aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-sysfs.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-07-03 20:12:13 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-03 20:12:13 -0400
commit7f0ef0267e20d62d45d527911a993b1e998f4968 (patch)
treede51abc7da5903f59d83e23937f22420164c9477 /drivers/rtc/rtc-sysfs.c
parent862f0012549110d6f2586bf54b52ed4540cbff3a (diff)
parent9307c29524502c21f0e8a6d96d850b2f5bc0bd9a (diff)
Merge branch 'akpm' (updates from Andrew Morton)
Merge first patch-bomb from Andrew Morton: - various misc bits - I'm been patchmonkeying ocfs2 for a while, as Joel and Mark have been distracted. There has been quite a bit of activity. - About half the MM queue - Some backlight bits - Various lib/ updates - checkpatch updates - zillions more little rtc patches - ptrace - signals - exec - procfs - rapidio - nbd - aoe - pps - memstick - tools/testing/selftests updates * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (445 commits) tools/testing/selftests: don't assume the x bit is set on scripts selftests: add .gitignore for kcmp selftests: fix clean target in kcmp Makefile selftests: add .gitignore for vm selftests: add hugetlbfstest self-test: fix make clean selftests: exit 1 on failure kernel/resource.c: remove the unneeded assignment in function __find_resource aio: fix wrong comment in aio_complete() drivers/w1/slaves/w1_ds2408.c: add magic sequence to disable P0 test mode drivers/memstick/host/r592.c: convert to module_pci_driver drivers/memstick/host/jmb38x_ms: convert to module_pci_driver pps-gpio: add device-tree binding and support drivers/pps/clients/pps-gpio.c: convert to module_platform_driver drivers/pps/clients/pps-gpio.c: convert to devm_* helpers drivers/parport/share.c: use kzalloc Documentation/accounting/getdelays.c: avoid strncpy in accounting tool aoe: update internal version number to v83 aoe: update copyright date aoe: perform I/O completions in parallel ...
Diffstat (limited to 'drivers/rtc/rtc-sysfs.c')
-rw-r--r--drivers/rtc/rtc-sysfs.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c
index b70e2bb63645..4b26f8672b2d 100644
--- a/drivers/rtc/rtc-sysfs.c
+++ b/drivers/rtc/rtc-sysfs.c
@@ -164,6 +164,7 @@ rtc_sysfs_set_wakealarm(struct device *dev, struct device_attribute *attr,
164{ 164{
165 ssize_t retval; 165 ssize_t retval;
166 unsigned long now, alarm; 166 unsigned long now, alarm;
167 unsigned long push = 0;
167 struct rtc_wkalrm alm; 168 struct rtc_wkalrm alm;
168 struct rtc_device *rtc = to_rtc_device(dev); 169 struct rtc_device *rtc = to_rtc_device(dev);
169 char *buf_ptr; 170 char *buf_ptr;
@@ -180,13 +181,17 @@ rtc_sysfs_set_wakealarm(struct device *dev, struct device_attribute *attr,
180 buf_ptr = (char *)buf; 181 buf_ptr = (char *)buf;
181 if (*buf_ptr == '+') { 182 if (*buf_ptr == '+') {
182 buf_ptr++; 183 buf_ptr++;
183 adjust = 1; 184 if (*buf_ptr == '=') {
185 buf_ptr++;
186 push = 1;
187 } else
188 adjust = 1;
184 } 189 }
185 alarm = simple_strtoul(buf_ptr, NULL, 0); 190 alarm = simple_strtoul(buf_ptr, NULL, 0);
186 if (adjust) { 191 if (adjust) {
187 alarm += now; 192 alarm += now;
188 } 193 }
189 if (alarm > now) { 194 if (alarm > now || push) {
190 /* Avoid accidentally clobbering active alarms; we can't 195 /* Avoid accidentally clobbering active alarms; we can't
191 * entirely prevent that here, without even the minimal 196 * entirely prevent that here, without even the minimal
192 * locking from the /dev/rtcN api. 197 * locking from the /dev/rtcN api.
@@ -194,9 +199,14 @@ rtc_sysfs_set_wakealarm(struct device *dev, struct device_attribute *attr,
194 retval = rtc_read_alarm(rtc, &alm); 199 retval = rtc_read_alarm(rtc, &alm);
195 if (retval < 0) 200 if (retval < 0)
196 return retval; 201 return retval;
197 if (alm.enabled) 202 if (alm.enabled) {
198 return -EBUSY; 203 if (push) {
199 204 rtc_tm_to_time(&alm.time, &push);
205 alarm += push;
206 } else
207 return -EBUSY;
208 } else if (push)
209 return -EINVAL;
200 alm.enabled = 1; 210 alm.enabled = 1;
201 } else { 211 } else {
202 alm.enabled = 0; 212 alm.enabled = 0;