aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorVladimir Zapolskiy <vz@mleia.com>2015-08-05 14:12:58 -0400
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>2015-09-05 07:19:10 -0400
commit8ccba14233000f48639aad4cab55ed7b61260db5 (patch)
tree5a4e2fed7b7eeb13d78c96aded6c4a723080a57d /drivers/rtc
parentf4843b19d2c7b5effd25e2a65b487d02bf55e96f (diff)
rtc: ds1511: clean up ds1511_nvram_read()/ds1511_nvram_write()
The change removes redundant sysfs binary file boundary checks, since this task is already done on caller side in fs/sysfs/file.c The change enables burst mode of access to SRAM for any read()/write() operations, it is worth to mention that this may influence on userspace, for instance prior to the change read(fd, buf, 1); read(fd, buf + 1, 1); and read(fd, buf, 2); sequences of syscalls over DS1511's sysfs "nvram" fd led to different DS1511 state changes and/or buf content, if some userspace applications are written specifically for DS1511 and exploit this strange "feature", they may be impacted. Also the change corrects NVRAM size accessible to userspace from 255 bytes to 256 bytes. Signed-off-by: Vladimir Zapolskiy <vz@mleia.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/rtc-ds1511.c42
1 files changed, 5 insertions, 37 deletions
diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c
index 7415c2b4d6e8..da3d04ce83bd 100644
--- a/drivers/rtc/rtc-ds1511.c
+++ b/drivers/rtc/rtc-ds1511.c
@@ -64,7 +64,7 @@ enum ds1511reg {
64#define DS1511_KIE 0x04 64#define DS1511_KIE 0x04
65#define DS1511_WDE 0x02 65#define DS1511_WDE 0x02
66#define DS1511_WDS 0x01 66#define DS1511_WDS 0x01
67#define DS1511_RAM_MAX 0xff 67#define DS1511_RAM_MAX 0x100
68 68
69#define RTC_CMD DS1511_CONTROL_B 69#define RTC_CMD DS1511_CONTROL_B
70#define RTC_CMD1 DS1511_CONTROL_A 70#define RTC_CMD1 DS1511_CONTROL_A
@@ -159,7 +159,7 @@ ds1511_wdog_set(unsigned long deciseconds)
159 /* 159 /*
160 * set wdog enable and wdog 'steering' bit to issue a reset 160 * set wdog enable and wdog 'steering' bit to issue a reset
161 */ 161 */
162 rtc_write(DS1511_WDE | DS1511_WDS, RTC_CMD); 162 rtc_write(rtc_read(RTC_CMD) | DS1511_WDE | DS1511_WDS, RTC_CMD);
163} 163}
164 164
165void 165void
@@ -407,26 +407,10 @@ ds1511_nvram_read(struct file *filp, struct kobject *kobj,
407{ 407{
408 ssize_t count; 408 ssize_t count;
409 409
410 /*
411 * if count is more than one, turn on "burst" mode
412 * turn it off when you're done
413 */
414 if (size > 1)
415 rtc_write((rtc_read(RTC_CMD) | DS1511_BME), RTC_CMD);
416
417 if (pos > DS1511_RAM_MAX)
418 pos = DS1511_RAM_MAX;
419
420 if (size + pos > DS1511_RAM_MAX + 1)
421 size = DS1511_RAM_MAX - pos + 1;
422
423 rtc_write(pos, DS1511_RAMADDR_LSB); 410 rtc_write(pos, DS1511_RAMADDR_LSB);
424 for (count = 0; size > 0; count++, size--) 411 for (count = 0; count < size; count++)
425 *buf++ = rtc_read(DS1511_RAMDATA); 412 *buf++ = rtc_read(DS1511_RAMDATA);
426 413
427 if (count > 1)
428 rtc_write((rtc_read(RTC_CMD) & ~DS1511_BME), RTC_CMD);
429
430 return count; 414 return count;
431} 415}
432 416
@@ -437,26 +421,10 @@ ds1511_nvram_write(struct file *filp, struct kobject *kobj,
437{ 421{
438 ssize_t count; 422 ssize_t count;
439 423
440 /*
441 * if count is more than one, turn on "burst" mode
442 * turn it off when you're done
443 */
444 if (size > 1)
445 rtc_write((rtc_read(RTC_CMD) | DS1511_BME), RTC_CMD);
446
447 if (pos > DS1511_RAM_MAX)
448 pos = DS1511_RAM_MAX;
449
450 if (size + pos > DS1511_RAM_MAX + 1)
451 size = DS1511_RAM_MAX - pos + 1;
452
453 rtc_write(pos, DS1511_RAMADDR_LSB); 424 rtc_write(pos, DS1511_RAMADDR_LSB);
454 for (count = 0; size > 0; count++, size--) 425 for (count = 0; count < size; count++)
455 rtc_write(*buf++, DS1511_RAMDATA); 426 rtc_write(*buf++, DS1511_RAMDATA);
456 427
457 if (count > 1)
458 rtc_write((rtc_read(RTC_CMD) & ~DS1511_BME), RTC_CMD);
459
460 return count; 428 return count;
461} 429}
462 430
@@ -490,7 +458,7 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
490 /* 458 /*
491 * turn on the clock and the crystal, etc. 459 * turn on the clock and the crystal, etc.
492 */ 460 */
493 rtc_write(0, RTC_CMD); 461 rtc_write(DS1511_BME, RTC_CMD);
494 rtc_write(0, RTC_CMD1); 462 rtc_write(0, RTC_CMD1);
495 /* 463 /*
496 * clear the wdog counter 464 * clear the wdog counter