xref: /linux/arch/mips/bcm47xx/serial.c (revision 24bce201d79807b668bf9d9e0aca801c5c0d5f78)
1 /*
2  * 8250 UART probe driver for the BCM47XX platforms
3  * Author: Aurelien Jarno
4  *
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
7  * for more details.
8  *
9  * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
10  */
11 
12 #include <linux/init.h>
13 #include <linux/serial.h>
14 #include <linux/serial_8250.h>
15 #include <linux/ssb/ssb.h>
16 #include <bcm47xx.h>
17 
18 static struct plat_serial8250_port uart8250_data[5];
19 
20 static struct platform_device uart8250_device = {
21 	.name			= "serial8250",
22 	.id			= PLAT8250_DEV_PLATFORM,
23 	.dev			= {
24 		.platform_data	= uart8250_data,
25 	},
26 };
27 
28 #ifdef CONFIG_BCM47XX_SSB
29 static int __init uart8250_init_ssb(void)
30 {
31 	int i;
32 	struct ssb_mipscore *mcore = &(bcm47xx_bus.ssb.mipscore);
33 
34 	memset(&uart8250_data, 0,  sizeof(uart8250_data));
35 
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]);
40 
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;
46 		p->iotype = UPIO_MEM;
47 		p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
48 	}
49 	return platform_device_register(&uart8250_device);
50 }
51 #endif
52 
53 #ifdef CONFIG_BCM47XX_BCMA
54 static int __init uart8250_init_bcma(void)
55 {
56 	int i;
57 	struct bcma_drv_cc *cc = &(bcm47xx_bus.bcma.bus.drv_cc);
58 
59 	memset(&uart8250_data, 0,  sizeof(uart8250_data));
60 
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]);
66 
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;
72 		p->iotype = UPIO_MEM;
73 		p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
74 	}
75 	return platform_device_register(&uart8250_device);
76 }
77 #endif
78 
79 static int __init uart8250_init(void)
80 {
81 	switch (bcm47xx_bus_type) {
82 #ifdef CONFIG_BCM47XX_SSB
83 	case BCM47XX_BUS_TYPE_SSB:
84 		return uart8250_init_ssb();
85 #endif
86 #ifdef CONFIG_BCM47XX_BCMA
87 	case BCM47XX_BUS_TYPE_BCMA:
88 		return uart8250_init_bcma();
89 #endif
90 	}
91 	return -EINVAL;
92 }
93 device_initcall(uart8250_init);
94