diff options
Diffstat (limited to 'arch/arm/mach-omap2/serial.c')
-rw-r--r-- | arch/arm/mach-omap2/serial.c | 77 |
1 files changed, 58 insertions, 19 deletions
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index a7421a50410b..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, |
@@ -109,10 +109,35 @@ static struct plat_serial8250_port serial_platform_data2[] = { | |||
109 | .regshift = 2, | 109 | .regshift = 2, |
110 | .uartclk = OMAP24XX_BASE_BAUD * 16, | 110 | .uartclk = OMAP24XX_BASE_BAUD * 16, |
111 | }, { | 111 | }, { |
112 | #ifdef CONFIG_ARCH_OMAP4 | ||
113 | .membase = IO_ADDRESS(OMAP_UART4_BASE), | ||
114 | .mapbase = OMAP_UART4_BASE, | ||
115 | .irq = 70, | ||
116 | .flags = UPF_BOOT_AUTOCONF, | ||
117 | .iotype = UPIO_MEM, | ||
118 | .regshift = 2, | ||
119 | .uartclk = OMAP24XX_BASE_BAUD * 16, | ||
120 | }, { | ||
121 | #endif | ||
112 | .flags = 0 | 122 | .flags = 0 |
113 | } | 123 | } |
114 | }; | 124 | }; |
115 | 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 | ||
116 | 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, |
117 | int offset) | 142 | int offset) |
118 | { | 143 | { |
@@ -460,7 +485,7 @@ static void omap_uart_idle_init(struct omap_uart_state *uart) | |||
460 | uart->padconf = 0; | 485 | uart->padconf = 0; |
461 | } | 486 | } |
462 | 487 | ||
463 | p->flags |= UPF_SHARE_IRQ; | 488 | p->irqflags |= IRQF_SHARED; |
464 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, | 489 | ret = request_irq(p->irq, omap_uart_interrupt, IRQF_SHARED, |
465 | "serial idle", (void *)uart); | 490 | "serial idle", (void *)uart); |
466 | WARN_ON(ret); | 491 | WARN_ON(ret); |
@@ -550,12 +575,22 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { | |||
550 | }, | 575 | }, |
551 | }, | 576 | }, |
552 | }, | 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 | ||
553 | }; | 589 | }; |
554 | 590 | ||
555 | void __init omap_serial_init(void) | 591 | void __init omap_serial_early_init(void) |
556 | { | 592 | { |
557 | int i; | 593 | int i; |
558 | const struct omap_uart_config *info; | ||
559 | char name[16]; | 594 | char name[16]; |
560 | 595 | ||
561 | /* | 596 | /* |
@@ -564,23 +599,12 @@ void __init omap_serial_init(void) | |||
564 | * if not needed. | 599 | * if not needed. |
565 | */ | 600 | */ |
566 | 601 | ||
567 | info = omap_get_config(OMAP_TAG_UART, struct omap_uart_config); | ||
568 | |||
569 | if (info == NULL) | ||
570 | return; | ||
571 | |||
572 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { | 602 | for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { |
573 | struct omap_uart_state *uart = &omap_uart[i]; | 603 | struct omap_uart_state *uart = &omap_uart[i]; |
574 | struct platform_device *pdev = &uart->pdev; | 604 | struct platform_device *pdev = &uart->pdev; |
575 | struct device *dev = &pdev->dev; | 605 | struct device *dev = &pdev->dev; |
576 | struct plat_serial8250_port *p = dev->platform_data; | 606 | struct plat_serial8250_port *p = dev->platform_data; |
577 | 607 | ||
578 | if (!(info->enabled_uarts & (1 << i))) { | ||
579 | p->membase = NULL; | ||
580 | p->mapbase = 0; | ||
581 | continue; | ||
582 | } | ||
583 | |||
584 | sprintf(name, "uart%d_ick", i+1); | 608 | sprintf(name, "uart%d_ick", i+1); |
585 | uart->ick = clk_get(NULL, name); | 609 | uart->ick = clk_get(NULL, name); |
586 | if (IS_ERR(uart->ick)) { | 610 | if (IS_ERR(uart->ick)) { |
@@ -595,8 +619,11 @@ void __init omap_serial_init(void) | |||
595 | uart->fck = NULL; | 619 | uart->fck = NULL; |
596 | } | 620 | } |
597 | 621 | ||
598 | if (!uart->ick || !uart->fck) | 622 | /* FIXME: Remove this once the clkdev is ready */ |
599 | continue; | 623 | if (!cpu_is_omap44xx()) { |
624 | if (!uart->ick || !uart->fck) | ||
625 | continue; | ||
626 | } | ||
600 | 627 | ||
601 | uart->num = i; | 628 | uart->num = i; |
602 | p->private_data = uart; | 629 | p->private_data = uart; |
@@ -607,6 +634,18 @@ void __init omap_serial_init(void) | |||
607 | p->irq += 32; | 634 | p->irq += 32; |
608 | 635 | ||
609 | 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 | |||
610 | omap_uart_reset(uart); | 649 | omap_uart_reset(uart); |
611 | omap_uart_idle_init(uart); | 650 | omap_uart_idle_init(uart); |
612 | 651 | ||