Skip to content

Commit 5ed771f

Browse files
asdfugilgregkh
authored andcommitted
tty: serial: samsung: Fix serial rx on Apple A7-A9
Apple's older A7-A9 SoCs seems to use bit 3 in UTRSTAT as RXTO, which is enabled by bit 11 in UCON. Access these bits in addition to the original RXTO and RXTO enable bits, to allow serial rx to function on A7-A9 SoCs. This change does not appear to affect the A10 SoC and up. Tested-by: Janne Grunau <j@jannau.net> Reviewed-by: Neal Gompa <neal@gompa.dev> Signed-off-by: Nick Chan <towinchenmi@gmail.com> Reviewed-by: Andi Shyti <andi.shyti@kernel.org> Link: https://lore.kernel.org/r/20240911050741.14477-4-towinchenmi@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 86d4ac2 commit 5ed771f

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

drivers/tty/serial/samsung_tty.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ static void s3c24xx_serial_stop_rx(struct uart_port *port)
550550
case TYPE_APPLE_S5L:
551551
s3c24xx_clear_bit(port, APPLE_S5L_UCON_RXTHRESH_ENA, S3C2410_UCON);
552552
s3c24xx_clear_bit(port, APPLE_S5L_UCON_RXTO_ENA, S3C2410_UCON);
553+
s3c24xx_clear_bit(port, APPLE_S5L_UCON_RXTO_LEGACY_ENA, S3C2410_UCON);
553554
break;
554555
default:
555556
disable_irq_nosync(ourport->rx_irq);
@@ -963,9 +964,11 @@ static irqreturn_t apple_serial_handle_irq(int irq, void *id)
963964
u32 pend = rd_regl(port, S3C2410_UTRSTAT);
964965
irqreturn_t ret = IRQ_NONE;
965966

966-
if (pend & (APPLE_S5L_UTRSTAT_RXTHRESH | APPLE_S5L_UTRSTAT_RXTO)) {
967+
if (pend & (APPLE_S5L_UTRSTAT_RXTHRESH | APPLE_S5L_UTRSTAT_RXTO |
968+
APPLE_S5L_UTRSTAT_RXTO_LEGACY)) {
967969
wr_regl(port, S3C2410_UTRSTAT,
968-
APPLE_S5L_UTRSTAT_RXTHRESH | APPLE_S5L_UTRSTAT_RXTO);
970+
APPLE_S5L_UTRSTAT_RXTHRESH | APPLE_S5L_UTRSTAT_RXTO |
971+
APPLE_S5L_UTRSTAT_RXTO_LEGACY);
969972
ret = s3c24xx_serial_rx_irq(ourport);
970973
}
971974
if (pend & APPLE_S5L_UTRSTAT_TXTHRESH) {
@@ -1190,7 +1193,8 @@ static void apple_s5l_serial_shutdown(struct uart_port *port)
11901193
ucon = rd_regl(port, S3C2410_UCON);
11911194
ucon &= ~(APPLE_S5L_UCON_TXTHRESH_ENA_MSK |
11921195
APPLE_S5L_UCON_RXTHRESH_ENA_MSK |
1193-
APPLE_S5L_UCON_RXTO_ENA_MSK);
1196+
APPLE_S5L_UCON_RXTO_ENA_MSK |
1197+
APPLE_S5L_UCON_RXTO_LEGACY_ENA_MSK);
11941198
wr_regl(port, S3C2410_UCON, ucon);
11951199

11961200
wr_regl(port, S3C2410_UTRSTAT, APPLE_S5L_UTRSTAT_ALL_FLAGS);
@@ -1287,6 +1291,7 @@ static int apple_s5l_serial_startup(struct uart_port *port)
12871291
/* Enable Rx Interrupt */
12881292
s3c24xx_set_bit(port, APPLE_S5L_UCON_RXTHRESH_ENA, S3C2410_UCON);
12891293
s3c24xx_set_bit(port, APPLE_S5L_UCON_RXTO_ENA, S3C2410_UCON);
1294+
s3c24xx_set_bit(port, APPLE_S5L_UCON_RXTO_LEGACY_ENA, S3C2410_UCON);
12901295

12911296
return ret;
12921297
}
@@ -2143,13 +2148,15 @@ static int s3c24xx_serial_resume_noirq(struct device *dev)
21432148

21442149
ucon &= ~(APPLE_S5L_UCON_TXTHRESH_ENA_MSK |
21452150
APPLE_S5L_UCON_RXTHRESH_ENA_MSK |
2146-
APPLE_S5L_UCON_RXTO_ENA_MSK);
2151+
APPLE_S5L_UCON_RXTO_ENA_MSK |
2152+
APPLE_S5L_UCON_RXTO_LEGACY_ENA_MSK);
21472153

21482154
if (ourport->tx_enabled)
21492155
ucon |= APPLE_S5L_UCON_TXTHRESH_ENA_MSK;
21502156
if (ourport->rx_enabled)
21512157
ucon |= APPLE_S5L_UCON_RXTHRESH_ENA_MSK |
2152-
APPLE_S5L_UCON_RXTO_ENA_MSK;
2158+
APPLE_S5L_UCON_RXTO_ENA_MSK |
2159+
APPLE_S5L_UCON_RXTO_LEGACY_ENA_MSK;
21532160

21542161
wr_regl(port, S3C2410_UCON, ucon);
21552162

include/linux/serial_s3c.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,24 +246,28 @@
246246
S5PV210_UFCON_TXTRIG4 | \
247247
S5PV210_UFCON_RXTRIG4)
248248

249-
#define APPLE_S5L_UCON_RXTO_ENA 9
250-
#define APPLE_S5L_UCON_RXTHRESH_ENA 12
251-
#define APPLE_S5L_UCON_TXTHRESH_ENA 13
252-
#define APPLE_S5L_UCON_RXTO_ENA_MSK BIT(APPLE_S5L_UCON_RXTO_ENA)
253-
#define APPLE_S5L_UCON_RXTHRESH_ENA_MSK BIT(APPLE_S5L_UCON_RXTHRESH_ENA)
254-
#define APPLE_S5L_UCON_TXTHRESH_ENA_MSK BIT(APPLE_S5L_UCON_TXTHRESH_ENA)
249+
#define APPLE_S5L_UCON_RXTO_ENA 9
250+
#define APPLE_S5L_UCON_RXTO_LEGACY_ENA 11
251+
#define APPLE_S5L_UCON_RXTHRESH_ENA 12
252+
#define APPLE_S5L_UCON_TXTHRESH_ENA 13
253+
#define APPLE_S5L_UCON_RXTO_ENA_MSK BIT(APPLE_S5L_UCON_RXTO_ENA)
254+
#define APPLE_S5L_UCON_RXTO_LEGACY_ENA_MSK BIT(APPLE_S5L_UCON_RXTO_LEGACY_ENA)
255+
#define APPLE_S5L_UCON_RXTHRESH_ENA_MSK BIT(APPLE_S5L_UCON_RXTHRESH_ENA)
256+
#define APPLE_S5L_UCON_TXTHRESH_ENA_MSK BIT(APPLE_S5L_UCON_TXTHRESH_ENA)
255257

256258
#define APPLE_S5L_UCON_DEFAULT (S3C2410_UCON_TXIRQMODE | \
257259
S3C2410_UCON_RXIRQMODE | \
258260
S3C2410_UCON_RXFIFO_TOI)
259261
#define APPLE_S5L_UCON_MASK (APPLE_S5L_UCON_RXTO_ENA_MSK | \
262+
APPLE_S5L_UCON_RXTO_LEGACY_ENA_MSK | \
260263
APPLE_S5L_UCON_RXTHRESH_ENA_MSK | \
261264
APPLE_S5L_UCON_TXTHRESH_ENA_MSK)
262265

266+
#define APPLE_S5L_UTRSTAT_RXTO_LEGACY BIT(3)
263267
#define APPLE_S5L_UTRSTAT_RXTHRESH BIT(4)
264268
#define APPLE_S5L_UTRSTAT_TXTHRESH BIT(5)
265269
#define APPLE_S5L_UTRSTAT_RXTO BIT(9)
266-
#define APPLE_S5L_UTRSTAT_ALL_FLAGS GENMASK(9, 4)
270+
#define APPLE_S5L_UTRSTAT_ALL_FLAGS GENMASK(9, 3)
267271

268272
#ifndef __ASSEMBLY__
269273

0 commit comments

Comments
 (0)