18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * NEC VR4100 series SIU platform device. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2007-2008 Yoichi Yuasa <yuasa@linux-mips.org> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/errno.h> 88c2ecf20Sopenharmony_ci#include <linux/init.h> 98c2ecf20Sopenharmony_ci#include <linux/ioport.h> 108c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 118c2ecf20Sopenharmony_ci#include <linux/serial_core.h> 128c2ecf20Sopenharmony_ci#include <linux/irq.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <asm/cpu.h> 158c2ecf20Sopenharmony_ci#include <asm/vr41xx/siu.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic unsigned int siu_type1_ports[SIU_PORTS_MAX] __initdata = { 188c2ecf20Sopenharmony_ci PORT_VR41XX_SIU, 198c2ecf20Sopenharmony_ci PORT_UNKNOWN, 208c2ecf20Sopenharmony_ci}; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic struct resource siu_type1_resource[] __initdata = { 238c2ecf20Sopenharmony_ci { 248c2ecf20Sopenharmony_ci .start = 0x0c000000, 258c2ecf20Sopenharmony_ci .end = 0x0c00000a, 268c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 278c2ecf20Sopenharmony_ci }, 288c2ecf20Sopenharmony_ci { 298c2ecf20Sopenharmony_ci .start = SIU_IRQ, 308c2ecf20Sopenharmony_ci .end = SIU_IRQ, 318c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 328c2ecf20Sopenharmony_ci }, 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic unsigned int siu_type2_ports[SIU_PORTS_MAX] __initdata = { 368c2ecf20Sopenharmony_ci PORT_VR41XX_SIU, 378c2ecf20Sopenharmony_ci PORT_VR41XX_DSIU, 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_cistatic struct resource siu_type2_resource[] __initdata = { 418c2ecf20Sopenharmony_ci { 428c2ecf20Sopenharmony_ci .start = 0x0f000800, 438c2ecf20Sopenharmony_ci .end = 0x0f00080a, 448c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 458c2ecf20Sopenharmony_ci }, 468c2ecf20Sopenharmony_ci { 478c2ecf20Sopenharmony_ci .start = 0x0f000820, 488c2ecf20Sopenharmony_ci .end = 0x0f000829, 498c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 508c2ecf20Sopenharmony_ci }, 518c2ecf20Sopenharmony_ci { 528c2ecf20Sopenharmony_ci .start = SIU_IRQ, 538c2ecf20Sopenharmony_ci .end = SIU_IRQ, 548c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 558c2ecf20Sopenharmony_ci }, 568c2ecf20Sopenharmony_ci { 578c2ecf20Sopenharmony_ci .start = DSIU_IRQ, 588c2ecf20Sopenharmony_ci .end = DSIU_IRQ, 598c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 608c2ecf20Sopenharmony_ci }, 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_cistatic int __init vr41xx_siu_add(void) 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci struct platform_device *pdev; 668c2ecf20Sopenharmony_ci struct resource *res; 678c2ecf20Sopenharmony_ci unsigned int num; 688c2ecf20Sopenharmony_ci int retval; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci pdev = platform_device_alloc("SIU", -1); 718c2ecf20Sopenharmony_ci if (!pdev) 728c2ecf20Sopenharmony_ci return -ENOMEM; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci switch (current_cpu_type()) { 758c2ecf20Sopenharmony_ci case CPU_VR4111: 768c2ecf20Sopenharmony_ci case CPU_VR4121: 778c2ecf20Sopenharmony_ci pdev->dev.platform_data = siu_type1_ports; 788c2ecf20Sopenharmony_ci res = siu_type1_resource; 798c2ecf20Sopenharmony_ci num = ARRAY_SIZE(siu_type1_resource); 808c2ecf20Sopenharmony_ci break; 818c2ecf20Sopenharmony_ci case CPU_VR4122: 828c2ecf20Sopenharmony_ci case CPU_VR4131: 838c2ecf20Sopenharmony_ci case CPU_VR4133: 848c2ecf20Sopenharmony_ci pdev->dev.platform_data = siu_type2_ports; 858c2ecf20Sopenharmony_ci res = siu_type2_resource; 868c2ecf20Sopenharmony_ci num = ARRAY_SIZE(siu_type2_resource); 878c2ecf20Sopenharmony_ci break; 888c2ecf20Sopenharmony_ci default: 898c2ecf20Sopenharmony_ci retval = -ENODEV; 908c2ecf20Sopenharmony_ci goto err_free_device; 918c2ecf20Sopenharmony_ci } 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci retval = platform_device_add_resources(pdev, res, num); 948c2ecf20Sopenharmony_ci if (retval) 958c2ecf20Sopenharmony_ci goto err_free_device; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci retval = platform_device_add(pdev); 988c2ecf20Sopenharmony_ci if (retval) 998c2ecf20Sopenharmony_ci goto err_free_device; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci return 0; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cierr_free_device: 1048c2ecf20Sopenharmony_ci platform_device_put(pdev); 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci return retval; 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_cidevice_initcall(vr41xx_siu_add); 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_civoid __init vr41xx_siu_setup(void) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci struct uart_port port; 1138c2ecf20Sopenharmony_ci struct resource *res; 1148c2ecf20Sopenharmony_ci unsigned int *type; 1158c2ecf20Sopenharmony_ci int i; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci switch (current_cpu_type()) { 1188c2ecf20Sopenharmony_ci case CPU_VR4111: 1198c2ecf20Sopenharmony_ci case CPU_VR4121: 1208c2ecf20Sopenharmony_ci type = siu_type1_ports; 1218c2ecf20Sopenharmony_ci res = siu_type1_resource; 1228c2ecf20Sopenharmony_ci break; 1238c2ecf20Sopenharmony_ci case CPU_VR4122: 1248c2ecf20Sopenharmony_ci case CPU_VR4131: 1258c2ecf20Sopenharmony_ci case CPU_VR4133: 1268c2ecf20Sopenharmony_ci type = siu_type2_ports; 1278c2ecf20Sopenharmony_ci res = siu_type2_resource; 1288c2ecf20Sopenharmony_ci break; 1298c2ecf20Sopenharmony_ci default: 1308c2ecf20Sopenharmony_ci return; 1318c2ecf20Sopenharmony_ci } 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci for (i = 0; i < SIU_PORTS_MAX; i++) { 1348c2ecf20Sopenharmony_ci port.line = i; 1358c2ecf20Sopenharmony_ci port.type = type[i]; 1368c2ecf20Sopenharmony_ci if (port.type == PORT_UNKNOWN) 1378c2ecf20Sopenharmony_ci break; 1388c2ecf20Sopenharmony_ci port.mapbase = res[i].start; 1398c2ecf20Sopenharmony_ci port.membase = (unsigned char __iomem *)KSEG1ADDR(res[i].start); 1408c2ecf20Sopenharmony_ci vr41xx_siu_early_setup(&port); 1418c2ecf20Sopenharmony_ci } 1428c2ecf20Sopenharmony_ci} 143