Re: [PATCH v4 5/6] serial: 8250_em: Use pseudo offset for UART_FCR

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 17 Feb 2023, Biju Das wrote:

> 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.
> 
> This patch introduces a macro UART_FCR_EM with a high value to
> avoid overlapping with existing UART_* register defines.
> 
> This will help us to use UART_FCR_EM consistently in serial8250_em_
> serial{_in/_out} function to read/write FCR register.
> 
> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
> Suggested-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> ---
> v4:
>  * New patch. Used UART_FCR_EM for read/write of FCR register.
> ---
>  drivers/tty/serial/8250/8250_em.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/tty/serial/8250/8250_em.c b/drivers/tty/serial/8250/8250_em.c
> index 499d7a8847ec..4165fd3bb17a 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,14 @@ 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) */

8250_port wants this to remain in place, I think. Otherwise it's attempts 
to set UART_FCR will end up into wrong destination.

-- 
 i.


>  	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_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;
> @@ -54,6 +63,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) */
> 

[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux