18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * 8250 UART probe driver for the BCM47XX platforms 38c2ecf20Sopenharmony_ci * Author: Aurelien Jarno 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 68c2ecf20Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 78c2ecf20Sopenharmony_ci * for more details. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net> 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#include <linux/init.h> 138c2ecf20Sopenharmony_ci#include <linux/serial.h> 148c2ecf20Sopenharmony_ci#include <linux/serial_8250.h> 158c2ecf20Sopenharmony_ci#include <linux/ssb/ssb.h> 168c2ecf20Sopenharmony_ci#include <bcm47xx.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cistatic struct plat_serial8250_port uart8250_data[5]; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic struct platform_device uart8250_device = { 218c2ecf20Sopenharmony_ci .name = "serial8250", 228c2ecf20Sopenharmony_ci .id = PLAT8250_DEV_PLATFORM, 238c2ecf20Sopenharmony_ci .dev = { 248c2ecf20Sopenharmony_ci .platform_data = uart8250_data, 258c2ecf20Sopenharmony_ci }, 268c2ecf20Sopenharmony_ci}; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#ifdef CONFIG_BCM47XX_SSB 298c2ecf20Sopenharmony_cistatic int __init uart8250_init_ssb(void) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci int i; 328c2ecf20Sopenharmony_ci struct ssb_mipscore *mcore = &(bcm47xx_bus.ssb.mipscore); 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci memset(&uart8250_data, 0, sizeof(uart8250_data)); 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci for (i = 0; i < mcore->nr_serial_ports && 378c2ecf20Sopenharmony_ci i < ARRAY_SIZE(uart8250_data) - 1; i++) { 388c2ecf20Sopenharmony_ci struct plat_serial8250_port *p = &(uart8250_data[i]); 398c2ecf20Sopenharmony_ci struct ssb_serial_port *ssb_port = &(mcore->serial_ports[i]); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci p->mapbase = (unsigned int)ssb_port->regs; 428c2ecf20Sopenharmony_ci p->membase = (void *)ssb_port->regs; 438c2ecf20Sopenharmony_ci p->irq = ssb_port->irq + 2; 448c2ecf20Sopenharmony_ci p->uartclk = ssb_port->baud_base; 458c2ecf20Sopenharmony_ci p->regshift = ssb_port->reg_shift; 468c2ecf20Sopenharmony_ci p->iotype = UPIO_MEM; 478c2ecf20Sopenharmony_ci p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 488c2ecf20Sopenharmony_ci } 498c2ecf20Sopenharmony_ci return platform_device_register(&uart8250_device); 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ci#endif 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci#ifdef CONFIG_BCM47XX_BCMA 548c2ecf20Sopenharmony_cistatic int __init uart8250_init_bcma(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci int i; 578c2ecf20Sopenharmony_ci struct bcma_drv_cc *cc = &(bcm47xx_bus.bcma.bus.drv_cc); 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci memset(&uart8250_data, 0, sizeof(uart8250_data)); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci for (i = 0; i < cc->nr_serial_ports && 628c2ecf20Sopenharmony_ci i < ARRAY_SIZE(uart8250_data) - 1; i++) { 638c2ecf20Sopenharmony_ci struct plat_serial8250_port *p = &(uart8250_data[i]); 648c2ecf20Sopenharmony_ci struct bcma_serial_port *bcma_port; 658c2ecf20Sopenharmony_ci bcma_port = &(cc->serial_ports[i]); 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci p->mapbase = (unsigned int)bcma_port->regs; 688c2ecf20Sopenharmony_ci p->membase = (void *)bcma_port->regs; 698c2ecf20Sopenharmony_ci p->irq = bcma_port->irq; 708c2ecf20Sopenharmony_ci p->uartclk = bcma_port->baud_base; 718c2ecf20Sopenharmony_ci p->regshift = bcma_port->reg_shift; 728c2ecf20Sopenharmony_ci p->iotype = UPIO_MEM; 738c2ecf20Sopenharmony_ci p->flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; 748c2ecf20Sopenharmony_ci } 758c2ecf20Sopenharmony_ci return platform_device_register(&uart8250_device); 768c2ecf20Sopenharmony_ci} 778c2ecf20Sopenharmony_ci#endif 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic int __init uart8250_init(void) 808c2ecf20Sopenharmony_ci{ 818c2ecf20Sopenharmony_ci switch (bcm47xx_bus_type) { 828c2ecf20Sopenharmony_ci#ifdef CONFIG_BCM47XX_SSB 838c2ecf20Sopenharmony_ci case BCM47XX_BUS_TYPE_SSB: 848c2ecf20Sopenharmony_ci return uart8250_init_ssb(); 858c2ecf20Sopenharmony_ci#endif 868c2ecf20Sopenharmony_ci#ifdef CONFIG_BCM47XX_BCMA 878c2ecf20Sopenharmony_ci case BCM47XX_BUS_TYPE_BCMA: 888c2ecf20Sopenharmony_ci return uart8250_init_bcma(); 898c2ecf20Sopenharmony_ci#endif 908c2ecf20Sopenharmony_ci } 918c2ecf20Sopenharmony_ci return -EINVAL; 928c2ecf20Sopenharmony_ci} 938c2ecf20Sopenharmony_cidevice_initcall(uart8250_init); 94