GNU Linux-libre 6.8.9-gnu
[releases.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 #include <bcm63xx_dev_uart.h>
14
15 static struct resource uart0_resources[] = {
16         {
17                 /* start & end filled at runtime */
18                 .flags          = IORESOURCE_MEM,
19         },
20         {
21                 /* start filled at runtime */
22                 .flags          = IORESOURCE_IRQ,
23         },
24 };
25
26 static struct resource uart1_resources[] = {
27         {
28                 /* start & end filled at runtime */
29                 .flags          = IORESOURCE_MEM,
30         },
31         {
32                 /* start filled at runtime */
33                 .flags          = IORESOURCE_IRQ,
34         },
35 };
36
37 static struct platform_device bcm63xx_uart_devices[] = {
38         {
39                 .name           = "bcm63xx_uart",
40                 .id             = 0,
41                 .num_resources  = ARRAY_SIZE(uart0_resources),
42                 .resource       = uart0_resources,
43         },
44
45         {
46                 .name           = "bcm63xx_uart",
47                 .id             = 1,
48                 .num_resources  = ARRAY_SIZE(uart1_resources),
49                 .resource       = uart1_resources,
50         }
51 };
52
53 int __init bcm63xx_uart_register(unsigned int id)
54 {
55         if (id >= ARRAY_SIZE(bcm63xx_uart_devices))
56                 return -ENODEV;
57
58         if (id == 1 && (!BCMCPU_IS_3368() && !BCMCPU_IS_6358() &&
59                 !BCMCPU_IS_6368()))
60                 return -ENODEV;
61
62         if (id == 0) {
63                 uart0_resources[0].start = bcm63xx_regset_address(RSET_UART0);
64                 uart0_resources[0].end = uart0_resources[0].start +
65                         RSET_UART_SIZE - 1;
66                 uart0_resources[1].start = bcm63xx_get_irq_number(IRQ_UART0);
67         }
68
69         if (id == 1) {
70                 uart1_resources[0].start = bcm63xx_regset_address(RSET_UART1);
71                 uart1_resources[0].end = uart1_resources[0].start +
72                         RSET_UART_SIZE - 1;
73                 uart1_resources[1].start = bcm63xx_get_irq_number(IRQ_UART1);
74         }
75
76         return platform_device_register(&bcm63xx_uart_devices[id]);
77 }