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*08ccf572SHauke Mehrtens static int __init uart8250_init_ssb(void) 271c0c13ebSAurelien Jarno { 281c0c13ebSAurelien Jarno int i; 29*08ccf572SHauke Mehrtens struct ssb_mipscore *mcore = &(bcm47xx_bus.ssb.mipscore); 301c0c13ebSAurelien Jarno 311c0c13ebSAurelien Jarno memset(&uart8250_data, 0, sizeof(uart8250_data)); 321c0c13ebSAurelien Jarno 331c0c13ebSAurelien Jarno for (i = 0; i < mcore->nr_serial_ports; i++) { 341c0c13ebSAurelien Jarno struct plat_serial8250_port *p = &(uart8250_data[i]); 351c0c13ebSAurelien Jarno struct ssb_serial_port *ssb_port = &(mcore->serial_ports[i]); 361c0c13ebSAurelien Jarno 371c0c13ebSAurelien Jarno p->mapbase = (unsigned int) ssb_port->regs; 381c0c13ebSAurelien Jarno p->membase = (void *) ssb_port->regs; 391c0c13ebSAurelien Jarno p->irq = ssb_port->irq + 2; 401c0c13ebSAurelien Jarno p->uartclk = ssb_port->baud_base; 411c0c13ebSAurelien Jarno p->regshift = ssb_port->reg_shift; 421c0c13ebSAurelien Jarno p->iotype = UPIO_MEM; 431c0c13ebSAurelien Jarno p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 441c0c13ebSAurelien Jarno } 451c0c13ebSAurelien Jarno return platform_device_register(&uart8250_device); 461c0c13ebSAurelien Jarno } 471c0c13ebSAurelien Jarno 48*08ccf572SHauke Mehrtens static int __init uart8250_init(void) 49*08ccf572SHauke Mehrtens { 50*08ccf572SHauke Mehrtens switch (bcm47xx_bus_type) { 51*08ccf572SHauke Mehrtens case BCM47XX_BUS_TYPE_SSB: 52*08ccf572SHauke Mehrtens return uart8250_init_ssb(); 53*08ccf572SHauke Mehrtens } 54*08ccf572SHauke Mehrtens return -EINVAL; 55*08ccf572SHauke Mehrtens } 56*08ccf572SHauke Mehrtens 571c0c13ebSAurelien Jarno module_init(uart8250_init); 581c0c13ebSAurelien Jarno 591c0c13ebSAurelien Jarno MODULE_AUTHOR("Aurelien Jarno <aurelien@aurel32.net>"); 601c0c13ebSAurelien Jarno MODULE_LICENSE("GPL"); 611c0c13ebSAurelien Jarno MODULE_DESCRIPTION("8250 UART probe driver for the BCM47XX platforms"); 62