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 26a656ffcbSHauke 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 } 48a656ffcbSHauke Mehrtens #endif 491c0c13ebSAurelien Jarno 50c1d1c5d4SHauke Mehrtens #ifdef CONFIG_BCM47XX_BCMA 51c1d1c5d4SHauke Mehrtens static int __init uart8250_init_bcma(void) 52c1d1c5d4SHauke Mehrtens { 53c1d1c5d4SHauke Mehrtens int i; 54c1d1c5d4SHauke Mehrtens struct bcma_drv_cc *cc = &(bcm47xx_bus.bcma.bus.drv_cc); 55c1d1c5d4SHauke Mehrtens 56c1d1c5d4SHauke Mehrtens memset(&uart8250_data, 0, sizeof(uart8250_data)); 57c1d1c5d4SHauke Mehrtens 58c1d1c5d4SHauke Mehrtens for (i = 0; i < cc->nr_serial_ports; i++) { 59c1d1c5d4SHauke Mehrtens struct plat_serial8250_port *p = &(uart8250_data[i]); 60c1d1c5d4SHauke Mehrtens struct bcma_serial_port *bcma_port; 61c1d1c5d4SHauke Mehrtens bcma_port = &(cc->serial_ports[i]); 62c1d1c5d4SHauke Mehrtens 63c1d1c5d4SHauke Mehrtens p->mapbase = (unsigned int) bcma_port->regs; 64c1d1c5d4SHauke Mehrtens p->membase = (void *) bcma_port->regs; 65*e2aa19faSNathan Hintz p->irq = bcma_port->irq; 66c1d1c5d4SHauke Mehrtens p->uartclk = bcma_port->baud_base; 67c1d1c5d4SHauke Mehrtens p->regshift = bcma_port->reg_shift; 68c1d1c5d4SHauke Mehrtens p->iotype = UPIO_MEM; 69c1d1c5d4SHauke Mehrtens p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 70c1d1c5d4SHauke Mehrtens } 71c1d1c5d4SHauke Mehrtens return platform_device_register(&uart8250_device); 72c1d1c5d4SHauke Mehrtens } 73c1d1c5d4SHauke Mehrtens #endif 74c1d1c5d4SHauke Mehrtens 7508ccf572SHauke Mehrtens static int __init uart8250_init(void) 7608ccf572SHauke Mehrtens { 7708ccf572SHauke Mehrtens switch (bcm47xx_bus_type) { 78a656ffcbSHauke Mehrtens #ifdef CONFIG_BCM47XX_SSB 7908ccf572SHauke Mehrtens case BCM47XX_BUS_TYPE_SSB: 8008ccf572SHauke Mehrtens return uart8250_init_ssb(); 81a656ffcbSHauke Mehrtens #endif 82c1d1c5d4SHauke Mehrtens #ifdef CONFIG_BCM47XX_BCMA 83c1d1c5d4SHauke Mehrtens case BCM47XX_BUS_TYPE_BCMA: 84c1d1c5d4SHauke Mehrtens return uart8250_init_bcma(); 85c1d1c5d4SHauke Mehrtens #endif 8608ccf572SHauke Mehrtens } 8708ccf572SHauke Mehrtens return -EINVAL; 8808ccf572SHauke Mehrtens } 8908ccf572SHauke Mehrtens 901c0c13ebSAurelien Jarno module_init(uart8250_init); 911c0c13ebSAurelien Jarno 921c0c13ebSAurelien Jarno MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>"); 931c0c13ebSAurelien Jarno MODULE_LICENSE("GPL"); 941c0c13ebSAurelien Jarno MODULE_DESCRIPTION("8250 UART probe driver for the BCM47XX platforms"); 95