Эх сурвалжийг харах

tty: amba-pl011: use iotype instead of access_32b to track 32-bit I/O

Instead of defining a new field in the uart_amba_port structure, use the
existing iotype field of the uart_port structure, which is intended for
this purpose.  If we need to use 32-bit register access, we set iotype
to UPIO_MEM32, otherwise we set it to UPIO_MEM.

For early console, specify the "mmio32" option on the kernel command-line.
Example:

        earlycon=pl011,mmio32,0x3ced1000

Signed-off-by: Timur Tabi <timur@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Timur Tabi 9 жил өмнө
parent
commit
3b78fae793

+ 4 - 1
Documentation/kernel-parameters.txt

@@ -1003,10 +1003,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 			unspecified, the h/w is not initialized.
 			unspecified, the h/w is not initialized.
 
 
 		pl011,<addr>
 		pl011,<addr>
+		pl011,mmio32,<addr>
 			Start an early, polled-mode console on a pl011 serial
 			Start an early, polled-mode console on a pl011 serial
 			port at the specified address. The pl011 serial port
 			port at the specified address. The pl011 serial port
 			must already be setup and configured. Options are not
 			must already be setup and configured. Options are not
-			yet supported.
+			yet supported.  If 'mmio32' is specified, then only
+			the driver will use only 32-bit accessors to read/write
+			the device registers.
 
 
 		msm_serial,<addr>
 		msm_serial,<addr>
 			Start an early, polled-mode console on an msm serial
 			Start an early, polled-mode console on an msm serial

+ 9 - 7
drivers/tty/serial/amba-pl011.c

@@ -238,7 +238,6 @@ struct uart_amba_port {
 	unsigned int		fifosize;	/* vendor-specific */
 	unsigned int		fifosize;	/* vendor-specific */
 	unsigned int		old_cr;		/* state during shutdown */
 	unsigned int		old_cr;		/* state during shutdown */
 	bool			autorts;
 	bool			autorts;
-	bool			access_32b;
 	unsigned int		fixed_baud;	/* vendor-set fixed baud rate */
 	unsigned int		fixed_baud;	/* vendor-set fixed baud rate */
 	char			type[12];
 	char			type[12];
 #ifdef CONFIG_DMA_ENGINE
 #ifdef CONFIG_DMA_ENGINE
@@ -262,7 +261,8 @@ static unsigned int pl011_read(const struct uart_amba_port *uap,
 {
 {
 	void __iomem *addr = uap->port.membase + pl011_reg_to_offset(uap, reg);
 	void __iomem *addr = uap->port.membase + pl011_reg_to_offset(uap, reg);
 
 
-	return uap->access_32b ? readl_relaxed(addr) : readw_relaxed(addr);
+	return (uap->port.iotype == UPIO_MEM32) ?
+		readl_relaxed(addr) : readw_relaxed(addr);
 }
 }
 
 
 static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
 static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
@@ -270,7 +270,7 @@ static void pl011_write(unsigned int val, const struct uart_amba_port *uap,
 {
 {
 	void __iomem *addr = uap->port.membase + pl011_reg_to_offset(uap, reg);
 	void __iomem *addr = uap->port.membase + pl011_reg_to_offset(uap, reg);
 
 
-	if (uap->access_32b)
+	if (uap->port.iotype == UPIO_MEM32)
 		writel_relaxed(val, addr);
 		writel_relaxed(val, addr);
 	else
 	else
 		writew_relaxed(val, addr);
 		writew_relaxed(val, addr);
@@ -2303,7 +2303,10 @@ static void pl011_putc(struct uart_port *port, int c)
 {
 {
 	while (readl(port->membase + UART01x_FR) & UART01x_FR_TXFF)
 	while (readl(port->membase + UART01x_FR) & UART01x_FR_TXFF)
 		;
 		;
-	writeb(c, port->membase + UART01x_DR);
+	if (port->iotype == UPIO_MEM32)
+		writel(c, port->membase + UART01x_DR);
+	else
+		writeb(c, port->membase + UART01x_DR);
 	while (readl(port->membase + UART01x_FR) & UART01x_FR_BUSY)
 	while (readl(port->membase + UART01x_FR) & UART01x_FR_BUSY)
 		;
 		;
 }
 }
@@ -2416,7 +2419,6 @@ static int pl011_setup_port(struct device *dev, struct uart_amba_port *uap,
 	uap->port.dev = dev;
 	uap->port.dev = dev;
 	uap->port.mapbase = mmiobase->start;
 	uap->port.mapbase = mmiobase->start;
 	uap->port.membase = base;
 	uap->port.membase = base;
-	uap->port.iotype = UPIO_MEM;
 	uap->port.fifosize = uap->fifosize;
 	uap->port.fifosize = uap->fifosize;
 	uap->port.flags = UPF_BOOT_AUTOCONF;
 	uap->port.flags = UPF_BOOT_AUTOCONF;
 	uap->port.line = index;
 	uap->port.line = index;
@@ -2470,9 +2472,9 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
 		return PTR_ERR(uap->clk);
 		return PTR_ERR(uap->clk);
 
 
 	uap->reg_offset = vendor->reg_offset;
 	uap->reg_offset = vendor->reg_offset;
-	uap->access_32b = vendor->access_32b;
 	uap->vendor = vendor;
 	uap->vendor = vendor;
 	uap->fifosize = vendor->get_fifosize(dev);
 	uap->fifosize = vendor->get_fifosize(dev);
+	uap->port.iotype = vendor->access_32b ? UPIO_MEM32 : UPIO_MEM;
 	uap->port.irq = dev->irq[0];
 	uap->port.irq = dev->irq[0];
 	uap->port.ops = &amba_pl011_pops;
 	uap->port.ops = &amba_pl011_pops;
 
 
@@ -2551,9 +2553,9 @@ static int sbsa_uart_probe(struct platform_device *pdev)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	uap->reg_offset	= vendor_sbsa.reg_offset;
 	uap->reg_offset	= vendor_sbsa.reg_offset;
-	uap->access_32b = vendor_sbsa.access_32b;
 	uap->vendor	= &vendor_sbsa;
 	uap->vendor	= &vendor_sbsa;
 	uap->fifosize	= 32;
 	uap->fifosize	= 32;
+	uap->port.iotype = vendor_sbsa.access_32b ? UPIO_MEM32 : UPIO_MEM;
 	uap->port.irq	= platform_get_irq(pdev, 0);
 	uap->port.irq	= platform_get_irq(pdev, 0);
 	uap->port.ops	= &sbsa_uart_pops;
 	uap->port.ops	= &sbsa_uart_pops;
 	uap->fixed_baud = baudrate;
 	uap->fixed_baud = baudrate;