18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * NEC VR4100 series RTC 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/irq.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic struct resource rtc_type1_resource[] __initdata = { 178c2ecf20Sopenharmony_ci { 188c2ecf20Sopenharmony_ci .start = 0x0b0000c0, 198c2ecf20Sopenharmony_ci .end = 0x0b0000df, 208c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 218c2ecf20Sopenharmony_ci }, 228c2ecf20Sopenharmony_ci { 238c2ecf20Sopenharmony_ci .start = 0x0b0001c0, 248c2ecf20Sopenharmony_ci .end = 0x0b0001df, 258c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 268c2ecf20Sopenharmony_ci }, 278c2ecf20Sopenharmony_ci { 288c2ecf20Sopenharmony_ci .start = ELAPSEDTIME_IRQ, 298c2ecf20Sopenharmony_ci .end = ELAPSEDTIME_IRQ, 308c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 318c2ecf20Sopenharmony_ci }, 328c2ecf20Sopenharmony_ci { 338c2ecf20Sopenharmony_ci .start = RTCLONG1_IRQ, 348c2ecf20Sopenharmony_ci .end = RTCLONG1_IRQ, 358c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 368c2ecf20Sopenharmony_ci }, 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistatic struct resource rtc_type2_resource[] __initdata = { 408c2ecf20Sopenharmony_ci { 418c2ecf20Sopenharmony_ci .start = 0x0f000100, 428c2ecf20Sopenharmony_ci .end = 0x0f00011f, 438c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 448c2ecf20Sopenharmony_ci }, 458c2ecf20Sopenharmony_ci { 468c2ecf20Sopenharmony_ci .start = 0x0f000120, 478c2ecf20Sopenharmony_ci .end = 0x0f00013f, 488c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 498c2ecf20Sopenharmony_ci }, 508c2ecf20Sopenharmony_ci { 518c2ecf20Sopenharmony_ci .start = ELAPSEDTIME_IRQ, 528c2ecf20Sopenharmony_ci .end = ELAPSEDTIME_IRQ, 538c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 548c2ecf20Sopenharmony_ci }, 558c2ecf20Sopenharmony_ci { 568c2ecf20Sopenharmony_ci .start = RTCLONG1_IRQ, 578c2ecf20Sopenharmony_ci .end = RTCLONG1_IRQ, 588c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 598c2ecf20Sopenharmony_ci }, 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistatic int __init vr41xx_rtc_add(void) 638c2ecf20Sopenharmony_ci{ 648c2ecf20Sopenharmony_ci struct platform_device *pdev; 658c2ecf20Sopenharmony_ci struct resource *res; 668c2ecf20Sopenharmony_ci unsigned int num; 678c2ecf20Sopenharmony_ci int retval; 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci pdev = platform_device_alloc("RTC", -1); 708c2ecf20Sopenharmony_ci if (!pdev) 718c2ecf20Sopenharmony_ci return -ENOMEM; 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci switch (current_cpu_type()) { 748c2ecf20Sopenharmony_ci case CPU_VR4111: 758c2ecf20Sopenharmony_ci case CPU_VR4121: 768c2ecf20Sopenharmony_ci res = rtc_type1_resource; 778c2ecf20Sopenharmony_ci num = ARRAY_SIZE(rtc_type1_resource); 788c2ecf20Sopenharmony_ci break; 798c2ecf20Sopenharmony_ci case CPU_VR4122: 808c2ecf20Sopenharmony_ci case CPU_VR4131: 818c2ecf20Sopenharmony_ci case CPU_VR4133: 828c2ecf20Sopenharmony_ci res = rtc_type2_resource; 838c2ecf20Sopenharmony_ci num = ARRAY_SIZE(rtc_type2_resource); 848c2ecf20Sopenharmony_ci break; 858c2ecf20Sopenharmony_ci default: 868c2ecf20Sopenharmony_ci retval = -ENODEV; 878c2ecf20Sopenharmony_ci goto err_free_device; 888c2ecf20Sopenharmony_ci } 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci retval = platform_device_add_resources(pdev, res, num); 918c2ecf20Sopenharmony_ci if (retval) 928c2ecf20Sopenharmony_ci goto err_free_device; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci retval = platform_device_add(pdev); 958c2ecf20Sopenharmony_ci if (retval) 968c2ecf20Sopenharmony_ci goto err_free_device; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci return 0; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_cierr_free_device: 1018c2ecf20Sopenharmony_ci platform_device_put(pdev); 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ci return retval; 1048c2ecf20Sopenharmony_ci} 1058c2ecf20Sopenharmony_cidevice_initcall(vr41xx_rtc_add); 106