linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* (version 2) LinuxPPS new functionalities
@ 2010-02-23 12:40 Rodolfo Giometti
  2010-02-23 12:40 ` [PATCH 1/6] pps: LinuxPPS clients support Rodolfo Giometti
  0 siblings, 1 reply; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev

This patchset adds several PPS functionalities.

All patches have a specific comment but I prefer say something more:

* Patches 01-02 are just documentation about PPS support.

* Patch 03 adds PPS client support skeleton.

* Patches 04-06 add generic PPS serial support (with specific
  modifications requested by Alan Cox).

* Patches 07-08 add PPS serial support for specific hardware.

Changelog:

V2 -> V1

* Old patches 01-02 removed due related to userland code and then
  managed elsewhere.

* char: n_tty.c: documentation in kerneldoc form added.

* pps: pps-ldisc: avoid using global functions over in n_tty.c

Ciao,

Rodolfo

--

 b/Documentation/serial/tty.txt    |    4 
 b/drivers/char/n_tty.c            |   17 ++++
 b/drivers/pps/Kconfig             |    2 
 b/drivers/pps/Makefile            |    1 
 b/drivers/pps/clients/Kconfig     |   18 ++++
 b/drivers/pps/clients/Makefile    |    9 ++
 b/drivers/pps/clients/ktimer.c    |  123 ++++++++++++++++++++++++++++++
 b/drivers/pps/clients/pps-ldisc.c |  154 ++++++++++++++++++++++++++++++++++++++
 b/drivers/serial/8250.c           |   16 +++
 b/drivers/serial/amba-pl010.c     |   15 +++
 b/include/linux/serial_core.h     |   11 ++
 b/include/linux/tty.h             |    1 
 b/include/linux/tty_ldisc.h       |    8 +
 drivers/pps/clients/Kconfig       |    7 +
 drivers/pps/clients/Makefile      |    1 
 15 files changed, 386 insertions(+), 1 deletion(-)


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

* [PATCH 1/6] pps: LinuxPPS clients support.
  2010-02-23 12:40 (version 2) LinuxPPS new functionalities Rodolfo Giometti
@ 2010-02-23 12:40 ` Rodolfo Giometti
  2010-02-23 12:40   ` [PATCH 2/6] ldisc: new dcd_change() method for line disciplines Rodolfo Giometti
  2010-02-23 16:21   ` [PATCH 1/6] pps: LinuxPPS clients support Randy Dunlap
  0 siblings, 2 replies; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

Each PPS source can be registered/deregistered into the system by
using special modules called "clients". They simply define the PPS
sources' attributes and implement the time signal registartion
mechanism.

This patch adds a special directory for such clients and adds a dummy
client that can be useful to test system integrity on real systems.

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 drivers/pps/Kconfig          |    2 +
 drivers/pps/Makefile         |    1 +
 drivers/pps/clients/Kconfig  |   18 ++++++
 drivers/pps/clients/Makefile |    9 +++
 drivers/pps/clients/ktimer.c |  123 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 153 insertions(+), 0 deletions(-)
 create mode 100644 drivers/pps/clients/Kconfig
 create mode 100644 drivers/pps/clients/Makefile
 create mode 100644 drivers/pps/clients/ktimer.c

diff --git a/drivers/pps/Kconfig b/drivers/pps/Kconfig
index cc2eb8e..1afe4e0 100644
--- a/drivers/pps/Kconfig
+++ b/drivers/pps/Kconfig
@@ -30,4 +30,6 @@ config PPS_DEBUG
 	  messages to the system log.  Select this if you are having a
 	  problem with PPS support and want to see more of what is going on.
 
+source drivers/pps/clients/Kconfig
+
 endmenu
diff --git a/drivers/pps/Makefile b/drivers/pps/Makefile
index 19ea582..98960dd 100644
--- a/drivers/pps/Makefile
+++ b/drivers/pps/Makefile
@@ -4,5 +4,6 @@
 
 pps_core-y			:= pps.o kapi.o sysfs.o
 obj-$(CONFIG_PPS)		:= pps_core.o
+obj-y				+= clients/
 
 ccflags-$(CONFIG_PPS_DEBUG) := -DDEBUG
diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
new file mode 100644
index 0000000..60b83be
--- /dev/null
+++ b/drivers/pps/clients/Kconfig
@@ -0,0 +1,18 @@
+#
+# PPS clients configuration
+#
+
+if PPS
+
+comment "PPS clients support"
+
+config PPS_CLIENT_KTIMER
+	tristate "Kernel timer client (Testing client, use for debug)"
+	help
+	  If you say yes here you get support for a PPS debugging client
+	  which uses a kernel timer to generate the PPS signal.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called ktimer.ko.
+
+endif
diff --git a/drivers/pps/clients/Makefile b/drivers/pps/clients/Makefile
new file mode 100644
index 0000000..f3c1e39
--- /dev/null
+++ b/drivers/pps/clients/Makefile
@@ -0,0 +1,9 @@
+#
+# Makefile for PPS clients.
+#
+
+obj-$(CONFIG_PPS_CLIENT_KTIMER)	+= ktimer.o
+
+ifeq ($(CONFIG_PPS_DEBUG),y)
+EXTRA_CFLAGS += -DDEBUG
+endif
diff --git a/drivers/pps/clients/ktimer.c b/drivers/pps/clients/ktimer.c
new file mode 100644
index 0000000..6de5dfc
--- /dev/null
+++ b/drivers/pps/clients/ktimer.c
@@ -0,0 +1,123 @@
+/*
+ * ktimer.c -- kernel timer test client
+ *
+ *
+ * Copyright (C) 2005-2006   Rodolfo Giometti <giometti@linux.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.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/time.h>
+#include <linux/timer.h>
+#include <linux/pps_kernel.h>
+
+/*
+ * Global variables
+ */
+
+static int source;
+static struct timer_list ktimer;
+
+/*
+ * The kernel timer
+ */
+
+static void pps_ktimer_event(unsigned long ptr)
+{
+	struct timespec __ts;
+	struct pps_ktime ts;
+
+	/* First of all we get the time stamp... */
+	getnstimeofday(&__ts);
+
+	pr_info("PPS event at %lu\n", jiffies);
+
+	/* ... and translate it to PPS time data struct */
+	ts.sec = __ts.tv_sec;
+	ts.nsec = __ts.tv_nsec;
+
+	pps_event(source, &ts, PPS_CAPTUREASSERT, NULL);
+
+	mod_timer(&ktimer, jiffies + HZ);
+}
+
+/*
+ * The echo function
+ */
+
+static void pps_ktimer_echo(int source, int event, void *data)
+{
+	pr_info("echo %s %s for source %d\n",
+		event & PPS_CAPTUREASSERT ? "assert" : "",
+		event & PPS_CAPTURECLEAR ? "clear" : "",
+		source);
+}
+
+/*
+ * The PPS info struct
+ */
+
+static struct pps_source_info pps_ktimer_info = {
+	.name		= "ktimer",
+	.path		= "",
+	.mode		= PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
+			  PPS_ECHOASSERT | \
+			  PPS_CANWAIT | PPS_TSFMT_TSPEC,
+	.echo 		= pps_ktimer_echo,
+	.owner		= THIS_MODULE,
+};
+
+/*
+ * Module staff
+ */
+
+static void __exit pps_ktimer_exit(void)
+{
+	del_timer_sync(&ktimer);
+	pps_unregister_source(source);
+
+	pr_info("ktimer PPS source unregistered\n");
+}
+
+static int __init pps_ktimer_init(void)
+{
+	int ret;
+
+	ret = pps_register_source(&pps_ktimer_info,
+				PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
+	if (ret < 0) {
+		printk(KERN_ERR "cannot register ktimer source\n");
+		return ret;
+	}
+	source = ret;
+
+	setup_timer(&ktimer, pps_ktimer_event, 0);
+	mod_timer(&ktimer, jiffies + HZ);
+
+	pr_info("ktimer PPS source registered at %d\n", source);
+
+	return  0;
+}
+
+module_init(pps_ktimer_init);
+module_exit(pps_ktimer_exit);
+
+MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
+MODULE_DESCRIPTION("dummy PPS source by using a kernel timer (just for debug)");
+MODULE_LICENSE("GPL");
-- 
1.6.3.3


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

* [PATCH 2/6] ldisc: new dcd_change() method for line disciplines.
  2010-02-23 12:40 ` [PATCH 1/6] pps: LinuxPPS clients support Rodolfo Giometti
@ 2010-02-23 12:40   ` Rodolfo Giometti
  2010-02-23 12:40     ` [PATCH 3/6] ldisc n_tty: add new method n_tty_inherit_ops() Rodolfo Giometti
  2010-02-23 16:21   ` [PATCH 1/6] pps: LinuxPPS clients support Randy Dunlap
  1 sibling, 1 reply; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 Documentation/serial/tty.txt |    4 ++++
 include/linux/tty_ldisc.h    |    8 ++++++++
 2 files changed, 12 insertions(+), 0 deletions(-)

diff --git a/Documentation/serial/tty.txt b/Documentation/serial/tty.txt
index 5e5349a..7c90050 100644
--- a/Documentation/serial/tty.txt
+++ b/Documentation/serial/tty.txt
@@ -105,6 +105,10 @@ write_wakeup()	-	May be called at any point between open and close.
 			is permitted to call the driver write method from
 			this function. In such a situation defer it.
 
+dcd_change()	-	Report to the tty line the current DCD pin status
+			changes and the relative timestamp. The timestamp
+			can be NULL.
+
 
 Driver Access
 
diff --git a/include/linux/tty_ldisc.h b/include/linux/tty_ldisc.h
index 0c4ee9b..526d66f 100644
--- a/include/linux/tty_ldisc.h
+++ b/include/linux/tty_ldisc.h
@@ -99,6 +99,12 @@
  *	cease I/O to the tty driver. Can sleep. The driver should
  *	seek to perform this action quickly but should wait until
  *	any pending driver I/O is completed.
+ *
+ * void (*dcd_change)(struct tty_struct *tty, unsigned int status,
+ * 			struct timespec *ts)
+ *
+ *	Tells the discipline that the DCD pin has changed its status and
+ *	the relative timestamp. Pointer ts can be NULL.
  */
 
 #include <linux/fs.h>
@@ -136,6 +142,8 @@ struct tty_ldisc_ops {
 	void	(*receive_buf)(struct tty_struct *, const unsigned char *cp,
 			       char *fp, int count);
 	void	(*write_wakeup)(struct tty_struct *);
+	void	(*dcd_change)(struct tty_struct *, unsigned int,
+				struct timespec *);
 
 	struct  module *owner;
 	
-- 
1.6.3.3


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

* [PATCH 3/6] ldisc n_tty: add new method n_tty_inherit_ops()
  2010-02-23 12:40   ` [PATCH 2/6] ldisc: new dcd_change() method for line disciplines Rodolfo Giometti
@ 2010-02-23 12:40     ` Rodolfo Giometti
  2010-02-23 12:40       ` [PATCH 4/6] pps: serial clients support Rodolfo Giometti
  0 siblings, 1 reply; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

This new method can be used to init a new struct tty_ldisc_ops as the
default tty_ldisc_N_TTY struct.

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 drivers/char/n_tty.c |   17 +++++++++++++++++
 include/linux/tty.h  |    1 +
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/drivers/char/n_tty.c b/drivers/char/n_tty.c
index 2e50f4d..bdae832 100644
--- a/drivers/char/n_tty.c
+++ b/drivers/char/n_tty.c
@@ -48,6 +48,7 @@
 #include <linux/audit.h>
 #include <linux/file.h>
 #include <linux/uaccess.h>
+#include <linux/module.h>
 
 #include <asm/system.h>
 
@@ -2091,3 +2092,19 @@ struct tty_ldisc_ops tty_ldisc_N_TTY = {
 	.receive_buf     = n_tty_receive_buf,
 	.write_wakeup    = n_tty_write_wakeup
 };
+
+/**
+ *	n_tty_inherit_ops	-	inherit N_TTY methods
+ *	@ops: struct tty_ldisc_ops where to save N_TTY methods
+ *
+ *	Used by a generic struct tty_ldisc_ops to easily inherit N_TTY
+ *	methods.
+ */
+
+void n_tty_inherit_ops(struct tty_ldisc_ops *ops)
+{
+	*ops = tty_ldisc_N_TTY;
+	ops->owner = NULL;
+	ops->refcount = ops->flags = 0;
+}
+EXPORT_SYMBOL_GPL(n_tty_inherit_ops);
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 6abfcf5..d6cc652 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -504,6 +504,7 @@ extern void tty_ldisc_enable(struct tty_struct *tty);
 
 /* n_tty.c */
 extern struct tty_ldisc_ops tty_ldisc_N_TTY;
+extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
 
 /* tty_audit.c */
 #ifdef CONFIG_AUDIT
-- 
1.6.3.3


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

* [PATCH 4/6] pps: serial clients support.
  2010-02-23 12:40     ` [PATCH 3/6] ldisc n_tty: add new method n_tty_inherit_ops() Rodolfo Giometti
@ 2010-02-23 12:40       ` Rodolfo Giometti
  2010-02-23 12:40         ` [PATCH 5/6] serial 8250: enable PPS support Rodolfo Giometti
  0 siblings, 1 reply; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

Adds support, by using the PPS line discipline, for the PPS sources
connected with the CD (Carrier Detect) pin of a serial port.

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 drivers/pps/clients/Kconfig     |    7 ++
 drivers/pps/clients/Makefile    |    1 +
 drivers/pps/clients/pps-ldisc.c |  154 +++++++++++++++++++++++++++++++++++++++
 include/linux/serial_core.h     |   11 +++-
 4 files changed, 172 insertions(+), 1 deletions(-)
 create mode 100644 drivers/pps/clients/pps-ldisc.c

diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 60b83be..487c1c8 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -15,4 +15,11 @@ config PPS_CLIENT_KTIMER
 	  This driver can also be built as a module.  If so, the module
 	  will be called ktimer.ko.
 
+config PPS_CLIENT_LDISC
+	tristate "PPS line discipline"
+	depends on PPS
+	help
+	  If you say yes here you get support for a PPS source connected
+	  with the CD (Carrier Detect) pin of your serial port.
+
 endif
diff --git a/drivers/pps/clients/Makefile b/drivers/pps/clients/Makefile
index f3c1e39..9f5b988 100644
--- a/drivers/pps/clients/Makefile
+++ b/drivers/pps/clients/Makefile
@@ -3,6 +3,7 @@
 #
 
 obj-$(CONFIG_PPS_CLIENT_KTIMER)	+= ktimer.o
+obj-$(CONFIG_PPS_CLIENT_LDISC)	+= pps-ldisc.o
 
 ifeq ($(CONFIG_PPS_DEBUG),y)
 EXTRA_CFLAGS += -DDEBUG
diff --git a/drivers/pps/clients/pps-ldisc.c b/drivers/pps/clients/pps-ldisc.c
new file mode 100644
index 0000000..2607d0b
--- /dev/null
+++ b/drivers/pps/clients/pps-ldisc.c
@@ -0,0 +1,154 @@
+/*
+ * pps-ldisc.c -- PPS line discipline
+ *
+ *
+ * Copyright (C) 2008	Rodolfo Giometti <giometti@linux.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.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/serial_core.h>
+#include <linux/tty.h>
+#include <linux/pps_kernel.h>
+
+#define PPS_TTY_MAGIC		0x0001
+
+static void pps_tty_dcd_change(struct tty_struct *tty, unsigned int status,
+				struct timespec *ts)
+{
+	int id = (int) tty->disc_data;
+	struct timespec __ts;
+	struct pps_ktime pps_ts;
+
+	/* First of all we get the time stamp... */
+	getnstimeofday(&__ts);
+
+	/* Does caller give us a timestamp? */
+	if (ts) {	/* Yes. Let's use it! */
+		pps_ts.sec = ts->tv_sec;
+		pps_ts.nsec = ts->tv_nsec;
+	} else {	/* No. Do it ourself! */
+		pps_ts.sec = __ts.tv_sec;
+		pps_ts.nsec = __ts.tv_nsec;
+	}
+
+	/* Now do the PPS event report */
+	pps_event(id, &pps_ts, status ? PPS_CAPTUREASSERT : PPS_CAPTURECLEAR,
+			NULL);
+
+	pr_debug("PPS %s at %lu on source #%d\n",
+			status ? "assert" : "clear", jiffies, id);
+}
+
+static int (*alias_n_tty_open)(struct tty_struct *tty);
+
+static int pps_tty_open(struct tty_struct *tty)
+{
+	struct pps_source_info info;
+	struct tty_driver *drv = tty->driver;
+	int index = tty->index + drv->name_base;
+	int ret;
+
+	info.owner = THIS_MODULE;
+	info.dev = NULL;
+	snprintf(info.name, PPS_MAX_NAME_LEN, "%s%d", drv->driver_name, index);
+	snprintf(info.path, PPS_MAX_NAME_LEN, "/dev/%s%d", drv->name, index);
+	info.mode = PPS_CAPTUREBOTH | \
+			PPS_OFFSETASSERT | PPS_OFFSETCLEAR | \
+			PPS_CANWAIT | PPS_TSFMT_TSPEC;
+
+	ret = pps_register_source(&info, PPS_CAPTUREBOTH | \
+				PPS_OFFSETASSERT | PPS_OFFSETCLEAR);
+	if (ret < 0) {
+		pr_err("cannot register PPS source \"%s\"\n", info.path);
+		return ret;
+	}
+	tty->disc_data = (void *) ret;
+
+	/* Should open N_TTY ldisc too */
+	ret = alias_n_tty_open(tty);
+	if (ret < 0)
+		pps_unregister_source((int) tty->disc_data);
+
+	pr_info("PPS source #%d \"%s\" added\n", ret, info.path);
+
+	return 0;
+}
+
+static void (*alias_n_tty_close)(struct tty_struct *tty);
+
+static void pps_tty_close(struct tty_struct *tty)
+{
+	int id = (int) tty->disc_data;
+
+	pps_unregister_source(id);
+	alias_n_tty_close(tty);
+
+	pr_info("PPS source #%d removed\n", id);
+}
+
+static struct tty_ldisc_ops pps_ldisc_ops;
+
+/*
+ * Module stuff
+ */
+
+static int __init pps_tty_init(void)
+{
+	int err;
+
+	/* Inherit the N_TTY's ops */
+	n_tty_inherit_ops(&pps_ldisc_ops);
+
+	/* Save N_TTY's open()/close() methods */
+	alias_n_tty_open = pps_ldisc_ops.open;
+	alias_n_tty_close = pps_ldisc_ops.close;
+
+	/* Init PPS_TTY data */
+	pps_ldisc_ops.owner = THIS_MODULE;
+	pps_ldisc_ops.magic = PPS_TTY_MAGIC;
+	pps_ldisc_ops.name = "pps_tty";
+	pps_ldisc_ops.dcd_change = pps_tty_dcd_change;
+	pps_ldisc_ops.open = pps_tty_open;
+	pps_ldisc_ops.close = pps_tty_close;
+
+	err = tty_register_ldisc(N_PPS, &pps_ldisc_ops);
+	if (err)
+		pr_err("can't register PPS line discipline\n");
+	else
+		pr_info("PPS line discipline registered\n");
+
+	return err;
+}
+
+static void __exit pps_tty_cleanup(void)
+{
+	int err;
+
+	err = tty_unregister_ldisc(N_PPS);
+	if (err)
+		pr_err("can't unregister PPS line discipline\n");
+	else
+		pr_info("PPS line discipline removed\n");
+}
+
+module_init(pps_tty_init);
+module_exit(pps_tty_cleanup);
+
+MODULE_ALIAS_LDISC(N_PPS);
+MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
+MODULE_DESCRIPTION("PPS TTY device driver");
+MODULE_LICENSE("GPL");
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 8c3dd36..78dd1e7 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -491,9 +491,13 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
 {
 	struct uart_state *state = uport->state;
 	struct tty_port *port = &state->port;
+	struct tty_ldisc *ld = tty_ldisc_ref(port->tty);
+	struct timespec ts;
 
-	uport->icount.dcd++;
+	if (ld && ld->ops->dcd_change)
+		getnstimeofday(&ts);
 
+	uport->icount.dcd++;
 #ifdef CONFIG_HARD_PPS
 	if ((uport->flags & UPF_HARDPPS_CD) && status)
 		hardpps();
@@ -505,6 +509,11 @@ uart_handle_dcd_change(struct uart_port *uport, unsigned int status)
 		else if (port->tty)
 			tty_hangup(port->tty);
 	}
+
+	if (ld && ld->ops->dcd_change)
+		ld->ops->dcd_change(port->tty, status, &ts);
+	if (ld)
+		tty_ldisc_deref(ld);
 }
 
 /**
-- 
1.6.3.3


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

* [PATCH 5/6] serial 8250: enable PPS support.
  2010-02-23 12:40       ` [PATCH 4/6] pps: serial clients support Rodolfo Giometti
@ 2010-02-23 12:40         ` Rodolfo Giometti
  2010-02-23 12:40           ` [PATCH 6/6] serial amba-pl010: " Rodolfo Giometti
  0 siblings, 1 reply; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

Automagically function serial8250_enable_ms() is called when PPS ldisc
is selected.

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 drivers/serial/8250.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
index c3e37c8..48aa0b4 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2413,6 +2413,21 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
 }
 
 static void
+serial8250_set_ldisc(struct uart_port *port)
+{
+	int line = port->line;
+
+	if (line >= port->state->port.tty->driver->num)
+		return;
+
+	if (port->state->port.tty->ldisc->ops->num == N_PPS) {
+		port->flags |= UPF_HARDPPS_CD;
+		serial8250_enable_ms(port);
+	} else
+		port->flags &= ~UPF_HARDPPS_CD;
+}
+
+static void
 serial8250_pm(struct uart_port *port, unsigned int state,
 	      unsigned int oldstate)
 {
@@ -2626,6 +2641,7 @@ static struct uart_ops serial8250_pops = {
 	.startup	= serial8250_startup,
 	.shutdown	= serial8250_shutdown,
 	.set_termios	= serial8250_set_termios,
+	.set_ldisc	= serial8250_set_ldisc,
 	.pm		= serial8250_pm,
 	.type		= serial8250_type,
 	.release_port	= serial8250_release_port,
-- 
1.6.3.3


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

* [PATCH 6/6] serial amba-pl010: enable PPS support.
  2010-02-23 12:40         ` [PATCH 5/6] serial 8250: enable PPS support Rodolfo Giometti
@ 2010-02-23 12:40           ` Rodolfo Giometti
  0 siblings, 0 replies; 8+ messages in thread
From: Rodolfo Giometti @ 2010-02-23 12:40 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg,
	Greg KH, Randy Dunlap, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev, Rodolfo Giometti

Function pl010_enable_ms() is automagically called when PPS ldisc
is selected.

Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
 drivers/serial/amba-pl010.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c
index 429a8ae..e4b3c2c 100644
--- a/drivers/serial/amba-pl010.c
+++ b/drivers/serial/amba-pl010.c
@@ -471,6 +471,20 @@ pl010_set_termios(struct uart_port *port, struct ktermios *termios,
 	spin_unlock_irqrestore(&uap->port.lock, flags);
 }
 
+static void pl010_set_ldisc(struct uart_port *port)
+{
+	int line = port->line;
+
+	if (line >= port->state->port.tty->driver->num)
+		return;
+
+	if (port->state->port.tty->ldisc->ops->num == N_PPS) {
+		port->flags |= UPF_HARDPPS_CD;
+		pl010_enable_ms(port);
+	} else
+		port->flags &= ~UPF_HARDPPS_CD;
+}
+
 static const char *pl010_type(struct uart_port *port)
 {
 	return port->type == PORT_AMBA ? "AMBA" : NULL;
@@ -531,6 +545,7 @@ static struct uart_ops amba_pl010_pops = {
 	.startup	= pl010_startup,
 	.shutdown	= pl010_shutdown,
 	.set_termios	= pl010_set_termios,
+	.set_ldisc	= pl010_set_ldisc,
 	.type		= pl010_type,
 	.release_port	= pl010_release_port,
 	.request_port	= pl010_request_port,
-- 
1.6.3.3


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

* Re: [PATCH 1/6] pps: LinuxPPS clients support.
  2010-02-23 12:40 ` [PATCH 1/6] pps: LinuxPPS clients support Rodolfo Giometti
  2010-02-23 12:40   ` [PATCH 2/6] ldisc: new dcd_change() method for line disciplines Rodolfo Giometti
@ 2010-02-23 16:21   ` Randy Dunlap
  1 sibling, 0 replies; 8+ messages in thread
From: Randy Dunlap @ 2010-02-23 16:21 UTC (permalink / raw)
  To: Rodolfo Giometti
  Cc: linux-kernel, Andrew Morton, David Woodhouse, Dave Jones,
	Sam Ravnborg, Greg KH, Kay Sievers, Alan Cox, H. Peter Anvin,
	Ingo Molnar, Michael Kerrisk, Christoph Hellwig,
	Alexander Gordeev

On 02/23/10 04:40, Rodolfo Giometti wrote:
> Each PPS source can be registered/deregistered into the system by
> using special modules called "clients". They simply define the PPS
> sources' attributes and implement the time signal registartion
> mechanism.
> 
> This patch adds a special directory for such clients and adds a dummy
> client that can be useful to test system integrity on real systems.
> 
> Signed-off-by: Rodolfo Giometti <giometti@linux.it>
> ---
>  drivers/pps/Kconfig          |    2 +
>  drivers/pps/Makefile         |    1 +
>  drivers/pps/clients/Kconfig  |   18 ++++++
>  drivers/pps/clients/Makefile |    9 +++
>  drivers/pps/clients/ktimer.c |  123 ++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 153 insertions(+), 0 deletions(-)
>  create mode 100644 drivers/pps/clients/Kconfig
>  create mode 100644 drivers/pps/clients/Makefile
>  create mode 100644 drivers/pps/clients/ktimer.c


> diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
> new file mode 100644
> index 0000000..60b83be
> --- /dev/null
> +++ b/drivers/pps/clients/Kconfig
> @@ -0,0 +1,18 @@
> +#
> +# PPS clients configuration
> +#
> +
> +if PPS
> +
> +comment "PPS clients support"
> +
> +config PPS_CLIENT_KTIMER
> +	tristate "Kernel timer client (Testing client, use for debug)"
> +	help
> +	  If you say yes here you get support for a PPS debugging client
> +	  which uses a kernel timer to generate the PPS signal.
> +
> +	  This driver can also be built as a module.  If so, the module
> +	  will be called ktimer.ko.

	  will be called ktimer.

Only a handful of other drivers/kconfigs have that incorrect.

> +
> +endif

> diff --git a/drivers/pps/clients/ktimer.c b/drivers/pps/clients/ktimer.c
> new file mode 100644
> index 0000000..6de5dfc
> --- /dev/null
> +++ b/drivers/pps/clients/ktimer.c
> @@ -0,0 +1,123 @@
> +/*
> + * ktimer.c -- kernel timer test client

> +/*
> + * Global variables
> + */
> +
> +static int source;
> +static struct timer_list ktimer;
> +
> +/*
> + * The kernel timer
> + */
> +
> +static void pps_ktimer_event(unsigned long ptr)
> +{
> +	struct timespec __ts;
> +	struct pps_ktime ts;
> +
> +	/* First of all we get the time stamp... */
> +	getnstimeofday(&__ts);
> +
> +	pr_info("PPS event at %lu\n", jiffies);
> +
> +	/* ... and translate it to PPS time data struct */
> +	ts.sec = __ts.tv_sec;
> +	ts.nsec = __ts.tv_nsec;
> +
> +	pps_event(source, &ts, PPS_CAPTUREASSERT, NULL);
> +
> +	mod_timer(&ktimer, jiffies + HZ);
> +}
> +
> +/*
> + * The echo function
> + */
> +
> +static void pps_ktimer_echo(int source, int event, void *data)
> +{
> +	pr_info("echo %s %s for source %d\n",
> +		event & PPS_CAPTUREASSERT ? "assert" : "",
> +		event & PPS_CAPTURECLEAR ? "clear" : "",
> +		source);
> +}
> +
> +/*
> + * The PPS info struct
> + */
> +
> +static struct pps_source_info pps_ktimer_info = {
> +	.name		= "ktimer",
> +	.path		= "",
> +	.mode		= PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
> +			  PPS_ECHOASSERT | \
> +			  PPS_CANWAIT | PPS_TSFMT_TSPEC,

We don't usually use \ continuation characters when they are not needed.

> +	.echo 		= pps_ktimer_echo,
> +	.owner		= THIS_MODULE,
> +};


-- 
~Randy

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

end of thread, other threads:[~2010-02-23 16:25 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-23 12:40 (version 2) LinuxPPS new functionalities Rodolfo Giometti
2010-02-23 12:40 ` [PATCH 1/6] pps: LinuxPPS clients support Rodolfo Giometti
2010-02-23 12:40   ` [PATCH 2/6] ldisc: new dcd_change() method for line disciplines Rodolfo Giometti
2010-02-23 12:40     ` [PATCH 3/6] ldisc n_tty: add new method n_tty_inherit_ops() Rodolfo Giometti
2010-02-23 12:40       ` [PATCH 4/6] pps: serial clients support Rodolfo Giometti
2010-02-23 12:40         ` [PATCH 5/6] serial 8250: enable PPS support Rodolfo Giometti
2010-02-23 12:40           ` [PATCH 6/6] serial amba-pl010: " Rodolfo Giometti
2010-02-23 16:21   ` [PATCH 1/6] pps: LinuxPPS clients support Randy Dunlap

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).