On Mon, Nov 16, 2015 at 05:40:26PM +0000, Russell King wrote: Hi Russell, > Add a register lookup table, which allows the register offsets to be > adjusted on a per-port basis. I met a console hang with my ARM juno-r1 board after the linux-next merge this patch. The console hang like this: ================================== on will start in 1 seconds EFI stub: Booting Linux Kernel... EFI stub: Using DTB from command line EFI stub: Exiting boot services and installing virtual address map... ================================== The console runs well if I revert this patch. Does anyone also meet the same hang issue? My kernel cmdline: console=ttyAMA0,115200 earlycon=pl011,0x7ff80000 root=/dev/sda1 rootwait verbose debug sky2.mac_address=0x00,0x02,0xF7,0x00,0x63,0x3C dtb=r1a57.dtb thanks Huang Shijie > > Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> > --- > drivers/tty/serial/amba-pl011.c | 33 ++++++++++++++++++++++++- > drivers/tty/serial/amba-pl011.h | 53 ++++++++++++++++++++++------------------- > 2 files changed, 60 insertions(+), 26 deletions(-) > > diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c > index 5ea5b0a3dbb9..628557f6a7a1 100644 > --- a/drivers/tty/serial/amba-pl011.c > +++ b/drivers/tty/serial/amba-pl011.c > @@ -73,6 +73,34 @@ > #define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE) > #define UART_DUMMY_DR_RX (1 << 16) > > +static u16 pl011_std_offsets[REG_ARRAY_SIZE] = { > + [REG_DR] = UART01x_DR, > + [REG_ST_DMAWM] = ST_UART011_DMAWM, > + [REG_ST_TIMEOUT] = ST_UART011_TIMEOUT, > + [REG_FR] = UART01x_FR, > + [REG_ST_LCRH_RX] = ST_UART011_LCRH_RX, > + [REG_IBRD] = UART011_IBRD, > + [REG_FBRD] = UART011_FBRD, > + [REG_LCRH] = UART011_LCRH, > + [REG_ST_LCRH_TX] = ST_UART011_LCRH_TX, > + [REG_CR] = UART011_CR, > + [REG_IFLS] = UART011_IFLS, > + [REG_IMSC] = UART011_IMSC, > + [REG_RIS] = UART011_RIS, > + [REG_MIS] = UART011_MIS, > + [REG_ICR] = UART011_ICR, > + [REG_DMACR] = UART011_DMACR, > + [REG_ST_XFCR] = ST_UART011_XFCR, > + [REG_ST_XON1] = ST_UART011_XON1, > + [REG_ST_XON2] = ST_UART011_XON2, > + [REG_ST_XOFF1] = ST_UART011_XOFF1, > + [REG_ST_XOFF2] = ST_UART011_XOFF2, > + [REG_ST_ITCR] = ST_UART011_ITCR, > + [REG_ST_ITIP] = ST_UART011_ITIP, > + [REG_ST_ABCR] = ST_UART011_ABCR, > + [REG_ST_ABIMSC] = ST_UART011_ABIMSC, > +}; > + > /* There is by now at least one vendor with differing details, so handle it */ > struct vendor_data { > unsigned int ifls; > @@ -164,6 +192,7 @@ struct pl011_dmatx_data { > */ > struct uart_amba_port { > struct uart_port port; > + const u16 *reg_offset; > struct clk *clk; > const struct vendor_data *vendor; > unsigned int dmacr; /* dma control reg */ > @@ -189,7 +218,7 @@ struct uart_amba_port { > static unsigned int pl011_reg_to_offset(const struct uart_amba_port *uap, > unsigned int reg) > { > - return reg; > + return uap->reg_offset[reg]; > } > > static unsigned int pl011_read(const struct uart_amba_port *uap, > @@ -2397,6 +2426,7 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) > if (IS_ERR(uap->clk)) > return PTR_ERR(uap->clk); > > + uap->reg_offset = pl011_std_offsets; > uap->vendor = vendor; > uap->lcrh_rx = vendor->lcrh_rx; > uap->lcrh_tx = vendor->lcrh_tx; > @@ -2478,6 +2508,7 @@ static int sbsa_uart_probe(struct platform_device *pdev) > if (!uap) > return -ENOMEM; > > + uap->reg_offset = pl011_std_offsets; > uap->vendor = &vendor_sbsa; > uap->fifosize = 32; > uap->port.irq = platform_get_irq(pdev, 0); > diff --git a/drivers/tty/serial/amba-pl011.h b/drivers/tty/serial/amba-pl011.h > index b7eb1bc2fab9..0c6756dba2fe 100644 > --- a/drivers/tty/serial/amba-pl011.h > +++ b/drivers/tty/serial/amba-pl011.h > @@ -2,31 +2,34 @@ > #define AMBA_PL011_H > > enum { > - REG_DR = UART01x_DR, > - REG_ST_DMAWM = ST_UART011_DMAWM, > - REG_ST_TIMEOUT = ST_UART011_TIMEOUT, > - REG_FR = UART01x_FR, > - REG_ST_LCRH_RX = ST_UART011_LCRH_RX, > - REG_IBRD = UART011_IBRD, > - REG_FBRD = UART011_FBRD, > - REG_LCRH = UART011_LCRH, > - REG_ST_LCRH_TX = ST_UART011_LCRH_TX, > - REG_CR = UART011_CR, > - REG_IFLS = UART011_IFLS, > - REG_IMSC = UART011_IMSC, > - REG_RIS = UART011_RIS, > - REG_MIS = UART011_MIS, > - REG_ICR = UART011_ICR, > - REG_DMACR = UART011_DMACR, > - REG_ST_XFCR = ST_UART011_XFCR, > - REG_ST_XON1 = ST_UART011_XON1, > - REG_ST_XON2 = ST_UART011_XON2, > - REG_ST_XOFF1 = ST_UART011_XOFF1, > - REG_ST_XOFF2 = ST_UART011_XOFF2, > - REG_ST_ITCR = ST_UART011_ITCR, > - REG_ST_ITIP = ST_UART011_ITIP, > - REG_ST_ABCR = ST_UART011_ABCR, > - REG_ST_ABIMSC = ST_UART011_ABIMSC, > + REG_DR, > + REG_ST_DMAWM, > + REG_ST_TIMEOUT, > + REG_FR, > + REG_ST_LCRH_RX, > + REG_IBRD, > + REG_FBRD, > + REG_LCRH, > + REG_ST_LCRH_TX, > + REG_CR, > + REG_IFLS, > + REG_IMSC, > + REG_RIS, > + REG_MIS, > + REG_ICR, > + REG_DMACR, > + REG_ST_XFCR, > + REG_ST_XON1, > + REG_ST_XON2, > + REG_ST_XOFF1, > + REG_ST_XOFF2, > + REG_ST_ITCR, > + REG_ST_ITIP, > + REG_ST_ABCR, > + REG_ST_ABIMSC, > + > + /* The size of the array - must be last */ > + REG_ARRAY_SIZE, > }; > > #endif > -- > 2.1.0 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you. -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html