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 34*9cbeac05SHauke Mehrtens for (i = 0; i < mcore->nr_serial_ports && 35*9cbeac05SHauke Mehrtens i < ARRAY_SIZE(uart8250_data) - 1; i++) { 361c0c13ebSAurelien Jarno struct plat_serial8250_port *p = &(uart8250_data[i]); 371c0c13ebSAurelien Jarno struct ssb_serial_port *ssb_port = &(mcore->serial_ports[i]); 381c0c13ebSAurelien Jarno 391c0c13ebSAurelien Jarno p->mapbase = (unsigned int) ssb_port->regs; 401c0c13ebSAurelien Jarno p->membase = (void *) ssb_port->regs; 411c0c13ebSAurelien Jarno p->irq = ssb_port->irq + 2; 421c0c13ebSAurelien Jarno p->uartclk = ssb_port->baud_base; 431c0c13ebSAurelien Jarno p->regshift = ssb_port->reg_shift; 441c0c13ebSAurelien Jarno p->iotype = UPIO_MEM; 451c0c13ebSAurelien Jarno p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 461c0c13ebSAurelien Jarno } 471c0c13ebSAurelien Jarno return platform_device_register(&uart8250_device); 481c0c13ebSAurelien Jarno } 49a656ffcbSHauke Mehrtens #endif 501c0c13ebSAurelien Jarno 51c1d1c5d4SHauke Mehrtens #ifdef CONFIG_BCM47XX_BCMA 52c1d1c5d4SHauke Mehrtens static int __init uart8250_init_bcma(void) 53c1d1c5d4SHauke Mehrtens { 54c1d1c5d4SHauke Mehrtens int i; 55c1d1c5d4SHauke Mehrtens struct bcma_drv_cc *cc = &(bcm47xx_bus.bcma.bus.drv_cc); 56c1d1c5d4SHauke Mehrtens 57c1d1c5d4SHauke Mehrtens memset(&uart8250_data, 0, sizeof(uart8250_data)); 58c1d1c5d4SHauke Mehrtens 59*9cbeac05SHauke Mehrtens for (i = 0; i < cc->nr_serial_ports && 60*9cbeac05SHauke Mehrtens i < ARRAY_SIZE(uart8250_data) - 1; i++) { 61c1d1c5d4SHauke Mehrtens struct plat_serial8250_port *p = &(uart8250_data[i]); 62c1d1c5d4SHauke Mehrtens struct bcma_serial_port *bcma_port; 63c1d1c5d4SHauke Mehrtens bcma_port = &(cc->serial_ports[i]); 64c1d1c5d4SHauke Mehrtens 65c1d1c5d4SHauke Mehrtens p->mapbase = (unsigned int) bcma_port->regs; 66c1d1c5d4SHauke Mehrtens p->membase = (void *) bcma_port->regs; 67e2aa19faSNathan Hintz p->irq = bcma_port->irq; 68c1d1c5d4SHauke Mehrtens p->uartclk = bcma_port->baud_base; 69c1d1c5d4SHauke Mehrtens p->regshift = bcma_port->reg_shift; 70c1d1c5d4SHauke Mehrtens p->iotype = UPIO_MEM; 71c1d1c5d4SHauke Mehrtens p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 72c1d1c5d4SHauke Mehrtens } 73c1d1c5d4SHauke Mehrtens return platform_device_register(&uart8250_device); 74c1d1c5d4SHauke Mehrtens } 75c1d1c5d4SHauke Mehrtens #endif 76c1d1c5d4SHauke Mehrtens 7708ccf572SHauke Mehrtens static int __init uart8250_init(void) 7808ccf572SHauke Mehrtens { 7908ccf572SHauke Mehrtens switch (bcm47xx_bus_type) { 80a656ffcbSHauke Mehrtens #ifdef CONFIG_BCM47XX_SSB 8108ccf572SHauke Mehrtens case BCM47XX_BUS_TYPE_SSB: 8208ccf572SHauke Mehrtens return uart8250_init_ssb(); 83a656ffcbSHauke Mehrtens #endif 84c1d1c5d4SHauke Mehrtens #ifdef CONFIG_BCM47XX_BCMA 85c1d1c5d4SHauke Mehrtens case BCM47XX_BUS_TYPE_BCMA: 86c1d1c5d4SHauke Mehrtens return uart8250_init_bcma(); 87c1d1c5d4SHauke Mehrtens #endif 8808ccf572SHauke Mehrtens } 8908ccf572SHauke Mehrtens return -EINVAL; 9008ccf572SHauke Mehrtens } 9108ccf572SHauke Mehrtens 921c0c13ebSAurelien Jarno module_init(uart8250_init); 931c0c13ebSAurelien Jarno 941c0c13ebSAurelien Jarno MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>"); 951c0c13ebSAurelien Jarno MODULE_LICENSE("GPL"); 961c0c13ebSAurelien Jarno MODULE_DESCRIPTION("8250 UART probe driver for the BCM47XX platforms"); 97