aboutsummaryrefslogtreecommitdiff
path: root/drivers/tty/serial/8250/8250_em.c
diff options
context:
space:
mode:
authorGravatar Biju Das <biju.das.jz@bp.renesas.com> 2023-02-27 11:41:51 +0000
committerGravatar Greg Kroah-Hartman <gregkh@linuxfoundation.org> 2023-03-09 17:21:54 +0100
commit59d6558fb5fd750777edfde028ea1f9e7eed8a46 (patch)
treeebcecca4eff12ba2a85d5c4caaf01a5542beda8b /drivers/tty/serial/8250/8250_em.c
parentserial: 8250_em: Use devm_clk_get_enabled() (diff)
downloadlinux-59d6558fb5fd750777edfde028ea1f9e7eed8a46.tar.gz
linux-59d6558fb5fd750777edfde028ea1f9e7eed8a46.tar.bz2
linux-59d6558fb5fd750777edfde028ea1f9e7eed8a46.zip
serial: 8250_em: Use pseudo offset for UART_FCR
UART_FCR shares the same offset with UART_IIR. We cannot use UART_FCR in serial8250_em_serial_in() as it overlaps with UART_IIR. Define UART_FCR_EM macro with a high value to avoid overlapping with existing UART_* register defines and define another macro UART_FCR_EM_HW for the real offset. Use these macros in serial8250_em_serial{_in/_out} function to read/write FCR register. Suggested-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com> Link: https://lore.kernel.org/r/20230227114152.22265-7-biju.das.jz@bp.renesas.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty/serial/8250/8250_em.c')
-rw-r--r--drivers/tty/serial/8250/8250_em.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/tty/serial/8250/8250_em.c b/drivers/tty/serial/8250/8250_em.c
index dcf1761e8ef5..7614ced9377e 100644
--- a/drivers/tty/serial/8250/8250_em.c
+++ b/drivers/tty/serial/8250/8250_em.c
@@ -19,6 +19,13 @@
#define UART_DLL_EM 9
#define UART_DLM_EM 10
+/*
+ * A high value for UART_FCR_EM avoids overlapping with existing UART_*
+ * register defines. UART_FCR_EM_HW is the real HW register offset.
+ */
+#define UART_FCR_EM 0x10003
+#define UART_FCR_EM_HW 3
+
struct serial8250_em_priv {
int line;
};
@@ -29,12 +36,15 @@ static void serial8250_em_serial_out(struct uart_port *p, int offset, int value)
case UART_TX: /* TX @ 0x00 */
writeb(value, p->membase);
break;
- case UART_FCR: /* FCR @ 0x0c (+1) */
case UART_LCR: /* LCR @ 0x10 (+1) */
case UART_MCR: /* MCR @ 0x14 (+1) */
case UART_SCR: /* SCR @ 0x20 (+1) */
writel(value, p->membase + ((offset + 1) << 2));
break;
+ case UART_FCR:
+ case UART_FCR_EM:
+ writel(value, p->membase + (UART_FCR_EM_HW << 2));
+ break;
case UART_IER: /* IER @ 0x04 */
value &= 0x0f; /* only 4 valid bits - not Xscale */
fallthrough;
@@ -55,6 +65,8 @@ static unsigned int serial8250_em_serial_in(struct uart_port *p, int offset)
case UART_MSR: /* MSR @ 0x1c (+1) */
case UART_SCR: /* SCR @ 0x20 (+1) */
return readl(p->membase + ((offset + 1) << 2));
+ case UART_FCR_EM:
+ return readl(p->membase + (UART_FCR_EM_HW << 2));
case UART_IER: /* IER @ 0x04 */
case UART_IIR: /* IIR @ 0x08 */
case UART_DLL_EM: /* DLL @ 0x24 (+9) */