From: Rodolfo Giometti <giometti@linux.it>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
David Woodhouse <dwmw2@infradead.org>,
Dave Jones <davej@redhat.com>, Sam Ravnborg <sam@ravnborg.org>,
Greg KH <greg@kroah.com>, Randy Dunlap <randy.dunlap@oracle.com>,
Rodolfo Giometti <giometti@linux.it>
Subject: [PATCH] PPS: parallel port clients support.
Date: Fri, 22 Feb 2008 15:03:33 +0100 [thread overview]
Message-ID: <12036890141304-git-send-email-giometti@linux.it> (raw)
In-Reply-To: <12036890142501-git-send-email-giometti@linux.it>
Adds support for the PPS sources connected with the interrupt pin of a
parallel port.
Signed-off-by: Rodolfo Giometti <giometti@linux.it>
---
drivers/char/lp.c | 61 +++++++++++++++++++++++++++++++++++++++++++
drivers/pps/clients/Kconfig | 10 +++++++
include/linux/parport.h | 12 ++++++++
3 files changed, 83 insertions(+), 0 deletions(-)
diff --git a/drivers/char/lp.c b/drivers/char/lp.c
index 60ac642..b201fed 100644
--- a/drivers/char/lp.c
+++ b/drivers/char/lp.c
@@ -746,6 +746,27 @@ static struct console lpcons = {
#endif /* console on line printer */
+/* Support for PPS signal on the line printer */
+
+#ifdef CONFIG_PPS_CLIENT_LP
+
+static void lp_pps_echo(int source, int event, void *data)
+{
+ struct parport *port = data;
+ unsigned char status = parport_read_status(port);
+
+ /* echo event via SEL bit */
+ parport_write_control(port,
+ parport_read_control(port) | PARPORT_CONTROL_SELECT);
+
+ /* signal no event */
+ if ((status & PARPORT_STATUS_ACK) != 0)
+ parport_write_control(port,
+ parport_read_control(port) & ~PARPORT_CONTROL_SELECT);
+}
+
+#endif
+
/* --- initialisation code ------------------------------------- */
static int parport_nr[LP_NO] = { [0 ... LP_NO-1] = LP_PARPORT_UNSPEC };
@@ -816,6 +837,38 @@ static int lp_register(int nr, struct parport *port)
}
#endif
+#ifdef CONFIG_PPS_CLIENT_LP
+ port->pps_info.owner = THIS_MODULE;
+ port->pps_info.dev = port->dev;
+ snprintf(port->pps_info.path, PPS_MAX_NAME_LEN, "/dev/lp%d", nr);
+
+ /* No PPS support if lp port has no IRQ line */
+ if (port->irq != PARPORT_IRQ_NONE) {
+ strncpy(port->pps_info.name, port->name, PPS_MAX_NAME_LEN);
+
+ port->pps_info.mode = PPS_CAPTUREASSERT | PPS_OFFSETASSERT | \
+ PPS_ECHOASSERT | \
+ PPS_CANWAIT | PPS_TSFMT_TSPEC;
+
+ port->pps_info.echo = lp_pps_echo;
+
+ port->pps_source = pps_register_source(&(port->pps_info),
+ PPS_CAPTUREASSERT | PPS_OFFSETASSERT);
+ if (port->pps_source < 0)
+ dev_err(port->dev,
+ "cannot register PPS source \"%s\"\n",
+ port->pps_info.path);
+ else
+ dev_info(port->dev, "PPS source #%d \"%s\" added\n",
+ port->pps_source, port->pps_info.path);
+ } else {
+ port->pps_source = -1;
+ dev_err(port->dev, "PPS support disabled because port \"%s\" "
+ "is in polling mode\n",
+ port->pps_info.path);
+ }
+#endif
+
return 0;
}
@@ -858,6 +911,14 @@ static void lp_detach (struct parport *port)
console_registered = NULL;
}
#endif /* CONFIG_LP_CONSOLE */
+
+#ifdef CONFIG_PPS_CLIENT_LP
+ if (port->pps_source >= 0) {
+ pps_unregister_source(port->pps_source);
+ dev_dbg(port->dev, "PPS source #%d \"%s\" removed\n",
+ port->pps_source, port->pps_info.path);
+ }
+#endif
}
static struct parport_driver lp_driver = {
diff --git a/drivers/pps/clients/Kconfig b/drivers/pps/clients/Kconfig
index 517c338..09ba5c3 100644
--- a/drivers/pps/clients/Kconfig
+++ b/drivers/pps/clients/Kconfig
@@ -25,4 +25,14 @@ config PPS_CLIENT_UART
If you say yes here you get support for a PPS source connected
with the CD (Carrier Detect) pin of your serial port.
+comment "Parallel printer support (forced off)"
+ depends on !( PRINTER != n && !(PPS = m && PRINTER = y))
+
+config PPS_CLIENT_LP
+ bool "Parallel printer support"
+ depends on PRINTER != n && !(PPS = m && PRINTER = y)
+ help
+ If you say yes here you get support for a PPS source connected
+ with the interrupt pin of your parallel port.
+
endif
diff --git a/include/linux/parport.h b/include/linux/parport.h
index d1ad546..501a9dc 100644
--- a/include/linux/parport.h
+++ b/include/linux/parport.h
@@ -100,6 +100,7 @@ typedef enum {
#include <linux/proc_fs.h>
#include <linux/spinlock.h>
#include <linux/wait.h>
+#include <linux/pps.h>
#include <linux/irqreturn.h>
#include <asm/system.h>
#include <asm/ptrace.h>
@@ -328,6 +329,11 @@ struct parport {
struct list_head full_list;
struct parport *slaves[3];
+
+#ifdef CONFIG_PPS_CLIENT_LP
+ struct pps_source_info pps_info;
+ int pps_source; /* PPS source ID */
+#endif
};
#define DEFAULT_SPIN_TIME 500 /* us */
@@ -516,6 +522,12 @@ extern int parport_daisy_select (struct parport *port, int daisy, int mode);
/* Lowlevel drivers _can_ call this support function to handle irqs. */
static inline void parport_generic_irq(struct parport *port)
{
+#ifdef CONFIG_PPS_CLIENT_LP
+ pps_event(port->pps_source, PPS_CAPTUREASSERT, port);
+ dev_dbg(port->dev, "PPS assert at %lu on source #%d\n",
+ jiffies, port->pps_source);
+#endif
+
parport_ieee1284_interrupt (port);
read_lock(&port->cad_lock);
if (port->cad && port->cad->irq_func)
--
1.5.2.5
next prev parent reply other threads:[~2008-02-22 14:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-22 14:03 LinuxPPS (RESUBMIT): the PPS Linux implementation Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] LinuxPPS core support Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] PPS: userland header file for PPS API Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] PPS: documentation programs and examples Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] PPS: LinuxPPS clients support Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] PPS: serial " Rodolfo Giometti
2008-02-22 14:03 ` [PATCH] PPS: example program to enable PPS support on serial ports Rodolfo Giometti
2008-02-22 14:03 ` Rodolfo Giometti [this message]
-- strict thread matches above, loose matches on Subject: below --
2008-02-18 23:28 LinuxPPS (RESUBMIT): the PPS Linux implementation Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] LinuxPPS core support Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: userland header file for PPS API Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: documentation programs and examples Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: LinuxPPS clients support Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: serial " Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: example program to enable PPS support on serial ports Rodolfo Giometti
2008-02-18 23:28 ` [PATCH] PPS: parallel port clients support Rodolfo Giometti
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=12036890141304-git-send-email-giometti@linux.it \
--to=giometti@linux.it \
--cc=akpm@linux-foundation.org \
--cc=davej@redhat.com \
--cc=dwmw2@infradead.org \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=randy.dunlap@oracle.com \
--cc=sam@ravnborg.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.