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