From: Alessandro Zummo <a.zummo@towertech.it>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@osdl.org>, Greg KH <greg@kroah.com>
Subject: [PATCH 07/13] RTC subsystem, proc interface
Date: Sat, 04 Mar 2006 17:42:54 +0100 [thread overview]
Message-ID: <20060304164249.441734000@towertech.it> (raw)
In-Reply-To: 20060304164247.963655000@towertech.it
[-- Attachment #1: rtc-intf-proc.patch --]
[-- Type: text/plain, Size: 5912 bytes --]
This patch adds the proc interface to the
RTC subsystem.
The first RTC driver which registers with
the class will be accessible by /proc/driver/rtc .
This is required for compatibility with the standard
RTC driver and to avoid breaking any user space
application which may erroneusly rely on this.
Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Cc: Greg KH <greg@kroah.com>
--
drivers/rtc/Kconfig | 11 +++
drivers/rtc/Makefile | 1
drivers/rtc/rtc-proc.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 174 insertions(+)
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-rtc/drivers/rtc/rtc-proc.c 2006-03-04 16:17:10.000000000 +0100
@@ -0,0 +1,162 @@
+/*
+ * RTC subsystem, proc interface
+ *
+ * Copyright (C) 2005-06 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * based on arch/arm/common/rtctime.c
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+*/
+
+#include <linux/module.h>
+#include <linux/rtc.h>
+#include <linux/proc_fs.h>
+#include <linux/seq_file.h>
+
+static struct class_device *rtc_dev = NULL;
+static DEFINE_MUTEX(rtc_lock);
+
+static int rtc_proc_show(struct seq_file *seq, void *offset)
+{
+ int err;
+ struct class_device *class_dev = seq->private;
+ struct rtc_class_ops *ops = to_rtc_device(class_dev)->ops;
+ struct rtc_wkalrm alrm;
+ struct rtc_time tm;
+
+ err = rtc_read_time(class_dev, &tm);
+ if (err == 0) {
+ seq_printf(seq,
+ "rtc_time\t: %02d:%02d:%02d\n"
+ "rtc_date\t: %04d-%02d-%02d\n",
+ tm.tm_hour, tm.tm_min, tm.tm_sec,
+ tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday);
+ }
+
+ err = rtc_read_alarm(class_dev, &alrm);
+ if (err == 0) {
+ seq_printf(seq, "alrm_time\t: ");
+ if ((unsigned int)alrm.time.tm_hour <= 24)
+ seq_printf(seq, "%02d:", alrm.time.tm_hour);
+ else
+ seq_printf(seq, "**:");
+ if ((unsigned int)alrm.time.tm_min <= 59)
+ seq_printf(seq, "%02d:", alrm.time.tm_min);
+ else
+ seq_printf(seq, "**:");
+ if ((unsigned int)alrm.time.tm_sec <= 59)
+ seq_printf(seq, "%02d\n", alrm.time.tm_sec);
+ else
+ seq_printf(seq, "**\n");
+
+ seq_printf(seq, "alrm_date\t: ");
+ if ((unsigned int)alrm.time.tm_year <= 200)
+ seq_printf(seq, "%04d-", alrm.time.tm_year + 1900);
+ else
+ seq_printf(seq, "****-");
+ if ((unsigned int)alrm.time.tm_mon <= 11)
+ seq_printf(seq, "%02d-", alrm.time.tm_mon + 1);
+ else
+ seq_printf(seq, "**-");
+ if ((unsigned int)alrm.time.tm_mday <= 31)
+ seq_printf(seq, "%02d\n", alrm.time.tm_mday);
+ else
+ seq_printf(seq, "**\n");
+ seq_printf(seq, "alrm_wakeup\t: %s\n",
+ alrm.enabled ? "yes" : "no");
+ seq_printf(seq, "alrm_pending\t: %s\n",
+ alrm.pending ? "yes" : "no");
+ }
+
+ if (ops->proc)
+ ops->proc(class_dev->dev, seq);
+
+ return 0;
+}
+
+static int rtc_proc_open(struct inode *inode, struct file *file)
+{
+ struct class_device *class_dev = PDE(inode)->data;
+
+ if (!try_module_get(THIS_MODULE))
+ return -ENODEV;
+
+ return single_open(file, rtc_proc_show, class_dev);
+}
+
+static int rtc_proc_release(struct inode *inode, struct file *file)
+{
+ int res = single_release(inode, file);
+ module_put(THIS_MODULE);
+ return res;
+}
+
+static struct file_operations rtc_proc_fops = {
+ .open = rtc_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = rtc_proc_release,
+};
+
+static int rtc_proc_add_device(struct class_device *class_dev,
+ struct class_interface *class_intf)
+{
+ mutex_lock(&rtc_lock);
+ if (rtc_dev == NULL) {
+ struct proc_dir_entry *ent;
+
+ rtc_dev = class_dev;
+
+ ent = create_proc_entry("driver/rtc", 0, NULL);
+ if (ent) {
+ struct rtc_device *rtc = to_rtc_device(class_dev);
+
+ ent->proc_fops = &rtc_proc_fops;
+ ent->owner = rtc->owner;
+ ent->data = class_dev;
+
+ dev_info(class_dev->dev, "rtc intf: proc\n");
+ }
+ else
+ rtc_dev = NULL;
+ }
+ mutex_unlock(&rtc_lock);
+
+ return 0;
+}
+
+static void rtc_proc_remove_device(struct class_device *class_dev,
+ struct class_interface *class_intf)
+{
+ mutex_lock(&rtc_lock);
+ if (rtc_dev == class_dev) {
+ remove_proc_entry("driver/rtc", NULL);
+ rtc_dev = NULL;
+ }
+ mutex_unlock(&rtc_lock);
+}
+
+static struct class_interface rtc_proc_interface = {
+ .add = &rtc_proc_add_device,
+ .remove = &rtc_proc_remove_device,
+};
+
+static int __init rtc_proc_init(void)
+{
+ return rtc_interface_register(&rtc_proc_interface);
+}
+
+static void __exit rtc_proc_exit(void)
+{
+ class_interface_unregister(&rtc_proc_interface);
+}
+
+module_init(rtc_proc_init);
+module_exit(rtc_proc_exit);
+
+MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
+MODULE_DESCRIPTION("RTC class proc interface");
+MODULE_LICENSE("GPL");
--- linux-rtc.orig/drivers/rtc/Kconfig 2006-03-04 16:17:08.000000000 +0100
+++ linux-rtc/drivers/rtc/Kconfig 2006-03-04 16:17:10.000000000 +0100
@@ -50,6 +50,17 @@ config RTC_INTF_SYSFS
This driver can also be built as a module. If so, the module
will be called rtc-sysfs.
+config RTC_INTF_PROC
+ tristate "proc"
+ depends on RTC_CLASS && PROC_FS
+ default RTC_CLASS
+ help
+ Say yes here if you want to use your RTC using the proc
+ interface, /proc/driver/rtc .
+
+ This driver can also be built as a module. If so, the module
+ will be called rtc-proc.
+
comment "RTC drivers"
depends on RTC_CLASS
--- linux-rtc.orig/drivers/rtc/Makefile 2006-03-04 16:17:08.000000000 +0100
+++ linux-rtc/drivers/rtc/Makefile 2006-03-04 16:17:10.000000000 +0100
@@ -9,3 +9,4 @@ obj-$(CONFIG_RTC_HCTOSYS) += hctosys.o
obj-$(CONFIG_RTC_CLASS) += rtc-core.o
rtc-core-y := class.o interface.o
obj-$(CONFIG_RTC_INTF_SYSFS) += rtc-sysfs.o
+obj-$(CONFIG_RTC_INTF_PROC) += rtc-proc.o
--
next prev parent reply other threads:[~2006-03-04 16:44 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-04 16:42 [PATCH 00/13] RTC subsystem Alessandro Zummo
2006-03-04 16:42 ` [PATCH 01/13] RTC Subsystem, library functions Alessandro Zummo
2006-03-04 16:58 ` Adrian Bunk
2006-03-04 17:12 ` Alessandro Zummo
2006-03-04 17:20 ` Adrian Bunk
2006-03-04 16:42 ` [PATCH 02/13] RTC subsystem, ARM cleanup Alessandro Zummo
2006-03-04 16:42 ` [PATCH 03/13] RTC subsystem, MIPS cleanup Alessandro Zummo
2006-03-04 16:42 ` [PATCH 04/13] RTC subsystem, class Alessandro Zummo
2006-03-04 17:08 ` Adrian Bunk
2006-03-04 17:46 ` Alessandro Zummo
2006-03-04 17:53 ` Adrian Bunk
2006-03-04 18:04 ` Alessandro Zummo
2006-03-04 16:42 ` [PATCH 05/13] RTC subsystem, I2C cleanup Alessandro Zummo
2006-03-04 16:42 ` [PATCH 06/13] RTC subsystem, sysfs interface Alessandro Zummo
2006-03-04 16:42 ` Alessandro Zummo [this message]
2006-03-04 16:42 ` [PATCH 08/13] RTC subsystem, dev interface Alessandro Zummo
2006-03-04 16:42 ` [PATCH 09/13] RTC subsystem, X1205 driver Alessandro Zummo
2006-03-04 16:42 ` [PATCH 10/13] RTC subsystem, test device/driver Alessandro Zummo
2006-03-04 16:42 ` [PATCH 11/13] RTC subsystem, DS1672 driver Alessandro Zummo
2006-03-04 16:42 ` [PATCH 12/13] RTC subsystem, PCF8563 driver Alessandro Zummo
2006-03-04 16:43 ` [PATCH 13/13] RTC subsystem, RS5C372 driver Alessandro Zummo
-- strict thread matches above, loose matches on Subject: below --
2006-02-26 23:14 [PATCH 00/13] RTC subsystem Alessandro Zummo
2006-02-26 23:14 ` [PATCH 07/13] RTC subsystem, proc interface Alessandro Zummo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060304164249.441734000@towertech.it \
--to=a.zummo@towertech.it \
--cc=akpm@osdl.org \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).