rtc: cmos: Call cmos_wake_setup() from cmos_do_probe()
[platform/kernel/linux-starfive.git] / drivers / rtc / rtc-cmos.c
index 58cc2ba..a842622 100644 (file)
@@ -744,6 +744,8 @@ static irqreturn_t cmos_interrupt(int irq, void *p)
                return IRQ_NONE;
 }
 
+static void cmos_wake_setup(struct device *dev);
+
 #ifdef CONFIG_PNP
 #define        INITSECTION
 
@@ -827,19 +829,27 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
                if (info->address_space)
                        address_space = info->address_space;
 
-               if (info->rtc_day_alarm && info->rtc_day_alarm < 128)
-                       cmos_rtc.day_alrm = info->rtc_day_alarm;
-               if (info->rtc_mon_alarm && info->rtc_mon_alarm < 128)
-                       cmos_rtc.mon_alrm = info->rtc_mon_alarm;
-               if (info->rtc_century && info->rtc_century < 128)
-                       cmos_rtc.century = info->rtc_century;
+               cmos_rtc.day_alrm = info->rtc_day_alarm;
+               cmos_rtc.mon_alrm = info->rtc_mon_alarm;
+               cmos_rtc.century = info->rtc_century;
 
                if (info->wake_on && info->wake_off) {
                        cmos_rtc.wake_on = info->wake_on;
                        cmos_rtc.wake_off = info->wake_off;
                }
+       } else {
+               cmos_wake_setup(dev);
        }
 
+       if (cmos_rtc.day_alrm >= 128)
+               cmos_rtc.day_alrm = 0;
+
+       if (cmos_rtc.mon_alrm >= 128)
+               cmos_rtc.mon_alrm = 0;
+
+       if (cmos_rtc.century >= 128)
+               cmos_rtc.century = 0;
+
        cmos_rtc.dev = dev;
        dev_set_drvdata(dev, &cmos_rtc);
 
@@ -1275,13 +1285,6 @@ static void use_acpi_alarm_quirks(void)
 static inline void use_acpi_alarm_quirks(void) { }
 #endif
 
-/* Every ACPI platform has a mc146818 compatible "cmos rtc".  Here we find
- * its device node and pass extra config data.  This helps its driver use
- * capabilities that the now-obsolete mc146818 didn't have, and informs it
- * that this board's RTC is wakeup-capable (per ACPI spec).
- */
-static struct cmos_rtc_board_info acpi_rtc_info;
-
 static void cmos_wake_setup(struct device *dev)
 {
        if (acpi_disabled)
@@ -1289,26 +1292,23 @@ static void cmos_wake_setup(struct device *dev)
 
        use_acpi_alarm_quirks();
 
-       acpi_rtc_info.wake_on = rtc_wake_on;
-       acpi_rtc_info.wake_off = rtc_wake_off;
+       cmos_rtc.wake_on = rtc_wake_on;
+       cmos_rtc.wake_off = rtc_wake_off;
 
-       /* workaround bug in some ACPI tables */
+       /* ACPI tables bug workaround. */
        if (acpi_gbl_FADT.month_alarm && !acpi_gbl_FADT.day_alarm) {
                dev_dbg(dev, "bogus FADT month_alarm (%d)\n",
                        acpi_gbl_FADT.month_alarm);
                acpi_gbl_FADT.month_alarm = 0;
        }
 
-       acpi_rtc_info.rtc_day_alarm = acpi_gbl_FADT.day_alarm;
-       acpi_rtc_info.rtc_mon_alarm = acpi_gbl_FADT.month_alarm;
-       acpi_rtc_info.rtc_century = acpi_gbl_FADT.century;
+       cmos_rtc.day_alrm = acpi_gbl_FADT.day_alarm;
+       cmos_rtc.mon_alrm = acpi_gbl_FADT.month_alarm;
+       cmos_rtc.century = acpi_gbl_FADT.century;
 
-       /* NOTE:  S4_RTC_WAKE is NOT currently useful to Linux */
        if (acpi_gbl_FADT.flags & ACPI_FADT_S4_RTC_WAKE)
                dev_info(dev, "RTC can wake from S4\n");
 
-       dev->platform_data = &acpi_rtc_info;
-
        /* RTC always wakes from S1/S2/S3, and often S4/STD */
        device_init_wakeup(dev, 1);
 }
@@ -1359,8 +1359,6 @@ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
 {
        int irq, ret;
 
-       cmos_wake_setup(&pnp->dev);
-
        if (pnp_port_start(pnp, 0) == 0x70 && !pnp_irq_valid(pnp, 0)) {
                irq = 0;
 #ifdef CONFIG_X86
@@ -1468,7 +1466,6 @@ static int __init cmos_platform_probe(struct platform_device *pdev)
        int irq, ret;
 
        cmos_of_init(pdev);
-       cmos_wake_setup(&pdev->dev);
 
        if (RTC_IOMAPPED)
                resource = platform_get_resource(pdev, IORESOURCE_IO, 0);