Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
[platform/kernel/linux-starfive.git] / arch / mips / sgi-ip32 / ip32-platform.c
index 94191a1..0134db2 100644 (file)
@@ -8,10 +8,13 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/serial_8250.h>
+#include <linux/rtc/ds1685.h>
 
 #include <asm/ip32/mace.h>
 #include <asm/ip32/ip32_ints.h>
 
+extern void ip32_prepare_poweroff(void);
+
 #define MACEISA_SERIAL1_OFFS   offsetof(struct sgi_mace, isa.serial1)
 #define MACEISA_SERIAL2_OFFS   offsetof(struct sgi_mace, isa.serial2)
 
@@ -89,18 +92,47 @@ static __init int sgio2btns_devinit(void)
 
 device_initcall(sgio2btns_devinit);
 
-static struct resource sgio2_cmos_rsrc[] = {
+#define MACE_RTC_RES_START (MACE_BASE + offsetof(struct sgi_mace, isa.rtc))
+#define MACE_RTC_RES_END (MACE_RTC_RES_START + 32767)
+
+static struct resource ip32_rtc_resources[] = {
        {
-               .start = 0x70,
-               .end   = 0x71,
-               .flags = IORESOURCE_IO
+               .start  = MACEISA_RTC_IRQ,
+               .end    = MACEISA_RTC_IRQ,
+               .flags  = IORESOURCE_IRQ
+       }, {
+               .start  = MACE_RTC_RES_START,
+               .end    = MACE_RTC_RES_END,
+               .flags  = IORESOURCE_MEM,
        }
 };
 
-static __init int sgio2_cmos_devinit(void)
+/* RTC registers on IP32 are each padded by 256 bytes (0x100). */
+static struct ds1685_rtc_platform_data
+ip32_rtc_platform_data[] = {
+       {
+               .regstep = 0x100,
+               .bcd_mode = true,
+               .no_irq = false,
+               .uie_unsupported = false,
+               .alloc_io_resources = true,
+               .plat_prepare_poweroff = ip32_prepare_poweroff,
+       },
+};
+
+struct platform_device ip32_rtc_device = {
+       .name                   = "rtc-ds1685",
+       .id                     = -1,
+       .dev                    = {
+               .platform_data  = ip32_rtc_platform_data,
+       },
+       .num_resources          = ARRAY_SIZE(ip32_rtc_resources),
+       .resource               = ip32_rtc_resources,
+};
+
++static int __init sgio2_rtc_devinit(void)
 {
-       return IS_ERR(platform_device_register_simple("rtc_cmos", -1,
-                                                     sgio2_cmos_rsrc, 1));
+       return platform_device_register(&ip32_rtc_device);
 }
 
 device_initcall(sgio2_cmos_devinit);