11c0c13ebSAurelien Jarno /* 21c0c13ebSAurelien Jarno * This file is subject to the terms and conditions of the GNU General Public 31c0c13ebSAurelien Jarno * License. See the file "COPYING" in the main directory of this archive 41c0c13ebSAurelien Jarno * for more details. 51c0c13ebSAurelien Jarno * 61c0c13ebSAurelien Jarno * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net> 71c0c13ebSAurelien Jarno */ 81c0c13ebSAurelien Jarno 91c0c13ebSAurelien Jarno #include <linux/module.h> 101c0c13ebSAurelien Jarno #include <linux/init.h> 111c0c13ebSAurelien Jarno #include <linux/serial.h> 121c0c13ebSAurelien Jarno #include <linux/serial_8250.h> 131c0c13ebSAurelien Jarno #include <linux/ssb/ssb.h> 141c0c13ebSAurelien Jarno #include <bcm47xx.h> 151c0c13ebSAurelien Jarno 161c0c13ebSAurelien Jarno static struct plat_serial8250_port uart8250_data[5]; 171c0c13ebSAurelien Jarno 181c0c13ebSAurelien Jarno static struct platform_device uart8250_device = { 191c0c13ebSAurelien Jarno .name = "serial8250", 201c0c13ebSAurelien Jarno .id = PLAT8250_DEV_PLATFORM, 211c0c13ebSAurelien Jarno .dev = { 221c0c13ebSAurelien Jarno .platform_data = uart8250_data, 231c0c13ebSAurelien Jarno }, 241c0c13ebSAurelien Jarno }; 251c0c13ebSAurelien Jarno 26*a656ffcbSHauke Mehrtens #ifdef CONFIG_BCM47XX_SSB 2708ccf572SHauke Mehrtens static int __init uart8250_init_ssb(void) 281c0c13ebSAurelien Jarno { 291c0c13ebSAurelien Jarno int i; 3008ccf572SHauke Mehrtens struct ssb_mipscore *mcore = &(bcm47xx_bus.ssb.mipscore); 311c0c13ebSAurelien Jarno 321c0c13ebSAurelien Jarno memset(&uart8250_data, 0, sizeof(uart8250_data)); 331c0c13ebSAurelien Jarno 341c0c13ebSAurelien Jarno for (i = 0; i < mcore->nr_serial_ports; i++) { 351c0c13ebSAurelien Jarno struct plat_serial8250_port *p = &(uart8250_data[i]); 361c0c13ebSAurelien Jarno struct ssb_serial_port *ssb_port = &(mcore->serial_ports[i]); 371c0c13ebSAurelien Jarno 381c0c13ebSAurelien Jarno p->mapbase = (unsigned int) ssb_port->regs; 391c0c13ebSAurelien Jarno p->membase = (void *) ssb_port->regs; 401c0c13ebSAurelien Jarno p->irq = ssb_port->irq + 2; 411c0c13ebSAurelien Jarno p->uartclk = ssb_port->baud_base; 421c0c13ebSAurelien Jarno p->regshift = ssb_port->reg_shift; 431c0c13ebSAurelien Jarno p->iotype = UPIO_MEM; 441c0c13ebSAurelien Jarno p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 451c0c13ebSAurelien Jarno } 461c0c13ebSAurelien Jarno return platform_device_register(&uart8250_device); 471c0c13ebSAurelien Jarno } 48*a656ffcbSHauke Mehrtens #endif 491c0c13ebSAurelien Jarno 5008ccf572SHauke Mehrtens static int __init uart8250_init(void) 5108ccf572SHauke Mehrtens { 5208ccf572SHauke Mehrtens switch (bcm47xx_bus_type) { 53*a656ffcbSHauke Mehrtens #ifdef CONFIG_BCM47XX_SSB 5408ccf572SHauke Mehrtens case BCM47XX_BUS_TYPE_SSB: 5508ccf572SHauke Mehrtens return uart8250_init_ssb(); 56*a656ffcbSHauke Mehrtens #endif 5708ccf572SHauke Mehrtens } 5808ccf572SHauke Mehrtens return -EINVAL; 5908ccf572SHauke Mehrtens } 6008ccf572SHauke Mehrtens 611c0c13ebSAurelien Jarno module_init(uart8250_init); 621c0c13ebSAurelien Jarno 631c0c13ebSAurelien Jarno MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>"); 641c0c13ebSAurelien Jarno MODULE_LICENSE("GPL"); 651c0c13ebSAurelien Jarno MODULE_DESCRIPTION("8250 UART probe driver for the BCM47XX platforms"); 66