aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDavid Brownell <david-b@pacbell.net>2008-02-06 04:38:43 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-06 13:41:13 -0500
commite07e232cd96ef0092b2bddc72f9b7caf284633cb (patch)
tree442ff1cc6f2548e27315ee6c8ad5252132e5d416 /drivers
parent9974b6ea7b85a32f34f824443f47aa501c85ee8f (diff)
rtc-cmos: export nvram in sysfs
This makes rtc-cmos export its NVRAM, like several other RTC drivers. It still works within the limits of the current CMOS_READ/CMOS_WRITE calls, which don't understand how to access multiple register banks. The primary impact of that limitation is that Linux can't access the uppermost 128 bytes of NVRAM on many systems. Note that this isn't aiming to be a drop-in replacement for the legacy /dev/nvram support. (Presumably that has real users, and isn't just getting carried forward automatically?) Userspace handles more work: - When userspace code updates NVRAM, that will need to include updating any platform-specific checksums that may apply. - No /proc/driver/nvram file will parse and display NVRAM data according to whichever boot firmware your board expects. Also minor pnp-related updates: update a comment, remove dead code. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Alessandro Zummo <a.zummo@towertech.it> Cc: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/rtc/rtc-cmos.c129
1 files changed, 117 insertions, 12 deletions
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index 29cf1457ca10..ab455ddb16cf 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -393,6 +393,80 @@ static const struct rtc_class_ops cmos_rtc_ops = {
393 393
394/*----------------------------------------------------------------*/ 394/*----------------------------------------------------------------*/
395 395
396/*
397 * All these chips have at least 64 bytes of address space, shared by
398 * RTC registers and NVRAM. Most of those bytes of NVRAM are used
399 * by boot firmware. Modern chips have 128 or 256 bytes.
400 */
401
402#define NVRAM_OFFSET (RTC_REG_D + 1)
403
404static ssize_t
405cmos_nvram_read(struct kobject *kobj, struct bin_attribute *attr,
406 char *buf, loff_t off, size_t count)
407{
408 int retval;
409
410 if (unlikely(off >= attr->size))
411 return 0;
412 if ((off + count) > attr->size)
413 count = attr->size - off;
414
415 spin_lock_irq(&rtc_lock);
416 for (retval = 0, off += NVRAM_OFFSET; count--; retval++, off++)
417 *buf++ = CMOS_READ(off);
418 spin_unlock_irq(&rtc_lock);
419
420 return retval;
421}
422
423static ssize_t
424cmos_nvram_write(struct kobject *kobj, struct bin_attribute *attr,
425 char *buf, loff_t off, size_t count)
426{
427 struct cmos_rtc *cmos;
428 int retval;
429
430 cmos = dev_get_drvdata(container_of(kobj, struct device, kobj));
431 if (unlikely(off >= attr->size))
432 return -EFBIG;
433 if ((off + count) > attr->size)
434 count = attr->size - off;
435
436 /* NOTE: on at least PCs and Ataris, the boot firmware uses a
437 * checksum on part of the NVRAM data. That's currently ignored
438 * here. If userspace is smart enough to know what fields of
439 * NVRAM to update, updating checksums is also part of its job.
440 */
441 spin_lock_irq(&rtc_lock);
442 for (retval = 0, off += NVRAM_OFFSET; count--; retval++, off++) {
443 /* don't trash RTC registers */
444 if (off == cmos->day_alrm
445 || off == cmos->mon_alrm
446 || off == cmos->century)
447 buf++;
448 else
449 CMOS_WRITE(*buf++, off);
450 }
451 spin_unlock_irq(&rtc_lock);
452
453 return retval;
454}
455
456static struct bin_attribute nvram = {
457 .attr = {
458 .name = "nvram",
459 .mode = S_IRUGO | S_IWUSR,
460 .owner = THIS_MODULE,
461 },
462
463 .read = cmos_nvram_read,
464 .write = cmos_nvram_write,
465 /* size gets set up later */
466};
467
468/*----------------------------------------------------------------*/
469
396static struct cmos_rtc cmos_rtc; 470static struct cmos_rtc cmos_rtc;
397 471
398static irqreturn_t cmos_interrupt(int irq, void *p) 472static irqreturn_t cmos_interrupt(int irq, void *p)
@@ -412,11 +486,9 @@ static irqreturn_t cmos_interrupt(int irq, void *p)
412} 486}
413 487
414#ifdef CONFIG_PNP 488#ifdef CONFIG_PNP
415#define is_pnp() 1
416#define INITSECTION 489#define INITSECTION
417 490
418#else 491#else
419#define is_pnp() 0
420#define INITSECTION __init 492#define INITSECTION __init
421#endif 493#endif
422 494
@@ -426,6 +498,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
426 struct cmos_rtc_board_info *info = dev->platform_data; 498 struct cmos_rtc_board_info *info = dev->platform_data;
427 int retval = 0; 499 int retval = 0;
428 unsigned char rtc_control; 500 unsigned char rtc_control;
501 unsigned address_space;
429 502
430 /* there can be only one ... */ 503 /* there can be only one ... */
431 if (cmos_rtc.dev) 504 if (cmos_rtc.dev)
@@ -450,15 +523,36 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
450 cmos_rtc.irq = rtc_irq; 523 cmos_rtc.irq = rtc_irq;
451 cmos_rtc.iomem = ports; 524 cmos_rtc.iomem = ports;
452 525
526 /* Heuristic to deduce NVRAM size ... do what the legacy NVRAM
527 * driver did, but don't reject unknown configs. Old hardware
528 * won't address 128 bytes, and for now we ignore the way newer
529 * chips can address 256 bytes (using two more i/o ports).
530 */
531#if defined(CONFIG_ATARI)
532 address_space = 64;
533#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__)
534 address_space = 128;
535#else
536#warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes.
537 address_space = 128;
538#endif
539
453 /* For ACPI systems extension info comes from the FADT. On others, 540 /* For ACPI systems extension info comes from the FADT. On others,
454 * board specific setup provides it as appropriate. Systems where 541 * board specific setup provides it as appropriate. Systems where
455 * the alarm IRQ isn't automatically a wakeup IRQ (like ACPI, and 542 * the alarm IRQ isn't automatically a wakeup IRQ (like ACPI, and
456 * some almost-clones) can provide hooks to make that behave. 543 * some almost-clones) can provide hooks to make that behave.
544 *
545 * Note that ACPI doesn't preclude putting these registers into
546 * "extended" areas of the chip, including some that we won't yet
547 * expect CMOS_READ and friends to handle.
457 */ 548 */
458 if (info) { 549 if (info) {
459 cmos_rtc.day_alrm = info->rtc_day_alarm; 550 if (info->rtc_day_alarm && info->rtc_day_alarm < 128)
460 cmos_rtc.mon_alrm = info->rtc_mon_alarm; 551 cmos_rtc.day_alrm = info->rtc_day_alarm;
461 cmos_rtc.century = info->rtc_century; 552 if (info->rtc_mon_alarm && info->rtc_mon_alarm < 128)
553 cmos_rtc.mon_alrm = info->rtc_mon_alarm;
554 if (info->rtc_century && info->rtc_century < 128)
555 cmos_rtc.century = info->rtc_century;
462 556
463 if (info->wake_on && info->wake_off) { 557 if (info->wake_on && info->wake_off) {
464 cmos_rtc.wake_on = info->wake_on; 558 cmos_rtc.wake_on = info->wake_on;
@@ -518,10 +612,13 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
518 goto cleanup1; 612 goto cleanup1;
519 } 613 }
520 614
521 /* REVISIT optionally make 50 or 114 bytes NVRAM available, 615 /* export at least the first block of NVRAM */
522 * like rtc-ds1553, rtc-ds1742 ... this will often include 616 nvram.size = address_space - NVRAM_OFFSET;
523 * registers for century, and day/month alarm. 617 retval = sysfs_create_bin_file(&dev->kobj, &nvram);
524 */ 618 if (retval < 0) {
619 dev_dbg(dev, "can't create nvram file? %d\n", retval);
620 goto cleanup2;
621 }
525 622
526 pr_info("%s: alarms up to one %s%s\n", 623 pr_info("%s: alarms up to one %s%s\n",
527 cmos_rtc.rtc->dev.bus_id, 624 cmos_rtc.rtc->dev.bus_id,
@@ -536,6 +633,9 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
536 633
537 return 0; 634 return 0;
538 635
636cleanup2:
637 if (is_valid_irq(rtc_irq))
638 free_irq(rtc_irq, cmos_rtc.rtc);
539cleanup1: 639cleanup1:
540 cmos_rtc.dev = NULL; 640 cmos_rtc.dev = NULL;
541 rtc_device_unregister(cmos_rtc.rtc); 641 rtc_device_unregister(cmos_rtc.rtc);
@@ -563,6 +663,8 @@ static void __exit cmos_do_remove(struct device *dev)
563 663
564 cmos_do_shutdown(); 664 cmos_do_shutdown();
565 665
666 sysfs_remove_bin_file(&dev->kobj, &nvram);
667
566 if (is_valid_irq(cmos->irq)) 668 if (is_valid_irq(cmos->irq))
567 free_irq(cmos->irq, cmos->rtc); 669 free_irq(cmos->irq, cmos->rtc);
568 670
@@ -659,9 +761,12 @@ static int cmos_resume(struct device *dev)
659 761
660/*----------------------------------------------------------------*/ 762/*----------------------------------------------------------------*/
661 763
662/* The "CMOS" RTC normally lives on the platform_bus. On ACPI systems, 764/* On non-x86 systems, a "CMOS" RTC lives most naturally on platform_bus.
663 * the device node will always be created as a PNPACPI device. Plus 765 * ACPI systems always list these as PNPACPI devices, and pre-ACPI PCs
664 * pre-ACPI PCs probably list it in the PNPBIOS tables. 766 * probably list them in similar PNPBIOS tables; so PNP is more common.
767 *
768 * We don't use legacy "poke at the hardware" probing. Ancient PCs that
769 * predate even PNPBIOS should set up platform_bus devices.
665 */ 770 */
666 771
667#ifdef CONFIG_PNP 772#ifdef CONFIG_PNP