[PATCH 2/2] rtc: add kernel parameter hctosys, use it instead of CONFIG_RTC_HCTOSYS_DEVICE

From: Roman Fietze
Date: Fri Jul 04 2014 - 04:05:08 EST


This change allows to overwrite the default of the hctosys RTC
specified in the kernnel configuration by using a kernel parameter in
the form of

hctosys=rtc<n>

Signed-off-by: Roman Fietze <roman.fietze@xxxxxxxxxxxxx>
---
Documentation/kernel-parameters.txt | 2 ++
drivers/rtc/class.c | 23 +++++++++++++++++++++--
drivers/rtc/hctosys.c | 4 ++--
drivers/rtc/rtc-sysfs.c | 2 +-
drivers/rtc/systohc.c | 2 +-
include/linux/rtc.h | 1 +
6 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 30a8ad0d..ab1672f 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1110,6 +1110,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.

hcl= [IA-64] SGI's Hardware Graph compatibility layer

+ hctosys= [RTC_HCTOSYS_DEVICE] Sets the hctosys RTC
+
hd= [EIDE] (E)IDE hard drive subsystem geometry
Format: <cyl>,<head>,<sect>

diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c
index 589351e..b39434d 100644
--- a/drivers/rtc/class.c
+++ b/drivers/rtc/class.c
@@ -34,7 +34,26 @@ static void rtc_device_release(struct device *dev)
kfree(rtc);
}

+
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
+
+char rtc_hctosys_device[RTC_HCTOSYS_DEVICE_SIZE] = CONFIG_RTC_HCTOSYS_DEVICE;
+
+static int __init parse_hctosys(char *str)
+{
+ if (!str)
+ return -EINVAL;
+
+ if (strlen(str) >= RTC_HCTOSYS_DEVICE_SIZE)
+ return -ENOMEM;
+
+ strcpy(rtc_hctosys_device, str);
+
+ return 0;
+}
+
+__setup("hctosys=", parse_hctosys);
+
/* Result of the last RTC to system clock attempt. */
int rtc_hctosys_ret = -ENODEV;
#endif
@@ -57,7 +76,7 @@ static int rtc_suspend(struct device *dev)
if (has_persistent_clock())
return 0;

- if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
+ if (strcmp(dev_name(&rtc->dev), rtc_hctosys_device) != 0)
return 0;

/* snapshot the current RTC and system time at suspend*/
@@ -99,7 +118,7 @@ static int rtc_resume(struct device *dev)
return 0;

rtc_hctosys_ret = -ENODEV;
- if (strcmp(dev_name(&rtc->dev), CONFIG_RTC_HCTOSYS_DEVICE) != 0)
+ if (strcmp(dev_name(&rtc->dev), rtc_hctosys_device) != 0)
return 0;

/* snapshot the current rtc and system time at resume */
diff --git a/drivers/rtc/hctosys.c b/drivers/rtc/hctosys.c
index 4aa60d7..ea79018 100644
--- a/drivers/rtc/hctosys.c
+++ b/drivers/rtc/hctosys.c
@@ -29,11 +29,11 @@ static int __init rtc_hctosys(void)
struct timespec tv = {
.tv_nsec = NSEC_PER_SEC >> 1,
};
- struct rtc_device *rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
+ struct rtc_device *rtc = rtc_class_open(rtc_hctosys_device);

if (rtc == NULL) {
pr_err("%s: unable to open rtc device (%s)\n",
- __FILE__, CONFIG_RTC_HCTOSYS_DEVICE);
+ __FILE__, rtc_hctosys_device);
goto err_open;
}

diff --git a/drivers/rtc/rtc-sysfs.c b/drivers/rtc/rtc-sysfs.c
index babd43b..69c6a9f 100644
--- a/drivers/rtc/rtc-sysfs.c
+++ b/drivers/rtc/rtc-sysfs.c
@@ -114,7 +114,7 @@ hctosys_show(struct device *dev, struct device_attribute *attr, char *buf)
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
if (rtc_hctosys_ret == 0 &&
strcmp(dev_name(&to_rtc_device(dev)->dev),
- CONFIG_RTC_HCTOSYS_DEVICE) == 0)
+ rtc_hctosys_device) == 0)
return sprintf(buf, "1\n");
else
#endif
diff --git a/drivers/rtc/systohc.c b/drivers/rtc/systohc.c
index bf3e242..db9e74a 100644
--- a/drivers/rtc/systohc.c
+++ b/drivers/rtc/systohc.c
@@ -31,7 +31,7 @@ int rtc_set_ntp_time(struct timespec now)
else
rtc_time_to_tm(now.tv_sec + 1, &tm);

- rtc = rtc_class_open(CONFIG_RTC_HCTOSYS_DEVICE);
+ rtc = rtc_class_open(rtc_hctosys_device);
if (rtc) {
/* rtc_hctosys exclusively uses UTC, so we call set_time here,
* not set_mmss. */
diff --git a/include/linux/rtc.h b/include/linux/rtc.h
index 0a115b5..6feb68a 100644
--- a/include/linux/rtc.h
+++ b/include/linux/rtc.h
@@ -194,6 +194,7 @@ static inline bool is_leap_year(unsigned int year)
#ifdef CONFIG_RTC_HCTOSYS_DEVICE
#define RTC_HCTOSYS_DEVICE_SIZE 10
extern int rtc_hctosys_ret;
+extern char rtc_hctosys_device[RTC_HCTOSYS_DEVICE_SIZE];
#else
#define rtc_hctosys_ret -ENODEV
#endif
--
1.8.4.5



--
Roman Fietze Telemotive AG Buero Muehlhausen
Breitwiesen 73347 Muehlhausen
Tel.: +49 7335 18493-45 http://www.telemotive.de

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/