diff --git a/drivers/rtc/rtc-hym8563.c b/drivers/rtc/rtc-hym8563.c index b18f3ff9c20f..a03b28f2033e 100644 --- a/drivers/rtc/rtc-hym8563.c +++ b/drivers/rtc/rtc-hym8563.c @@ -226,12 +226,39 @@ static int hym8563_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) if (alm_tm->tm_hour >= 24) { alm_tm->tm_hour = 0; alm_tm->tm_mday++; - if (alm_tm->tm_mday > 31) - alm_tm->tm_mday = 0; + alm_tm->tm_wday++; + if (alm_tm->tm_wday > 6) + alm_tm->tm_wday = 0; + switch (alm_tm->tm_mon + 1) { + case 1: + case 3: + case 5: + case 7: + case 8: + case 10: + case 12: + if (alm_tm->tm_mday > 31) + alm_tm->tm_mday = 1; + break; + case 4: + case 6: + case 9: + case 11: + if (alm_tm->tm_mday > 30) + alm_tm->tm_mday = 1; + break; + case 2: + if (alm_tm->tm_year / 4 == 0) { + if (alm_tm->tm_mday > 29) + alm_tm->tm_mday = 1; + } else if (alm_tm->tm_mday > 28) { + alm_tm->tm_mday = 1; + } + break; + } } } } - ret = i2c_smbus_read_byte_data(client, HYM8563_CTL2); if (ret < 0) return ret;