Commit e259a3aecbfb61981175ddc7fc02dd180da7d73e

Authored by Russell King
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 }