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
6 * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
9 #include <linux/module.h>
10 #include <linux/init.h>
11 #include <linux/serial.h>
12 #include <linux/serial_8250.h>
13 #include <linux/ssb/ssb.h>
16 static struct plat_serial8250_port uart8250_data
[5];
18 static struct platform_device uart8250_device
= {
20 .id
= PLAT8250_DEV_PLATFORM
,
22 .platform_data
= uart8250_data
,
26 #ifdef CONFIG_BCM47XX_SSB
27 static int __init
uart8250_init_ssb(void)
30 struct ssb_mipscore
*mcore
= &(bcm47xx_bus
.ssb
.mipscore
);
32 memset(&uart8250_data
, 0, sizeof(uart8250_data
));
34 for (i
= 0; i
< mcore
->nr_serial_ports
&&
35 i
< ARRAY_SIZE(uart8250_data
) - 1; i
++) {
36 struct plat_serial8250_port
*p
= &(uart8250_data
[i
]);
37 struct ssb_serial_port
*ssb_port
= &(mcore
->serial_ports
[i
]);
39 p
->mapbase
= (unsigned int) ssb_port
->regs
;
40 p
->membase
= (void *) ssb_port
->regs
;
41 p
->irq
= ssb_port
->irq
+ 2;
42 p
->uartclk
= ssb_port
->baud_base
;
43 p
->regshift
= ssb_port
->reg_shift
;
45 p
->flags
= UPF_BOOT_AUTOCONF
| UPF_SHARE_IRQ
;
47 return platform_device_register(&uart8250_device
);
51 #ifdef CONFIG_BCM47XX_BCMA
52 static int __init
uart8250_init_bcma(void)
55 struct bcma_drv_cc
*cc
= &(bcm47xx_bus
.bcma
.bus
.drv_cc
);
57 memset(&uart8250_data
, 0, sizeof(uart8250_data
));
59 for (i
= 0; i
< cc
->nr_serial_ports
&&
60 i
< ARRAY_SIZE(uart8250_data
) - 1; i
++) {
61 struct plat_serial8250_port
*p
= &(uart8250_data
[i
]);
62 struct bcma_serial_port
*bcma_port
;
63 bcma_port
= &(cc
->serial_ports
[i
]);
65 p
->mapbase
= (unsigned int) bcma_port
->regs
;
66 p
->membase
= (void *) bcma_port
->regs
;
67 p
->irq
= bcma_port
->irq
;
68 p
->uartclk
= bcma_port
->baud_base
;
69 p
->regshift
= bcma_port
->reg_shift
;
71 p
->flags
= UPF_BOOT_AUTOCONF
| UPF_SHARE_IRQ
;
73 return platform_device_register(&uart8250_device
);
77 static int __init
uart8250_init(void)
79 switch (bcm47xx_bus_type
) {
80 #ifdef CONFIG_BCM47XX_SSB
81 case BCM47XX_BUS_TYPE_SSB
:
82 return uart8250_init_ssb();
84 #ifdef CONFIG_BCM47XX_BCMA
85 case BCM47XX_BUS_TYPE_BCMA
:
86 return uart8250_init_bcma();
92 module_init(uart8250_init
);
94 MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>");
95 MODULE_LICENSE("GPL");
96 MODULE_DESCRIPTION("8250 UART probe driver for the BCM47XX platforms");