GNU Linux-libre 4.19.286-gnu1
[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
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_3368() && !BCMCPU_IS_6358() &&
58                 !BCMCPU_IS_6368()))
59                 return -ENODEV;
60
61         if (id == 0) {
62                 uart0_resources[0].start = bcm63xx_regset_address(RSET_UART0);
63                 uart0_resources[0].end = uart0_resources[0].start +
64                         RSET_UART_SIZE - 1;
65                 uart0_resources[1].start = bcm63xx_get_irq_number(IRQ_UART0);
66         }
67
68         if (id == 1) {
69                 uart1_resources[0].start = bcm63xx_regset_address(RSET_UART1);
70                 uart1_resources[0].end = uart1_resources[0].start +
71                         RSET_UART_SIZE - 1;
72                 uart1_resources[1].start = bcm63xx_get_irq_number(IRQ_UART1);
73         }
74
75         return platform_device_register(&bcm63xx_uart_devices[id]);
76 }