Re: OLPC power management patches - merge for 3.1?

From: Ingo Molnar
Date: Sun Jul 24 2011 - 03:32:18 EST



* Daniel Drake <dsd@xxxxxxxxxx> wrote:

> Hi,
>
> Many thanks for committing the OLPC power management patches to
> linux-tip a few weeks ago.
>
> Even though they were never merged into the master branch of linux-tip

it's excluded because in testing i found a boot crash with it.
Thomas did a quick fix for it but i have not heard about it since
then - Thomas/Peter, is this all resolved in x86/olpc?

(There's also the build failure Randy reported.)

> (where I presume linux-next pulls from), they have been included in
> linux-next for even longer via Andrew Morton's tree.

Andrew probably thought they were missed - they werent.

Thanks,

Ingo

------------->
Subject: drivers/serial/apbuart: Fix boot crash
From: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
Date: Thu, 16 Dec 2010 12:38:03 +0100

Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
---
drivers/serial/apbuart.c | 58 ++++++++++++++++++-----------------------------
1 file changed, 23 insertions(+), 35 deletions(-)

Index: linux-2.6-tip/drivers/serial/apbuart.c
===================================================================
--- linux-2.6-tip.orig/drivers/serial/apbuart.c
+++ linux-2.6-tip/drivers/serial/apbuart.c
@@ -593,71 +593,57 @@ static struct of_platform_driver grlib_a
};


-static void grlib_apbuart_configure(void)
+static int grlib_apbuart_configure(void)
{
- static int enum_done;
struct device_node *np, *rp;
- struct uart_port *port = NULL;
const u32 *prop;
- int freq_khz;
- int v = 0, d = 0;
- unsigned int addr;
- int irq, line;
- struct amba_prom_registers *regs;
-
- if (enum_done)
- return;
+ int freq_khz, line = 0;

/* Get bus frequency */
rp = of_find_node_by_path("/");
+ if (!rp)
+ return -ENODEV;
rp = of_get_next_child(rp, NULL);
+ if (!rp)
+ return -ENODEV;
prop = of_get_property(rp, "clock-frequency", NULL);
+ if (!prop)
+ return -ENODEV;
freq_khz = *prop;

- line = 0;
for_each_matching_node(np, apbuart_match) {
+ const int *irqs = of_get_property(np, "interrupts", NULL);
+ const struct amba_prom_registers *regs;
+ struct uart_port *port;

- int *vendor = (int *) of_get_property(np, "vendor", NULL);
- int *device = (int *) of_get_property(np, "device", NULL);
- int *irqs = (int *) of_get_property(np, "interrupts", NULL);
- regs = (struct amba_prom_registers *)
- of_get_property(np, "reg", NULL);
-
- if (vendor)
- v = *vendor;
- if (device)
- d = *device;
+ regs = of_get_property(np, "reg", NULL);

if (!irqs || !regs)
- return;
+ return -ENODEV;

grlib_apbuart_nodes[line] = np;

- addr = regs->phys_addr;
- irq = *irqs;
-
port = &grlib_apbuart_ports[line];
-
- port->mapbase = addr;
- port->membase = ioremap(addr, sizeof(struct grlib_apbuart_regs_map));
- port->irq = irq;
+ port->mapbase = regs->phys_addr;
+ port->membase = ioremap(regs->phys_addr,
+ sizeof(struct grlib_apbuart_regs_map));
+ port->irq = *irqs;
port->iotype = UPIO_MEM;
port->ops = &grlib_apbuart_ops;
port->flags = UPF_BOOT_AUTOCONF;
port->line = line;
port->uartclk = freq_khz * 1000;
- port->fifosize = apbuart_scan_fifo_size((struct uart_port *) port, line);
+ port->fifosize =
+ apbuart_scan_fifo_size((struct uart_port *) port, line);
line++;

/* We support maximum UART_NR uarts ... */
if (line == UART_NR)
break;
-
}

- enum_done = 1;
-
grlib_apbuart_driver.nr = grlib_apbuart_port_nr = line;
+ return line ? 0 : -ENODEV;
}

static int __init grlib_apbuart_init(void)
@@ -665,7 +651,9 @@ static int __init grlib_apbuart_init(voi
int ret;

/* Find all APBUARTS in device the tree and initialize their ports */
- grlib_apbuart_configure();
+ ret = grlib_apbuart_configure();
+ if (ret)
+ return ret;

printk(KERN_INFO "Serial: GRLIB APBUART driver\n");

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/