Merge tag 'rtc-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux
Pull RTC updates from Alexandre Belloni: "Subsystem: - non-modular drivers are now explicitly non-modular New driver: - Epson Toyocom rtc-7301sf/dg Drivers: - cmos: reject unsupported alarm values wrt the RTC capabilities - ds1307: ACPI support - jz4740: DT support, jz4780 handling, can now be used as a system power controller - mcp795: many fixes, in particular proper month handling - twl: driver is now DT only" * tag 'rtc-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (31 commits) rtc: mcp795: Fix whitespace and indentation. rtc: mcp795: Prefer using the BIT() macro. rtc: mcp795: fix month write resetting date to 1. rtc: mcp795: fix time range difference between linux and RTC chip. rtc: mcp795: fix bitmask value for leap year (LP). rtc: mcp795: use bcd2bin/bin2bcd. rtc: add support for EPSON TOYOCOM RTC-7301SF/DG rtc: ds1307: Add ACPI support rtc: imxdi: (trivial) fix a typo rtc: ds1374: Merge conditional + WARN_ON() rtc: twl: make driver DT only rtc: twl: kill static variables rtc: fix typos in Kconfig rtc: jz4740: make the driver builtin only rtc: jz4740: remove unused EXPORT_SYMBOL Documentation: bindings: fix twl-rtc documentation rtc: Enable compile testing for Maxim and Samsung drivers MIPS: jz4740: Remove obsolete code MIPS: qi_lb60: Probe RTC driver from DT and use it as power controller MIPS: jz4740: DTS: Probe the jz4740-rtc driver from devicetree ...
This commit is contained in:
@@ -332,14 +332,86 @@ static void cmos_irq_disable(struct cmos_rtc *cmos, unsigned char mask)
|
||||
cmos_checkintr(cmos, rtc_control);
|
||||
}
|
||||
|
||||
static int cmos_validate_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
{
|
||||
struct cmos_rtc *cmos = dev_get_drvdata(dev);
|
||||
struct rtc_time now;
|
||||
|
||||
cmos_read_time(dev, &now);
|
||||
|
||||
if (!cmos->day_alrm) {
|
||||
time64_t t_max_date;
|
||||
time64_t t_alrm;
|
||||
|
||||
t_max_date = rtc_tm_to_time64(&now);
|
||||
t_max_date += 24 * 60 * 60 - 1;
|
||||
t_alrm = rtc_tm_to_time64(&t->time);
|
||||
if (t_alrm > t_max_date) {
|
||||
dev_err(dev,
|
||||
"Alarms can be up to one day in the future\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (!cmos->mon_alrm) {
|
||||
struct rtc_time max_date = now;
|
||||
time64_t t_max_date;
|
||||
time64_t t_alrm;
|
||||
int max_mday;
|
||||
|
||||
if (max_date.tm_mon == 11) {
|
||||
max_date.tm_mon = 0;
|
||||
max_date.tm_year += 1;
|
||||
} else {
|
||||
max_date.tm_mon += 1;
|
||||
}
|
||||
max_mday = rtc_month_days(max_date.tm_mon, max_date.tm_year);
|
||||
if (max_date.tm_mday > max_mday)
|
||||
max_date.tm_mday = max_mday;
|
||||
|
||||
t_max_date = rtc_tm_to_time64(&max_date);
|
||||
t_max_date -= 1;
|
||||
t_alrm = rtc_tm_to_time64(&t->time);
|
||||
if (t_alrm > t_max_date) {
|
||||
dev_err(dev,
|
||||
"Alarms can be up to one month in the future\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
struct rtc_time max_date = now;
|
||||
time64_t t_max_date;
|
||||
time64_t t_alrm;
|
||||
int max_mday;
|
||||
|
||||
max_date.tm_year += 1;
|
||||
max_mday = rtc_month_days(max_date.tm_mon, max_date.tm_year);
|
||||
if (max_date.tm_mday > max_mday)
|
||||
max_date.tm_mday = max_mday;
|
||||
|
||||
t_max_date = rtc_tm_to_time64(&max_date);
|
||||
t_max_date -= 1;
|
||||
t_alrm = rtc_tm_to_time64(&t->time);
|
||||
if (t_alrm > t_max_date) {
|
||||
dev_err(dev,
|
||||
"Alarms can be up to one year in the future\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
{
|
||||
struct cmos_rtc *cmos = dev_get_drvdata(dev);
|
||||
unsigned char mon, mday, hrs, min, sec, rtc_control;
|
||||
int ret;
|
||||
|
||||
if (!is_valid_irq(cmos->irq))
|
||||
return -EIO;
|
||||
|
||||
ret = cmos_validate_alarm(dev, t);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
mon = t->time.tm_mon + 1;
|
||||
mday = t->time.tm_mday;
|
||||
hrs = t->time.tm_hour;
|
||||
@@ -707,9 +779,6 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
|
||||
|
||||
spin_unlock_irq(&rtc_lock);
|
||||
|
||||
/* FIXME:
|
||||
* <asm-generic/rtc.h> doesn't know 12-hour mode either.
|
||||
*/
|
||||
if (is_valid_irq(rtc_irq) && !(rtc_control & RTC_24H)) {
|
||||
dev_warn(dev, "only 24-hr supported\n");
|
||||
retval = -ENXIO;
|
||||
|
Reference in New Issue
Block a user