|
@@ -71,8 +71,9 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
|
|
|
phys_addr_t taddr, unsigned long irq,
|
|
|
upf_t flags, int irq_check_parent)
|
|
|
{
|
|
|
- const __be32 *clk, *spd;
|
|
|
+ const __be32 *clk, *spd, *rs;
|
|
|
u32 clock = BASE_BAUD * 16;
|
|
|
+ u32 shift = 0;
|
|
|
int index;
|
|
|
|
|
|
/* get clock freq. if present */
|
|
@@ -83,6 +84,11 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
|
|
|
/* get default speed if present */
|
|
|
spd = of_get_property(np, "current-speed", NULL);
|
|
|
|
|
|
+ /* get register shift if present */
|
|
|
+ rs = of_get_property(np, "reg-shift", NULL);
|
|
|
+ if (rs && *rs)
|
|
|
+ shift = be32_to_cpup(rs);
|
|
|
+
|
|
|
/* If we have a location index, then try to use it */
|
|
|
if (want_index >= 0 && want_index < MAX_LEGACY_SERIAL_PORTS)
|
|
|
index = want_index;
|
|
@@ -126,6 +132,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
|
|
|
legacy_serial_ports[index].uartclk = clock;
|
|
|
legacy_serial_ports[index].irq = irq;
|
|
|
legacy_serial_ports[index].flags = flags;
|
|
|
+ legacy_serial_ports[index].regshift = shift;
|
|
|
legacy_serial_infos[index].taddr = taddr;
|
|
|
legacy_serial_infos[index].np = of_node_get(np);
|
|
|
legacy_serial_infos[index].clock = clock;
|
|
@@ -163,9 +170,8 @@ static int __init add_legacy_soc_port(struct device_node *np,
|
|
|
if (of_get_property(np, "clock-frequency", NULL) == NULL)
|
|
|
return -1;
|
|
|
|
|
|
- /* if reg-shift or offset, don't try to use it */
|
|
|
- if ((of_get_property(np, "reg-shift", NULL) != NULL) ||
|
|
|
- (of_get_property(np, "reg-offset", NULL) != NULL))
|
|
|
+ /* if reg-offset don't try to use it */
|
|
|
+ if ((of_get_property(np, "reg-offset", NULL) != NULL))
|
|
|
return -1;
|
|
|
|
|
|
/* if rtas uses this device, don't try to use it as well */
|
|
@@ -315,17 +321,20 @@ static void __init setup_legacy_serial_console(int console)
|
|
|
struct legacy_serial_info *info = &legacy_serial_infos[console];
|
|
|
struct plat_serial8250_port *port = &legacy_serial_ports[console];
|
|
|
void __iomem *addr;
|
|
|
+ unsigned int stride;
|
|
|
+
|
|
|
+ stride = 1 << port->regshift;
|
|
|
|
|
|
/* Check if a translated MMIO address has been found */
|
|
|
if (info->taddr) {
|
|
|
addr = ioremap(info->taddr, 0x1000);
|
|
|
if (addr == NULL)
|
|
|
return;
|
|
|
- udbg_uart_init_mmio(addr, 1);
|
|
|
+ udbg_uart_init_mmio(addr, stride);
|
|
|
} else {
|
|
|
/* Check if it's PIO and we support untranslated PIO */
|
|
|
if (port->iotype == UPIO_PORT && isa_io_special)
|
|
|
- udbg_uart_init_pio(port->iobase, 1);
|
|
|
+ udbg_uart_init_pio(port->iobase, stride);
|
|
|
else
|
|
|
return;
|
|
|
}
|