X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fserial%2F8250_acorn.c;h=ef8cc8a70c6092e018a7e34b98a7c66426140bec;hb=97bf2856c6014879bd04983a3e9dfcdac1e7fe85;hp=2e69f6c536be0664ed9578976c1d7877d1544fea;hpb=9bf4aaab3e101692164d49b7ca357651eb691cb6;p=linux-2.6.git diff --git a/drivers/serial/8250_acorn.c b/drivers/serial/8250_acorn.c index 2e69f6c53..ef8cc8a70 100644 --- a/drivers/serial/8250_acorn.c +++ b/drivers/serial/8250_acorn.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -22,11 +21,13 @@ #include #include +#include "8250.h" + #define MAX_PORTS 3 struct serial_card_type { unsigned int num_ports; - unsigned int baud_base; + unsigned int uartclk; unsigned int type; unsigned int offset[MAX_PORTS]; }; @@ -34,33 +35,17 @@ struct serial_card_type { struct serial_card_info { unsigned int num_ports; int ports[MAX_PORTS]; + void __iomem *vaddr; }; -static inline int -serial_register_onedev(unsigned long baddr, void *vaddr, int irq, unsigned int baud_base) -{ - struct serial_struct req; - - memset(&req, 0, sizeof(req)); - req.irq = irq; - req.flags = UPF_AUTOPROBE | UPF_SHARE_IRQ; - req.baud_base = baud_base; - req.io_type = UPIO_MEM; - req.iomem_base = vaddr; - req.iomem_reg_shift = 2; - req.iomap_base = baddr; - - return register_serial(&req); -} - static int __devinit serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) { struct serial_card_info *info; struct serial_card_type *type = id->data; + struct uart_port port; unsigned long bus_addr; - unsigned char *virt_addr; - unsigned int port; + unsigned int i; info = kmalloc(sizeof(struct serial_card_info), GFP_KERNEL); if (!info) @@ -69,21 +54,28 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id) memset(info, 0, sizeof(struct serial_card_info)); info->num_ports = type->num_ports; - ecard_set_drvdata(ec, info); - - bus_addr = ec->resource[type->type].start; - virt_addr = ioremap(bus_addr, ec->resource[type->type].end - bus_addr + 1); - if (!virt_addr) { + bus_addr = ecard_resource_start(ec, type->type); + info->vaddr = ioremap(bus_addr, ecard_resource_len(ec, type->type)); + if (!info->vaddr) { kfree(info); return -ENOMEM; } - for (port = 0; port < info->num_ports; port ++) { - unsigned long baddr = bus_addr + type->offset[port]; - unsigned char *vaddr = virt_addr + type->offset[port]; + ecard_set_drvdata(ec, info); + + memset(&port, 0, sizeof(struct uart_port)); + port.irq = ec->irq; + port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; + port.uartclk = type->uartclk; + port.iotype = UPIO_MEM; + port.regshift = 2; + port.dev = &ec->dev; + + for (i = 0; i < info->num_ports; i ++) { + port.membase = info->vaddr + type->offset[i]; + port.mapbase = bus_addr + type->offset[i]; - info->ports[port] = serial_register_onedev(baddr, vaddr, - ec->irq, type->baud_base); + info->ports[i] = serial8250_register_port(&port); } return 0; @@ -98,21 +90,22 @@ static void __devexit serial_card_remove(struct expansion_card *ec) for (i = 0; i < info->num_ports; i++) if (info->ports[i] > 0) - unregister_serial(info->ports[i]); + serial8250_unregister_port(info->ports[i]); + iounmap(info->vaddr); kfree(info); } static struct serial_card_type atomwide_type = { .num_ports = 3, - .baud_base = 7372800 / 16, + .uartclk = 7372800, .type = ECARD_RES_IOCSLOW, .offset = { 0x2800, 0x2400, 0x2000 }, }; static struct serial_card_type serport_type = { .num_ports = 2, - .baud_base = 3686400 / 16, + .uartclk = 3686400, .type = ECARD_RES_IOCSLOW, .offset = { 0x2000, 0x2020 }, }; @@ -128,7 +121,7 @@ static struct ecard_driver serial_card_driver = { .remove = __devexit_p(serial_card_remove), .id_table = serial_cids, .drv = { - .name = "8250_acorn", + .name = "8250_acorn", }, };