18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * NEC VR4100 series GIU platform device. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#include <linux/errno.h> 88c2ecf20Sopenharmony_ci#include <linux/init.h> 98c2ecf20Sopenharmony_ci#include <linux/smp.h> 108c2ecf20Sopenharmony_ci#include <linux/ioport.h> 118c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <asm/cpu.h> 148c2ecf20Sopenharmony_ci#include <asm/vr41xx/giu.h> 158c2ecf20Sopenharmony_ci#include <asm/vr41xx/irq.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_cistatic struct resource giu_50pins_pullupdown_resource[] __initdata = { 188c2ecf20Sopenharmony_ci { 198c2ecf20Sopenharmony_ci .start = 0x0b000100, 208c2ecf20Sopenharmony_ci .end = 0x0b00011f, 218c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 228c2ecf20Sopenharmony_ci }, 238c2ecf20Sopenharmony_ci { 248c2ecf20Sopenharmony_ci .start = 0x0b0002e0, 258c2ecf20Sopenharmony_ci .end = 0x0b0002e3, 268c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 278c2ecf20Sopenharmony_ci }, 288c2ecf20Sopenharmony_ci { 298c2ecf20Sopenharmony_ci .start = GIUINT_IRQ, 308c2ecf20Sopenharmony_ci .end = GIUINT_IRQ, 318c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 328c2ecf20Sopenharmony_ci }, 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistatic struct resource giu_36pins_resource[] __initdata = { 368c2ecf20Sopenharmony_ci { 378c2ecf20Sopenharmony_ci .start = 0x0f000140, 388c2ecf20Sopenharmony_ci .end = 0x0f00015f, 398c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 408c2ecf20Sopenharmony_ci }, 418c2ecf20Sopenharmony_ci { 428c2ecf20Sopenharmony_ci .start = GIUINT_IRQ, 438c2ecf20Sopenharmony_ci .end = GIUINT_IRQ, 448c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 458c2ecf20Sopenharmony_ci }, 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistatic struct resource giu_48pins_resource[] __initdata = { 498c2ecf20Sopenharmony_ci { 508c2ecf20Sopenharmony_ci .start = 0x0f000140, 518c2ecf20Sopenharmony_ci .end = 0x0f000167, 528c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 538c2ecf20Sopenharmony_ci }, 548c2ecf20Sopenharmony_ci { 558c2ecf20Sopenharmony_ci .start = GIUINT_IRQ, 568c2ecf20Sopenharmony_ci .end = GIUINT_IRQ, 578c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 588c2ecf20Sopenharmony_ci }, 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic int __init vr41xx_giu_add(void) 628c2ecf20Sopenharmony_ci{ 638c2ecf20Sopenharmony_ci struct platform_device *pdev; 648c2ecf20Sopenharmony_ci struct resource *res; 658c2ecf20Sopenharmony_ci unsigned int num; 668c2ecf20Sopenharmony_ci int retval; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci pdev = platform_device_alloc("GIU", -1); 698c2ecf20Sopenharmony_ci if (!pdev) 708c2ecf20Sopenharmony_ci return -ENOMEM; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci switch (current_cpu_type()) { 738c2ecf20Sopenharmony_ci case CPU_VR4111: 748c2ecf20Sopenharmony_ci case CPU_VR4121: 758c2ecf20Sopenharmony_ci pdev->id = GPIO_50PINS_PULLUPDOWN; 768c2ecf20Sopenharmony_ci res = giu_50pins_pullupdown_resource; 778c2ecf20Sopenharmony_ci num = ARRAY_SIZE(giu_50pins_pullupdown_resource); 788c2ecf20Sopenharmony_ci break; 798c2ecf20Sopenharmony_ci case CPU_VR4122: 808c2ecf20Sopenharmony_ci case CPU_VR4131: 818c2ecf20Sopenharmony_ci pdev->id = GPIO_36PINS; 828c2ecf20Sopenharmony_ci res = giu_36pins_resource; 838c2ecf20Sopenharmony_ci num = ARRAY_SIZE(giu_36pins_resource); 848c2ecf20Sopenharmony_ci break; 858c2ecf20Sopenharmony_ci case CPU_VR4133: 868c2ecf20Sopenharmony_ci pdev->id = GPIO_48PINS_EDGE_SELECT; 878c2ecf20Sopenharmony_ci res = giu_48pins_resource; 888c2ecf20Sopenharmony_ci num = ARRAY_SIZE(giu_48pins_resource); 898c2ecf20Sopenharmony_ci break; 908c2ecf20Sopenharmony_ci default: 918c2ecf20Sopenharmony_ci retval = -ENODEV; 928c2ecf20Sopenharmony_ci goto err_free_device; 938c2ecf20Sopenharmony_ci } 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci retval = platform_device_add_resources(pdev, res, num); 968c2ecf20Sopenharmony_ci if (retval) 978c2ecf20Sopenharmony_ci goto err_free_device; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci retval = platform_device_add(pdev); 1008c2ecf20Sopenharmony_ci if (retval) 1018c2ecf20Sopenharmony_ci goto err_free_device; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci return 0; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cierr_free_device: 1068c2ecf20Sopenharmony_ci platform_device_put(pdev); 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci return retval; 1098c2ecf20Sopenharmony_ci} 1108c2ecf20Sopenharmony_cidevice_initcall(vr41xx_giu_add); 111