diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2007-08-20 04:47:41 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2007-10-12 16:14:49 -0400 |
commit | e259a3aecbfb61981175ddc7fc02dd180da7d73e (patch) | |
tree | fb265b5c377f2e82b3cf8d3b0805ff9ba17df891 | |
parent | 08197f6e3b262f4fb8b164c818d5e54b46c14711 (diff) |
[ARM] pxa: convert PXA serial drivers to use platform resources
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/mach-pxa/generic.c | 59 | ||||
-rw-r--r-- | drivers/serial/pxa.c | 139 |
2 files changed, 120 insertions, 78 deletions
diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index 9d6a2c00d762..98df63898d1d 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c | |||
@@ -267,21 +267,80 @@ void __init set_pxa_fb_parent(struct device *parent_dev) | |||
267 | pxa_device_fb.dev.parent = parent_dev; | 267 | pxa_device_fb.dev.parent = parent_dev; |
268 | } | 268 | } |
269 | 269 | ||
270 | static struct resource pxa_resource_ffuart[] = { | ||
271 | { | ||
272 | .start = __PREG(FFUART), | ||
273 | .end = __PREG(FFUART) + 35, | ||
274 | .flags = IORESOURCE_MEM, | ||
275 | }, { | ||
276 | .start = IRQ_FFUART, | ||
277 | .end = IRQ_FFUART, | ||
278 | .flags = IORESOURCE_IRQ, | ||
279 | } | ||
280 | }; | ||
281 | |||
270 | struct platform_device pxa_device_ffuart= { | 282 | struct platform_device pxa_device_ffuart= { |
271 | .name = "pxa2xx-uart", | 283 | .name = "pxa2xx-uart", |
272 | .id = 0, | 284 | .id = 0, |
285 | .resource = pxa_resource_ffuart, | ||
286 | .num_resources = ARRAY_SIZE(pxa_resource_ffuart), | ||
287 | }; | ||
288 | |||
289 | static struct resource pxa_resource_btuart[] = { | ||
290 | { | ||
291 | .start = __PREG(BTUART), | ||
292 | .end = __PREG(BTUART) + 35, | ||
293 | .flags = IORESOURCE_MEM, | ||
294 | }, { | ||
295 | .start = IRQ_BTUART, | ||
296 | .end = IRQ_BTUART, | ||
297 | .flags = IORESOURCE_IRQ, | ||
298 | } | ||
273 | }; | 299 | }; |
300 | |||
274 | struct platform_device pxa_device_btuart = { | 301 | struct platform_device pxa_device_btuart = { |
275 | .name = "pxa2xx-uart", | 302 | .name = "pxa2xx-uart", |
276 | .id = 1, | 303 | .id = 1, |
304 | .resource = pxa_resource_btuart, | ||
305 | .num_resources = ARRAY_SIZE(pxa_resource_btuart), | ||
277 | }; | 306 | }; |
307 | |||
308 | static struct resource pxa_resource_stuart[] = { | ||
309 | { | ||
310 | .start = __PREG(STUART), | ||
311 | .end = __PREG(STUART) + 35, | ||
312 | .flags = IORESOURCE_MEM, | ||
313 | }, { | ||
314 | .start = IRQ_STUART, | ||
315 | .end = IRQ_STUART, | ||
316 | .flags = IORESOURCE_IRQ, | ||
317 | } | ||
318 | }; | ||
319 | |||
278 | struct platform_device pxa_device_stuart = { | 320 | struct platform_device pxa_device_stuart = { |
279 | .name = "pxa2xx-uart", | 321 | .name = "pxa2xx-uart", |
280 | .id = 2, | 322 | .id = 2, |
323 | .resource = pxa_resource_stuart, | ||
324 | .num_resources = ARRAY_SIZE(pxa_resource_stuart), | ||
281 | }; | 325 | }; |
326 | |||
327 | static struct resource pxa_resource_hwuart[] = { | ||
328 | { | ||
329 | .start = __PREG(HWUART), | ||
330 | .end = __PREG(HWUART) + 47, | ||
331 | .flags = IORESOURCE_MEM, | ||
332 | }, { | ||
333 | .start = IRQ_HWUART, | ||
334 | .end = IRQ_HWUART, | ||
335 | .flags = IORESOURCE_IRQ, | ||
336 | } | ||
337 | }; | ||
338 | |||
282 | struct platform_device pxa_device_hwuart = { | 339 | struct platform_device pxa_device_hwuart = { |
283 | .name = "pxa2xx-uart", | 340 | .name = "pxa2xx-uart", |
284 | .id = 3, | 341 | .id = 3, |
342 | .resource = pxa_resource_hwuart, | ||
343 | .num_resources = ARRAY_SIZE(pxa_resource_hwuart), | ||
285 | }; | 344 | }; |
286 | 345 | ||
287 | static struct resource pxai2c_resources[] = { | 346 | static struct resource pxai2c_resources[] = { |
diff --git a/drivers/serial/pxa.c b/drivers/serial/pxa.c index e9c6cb391a23..59889f6a86b2 100644 --- a/drivers/serial/pxa.c +++ b/drivers/serial/pxa.c | |||
@@ -582,7 +582,7 @@ serial_pxa_type(struct uart_port *port) | |||
582 | 582 | ||
583 | #ifdef CONFIG_SERIAL_PXA_CONSOLE | 583 | #ifdef CONFIG_SERIAL_PXA_CONSOLE |
584 | 584 | ||
585 | static struct uart_pxa_port serial_pxa_ports[]; | 585 | static struct uart_pxa_port *serial_pxa_ports[4]; |
586 | static struct uart_driver serial_pxa_reg; | 586 | static struct uart_driver serial_pxa_reg; |
587 | 587 | ||
588 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) | 588 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
@@ -632,7 +632,7 @@ static void serial_pxa_console_putchar(struct uart_port *port, int ch) | |||
632 | static void | 632 | static void |
633 | serial_pxa_console_write(struct console *co, const char *s, unsigned int count) | 633 | serial_pxa_console_write(struct console *co, const char *s, unsigned int count) |
634 | { | 634 | { |
635 | struct uart_pxa_port *up = &serial_pxa_ports[co->index]; | 635 | struct uart_pxa_port *up = serial_pxa_ports[co->index]; |
636 | unsigned int ier; | 636 | unsigned int ier; |
637 | 637 | ||
638 | /* | 638 | /* |
@@ -662,7 +662,9 @@ serial_pxa_console_setup(struct console *co, char *options) | |||
662 | 662 | ||
663 | if (co->index == -1 || co->index >= serial_pxa_reg.nr) | 663 | if (co->index == -1 || co->index >= serial_pxa_reg.nr) |
664 | co->index = 0; | 664 | co->index = 0; |
665 | up = &serial_pxa_ports[co->index]; | 665 | up = serial_pxa_ports[co->index]; |
666 | if (!up) | ||
667 | return -ENODEV; | ||
666 | 668 | ||
667 | if (options) | 669 | if (options) |
668 | uart_parse_options(options, &baud, &parity, &bits, &flow); | 670 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
@@ -680,15 +682,6 @@ static struct console serial_pxa_console = { | |||
680 | .data = &serial_pxa_reg, | 682 | .data = &serial_pxa_reg, |
681 | }; | 683 | }; |
682 | 684 | ||
683 | static int __init | ||
684 | serial_pxa_console_init(void) | ||
685 | { | ||
686 | register_console(&serial_pxa_console); | ||
687 | return 0; | ||
688 | } | ||
689 | |||
690 | console_initcall(serial_pxa_console_init); | ||
691 | |||
692 | #define PXA_CONSOLE &serial_pxa_console | 685 | #define PXA_CONSOLE &serial_pxa_console |
693 | #else | 686 | #else |
694 | #define PXA_CONSOLE NULL | 687 | #define PXA_CONSOLE NULL |
@@ -714,73 +707,13 @@ struct uart_ops serial_pxa_pops = { | |||
714 | .verify_port = serial_pxa_verify_port, | 707 | .verify_port = serial_pxa_verify_port, |
715 | }; | 708 | }; |
716 | 709 | ||
717 | static struct uart_pxa_port serial_pxa_ports[] = { | ||
718 | { /* FFUART */ | ||
719 | .name = "FFUART", | ||
720 | .cken = CKEN_FFUART, | ||
721 | .port = { | ||
722 | .type = PORT_PXA, | ||
723 | .iotype = UPIO_MEM, | ||
724 | .membase = (void *)&FFUART, | ||
725 | .mapbase = __PREG(FFUART), | ||
726 | .irq = IRQ_FFUART, | ||
727 | .uartclk = 921600 * 16, | ||
728 | .fifosize = 64, | ||
729 | .ops = &serial_pxa_pops, | ||
730 | .line = 0, | ||
731 | }, | ||
732 | }, { /* BTUART */ | ||
733 | .name = "BTUART", | ||
734 | .cken = CKEN_BTUART, | ||
735 | .port = { | ||
736 | .type = PORT_PXA, | ||
737 | .iotype = UPIO_MEM, | ||
738 | .membase = (void *)&BTUART, | ||
739 | .mapbase = __PREG(BTUART), | ||
740 | .irq = IRQ_BTUART, | ||
741 | .uartclk = 921600 * 16, | ||
742 | .fifosize = 64, | ||
743 | .ops = &serial_pxa_pops, | ||
744 | .line = 1, | ||
745 | }, | ||
746 | }, { /* STUART */ | ||
747 | .name = "STUART", | ||
748 | .cken = CKEN_STUART, | ||
749 | .port = { | ||
750 | .type = PORT_PXA, | ||
751 | .iotype = UPIO_MEM, | ||
752 | .membase = (void *)&STUART, | ||
753 | .mapbase = __PREG(STUART), | ||
754 | .irq = IRQ_STUART, | ||
755 | .uartclk = 921600 * 16, | ||
756 | .fifosize = 64, | ||
757 | .ops = &serial_pxa_pops, | ||
758 | .line = 2, | ||
759 | }, | ||
760 | }, { /* HWUART */ | ||
761 | .name = "HWUART", | ||
762 | .cken = CKEN_HWUART, | ||
763 | .port = { | ||
764 | .type = PORT_PXA, | ||
765 | .iotype = UPIO_MEM, | ||
766 | .membase = (void *)&HWUART, | ||
767 | .mapbase = __PREG(HWUART), | ||
768 | .irq = IRQ_HWUART, | ||
769 | .uartclk = 921600 * 16, | ||
770 | .fifosize = 64, | ||
771 | .ops = &serial_pxa_pops, | ||
772 | .line = 3, | ||
773 | }, | ||
774 | } | ||
775 | }; | ||
776 | |||
777 | static struct uart_driver serial_pxa_reg = { | 710 | static struct uart_driver serial_pxa_reg = { |
778 | .owner = THIS_MODULE, | 711 | .owner = THIS_MODULE, |
779 | .driver_name = "PXA serial", | 712 | .driver_name = "PXA serial", |
780 | .dev_name = "ttyS", | 713 | .dev_name = "ttyS", |
781 | .major = TTY_MAJOR, | 714 | .major = TTY_MAJOR, |
782 | .minor = 64, | 715 | .minor = 64, |
783 | .nr = ARRAY_SIZE(serial_pxa_ports), | 716 | .nr = 4, |
784 | .cons = PXA_CONSOLE, | 717 | .cons = PXA_CONSOLE, |
785 | }; | 718 | }; |
786 | 719 | ||
@@ -806,10 +739,60 @@ static int serial_pxa_resume(struct platform_device *dev) | |||
806 | 739 | ||
807 | static int serial_pxa_probe(struct platform_device *dev) | 740 | static int serial_pxa_probe(struct platform_device *dev) |
808 | { | 741 | { |
809 | serial_pxa_ports[dev->id].port.dev = &dev->dev; | 742 | struct uart_pxa_port *sport; |
810 | uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port); | 743 | struct resource *mmres, *irqres; |
811 | platform_set_drvdata(dev, &serial_pxa_ports[dev->id]); | 744 | int ret; |
745 | |||
746 | mmres = platform_get_resource(dev, IORESOURCE_MEM, 0); | ||
747 | irqres = platform_get_resource(dev, IORESOURCE_IRQ, 0); | ||
748 | if (!mmres || !irqres) | ||
749 | return -ENODEV; | ||
750 | |||
751 | sport = kzalloc(sizeof(struct uart_pxa_port), GFP_KERNEL); | ||
752 | if (!sport) | ||
753 | return -ENOMEM; | ||
754 | |||
755 | sport->port.type = PORT_PXA; | ||
756 | sport->port.iotype = UPIO_MEM; | ||
757 | sport->port.mapbase = mmres->start; | ||
758 | sport->port.irq = irqres->start; | ||
759 | sport->port.fifosize = 64; | ||
760 | sport->port.ops = &serial_pxa_pops; | ||
761 | sport->port.line = dev->id; | ||
762 | sport->port.dev = &dev->dev; | ||
763 | sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; | ||
764 | sport->port.uartclk = 921600 * 16; | ||
765 | |||
766 | /* | ||
767 | * Is it worth keeping this? | ||
768 | */ | ||
769 | if (mmres->start == __PREG(FFUART)) | ||
770 | sport->name = "FFUART"; | ||
771 | else if (mmres->start == __PREG(BTUART)) | ||
772 | sport->name = "BTUART"; | ||
773 | else if (mmres->start == __PREG(STUART)) | ||
774 | sport->name = "STUART"; | ||
775 | else if (mmres->start == __PREG(HWUART)) | ||
776 | sport->name = "HWUART"; | ||
777 | else | ||
778 | sport->name = "???"; | ||
779 | |||
780 | sport->port.membase = ioremap(mmres->start, mmres->end - mmres->start + 1); | ||
781 | if (!sport->port.membase) { | ||
782 | ret = -ENOMEM; | ||
783 | goto err_free; | ||
784 | } | ||
785 | |||
786 | serial_pxa_ports[dev->id] = sport; | ||
787 | |||
788 | uart_add_one_port(&serial_pxa_reg, &sport->port); | ||
789 | platform_set_drvdata(dev, sport); | ||
790 | |||
812 | return 0; | 791 | return 0; |
792 | |||
793 | err_free: | ||
794 | kfree(sport); | ||
795 | return ret; | ||
813 | } | 796 | } |
814 | 797 | ||
815 | static int serial_pxa_remove(struct platform_device *dev) | 798 | static int serial_pxa_remove(struct platform_device *dev) |
@@ -818,8 +801,8 @@ static int serial_pxa_remove(struct platform_device *dev) | |||
818 | 801 | ||
819 | platform_set_drvdata(dev, NULL); | 802 | platform_set_drvdata(dev, NULL); |
820 | 803 | ||
821 | if (sport) | 804 | uart_remove_one_port(&serial_pxa_reg, &sport->port); |
822 | uart_remove_one_port(&serial_pxa_reg, &sport->port); | 805 | kfree(sport); |
823 | 806 | ||
824 | return 0; | 807 | return 0; |
825 | } | 808 | } |