diff options
Diffstat (limited to 'arch/arm/mach-omap2/serial.c')
| -rw-r--r-- | arch/arm/mach-omap2/serial.c | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index ce22344b94e7..3a529c77daa8 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
| @@ -73,7 +73,7 @@ static LIST_HEAD(uart_list); | |||
| 73 | 73 | ||
| 74 | static struct plat_serial8250_port serial_platform_data0[] = { | 74 | static struct plat_serial8250_port serial_platform_data0[] = { |
| 75 | { | 75 | { |
| 76 | .membase = IO_ADDRESS(OMAP_UART1_BASE), | 76 | .membase = OMAP2_IO_ADDRESS(OMAP_UART1_BASE), |
| 77 | .mapbase = OMAP_UART1_BASE, | 77 | .mapbase = OMAP_UART1_BASE, |
| 78 | .irq = 72, | 78 | .irq = 72, |
| 79 | .flags = UPF_BOOT_AUTOCONF, | 79 | .flags = UPF_BOOT_AUTOCONF, |
| @@ -87,7 +87,7 @@ static struct plat_serial8250_port serial_platform_data0[] = { | |||
| 87 | 87 | ||
| 88 | static struct plat_serial8250_port serial_platform_data1[] = { | 88 | static struct plat_serial8250_port serial_platform_data1[] = { |
| 89 | { | 89 | { |
| 90 | .membase = IO_ADDRESS(OMAP_UART2_BASE), | 90 | .membase = OMAP2_IO_ADDRESS(OMAP_UART2_BASE), |
| 91 | .mapbase = OMAP_UART2_BASE, | 91 | .mapbase = OMAP_UART2_BASE, |
| 92 | .irq = 73, | 92 | .irq = 73, |
| 93 | .flags = UPF_BOOT_AUTOCONF, | 93 | .flags = UPF_BOOT_AUTOCONF, |
| @@ -101,7 +101,7 @@ static struct plat_serial8250_port serial_platform_data1[] = { | |||
| 101 | 101 | ||
| 102 | static struct plat_serial8250_port serial_platform_data2[] = { | 102 | static struct plat_serial8250_port serial_platform_data2[] = { |
| 103 | { | 103 | { |
| 104 | .membase = IO_ADDRESS(OMAP_UART3_BASE), | 104 | .membase = OMAP2_IO_ADDRESS(OMAP_UART3_BASE), |
| 105 | .mapbase = OMAP_UART3_BASE, | 105 | .mapbase = OMAP_UART3_BASE, |
| 106 | .irq = 74, | 106 | .irq = 74, |
| 107 | .flags = UPF_BOOT_AUTOCONF, | 107 | .flags = UPF_BOOT_AUTOCONF, |
| @@ -123,6 +123,21 @@ static struct plat_serial8250_port serial_platform_data2[] = { | |||
| 123 | } | 123 | } |
| 124 | }; | 124 | }; |
| 125 | 125 | ||
| 126 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 127 | static struct plat_serial8250_port serial_platform_data3[] = { | ||
| 128 | { | ||
| 129 | .membase = IO_ADDRESS(OMAP_UART4_BASE), | ||
| 130 | .mapbase = OMAP_UART4_BASE, | ||
| 131 | .irq = 70, | ||
| 132 | .flags = UPF_BOOT_AUTOCONF, | ||
| 133 | .iotype = UPIO_MEM, | ||
| 134 | .regshift = 2, | ||
| 135 | .uartclk = OMAP24XX_BASE_BAUD * 16, | ||
| 136 | }, { | ||
| 137 | .flags = 0 | ||
| 138 | } | ||
| 139 | }; | ||
| 140 | #endif | ||
| 126 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, | 141 | static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, |
| 127 | int offset) | 142 | int offset) |
| 128 | { | 143 | { |
| @@ -470,7 +485,7 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
| 470 | uart->padconf = 0; | 485 | uart->padconf = 0; |
| 471 | } | 486 | } |
| 472 | 487 | ||
| 473 | p->flags |= UPF_SHARE_IRQ; | 488 | p->irqflags |= IRQF_SHARED; |
| 474 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, | 489 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, |
| 475 | "serial idle", (void *)uart); | 490 | "serial idle", (void *)uart); |
| 476 | WARN_ON(ret); | 491 | WARN_ON(ret); |
| @@ -560,12 +575,22 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { | |||
| 560 | }, | 575 | }, |
| 561 | }, | 576 | }, |
| 562 | }, | 577 | }, |
| 578 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 579 | { | ||
| 580 | .pdev = { | ||
| 581 | .name = "serial8250", | ||
| 582 | .id = 3 | ||
| 583 | .dev = { | ||
| 584 | .platform_data = serial_platform_data3, | ||
| 585 | }, | ||
| 586 | }, | ||
| 587 | }, | ||
| 588 | #endif | ||
| 563 | }; | 589 | }; |
| 564 | 590 | ||
| 565 | void __init omap_serial_init(void) | 591 | void __init omap_serial_early_init(void) |
| 566 | { | 592 | { |
| 567 | int i; | 593 | int i; |
| 568 | const struct omap_uart_config *info; | ||
| 569 | char name[16]; | 594 | char name[16]; |
| 570 | 595 | ||
| 571 | /* | 596 | /* |
| @@ -574,23 +599,12 @@ void __init omap_serial_init(void) | |||
| 574 | * if not needed. | 599 | * if not needed. |
| 575 | */ | 600 | */ |
| 576 | 601 | ||
| 577 | info = omap_get_config(OMAP_TAG_UART, struct omap_uart_config); | ||
| 578 | |||
| 579 | if (info == NULL) | ||
| 580 | return; | ||
| 581 | |||
| 582 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | 602 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { |
| 583 | struct omap_uart_state *uart = &omap_uart[i]; | 603 | struct omap_uart_state *uart = &omap_uart[i]; |
| 584 | struct platform_device *pdev = &uart->pdev; | 604 | struct platform_device *pdev = &uart->pdev; |
| 585 | struct device *dev = &pdev->dev; | 605 | struct device *dev = &pdev->dev; |
| 586 | struct plat_serial8250_port *p = dev->platform_data; | 606 | struct plat_serial8250_port *p = dev->platform_data; |
| 587 | 607 | ||
| 588 | if (!(info->enabled_uarts & (1 << i))) { | ||
| 589 | p->membase = NULL; | ||
| 590 | p->mapbase = 0; | ||
| 591 | continue; | ||
| 592 | } | ||
| 593 | |||
| 594 | sprintf(name, "uart%d_ick", i+1); | 608 | sprintf(name, "uart%d_ick", i+1); |
| 595 | uart->ick = clk_get(NULL, name); | 609 | uart->ick = clk_get(NULL, name); |
| 596 | if (IS_ERR(uart->ick)) { | 610 | if (IS_ERR(uart->ick)) { |
| @@ -605,8 +619,11 @@ void __init omap_serial_init(void) | |||
| 605 | uart->fck = NULL; | 619 | uart->fck = NULL; |
| 606 | } | 620 | } |
| 607 | 621 | ||
| 608 | if (!uart->ick || !uart->fck) | 622 | /* FIXME: Remove this once the clkdev is ready */ |
| 609 | continue; | 623 | if (!cpu_is_omap44xx()) { |
| 624 | if (!uart->ick || !uart->fck) | ||
| 625 | continue; | ||
| 626 | } | ||
| 610 | 627 | ||
| 611 | uart->num = i; | 628 | uart->num = i; |
| 612 | p->private_data = uart; | 629 | p->private_data = uart; |
| @@ -617,6 +634,18 @@ void __init omap_serial_init(void) | |||
| 617 | p->irq += 32; | 634 | p->irq += 32; |
| 618 | 635 | ||
| 619 | omap_uart_enable_clocks(uart); | 636 | omap_uart_enable_clocks(uart); |
| 637 | } | ||
| 638 | } | ||
| 639 | |||
| 640 | void __init omap_serial_init(void) | ||
| 641 | { | ||
| 642 | int i; | ||
| 643 | |||
| 644 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | ||
| 645 | struct omap_uart_state *uart = &omap_uart[i]; | ||
| 646 | struct platform_device *pdev = &uart->pdev; | ||
| 647 | struct device *dev = &pdev->dev; | ||
| 648 | |||
| 620 | omap_uart_reset(uart); | 649 | omap_uart_reset(uart); |
| 621 | omap_uart_idle_init(uart); | 650 | omap_uart_idle_init(uart); |
| 622 | 651 | ||
