Some legacy RTC IP revisions has a power-up reset flag in the status register that later revisions lack. As this flag is always read back as set on later revisions (or is overloaded with a different flag), make sure to only clear the flag and print the info message on legacy platforms. Signed-off-by: Johan Hovold <johan@xxxxxxxxxx> --- drivers/rtc/rtc-omap.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 1c58920b0c88..0ef016553a97 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -118,6 +118,12 @@ */ #define OMAP_RTC_HAS_32KCLK_EN BIT(2) +/* + * Some legacy RTC IP revisions has a power-up reset flag which later + * revisions lack. + */ +#define OMAP_RTC_HAS_POWER_UP_RESET BIT(3) + static void __iomem *rtc_base; #define rtc_read(addr) readb(rtc_base + (addr)) @@ -347,6 +353,7 @@ static int omap_rtc_timer; static struct platform_device_id omap_rtc_devtype[] = { { .name = DRIVER_NAME, + .driver_data = OMAP_RTC_HAS_POWER_UP_RESET, }, [OMAP_RTC_DATA_AM3352_IDX] = { .name = "am3352-rtc", @@ -376,7 +383,7 @@ static int __init omap_rtc_probe(struct platform_device *pdev) { struct resource *res; struct rtc_device *rtc; - u8 reg, new_ctrl; + u8 reg, mask, new_ctrl; const struct platform_device_id *id_entry; const struct of_device_id *of_id; @@ -429,12 +436,16 @@ static int __init omap_rtc_probe(struct platform_device *pdev) /* clear old status */ reg = rtc_read(OMAP_RTC_STATUS_REG); - if (reg & (u8) OMAP_RTC_STATUS_POWER_UP) { - dev_info(&pdev->dev, "RTC power up reset detected\n"); - rtc_write(OMAP_RTC_STATUS_POWER_UP, OMAP_RTC_STATUS_REG); + + mask = OMAP_RTC_STATUS_ALARM; + if (id_entry->driver_data & OMAP_RTC_HAS_POWER_UP_RESET) { + mask |= OMAP_RTC_STATUS_POWER_UP; + if (reg & OMAP_RTC_STATUS_POWER_UP) + dev_info(&pdev->dev, "RTC power up reset detected\n"); } - if (reg & (u8) OMAP_RTC_STATUS_ALARM) - rtc_write(OMAP_RTC_STATUS_ALARM, OMAP_RTC_STATUS_REG); + + if (reg & mask) + rtc_write(reg & mask, OMAP_RTC_STATUS_REG); /* handle periodic and alarm irqs */ if (devm_request_irq(&pdev->dev, omap_rtc_timer, rtc_irq, 0, -- 2.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html