rtc-proc: permit the /proc/driver/rtc device to use other devices
authorKim, Milo <Milo.Kim@ti.com>
Fri, 5 Oct 2012 00:13:45 +0000 (17:13 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Oct 2012 18:05:01 +0000 (03:05 +0900)
To get time information via /proc/driver/rtc, only the first device (rtc0)
is used.  If the rtcN (eg.  rtc1 or rtc2) is used for the system clock,
there is no way to get information of rtcN via /proc/driver/rtc.  With
this patch, the time data can be retrieved from the system clock RTC.

If the RTC_HCTOSYS_DEVICE is not defined, then rtc0 is used by default.

Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Documentation/rtc.txt
drivers/rtc/Kconfig
drivers/rtc/rtc-proc.c

index 250160469d83e65c3a5235ee7b00b83b40abb68d..32aa4002de4a9fbd9fe64045119f811df47886ae 100644 (file)
@@ -119,8 +119,9 @@ three different userspace interfaces:
     *  /sys/class/rtc/rtcN ... sysfs attributes support readonly
        access to some RTC attributes.
 
-    *  /proc/driver/rtc ... the first RTC (rtc0) may expose itself
-       using a procfs interface.  More information is (currently) shown
+    *  /proc/driver/rtc ... the system clock RTC may expose itself
+       using a procfs interface. If there is no RTC for the system clock,
+       rtc0 is used by default. More information is (currently) shown
        here than through sysfs.
 
 The RTC Class framework supports a wide variety of RTCs, ranging from those
index fabc99a75c6596d2b797e55a59fa7ecd2db49fc8..a4a805c273bb14ae0a5c47fafcc9c8170db78a05 100644 (file)
@@ -69,13 +69,15 @@ config RTC_INTF_SYSFS
          If unsure, say Y.
 
 config RTC_INTF_PROC
-       boolean "/proc/driver/rtc (procfs for rtc0)"
+       boolean "/proc/driver/rtc (procfs for rtcN)"
        depends on PROC_FS
        default RTC_CLASS
        help
-         Say yes here if you want to use your first RTC through the proc
-         interface, /proc/driver/rtc. Other RTCs will not be available
-         through that API.
+         Say yes here if you want to use your system clock RTC through
+         the proc interface, /proc/driver/rtc.
+         Other RTCs will not be available through that API.
+         If there is no RTC for the system clock, then the first RTC(rtc0)
+         is used by default.
 
          If unsure, say Y.
 
index 0a59fda5c09d176c5fa0af1f90625c04a29232c4..e96236ac2e78a74cc9673f71ef8c07233343277f 100644 (file)
 
 #include "rtc-core.h"
 
+#define NAME_SIZE      10
+
+#if defined(CONFIG_RTC_HCTOSYS_DEVICE)
+static bool is_rtc_hctosys(struct rtc_device *rtc)
+{
+       int size;
+       char name[NAME_SIZE];
+
+       size = scnprintf(name, NAME_SIZE, "rtc%d", rtc->id);
+       if (size > NAME_SIZE)
+               return false;
+
+       return !strncmp(name, CONFIG_RTC_HCTOSYS_DEVICE, NAME_SIZE);
+}
+#else
+static bool is_rtc_hctosys(struct rtc_device *rtc)
+{
+       return (rtc->id == 0);
+}
+#endif
 
 static int rtc_proc_show(struct seq_file *seq, void *offset)
 {
@@ -117,12 +137,12 @@ static const struct file_operations rtc_proc_fops = {
 
 void rtc_proc_add_device(struct rtc_device *rtc)
 {
-       if (rtc->id == 0)
+       if (is_rtc_hctosys(rtc))
                proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc);
 }
 
 void rtc_proc_del_device(struct rtc_device *rtc)
 {
-       if (rtc->id == 0)
+       if (is_rtc_hctosys(rtc))
                remove_proc_entry("driver/rtc", NULL);
 }