giu.c (2137B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * NEC VR4100 series GIU platform device. 4 * 5 * Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org> 6 */ 7#include <linux/errno.h> 8#include <linux/init.h> 9#include <linux/smp.h> 10#include <linux/ioport.h> 11#include <linux/platform_device.h> 12 13#include <asm/cpu.h> 14#include <asm/vr41xx/giu.h> 15#include <asm/vr41xx/irq.h> 16 17static struct resource giu_50pins_pullupdown_resource[] __initdata = { 18 { 19 .start = 0x0b000100, 20 .end = 0x0b00011f, 21 .flags = IORESOURCE_MEM, 22 }, 23 { 24 .start = 0x0b0002e0, 25 .end = 0x0b0002e3, 26 .flags = IORESOURCE_MEM, 27 }, 28 { 29 .start = GIUINT_IRQ, 30 .end = GIUINT_IRQ, 31 .flags = IORESOURCE_IRQ, 32 }, 33}; 34 35static struct resource giu_36pins_resource[] __initdata = { 36 { 37 .start = 0x0f000140, 38 .end = 0x0f00015f, 39 .flags = IORESOURCE_MEM, 40 }, 41 { 42 .start = GIUINT_IRQ, 43 .end = GIUINT_IRQ, 44 .flags = IORESOURCE_IRQ, 45 }, 46}; 47 48static struct resource giu_48pins_resource[] __initdata = { 49 { 50 .start = 0x0f000140, 51 .end = 0x0f000167, 52 .flags = IORESOURCE_MEM, 53 }, 54 { 55 .start = GIUINT_IRQ, 56 .end = GIUINT_IRQ, 57 .flags = IORESOURCE_IRQ, 58 }, 59}; 60 61static int __init vr41xx_giu_add(void) 62{ 63 struct platform_device *pdev; 64 struct resource *res; 65 unsigned int num; 66 int retval; 67 68 pdev = platform_device_alloc("GIU", -1); 69 if (!pdev) 70 return -ENOMEM; 71 72 switch (current_cpu_type()) { 73 case CPU_VR4111: 74 case CPU_VR4121: 75 pdev->id = GPIO_50PINS_PULLUPDOWN; 76 res = giu_50pins_pullupdown_resource; 77 num = ARRAY_SIZE(giu_50pins_pullupdown_resource); 78 break; 79 case CPU_VR4122: 80 case CPU_VR4131: 81 pdev->id = GPIO_36PINS; 82 res = giu_36pins_resource; 83 num = ARRAY_SIZE(giu_36pins_resource); 84 break; 85 case CPU_VR4133: 86 pdev->id = GPIO_48PINS_EDGE_SELECT; 87 res = giu_48pins_resource; 88 num = ARRAY_SIZE(giu_48pins_resource); 89 break; 90 default: 91 retval = -ENODEV; 92 goto err_free_device; 93 } 94 95 retval = platform_device_add_resources(pdev, res, num); 96 if (retval) 97 goto err_free_device; 98 99 retval = platform_device_add(pdev); 100 if (retval) 101 goto err_free_device; 102 103 return 0; 104 105err_free_device: 106 platform_device_put(pdev); 107 108 return retval; 109} 110device_initcall(vr41xx_giu_add);