From 5fc391853ea2a9070ae4161e21783e64c1b79f6c Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Fri, 20 Jun 2014 10:39:43 -0700 Subject: [PATCH] staging: comedi: ke_counter: expose clock source options to user space As pointed out by Ian Abbott, the INSN_CONFIG_SET_CLOCK_SRC options should be exposed in the user header comedi.h. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- drivers/staging/comedi/comedi.h | 11 ++++++ drivers/staging/comedi/drivers/ke_counter.c | 37 +++++++++++++-------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/drivers/staging/comedi/comedi.h b/drivers/staging/comedi/comedi.h index 6bbbe5b08954..dbaeba7469ac 100644 --- a/drivers/staging/comedi/comedi.h +++ b/drivers/staging/comedi/comedi.h @@ -976,4 +976,15 @@ enum amplc_dio_gate_source { AMPLC_DIO_GAT_NPAT_GONE /* negated "pattern gone away" */ }; +/* + * Values for setting a clock source with INSN_CONFIG_SET_CLOCK_SRC for + * the counter subdevice on the Kolter Electronic PCI-Counter board + * (ke_counter driver). + */ +enum ke_counter_clock_source { + KE_CLK_20MHZ, /* internal 20MHz (default) */ + KE_CLK_4MHZ, /* internal 4MHz (option) */ + KE_CLK_EXT /* external clock on pin 21 of D-Sub */ +}; + #endif /* _COMEDI_H */ diff --git a/drivers/staging/comedi/drivers/ke_counter.c b/drivers/staging/comedi/drivers/ke_counter.c index ed873c45e011..f46722c2648f 100644 --- a/drivers/staging/comedi/drivers/ke_counter.c +++ b/drivers/staging/comedi/drivers/ke_counter.c @@ -106,33 +106,42 @@ static int ke_counter_insn_config(struct comedi_device *dev, struct comedi_insn *insn, unsigned int *data) { + unsigned char src; + switch (data[0]) { case INSN_CONFIG_SET_CLOCK_SRC: switch (data[1]) { - case KE_OSC_SEL_EXT: /* Pin 21 on D-sub */ - case KE_OSC_SEL_4MHZ: /* option */ - case KE_OSC_SEL_20MHZ: /* default */ + case KE_CLK_20MHZ: /* default */ + src = KE_OSC_SEL_20MHZ; + break; + case KE_CLK_4MHZ: /* option */ + src = KE_OSC_SEL_4MHZ; + break; + case KE_CLK_EXT: /* Pin 21 on D-sub */ + src = KE_OSC_SEL_EXT; break; default: return -EINVAL; } - outb(data[1], dev->iobase + KE_OSC_SEL_REG); + outb(src, dev->iobase + KE_OSC_SEL_REG); break; case INSN_CONFIG_GET_CLOCK_SRC: - data[1] = inb(dev->iobase + KE_OSC_SEL_REG); - switch (data[1]) { - case KE_OSC_SEL_EXT: - data[2] = 0; /* Unknown */ - break; - case KE_OSC_SEL_4MHZ: - data[2] = 250; /* 250ns */ - break; + src = inb(dev->iobase + KE_OSC_SEL_REG); + switch (src) { case KE_OSC_SEL_20MHZ: + data[1] = KE_CLK_20MHZ; data[2] = 50; /* 50ns */ break; - default: - data[2] = 0; /* Invalid? */ + case KE_OSC_SEL_4MHZ: + data[1] = KE_CLK_4MHZ; + data[2] = 250; /* 250ns */ break; + case KE_OSC_SEL_EXT: + data[1] = KE_CLK_EXT; + data[2] = 0; /* Unknown */ + break; + default: + return -EINVAL; } break; case INSN_CONFIG_RESET: