2 * 8250 UART probe driver for the BCM47XX platforms
3 * Author: Aurelien Jarno
5 * This file is subject to the terms and conditions of the GNU General Public
6 * License. See the file "COPYING" in the main directory of this archive
9 * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
12 #include <linux/init.h>
13 #include <linux/serial.h>
14 #include <linux/serial_8250.h>
15 #include <linux/ssb/ssb.h>
18 static struct plat_serial8250_port uart8250_data
[5];
20 static struct platform_device uart8250_device
= {
22 .id
= PLAT8250_DEV_PLATFORM
,
24 .platform_data
= uart8250_data
,
28 #ifdef CONFIG_BCM47XX_SSB
29 static int __init
uart8250_init_ssb(void)
32 struct ssb_mipscore
*mcore
= &(bcm47xx_bus
.ssb
.mipscore
);
34 memset(&uart8250_data
, 0, sizeof(uart8250_data
));
36 for (i
= 0; i
< mcore
->nr_serial_ports
&&
37 i
< ARRAY_SIZE(uart8250_data
) - 1; i
++) {
38 struct plat_serial8250_port
*p
= &(uart8250_data
[i
]);
39 struct ssb_serial_port
*ssb_port
= &(mcore
->serial_ports
[i
]);
41 p
->mapbase
= (unsigned int)ssb_port
->regs
;
42 p
->membase
= (void *)ssb_port
->regs
;
43 p
->irq
= ssb_port
->irq
+ 2;
44 p
->uartclk
= ssb_port
->baud_base
;
45 p
->regshift
= ssb_port
->reg_shift
;
47 p
->flags
= UPF_BOOT_AUTOCONF
| UPF_SHARE_IRQ
;
49 return platform_device_register(&uart8250_device
);
53 #ifdef CONFIG_BCM47XX_BCMA
54 static int __init
uart8250_init_bcma(void)
57 struct bcma_drv_cc
*cc
= &(bcm47xx_bus
.bcma
.bus
.drv_cc
);
59 memset(&uart8250_data
, 0, sizeof(uart8250_data
));
61 for (i
= 0; i
< cc
->nr_serial_ports
&&
62 i
< ARRAY_SIZE(uart8250_data
) - 1; i
++) {
63 struct plat_serial8250_port
*p
= &(uart8250_data
[i
]);
64 struct bcma_serial_port
*bcma_port
;
65 bcma_port
= &(cc
->serial_ports
[i
]);
67 p
->mapbase
= (unsigned int)bcma_port
->regs
;
68 p
->membase
= (void *)bcma_port
->regs
;
69 p
->irq
= bcma_port
->irq
;
70 p
->uartclk
= bcma_port
->baud_base
;
71 p
->regshift
= bcma_port
->reg_shift
;
73 p
->flags
= UPF_BOOT_AUTOCONF
| UPF_SHARE_IRQ
;
75 return platform_device_register(&uart8250_device
);
79 static int __init
uart8250_init(void)
81 switch (bcm47xx_bus_type
) {
82 #ifdef CONFIG_BCM47XX_SSB
83 case BCM47XX_BUS_TYPE_SSB
:
84 return uart8250_init_ssb();
86 #ifdef CONFIG_BCM47XX_BCMA
87 case BCM47XX_BUS_TYPE_BCMA
:
88 return uart8250_init_bcma();
93 device_initcall(uart8250_init
);