Commit e259a3aecbfb61981175ddc7fc02dd180da7d73e
Committed by
Russell King
1 parent
08197f6e3b
[ARM] pxa: convert PXA serial drivers to use platform resources
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Showing 2 changed files with 120 additions and 78 deletions Side-by-side Diff
arch/arm/mach-pxa/generic.c
... | ... | @@ -267,21 +267,80 @@ |
267 | 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 | 282 | struct platform_device pxa_device_ffuart= { |
271 | 283 | .name = "pxa2xx-uart", |
272 | 284 | .id = 0, |
285 | + .resource = pxa_resource_ffuart, | |
286 | + .num_resources = ARRAY_SIZE(pxa_resource_ffuart), | |
273 | 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 | + } | |
299 | +}; | |
300 | + | |
274 | 301 | struct platform_device pxa_device_btuart = { |
275 | 302 | .name = "pxa2xx-uart", |
276 | 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 | 320 | struct platform_device pxa_device_stuart = { |
279 | 321 | .name = "pxa2xx-uart", |
280 | 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 | 339 | struct platform_device pxa_device_hwuart = { |
283 | 340 | .name = "pxa2xx-uart", |
284 | 341 | .id = 3, |
342 | + .resource = pxa_resource_hwuart, | |
343 | + .num_resources = ARRAY_SIZE(pxa_resource_hwuart), | |
285 | 344 | }; |
286 | 345 | |
287 | 346 | static struct resource pxai2c_resources[] = { |
drivers/serial/pxa.c
... | ... | @@ -582,7 +582,7 @@ |
582 | 582 | |
583 | 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 | 586 | static struct uart_driver serial_pxa_reg; |
587 | 587 | |
588 | 588 | #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE) |
... | ... | @@ -632,7 +632,7 @@ |
632 | 632 | static void |
633 | 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 | 636 | unsigned int ier; |
637 | 637 | |
638 | 638 | /* |
... | ... | @@ -662,7 +662,9 @@ |
662 | 662 | |
663 | 663 | if (co->index == -1 || co->index >= serial_pxa_reg.nr) |
664 | 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 | 669 | if (options) |
668 | 670 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
... | ... | @@ -680,15 +682,6 @@ |
680 | 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 | 685 | #define PXA_CONSOLE &serial_pxa_console |
693 | 686 | #else |
694 | 687 | #define PXA_CONSOLE NULL |
695 | 688 | |
... | ... | @@ -714,73 +707,13 @@ |
714 | 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 | 710 | static struct uart_driver serial_pxa_reg = { |
778 | 711 | .owner = THIS_MODULE, |
779 | 712 | .driver_name = "PXA serial", |
780 | 713 | .dev_name = "ttyS", |
781 | 714 | .major = TTY_MAJOR, |
782 | 715 | .minor = 64, |
783 | - .nr = ARRAY_SIZE(serial_pxa_ports), | |
716 | + .nr = 4, | |
784 | 717 | .cons = PXA_CONSOLE, |
785 | 718 | }; |
786 | 719 | |
787 | 720 | |
... | ... | @@ -806,10 +739,60 @@ |
806 | 739 | |
807 | 740 | static int serial_pxa_probe(struct platform_device *dev) |
808 | 741 | { |
809 | - serial_pxa_ports[dev->id].port.dev = &dev->dev; | |
810 | - uart_add_one_port(&serial_pxa_reg, &serial_pxa_ports[dev->id].port); | |
811 | - platform_set_drvdata(dev, &serial_pxa_ports[dev->id]); | |
742 | + struct uart_pxa_port *sport; | |
743 | + struct resource *mmres, *irqres; | |
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 | 791 | return 0; |
792 | + | |
793 | + err_free: | |
794 | + kfree(sport); | |
795 | + return ret; | |
813 | 796 | } |
814 | 797 | |
815 | 798 | static int serial_pxa_remove(struct platform_device *dev) |
... | ... | @@ -818,8 +801,8 @@ |
818 | 801 | |
819 | 802 | platform_set_drvdata(dev, NULL); |
820 | 803 | |
821 | - if (sport) | |
822 | - uart_remove_one_port(&serial_pxa_reg, &sport->port); | |
804 | + uart_remove_one_port(&serial_pxa_reg, &sport->port); | |
805 | + kfree(sport); | |
823 | 806 | |
824 | 807 | return 0; |
825 | 808 | } |