public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH 7/7] RTC subsystem, test device/driver
@ 2005-12-26 18:59 Alessandro Zummo
  2005-12-26 23:45 ` Dmitry Torokhov
  0 siblings, 1 reply; 3+ messages in thread
From: Alessandro Zummo @ 2005-12-26 18:59 UTC (permalink / raw)
  To: linux-kernel

 
This is a software RTC which can be
used to test the RTC subsystem APIs. It gets
the time from the system clock.

Interrupts can be generated by
echo "alarm|tick|update" >/sys/class/rtc/rtcX/device/irq

Signed-off-by: Alessandro Zummo <a.zummo@towertech.it>
--

 drivers/rtc/Kconfig    |   15 +++
 drivers/rtc/Makefile   |    1 
 drivers/rtc/rtc-test.c |  196 +++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 212 insertions(+)

--- linux.orig/drivers/rtc/Kconfig	2005-12-26 19:33:46.000000000 +0100
+++ linux/drivers/rtc/Kconfig	2005-12-26 19:34:03.000000000 +0100
@@ -65,4 +65,19 @@
 	  This driver can also be built as a module. If so, the module
 	  will be called rtc-x1205.
 
+config RTC_DRV_TEST
+	tristate "Test driver/device"
+	depends on RTC_CLASS
+	help
+	  If you say yes here you get support for the
+	  RTC test driver. It's a software RTC which can be
+	  used to test the RTC subsystem APIs. It gets
+	  the time from the system clock.
+	  You want this driver only if you are doing development
+	  on the RTC subsystem. Please read the source code
+	  for further details.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called rtc-test.
+
 endmenu
--- linux.orig/drivers/rtc/Makefile	2005-12-26 19:33:46.000000000 +0100
+++ linux/drivers/rtc/Makefile	2005-12-26 19:34:03.000000000 +0100
@@ -10,4 +10,5 @@
 obj-$(CONFIG_RTC_INTF_DEV)	+= rtc-dev.o
 
 obj-$(CONFIG_RTC_DRV_X1205)	+= rtc-x1205.o
+obj-$(CONFIG_RTC_DRV_TEST)	+= rtc-test.o
 
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux/drivers/rtc/rtc-test.c	2005-12-26 19:34:03.000000000 +0100
@@ -0,0 +1,196 @@
+/*
+ * An RTC test device/driver
+ * Copyright (C) 2005 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/string.h>
+#include <linux/bcd.h>
+#include <linux/rtc.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+
+static int test_rtc_read_alarm(struct device *dev,
+	struct rtc_wkalrm *alrm)
+{
+	return 0;
+}
+
+static int test_rtc_set_alarm(struct device *dev,
+	struct rtc_wkalrm *alrm)
+{
+	return 0;
+}
+
+static int test_rtc_read_time(struct device *dev,
+	struct rtc_time *tm)
+{
+	rtc_time_to_tm(get_seconds(), tm);
+	return 0;
+}
+
+static int test_rtc_set_time(struct device *dev,
+	struct rtc_time *tm)
+{
+	return 0;
+}
+
+static int test_rtc_set_mmss(struct device *dev, unsigned long secs)
+{
+	return 0;
+}
+
+static int test_rtc_proc(struct device *dev, struct seq_file *seq)
+{
+	struct platform_device *plat_dev = to_platform_device(dev);
+
+	seq_printf(seq, "24hr\t\t: yes\n");
+	seq_printf(seq, "test\t\t: yes\n");
+	seq_printf(seq, "id\t\t: %d\n", plat_dev->id);
+
+	return 0;
+}
+
+static int test_rtc_ioctl(struct device *dev, unsigned int cmd,
+	unsigned long arg)
+{
+	/* We do support interrupts, they're generated
+	 * using the sysfs interface.
+	 */
+	switch (cmd) {
+	case RTC_PIE_ON:
+	case RTC_PIE_OFF:
+	case RTC_UIE_ON:
+	case RTC_UIE_OFF:
+	case RTC_AIE_ON:
+	case RTC_AIE_OFF:
+		return 0;
+
+	default:
+		return -EINVAL;
+	}
+}
+
+static struct rtc_class_ops test_rtc_ops = {
+	.owner = THIS_MODULE,
+	.proc = test_rtc_proc,
+	.read_time = test_rtc_read_time,
+	.set_time = test_rtc_set_time,
+	.read_alarm = test_rtc_read_alarm,
+	.set_alarm = test_rtc_set_alarm,
+	.set_mmss = test_rtc_set_mmss,
+	.ioctl = test_rtc_ioctl,
+};
+
+static ssize_t test_irq_show(struct device *dev,
+				struct device_attribute *attr, char *buf)
+{
+	return sprintf(buf, "%d\n", 42);
+}
+static ssize_t test_irq_store(struct device *dev,
+				struct device_attribute *attr,
+				const char *buf, size_t count)
+{
+	int retval;
+	struct platform_device *plat_dev = to_platform_device(dev);
+	struct rtc_device *rtc = platform_get_drvdata(plat_dev);
+
+	retval = count;
+	if (strncmp(buf, "tick", 4) == 0)
+		rtc_update_irq(&rtc->class_dev, 1, RTC_PF | RTC_IRQF);
+	else if (strncmp(buf, "alarm", 5) == 0)
+		rtc_update_irq(&rtc->class_dev, 1, RTC_AF | RTC_IRQF);
+	else if (strncmp(buf, "update", 6) == 0)
+		rtc_update_irq(&rtc->class_dev, 1, RTC_UF | RTC_IRQF);
+	else
+		retval = -EINVAL;
+
+	return retval;
+}
+static DEVICE_ATTR(irq, S_IRUGO | S_IWUSR, test_irq_show, test_irq_store);
+
+static int test_probe(struct platform_device *plat_dev)
+{
+	int err;
+	struct rtc_device *rtc = rtc_device_register(&plat_dev->dev,
+							&test_rtc_ops);
+	if (IS_ERR(rtc)) {
+		err = PTR_ERR(rtc);
+		dev_err(&plat_dev->dev,
+			"unable to register the class device\n");
+		return err;
+	}
+	device_create_file(&plat_dev->dev, &dev_attr_irq);
+
+	platform_set_drvdata(plat_dev, rtc);
+
+	return 0;
+}
+
+static int test_remove(struct platform_device *plat_dev)
+{
+	struct rtc_device *rtc = platform_get_drvdata(plat_dev);
+
+	rtc_device_unregister(rtc);
+	device_remove_file(&plat_dev->dev, &dev_attr_irq);
+
+	return 0;
+}
+
+static void test_release(struct device * dev)
+{
+}
+
+struct platform_device test_dev_zero = {
+	.name	= "rtc-test",
+	.id	= 0,
+	.dev.release = test_release,
+};
+
+struct platform_device test_dev_one = {
+	.name	= "rtc-test",
+	.id	= 1,
+	.dev.release = test_release,
+};
+
+struct platform_driver test_drv = {
+	.probe	= test_probe,
+	.remove = test_remove,
+	.driver = {
+		.name = "rtc-test",
+		.owner = THIS_MODULE,
+	},
+};
+
+static int __init test_init(void)
+{
+	platform_device_register(&test_dev_zero);
+	platform_device_register(&test_dev_one);
+	platform_driver_register(&test_drv);
+
+	return 0;
+}
+
+static void __exit test_exit(void)
+{
+	platform_driver_unregister(&test_drv);
+	platform_device_unregister(&test_dev_zero);
+	platform_device_unregister(&test_dev_one);
+}
+
+MODULE_AUTHOR("Alessandro Zummo <a.zummo@towertech.it>");
+MODULE_DESCRIPTION("RTC test driver/device");
+MODULE_LICENSE("GPL");
+
+module_init(test_init);
+module_exit(test_exit);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFC][PATCH 7/7] RTC subsystem, test device/driver
  2005-12-26 18:59 [RFC][PATCH 7/7] RTC subsystem, test device/driver Alessandro Zummo
@ 2005-12-26 23:45 ` Dmitry Torokhov
  2005-12-27  1:22   ` Alessandro Zummo
  0 siblings, 1 reply; 3+ messages in thread
From: Dmitry Torokhov @ 2005-12-26 23:45 UTC (permalink / raw)
  To: Alessandro Zummo; +Cc: linux-kernel

On Monday 26 December 2005 13:59, Alessandro Zummo wrote:
> +struct platform_device test_dev_zero = {
> +	.name	= "rtc-test",
> +	.id	= 0,
> +	.dev.release = test_release,
> +};
> +
> +struct platform_device test_dev_one = {
> +	.name	= "rtc-test",
> +	.id	= 1,
> +	.dev.release = test_release,
> +};
> +

You should never ever statically allicate devices that can be unregistered.
Guess what will happen if one does this:

	rmmod rtc_test  < /sys/class/rtc/rtcX/date

where rctX is class device created by rtc-test0 or rtc-test1.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [RFC][PATCH 7/7] RTC subsystem, test device/driver
  2005-12-26 23:45 ` Dmitry Torokhov
@ 2005-12-27  1:22   ` Alessandro Zummo
  0 siblings, 0 replies; 3+ messages in thread
From: Alessandro Zummo @ 2005-12-27  1:22 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-kernel

On Mon, 26 Dec 2005 18:45:34 -0500
Dmitry Torokhov <dtor_core@ameritech.net> wrote:

> You should never ever statically allicate devices that can be unregistered.
> Guess what will happen if one does this:
> 
> 	rmmod rtc_test  < /sys/class/rtc/rtcX/date
> 
> where rctX is class device created by rtc-test0 or rtc-test1.

 Will fix, thanks!

-- 

 Best regards,

 Alessandro Zummo,
  Tower Technologies - Turin, Italy

  http://www.towertech.it


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2005-12-27  1:21 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-12-26 18:59 [RFC][PATCH 7/7] RTC subsystem, test device/driver Alessandro Zummo
2005-12-26 23:45 ` Dmitry Torokhov
2005-12-27  1:22   ` Alessandro Zummo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox