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