Hello list members,

And here the second part.


>From e523006a34db26c274d3b71de5b914f476fb029e Mon Sep 17 00:00:00 2001
From: Roman Fietze <roman.fie...@telemotive.de>
Date: Fri, 4 Jul 2014 10:05:08 +0200
Subject: [PATCH 2/2] rtc: add kernel parameter hctosys, use it instead of
 CONFIG_RTC_HCTOSYS_DEVICE

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.fie...@telemotive.de>
---
 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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to