rtc-proc: permit the /proc/driver/rtc device to use other devices

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>
This commit is contained in:
Kim, Milo 2012-10-04 17:13:45 -07:00 committed by Linus Torvalds
parent 5fa44f8691
commit 92589c986b
3 changed files with 31 additions and 8 deletions

View File

@ -119,8 +119,9 @@ three different userspace interfaces:
* /sys/class/rtc/rtcN ... sysfs attributes support readonly * /sys/class/rtc/rtcN ... sysfs attributes support readonly
access to some RTC attributes. access to some RTC attributes.
* /proc/driver/rtc ... the first RTC (rtc0) may expose itself * /proc/driver/rtc ... the system clock RTC may expose itself
using a procfs interface. More information is (currently) shown 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. here than through sysfs.
The RTC Class framework supports a wide variety of RTCs, ranging from those The RTC Class framework supports a wide variety of RTCs, ranging from those

View File

@ -69,13 +69,15 @@ config RTC_INTF_SYSFS
If unsure, say Y. If unsure, say Y.
config RTC_INTF_PROC config RTC_INTF_PROC
boolean "/proc/driver/rtc (procfs for rtc0)" boolean "/proc/driver/rtc (procfs for rtcN)"
depends on PROC_FS depends on PROC_FS
default RTC_CLASS default RTC_CLASS
help help
Say yes here if you want to use your first RTC through the proc Say yes here if you want to use your system clock RTC through
interface, /proc/driver/rtc. Other RTCs will not be available the proc interface, /proc/driver/rtc.
through that API. 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. If unsure, say Y.

View File

@ -18,6 +18,26 @@
#include "rtc-core.h" #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) 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) 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); proc_create_data("driver/rtc", 0, NULL, &rtc_proc_fops, rtc);
} }
void rtc_proc_del_device(struct rtc_device *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); remove_proc_entry("driver/rtc", NULL);
} }