rtc.c revision bd0765098bf22eb8b1319f649a4c3301b40ec04c
1/* 2 * NEC VR4100 series RTC platform device. 3 * 4 * Copyright (C) 2007 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20#include <linux/errno.h> 21#include <linux/init.h> 22#include <linux/ioport.h> 23#include <linux/platform_device.h> 24 25#include <asm/cpu.h> 26#include <asm/vr41xx/irq.h> 27 28static struct resource rtc_type1_resource[] __initdata = { 29 { 30 .start = 0x0b0000c0, 31 .end = 0x0b0000df, 32 .flags = IORESOURCE_MEM, 33 }, 34 { 35 .start = 0x0b0001c0, 36 .end = 0x0b0001df, 37 .flags = IORESOURCE_MEM, 38 }, 39 { 40 .start = ELAPSEDTIME_IRQ, 41 .end = ELAPSEDTIME_IRQ, 42 .flags = IORESOURCE_IRQ, 43 }, 44 { 45 .start = RTCLONG1_IRQ, 46 .end = RTCLONG1_IRQ, 47 .flags = IORESOURCE_IRQ, 48 }, 49}; 50 51static struct resource rtc_type2_resource[] __initdata = { 52 { 53 .start = 0x0f000100, 54 .end = 0x0f00011f, 55 .flags = IORESOURCE_MEM, 56 }, 57 { 58 .start = 0x0f000120, 59 .end = 0x0f00013f, 60 .flags = IORESOURCE_MEM, 61 }, 62 { 63 .start = ELAPSEDTIME_IRQ, 64 .end = ELAPSEDTIME_IRQ, 65 .flags = IORESOURCE_IRQ, 66 }, 67 { 68 .start = RTCLONG1_IRQ, 69 .end = RTCLONG1_IRQ, 70 .flags = IORESOURCE_IRQ, 71 }, 72}; 73 74static int __init vr41xx_rtc_add(void) 75{ 76 struct platform_device *pdev; 77 struct resource *res; 78 unsigned int num; 79 int retval; 80 81 pdev = platform_device_alloc("RTC", -1); 82 if (!pdev) 83 return -ENOMEM; 84 85 switch (current_cpu_data.cputype) { 86 case CPU_VR4111: 87 case CPU_VR4121: 88 res = rtc_type1_resource; 89 num = ARRAY_SIZE(rtc_type1_resource); 90 break; 91 case CPU_VR4122: 92 case CPU_VR4131: 93 case CPU_VR4133: 94 res = rtc_type2_resource; 95 num = ARRAY_SIZE(rtc_type2_resource); 96 break; 97 default: 98 retval = -ENODEV; 99 goto err_free_device; 100 } 101 102 retval = platform_device_add_resources(pdev, res, num); 103 if (retval) 104 goto err_free_device; 105 106 retval = platform_device_add(pdev); 107 if (retval) 108 goto err_free_device; 109 110 return 0; 111 112err_free_device: 113 platform_device_put(pdev); 114 115 return retval; 116} 117device_initcall(vr41xx_rtc_add); 118