Commit 8fa7b610 authored by Grant Likely's avatar Grant Likely Committed by Josh Boyer

[POWERPC] Uartlite: Separate the bus binding from the driver proper

Separate the bus binding code from the driver structure allocation code in
preparation for adding the of_platform_bus bindings needed by arch/powerpc
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
Signed-off-by: default avatarJosh Boyer <jwboyer@linux.vnet.ibm.com>
parent 00775828
...@@ -413,59 +413,90 @@ static struct uart_driver ulite_uart_driver = { ...@@ -413,59 +413,90 @@ static struct uart_driver ulite_uart_driver = {
#endif #endif
}; };
static int __devinit ulite_probe(struct platform_device *pdev) static int __devinit ulite_assign(struct device *dev, int id, u32 base, int irq)
{ {
struct resource *res, *res2;
struct uart_port *port; struct uart_port *port;
int rc;
if (pdev->id < 0 || pdev->id >= ULITE_NR_UARTS) /* if id = -1; then scan for a free id and use that */
if (id < 0) {
for (id = 0; id < ULITE_NR_UARTS; id++)
if (ulite_ports[id].mapbase == 0)
break;
}
if (id < 0 || id >= ULITE_NR_UARTS) {
dev_err(dev, "%s%i too large\n", ULITE_NAME, id);
return -EINVAL; return -EINVAL;
}
if (ulite_ports[pdev->id].membase) if (ulite_ports[id].mapbase) {
dev_err(dev, "cannot assign to %s%i; it is already in use\n",
ULITE_NAME, id);
return -EBUSY; return -EBUSY;
}
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); port = &ulite_ports[id];
if (!res)
return -ENODEV;
res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (!res2)
return -ENODEV;
port = &ulite_ports[pdev->id];
spin_lock_init(&port->lock);
port->fifosize = 16; port->fifosize = 16;
port->regshift = 2; port->regshift = 2;
port->iotype = UPIO_MEM; port->iotype = UPIO_MEM;
port->iobase = 1; /* mark port in use */ port->iobase = 1; /* mark port in use */
port->mapbase = res->start; port->mapbase = base;
port->membase = NULL; port->membase = NULL;
port->ops = &ulite_ops; port->ops = &ulite_ops;
port->irq = res2->start; port->irq = irq;
port->flags = UPF_BOOT_AUTOCONF; port->flags = UPF_BOOT_AUTOCONF;
port->dev = &pdev->dev; port->dev = dev;
port->type = PORT_UNKNOWN; port->type = PORT_UNKNOWN;
port->line = pdev->id; port->line = id;
uart_add_one_port(&ulite_uart_driver, port); dev_set_drvdata(dev, port);
platform_set_drvdata(pdev, port);
/* Register the port */
rc = uart_add_one_port(&ulite_uart_driver, port);
if (rc) {
dev_err(dev, "uart_add_one_port() failed; err=%i\n", rc);
port->mapbase = 0;
dev_set_drvdata(dev, NULL);
return rc;
}
return 0; return 0;
} }
static int ulite_remove(struct platform_device *pdev) static int __devinit ulite_release(struct device *dev)
{
struct uart_port *port = dev_get_drvdata(dev);
int rc = 0;
if (port) {
rc = uart_remove_one_port(&ulite_uart_driver, port);
dev_set_drvdata(dev, NULL);
port->mapbase = 0;
}
return rc;
}
static int __devinit ulite_probe(struct platform_device *pdev)
{ {
struct uart_port *port = platform_get_drvdata(pdev); struct resource *res, *res2;
platform_set_drvdata(pdev, NULL); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
if (port) res2 = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
uart_remove_one_port(&ulite_uart_driver, port); if (!res2)
return -ENODEV;
/* mark port as free */ return ulite_assign(&pdev->dev, pdev->id, res->start, res2->start);
port->membase = NULL; }
return 0; static int ulite_remove(struct platform_device *pdev)
{
return ulite_release(&pdev->dev);
} }
static struct platform_driver ulite_platform_driver = { static struct platform_driver ulite_platform_driver = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment