public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* LinuxPPS (RESUBMIT 3): the PPS Linux implementation.
@ 2008-04-10 15:15 Rodolfo Giometti
  2008-04-10 15:15 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
  2008-04-10 15:28 ` LinuxPPS (RESUBMIT 3): the PPS Linux implementation Lennart Sorensen
  0 siblings, 2 replies; 35+ messages in thread
From: Rodolfo Giometti @ 2008-04-10 15:15 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg, Greg KH,
	Randy Dunlap, Kay Sievers

This patch set adds the PPS support into Linux.

PPS means "pulse per second" and its API is specified by RFC 2783
(Pulse-Per-Second API for UNIX-like Operating Systems, Version 1.0).

The code has been tested with the NTPD program
(http://www.eecis.udel.edu/~mills/ntp/html/index.html) and several GPS
antennae.

Rodolfo

--

 Documentation/pps/Makefile            |    2 
 b/Documentation/ABI/testing/sysfs-pps |   73 +++++++
 b/Documentation/ioctl-number.txt      |    2 
 b/Documentation/pps/Makefile          |   27 ++
 b/Documentation/pps/pps.txt           |  170 +++++++++++++++++
 b/Documentation/pps/ppsctl.c          |   63 ++++++
 b/Documentation/pps/ppsfind           |   17 +
 b/Documentation/pps/ppstest.c         |  152 +++++++++++++++
 b/Documentation/pps/timepps.h         |  196 +++++++++++++++++++
 b/MAINTAINERS                         |    7 
 b/drivers/Kconfig                     |    2 
 b/drivers/Makefile                    |    1 
 b/drivers/char/lp.c                   |   61 ++++++
 b/drivers/pps/Kconfig                 |   33 +++
 b/drivers/pps/Makefile                |    8 
 b/drivers/pps/clients/Kconfig         |   18 +
 b/drivers/pps/clients/Makefile        |    9 
 b/drivers/pps/clients/ktimer.c        |  115 +++++++++++
 b/drivers/pps/kapi.c                  |  330 +++++++++++++++++++++++++++++++++
 b/drivers/pps/pps.c                   |  335 ++++++++++++++++++++++++++++++++++
 b/drivers/pps/sysfs.c                 |  103 ++++++++++
 b/drivers/serial/8250.c               |    2 
 b/drivers/serial/serial_core.c        |  131 ++++++++++---
 b/include/linux/Kbuild                |    1 
 b/include/linux/parport.h             |   13 +
 b/include/linux/pps.h                 |  203 ++++++++++++++++++++
 b/include/linux/serial_core.h         |   31 ++-
 drivers/pps/Kconfig                   |    2 
 drivers/pps/Makefile                  |    1 
 drivers/pps/clients/Kconfig           |   20 ++
 30 files changed, 2083 insertions(+), 45 deletions(-)



^ permalink raw reply	[flat|nested] 35+ messages in thread
* [PATCH 5/7] PPS: serial clients support.
@ 2008-04-10 16:01 Rodolfo Giometti
  2008-04-10 16:06 ` Rodolfo Giometti
  0 siblings, 1 reply; 35+ messages in thread
From: Rodolfo Giometti @ 2008-04-10 16:01 UTC (permalink / raw)
  To: Alan Cox
  Cc: linux-kernel, Andrew Morton, David Woodhouse, Dave Jones,
	Sam Ravnborg, Greg KH, Randy Dunlap, Kay Sievers

Adds support 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  |   10 +++++
 drivers/serial/8250.c        |    2 +
 drivers/serial/serial_core.c |   81 +++++++++++++++++++++++++++++++++++++++++-
 include/linux/serial_core.h  |   30 ++++++++++++---
 4 files changed, 116 insertions(+), 7 deletions(-)

diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 60b83be..517c338 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -15,4 +15,14 @@ config PPS_CLIENT_KTIMER
 	  This driver can also be built as a module.  If so, the module
 	  will be called ktimer.ko.
 
+comment "UART serial support (forced off)"
+	depends on ! (SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y))
+
+config PPS_CLIENT_UART
+	bool "UART serial support"
+	depends on SERIAL_CORE != n && !(PPS = m && SERIAL_CORE = y)
+	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/serial/8250.c b/drivers/serial/8250.c
index 77f7a7f..880cbeb 100644
--- a/drivers/serial/8250.c
+++ b/drivers/serial/8250.c
@@ -2119,6 +2119,8 @@ serial8250_set_termios(struct uart_port *port, struct ktermios *termios,
 		up->ier |= UART_IER_MSI;
 	if (up->capabilities & UART_CAP_UUE)
 		up->ier |= UART_IER_UUE | UART_IER_RTOIE;
+	if (up->port.flags & UPF_HARDPPS_CD)
+		up->ier |= UART_IER_MSI;	/* enable interrupts */
 
 	serial_out(up, UART_IER, up->ier);
 
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c
index 0f5a179..37e9962 100644
--- a/drivers/serial/serial_core.c
+++ b/drivers/serial/serial_core.c
@@ -33,6 +33,7 @@
 #include <linux/serial.h> /* for serial_state and serial_icounter_struct */
 #include <linux/delay.h>
 #include <linux/mutex.h>
+#include <linux/pps.h>
 
 #include <asm/irq.h>
 #include <asm/uaccess.h>
@@ -635,6 +636,63 @@ static int uart_get_info(struct uart_state *state,
 	return 0;
 }
 
+#ifdef CONFIG_PPS_CLIENT_UART
+
+static int
+uart_register_pps_port(struct uart_state *state, struct uart_port *port)
+{
+	struct tty_driver *drv = port->info->tty->driver;
+	int ret;
+
+	state->pps_info.owner = THIS_MODULE;
+	state->pps_info.dev = port->dev;
+	snprintf(state->pps_info.name, PPS_MAX_NAME_LEN, "%s%d",
+		drv->driver_name, port->line);
+	snprintf(state->pps_info.path, PPS_MAX_NAME_LEN, "/dev/%s%d",
+		drv->name, port->line);
+
+	state->pps_info.mode = PPS_CAPTUREBOTH | \
+			PPS_OFFSETASSERT | PPS_OFFSETCLEAR | \
+			PPS_CANWAIT | PPS_TSFMT_TSPEC;
+
+	ret = pps_register_source(&state->pps_info, PPS_CAPTUREBOTH | \
+				PPS_OFFSETASSERT | PPS_OFFSETCLEAR);
+	if (ret < 0) {
+		dev_err(port->dev, "cannot register PPS source \"%s\"\n",
+						state->pps_info.path);
+		return ret;
+	}
+	port->pps_source = ret;
+	dev_dbg(port->dev, "PPS source #%d \"%s\" added\n",
+		port->pps_source, state->pps_info.path);
+
+	return 0;
+}
+
+static void
+uart_unregister_pps_port(struct uart_state *state, struct uart_port *port)
+{
+	pps_unregister_source(port->pps_source);
+	dev_dbg(port->dev, "PPS source #%d \"%s\" removed\n",
+				port->pps_source, state->pps_info.path);
+}
+
+#else
+
+static inline int
+uart_register_pps_port(struct uart_state *state, struct uart_port *port)
+{
+	return 0;
+}
+
+static inline void
+uart_unregister_pps_port(struct uart_state *state, struct uart_port *port)
+{
+	/* Nop */
+}
+
+#endif /* CONFIG_PPS_CLIENT_UART */
+
 static int uart_set_info(struct uart_state *state,
 			 struct serial_struct __user *newinfo)
 {
@@ -810,11 +868,20 @@ static int uart_set_info(struct uart_state *state,
 			(port->flags & UPF_LOW_LATENCY) ? 1 : 0;
 
  check_and_exit:
+	/* PPS support enabled/disabled? */
+	if ((old_flags & UPF_HARDPPS_CD) != (new_flags & UPF_HARDPPS_CD)) {
+		if (new_flags & UPF_HARDPPS_CD)
+			uart_register_pps_port(state, port);
+		else
+			uart_unregister_pps_port(state, port);
+	}
+
 	retval = 0;
 	if (port->type == PORT_UNKNOWN)
 		goto exit;
 	if (state->info->flags & UIF_INITIALIZED) {
-		if (((old_flags ^ port->flags) & UPF_SPD_MASK) ||
+		if (((old_flags ^ port->flags) &
+					(UPF_SPD_MASK | UPF_HARDPPS_CD)) ||
 		    old_custom_divisor != port->custom_divisor) {
 			/*
 			 * If they're setting up a custom divisor or speed,
@@ -2148,6 +2215,12 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state,
 		port->ops->config_port(port, flags);
 	}
 
+	/*
+	 * Add the PPS support for the current port.
+	 */
+	if (port->flags & UPF_HARDPPS_CD)
+		uart_register_pps_port(state, port);
+
 	if (port->type != PORT_UNKNOWN) {
 		unsigned long flags;
 
@@ -2405,6 +2478,12 @@ int uart_remove_one_port(struct uart_driver *drv, struct uart_port *port)
 	mutex_unlock(&state->mutex);
 
 	/*
+	 * Remove PPS support from the current port.
+	 */
+	if (port->flags & UPF_HARDPPS_CD)
+		uart_unregister_pps_port(state, port);
+
+	/*
 	 * Remove the devices from the tty layer
 	 */
 	tty_unregister_device(drv->tty_driver, port->line);
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
index 289942f..0f8fbd4 100644
--- a/include/linux/serial_core.h
+++ b/include/linux/serial_core.h
@@ -166,6 +166,7 @@
 #include <linux/tty.h>
 #include <linux/mutex.h>
 #include <linux/sysrq.h>
+#include <linux/pps.h>
 
 struct uart_port;
 struct uart_info;
@@ -245,6 +246,9 @@ struct uart_port {
 	unsigned char		regshift;		/* reg offset shift */
 	unsigned char		iotype;			/* io access style */
 	unsigned char		unused1;
+#ifdef CONFIG_PPS_CLIENT_UART
+	int			pps_source;		/* PPS source ID */
+#endif
 
 #define UPIO_PORT		(0)
 #define UPIO_HUB6		(1)
@@ -289,7 +293,8 @@ struct uart_port {
 #define UPF_IOREMAP		((__force upf_t) (1 << 31))
 
 #define UPF_CHANGE_MASK		((__force upf_t) (0x17fff))
-#define UPF_USR_MASK		((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY))
+#define UPF_USR_MASK		((__force upf_t) (UPF_SPD_MASK|UPF_LOW_LATENCY\
+							|UPF_HARDPPS_CD))
 
 	unsigned int		mctrl;			/* current modem ctrl settings */
 	unsigned int		timeout;		/* character-based timeout */
@@ -322,6 +327,10 @@ struct uart_state {
 	struct uart_info	*info;
 	struct uart_port	*port;
 
+#ifdef CONFIG_PPS_CLIENT_UART
+	struct pps_source_info	pps_info;
+#endif
+
 	struct mutex		mutex;
 };
 
@@ -486,13 +495,22 @@ uart_handle_dcd_change(struct uart_port *port, unsigned int status)
 {
 	struct uart_info *info = port->info;
 
-	port->icount.dcd++;
-
-#ifdef CONFIG_HARD_PPS
-	if ((port->flags & UPF_HARDPPS_CD) && status)
-		hardpps();
+#ifdef CONFIG_PPS_CLIENT_UART
+	if (port->flags & UPF_HARDPPS_CD) {
+		if (status) {
+			pps_event(port->pps_source, PPS_CAPTUREASSERT, port);
+			dev_dbg(port->dev, "PPS assert at %lu on source #%d\n",
+				jiffies, port->pps_source);
+		} else {
+			pps_event(port->pps_source, PPS_CAPTURECLEAR, port);
+			dev_dbg(port->dev, "PPS clear at %lu on source #%d\n",
+				jiffies, port->pps_source);
+		}
+	}
 #endif
 
+	port->icount.dcd++;
+
 	if (info->flags & UIF_CHECK_CD) {
 		if (status)
 			wake_up_interruptible(&info->open_wait);
-- 
1.5.4.3


-- 

GNU/Linux Solutions                  e-mail:    giometti@enneenne.com
Linux Device Driver                             giometti@linux.it
Embedded Systems                     phone:	+39 349 2432127
UNIX programming                     skype:     rodolfo.giometti

^ permalink raw reply related	[flat|nested] 35+ messages in thread
* LinuxPPS (RESUBMIT 2): the PPS Linux implementation.
@ 2008-03-06 12:08 Rodolfo Giometti
  2008-03-06 12:09 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
  0 siblings, 1 reply; 35+ messages in thread
From: Rodolfo Giometti @ 2008-03-06 12:08 UTC (permalink / raw)
  To: linux-kernel
  Cc: Andrew Morton, David Woodhouse, Dave Jones, Sam Ravnborg, Greg KH,
	Randy Dunlap

This patch set adds the PPS support into Linux.

PPS means "pulse per second" and its API is specified by RFC 2783
(Pulse-Per-Second API for UNIX-like Operating Systems, Version 1.0).

The code has been tested with the NTPD program
(http://www.eecis.udel.edu/~mills/ntp/html/index.html) and several GPS
antennae.

Rodolfo

--

 Documentation/pps/Makefile            |    2 
 b/Documentation/ABI/testing/sysfs-pps |   73 +++++++
 b/Documentation/ioctl-number.txt      |    2 
 b/Documentation/pps/Makefile          |   27 ++
 b/Documentation/pps/pps.txt           |  170 ++++++++++++++++
 b/Documentation/pps/ppsctl.c          |   63 ++++++
 b/Documentation/pps/ppsfind           |   17 +
 b/Documentation/pps/ppstest.c         |  152 +++++++++++++++
 b/Documentation/pps/timepps.h         |  196 +++++++++++++++++++
 b/MAINTAINERS                         |    7 
 b/drivers/Kconfig                     |    2 
 b/drivers/Makefile                    |    1 
 b/drivers/char/lp.c                   |   61 ++++++
 b/drivers/pps/Kconfig                 |   33 +++
 b/drivers/pps/Makefile                |    8 
 b/drivers/pps/clients/Kconfig         |   18 +
 b/drivers/pps/clients/Makefile        |    9 
 b/drivers/pps/clients/ktimer.c        |  115 +++++++++++
 b/drivers/pps/kapi.c                  |  272 +++++++++++++++++++++++++++
 b/drivers/pps/pps.c                   |  342 ++++++++++++++++++++++++++++++++++
 b/drivers/pps/sysfs.c                 |  130 ++++++++++++
 b/drivers/serial/8250.c               |    2 
 b/drivers/serial/serial_core.c        |   71 ++++++-
 b/include/linux/Kbuild                |    1 
 b/include/linux/parport.h             |   13 +
 b/include/linux/pps.h                 |  205 ++++++++++++++++++++
 b/include/linux/serial_core.h         |   31 ++-
 drivers/pps/Kconfig                   |    2 
 drivers/pps/Makefile                  |    1 
 drivers/pps/clients/Kconfig           |   20 +
 30 files changed, 2031 insertions(+), 15 deletions(-)



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

end of thread, other threads:[~2008-05-02 21:10 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-10 15:15 LinuxPPS (RESUBMIT 3): the PPS Linux implementation Rodolfo Giometti
2008-04-10 15:15 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
2008-04-10 15:15   ` [PATCH 2/7] PPS: userland header file for PPS API Rodolfo Giometti
2008-04-10 15:15     ` [PATCH 3/7] PPS: documentation programs and examples Rodolfo Giometti
2008-04-10 15:15       ` [PATCH 4/7] PPS: LinuxPPS clients support Rodolfo Giometti
2008-04-10 15:15         ` [PATCH 5/7] PPS: serial " Rodolfo Giometti
2008-04-10 15:15           ` [PATCH 6/7] PPS: example program to enable PPS support on serial ports Rodolfo Giometti
2008-04-10 15:16             ` [PATCH 7/7] PPS: parallel port clients support Rodolfo Giometti
2008-04-10 15:28           ` [PATCH 5/7] PPS: serial " Alan Cox
2008-04-10 15:36             ` Rodolfo Giometti
2008-04-10 15:28 ` LinuxPPS (RESUBMIT 3): the PPS Linux implementation Lennart Sorensen
  -- strict thread matches above, loose matches on Subject: below --
2008-04-10 16:01 [PATCH 5/7] PPS: serial clients support Rodolfo Giometti
2008-04-10 16:06 ` Rodolfo Giometti
2008-04-10 17:41   ` Greg KH
2008-04-10 18:22   ` LinuxPPS (RESUBMIT 4): the PPS Linux implementation Rodolfo Giometti
2008-04-10 18:22     ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
2008-04-10 18:22       ` [PATCH 2/7] PPS: userland header file for PPS API Rodolfo Giometti
2008-04-10 18:22         ` [PATCH 3/7] PPS: documentation programs and examples Rodolfo Giometti
2008-04-10 18:22           ` [PATCH 4/7] PPS: LinuxPPS clients support Rodolfo Giometti
2008-04-10 18:22             ` [PATCH 5/7] PPS: serial " Rodolfo Giometti
2008-04-10 20:09               ` Alan Cox
2008-04-11  7:55                 ` Rodolfo Giometti
2008-04-11  8:28                   ` Alan Cox
2008-04-11  8:49                     ` Rodolfo Giometti
2008-04-11 14:43                       ` Serge Belyshev
2008-04-11 16:58                         ` Rodolfo Giometti
2008-04-11 13:47                     ` Lennart Sorensen
2008-04-11 14:46                       ` Alan Cox
2008-04-30 11:41                         ` Rodolfo Giometti
2008-04-30 16:28                           ` Alan Cox
2008-05-02  7:33                             ` Rodolfo Giometti
2008-05-02 10:18                               ` Alan Cox
2008-05-02 10:45                                 ` Rodolfo Giometti
2008-05-02 12:56                                   ` Alan Cox
2008-05-02 21:09                                     ` Rodolfo Giometti
2008-03-06 12:08 LinuxPPS (RESUBMIT 2): the PPS Linux implementation Rodolfo Giometti
2008-03-06 12:09 ` [PATCH 1/7] LinuxPPS core support Rodolfo Giometti
2008-03-06 12:09   ` [PATCH 2/7] PPS: userland header file for PPS API Rodolfo Giometti
2008-03-06 12:09     ` [PATCH 3/7] PPS: documentation programs and examples Rodolfo Giometti
2008-03-06 12:09       ` [PATCH 4/7] PPS: LinuxPPS clients support Rodolfo Giometti
2008-03-06 12:09         ` [PATCH 5/7] PPS: serial " Rodolfo Giometti
2008-03-20 20:04           ` Andrew Morton
2008-03-21 11:17             ` Rodolfo Giometti
2008-03-21 17:41               ` Andrew Morton
2008-03-25 10:38                 ` Rodolfo Giometti

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