Merge branch 'egalax' into for-linus
[pandora-kernel.git] / arch / mips / bcm63xx / dev-uart.c
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
7  */
8
9 #include <linux/init.h>
10 #include <linux/kernel.h>
11 #include <linux/platform_device.h>
12 #include <bcm63xx_cpu.h>
13
14 static struct resource uart0_resources[] = {
15         {
16                 /* start & end filled at runtime */
17                 .flags          = IORESOURCE_MEM,
18         },
19         {
20                 /* start filled at runtime */
21                 .flags          = IORESOURCE_IRQ,
22         },
23 };
24
25 static struct resource uart1_resources[] = {
26         {
27                 /* start & end filled at runtime */
28                 .flags          = IORESOURCE_MEM,
29         },
30         {
31                 /* start filled at runtime */
32                 .flags          = IORESOURCE_IRQ,
33         },
34 };
35
36 static struct platform_device bcm63xx_uart_devices[] = {
37         {
38                 .name           = "bcm63xx_uart",
39                 .id             = 0,
40                 .num_resources  = ARRAY_SIZE(uart0_resources),
41                 .resource       = uart0_resources,
42         },
43
44         {
45                 .name           = "bcm63xx_uart",
46                 .id             = 1,
47                 .num_resources  = ARRAY_SIZE(uart1_resources),
48                 .resource       = uart1_resources,
49         }
50 };
51
52 int __init bcm63xx_uart_register(unsigned int id)
53 {
54         if (id >= ARRAY_SIZE(bcm63xx_uart_devices))
55                 return -ENODEV;
56
57         if (id == 1 && !BCMCPU_IS_6358())
58                 return -ENODEV;
59
60         if (id == 0) {
61                 uart0_resources[0].start = bcm63xx_regset_address(RSET_UART0);
62                 uart0_resources[0].end = uart0_resources[0].start +
63                         RSET_UART_SIZE - 1;
64                 uart0_resources[1].start = bcm63xx_get_irq_number(IRQ_UART0);
65         }
66
67         if (id == 1) {
68                 uart1_resources[0].start = bcm63xx_regset_address(RSET_UART1);
69                 uart1_resources[0].end = uart1_resources[0].start +
70                         RSET_UART_SIZE - 1;
71                 uart1_resources[1].start = bcm63xx_get_irq_number(IRQ_UART1);
72         }
73
74         return platform_device_register(&bcm63xx_uart_devices[id]);
75 }