Commit aa94f288 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman

staging: comedi: ni_660x: tidy up ni_660x_set_pfi_routing()

Use the comedi.h provided constants (enum ni_660x_pfi_routing) instead
of defining new ones for the output sources.

Use a switch to clarify the channel/source validation.

For aesthetics, rename the private data members 'pfi_output_selects' and
'pfi_direction_bits'.

Remove the 'min_counter_pfi_chan' and 'max_dio_pfi_chan' from
enum ni_660x_constants. The open coded values make the code easier
to follow.
Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 826f783a
...@@ -42,8 +42,6 @@ ...@@ -42,8 +42,6 @@
#include "ni_tio.h" #include "ni_tio.h"
enum ni_660x_constants { enum ni_660x_constants {
min_counter_pfi_chan = 8,
max_dio_pfi_chan = 31,
counters_per_chip = 4 counters_per_chip = 4
}; };
...@@ -172,10 +170,6 @@ enum ni_660x_register { ...@@ -172,10 +170,6 @@ enum ni_660x_register {
#define NI660X_IO_CFG(x) (NI660X_IO_CFG_0_1 + ((x) / 2)) #define NI660X_IO_CFG(x) (NI660X_IO_CFG_0_1 + ((x) / 2))
#define NI660X_IO_CFG_OUT_SEL(_c, _s) (((_s) & 0x3) << (((_c) % 2) ? 0 : 8)) #define NI660X_IO_CFG_OUT_SEL(_c, _s) (((_s) & 0x3) << (((_c) % 2) ? 0 : 8))
#define NI660X_IO_CFG_OUT_SEL_MASK(_c) NI660X_IO_CFG_OUT_SEL((_c), 0x3) #define NI660X_IO_CFG_OUT_SEL_MASK(_c) NI660X_IO_CFG_OUT_SEL((_c), 0x3)
#define NI660X_IO_CFG_OUT_SEL_HIGH_Z 0
#define NI660X_IO_CFG_OUT_SEL_COUNTER 1
#define NI660X_IO_CFG_OUT_SEL_DO 2
#define NI660X_IO_CFG_OUT_SEL_MAX 3
#define NI660X_IO_CFG_IN_SEL(_c, _s) (((_s) & 0x7) << (((_c) % 2) ? 4 : 12)) #define NI660X_IO_CFG_IN_SEL(_c, _s) (((_s) & 0x7) << (((_c) % 2) ? 4 : 12))
#define NI660X_IO_CFG_IN_SEL_MASK(_c) NI660X_IO_CFG_IN_SEL((_c), 0x7) #define NI660X_IO_CFG_IN_SEL_MASK(_c) NI660X_IO_CFG_IN_SEL((_c), 0x7)
...@@ -331,7 +325,6 @@ static const struct ni_660x_board ni_660x_boards[] = { ...@@ -331,7 +325,6 @@ static const struct ni_660x_board ni_660x_boards[] = {
struct ni_660x_private { struct ni_660x_private {
struct mite_struct *mite; struct mite_struct *mite;
struct ni_gpct_device *counter_dev; struct ni_gpct_device *counter_dev;
u64 pfi_direction_bits;
struct mite_dma_descriptor_ring struct mite_dma_descriptor_ring
*mite_rings[NI_660X_MAX_NUM_CHIPS][counters_per_chip]; *mite_rings[NI_660X_MAX_NUM_CHIPS][counters_per_chip];
spinlock_t mite_channel_lock; spinlock_t mite_channel_lock;
...@@ -339,7 +332,8 @@ struct ni_660x_private { ...@@ -339,7 +332,8 @@ struct ni_660x_private {
spinlock_t interrupt_lock; spinlock_t interrupt_lock;
unsigned int dma_cfg[NI_660X_MAX_NUM_CHIPS]; unsigned int dma_cfg[NI_660X_MAX_NUM_CHIPS];
spinlock_t soft_reg_copy_lock; spinlock_t soft_reg_copy_lock;
unsigned short pfi_output_selects[NUM_PFI_CHANNELS]; unsigned int io_cfg[NUM_PFI_CHANNELS];
u64 io_dir;
}; };
static enum ni_660x_register ni_gpct_to_660x_register(enum ni_gpct_register reg) static enum ni_660x_register ni_gpct_to_660x_register(enum ni_gpct_register reg)
...@@ -728,7 +722,7 @@ static int ni_660x_allocate_private(struct comedi_device *dev) ...@@ -728,7 +722,7 @@ static int ni_660x_allocate_private(struct comedi_device *dev)
spin_lock_init(&devpriv->interrupt_lock); spin_lock_init(&devpriv->interrupt_lock);
spin_lock_init(&devpriv->soft_reg_copy_lock); spin_lock_init(&devpriv->soft_reg_copy_lock);
for (i = 0; i < NUM_PFI_CHANNELS; ++i) for (i = 0; i < NUM_PFI_CHANNELS; ++i)
devpriv->pfi_output_selects[i] = NI660X_IO_CFG_OUT_SEL_COUNTER; devpriv->io_cfg[i] = NI_660X_PFI_OUTPUT_COUNTER;
return 0; return 0;
} }
...@@ -817,7 +811,7 @@ static void ni_660x_select_pfi_output(struct comedi_device *dev, ...@@ -817,7 +811,7 @@ static void ni_660x_select_pfi_output(struct comedi_device *dev,
unsigned int bits; unsigned int bits;
if (board->n_chips > 1) { if (board->n_chips > 1) {
if (out_sel == NI660X_IO_CFG_OUT_SEL_COUNTER && if (out_sel == NI_660X_PFI_OUTPUT_COUNTER &&
chan >= 8 && chan <= 23) { chan >= 8 && chan <= 23) {
/* counters 4-7 pfi channels */ /* counters 4-7 pfi channels */
active_chip = 1; active_chip = 1;
...@@ -833,8 +827,7 @@ static void ni_660x_select_pfi_output(struct comedi_device *dev, ...@@ -833,8 +827,7 @@ static void ni_660x_select_pfi_output(struct comedi_device *dev,
/* set the pfi channel to high-z on the inactive chip */ /* set the pfi channel to high-z on the inactive chip */
bits = ni_660x_read(dev, idle_chip, NI660X_IO_CFG(chan)); bits = ni_660x_read(dev, idle_chip, NI660X_IO_CFG(chan));
bits &= ~NI660X_IO_CFG_OUT_SEL_MASK(chan); bits &= ~NI660X_IO_CFG_OUT_SEL_MASK(chan);
bits |= NI660X_IO_CFG_OUT_SEL(chan, bits |= NI660X_IO_CFG_OUT_SEL(chan, 0); /* high-z */
NI660X_IO_CFG_OUT_SEL_HIGH_Z);
ni_660x_write(dev, idle_chip, bits, NI660X_IO_CFG(chan)); ni_660x_write(dev, idle_chip, bits, NI660X_IO_CFG(chan));
} }
...@@ -850,22 +843,21 @@ static int ni_660x_set_pfi_routing(struct comedi_device *dev, ...@@ -850,22 +843,21 @@ static int ni_660x_set_pfi_routing(struct comedi_device *dev,
{ {
struct ni_660x_private *devpriv = dev->private; struct ni_660x_private *devpriv = dev->private;
if (source > NI660X_IO_CFG_OUT_SEL_MAX) switch (source) {
return -EINVAL; case NI_660X_PFI_OUTPUT_COUNTER:
if (source == NI660X_IO_CFG_OUT_SEL_HIGH_Z) if (chan < 8)
return -EINVAL;
if (chan < min_counter_pfi_chan) {
if (source == NI660X_IO_CFG_OUT_SEL_COUNTER)
return -EINVAL; return -EINVAL;
} else if (chan > max_dio_pfi_chan) { break;
if (source == NI660X_IO_CFG_OUT_SEL_DO) case NI_660X_PFI_OUTPUT_DIO:
if (chan > 31)
return -EINVAL; return -EINVAL;
default:
return -EINVAL;
} }
devpriv->pfi_output_selects[chan] = source; devpriv->io_cfg[chan] = source;
if (devpriv->pfi_direction_bits & (1ULL << chan)) if (devpriv->io_dir & (1ULL << chan))
ni_660x_select_pfi_output(dev, chan, ni_660x_select_pfi_output(dev, chan, devpriv->io_cfg[chan]);
devpriv->pfi_output_selects[chan]);
return 0; return 0;
} }
...@@ -882,20 +874,18 @@ static int ni_660x_dio_insn_config(struct comedi_device *dev, ...@@ -882,20 +874,18 @@ static int ni_660x_dio_insn_config(struct comedi_device *dev,
switch (data[0]) { switch (data[0]) {
case INSN_CONFIG_DIO_OUTPUT: case INSN_CONFIG_DIO_OUTPUT:
devpriv->pfi_direction_bits |= bit; devpriv->io_dir |= bit;
ni_660x_select_pfi_output(dev, chan, ni_660x_select_pfi_output(dev, chan, devpriv->io_cfg[chan]);
devpriv->pfi_output_selects[chan]);
break; break;
case INSN_CONFIG_DIO_INPUT: case INSN_CONFIG_DIO_INPUT:
devpriv->pfi_direction_bits &= ~bit; devpriv->io_dir &= ~bit;
ni_660x_select_pfi_output(dev, chan, ni_660x_select_pfi_output(dev, chan, 0); /* high-z */
NI660X_IO_CFG_OUT_SEL_HIGH_Z);
break; break;
case INSN_CONFIG_DIO_QUERY: case INSN_CONFIG_DIO_QUERY:
data[1] = (devpriv->pfi_direction_bits & bit) ? COMEDI_OUTPUT data[1] = (devpriv->io_dir & bit) ? COMEDI_OUTPUT
: COMEDI_INPUT; : COMEDI_INPUT;
break; break;
case INSN_CONFIG_SET_ROUTING: case INSN_CONFIG_SET_ROUTING:
...@@ -905,7 +895,7 @@ static int ni_660x_dio_insn_config(struct comedi_device *dev, ...@@ -905,7 +895,7 @@ static int ni_660x_dio_insn_config(struct comedi_device *dev,
break; break;
case INSN_CONFIG_GET_ROUTING: case INSN_CONFIG_GET_ROUTING:
data[1] = devpriv->pfi_output_selects[chan]; data[1] = devpriv->io_cfg[chan];
break; break;
case INSN_CONFIG_FILTER: case INSN_CONFIG_FILTER:
...@@ -1084,13 +1074,12 @@ static int ni_660x_auto_attach(struct comedi_device *dev, ...@@ -1084,13 +1074,12 @@ static int ni_660x_auto_attach(struct comedi_device *dev,
ni_tio_init_counter(&devpriv->counter_dev->counters[i]); ni_tio_init_counter(&devpriv->counter_dev->counters[i]);
for (i = 0; i < NUM_PFI_CHANNELS; ++i) { for (i = 0; i < NUM_PFI_CHANNELS; ++i) {
if (i < min_counter_pfi_chan) if (i < 8)
ni_660x_set_pfi_routing(dev, i, ni_660x_set_pfi_routing(dev, i, NI_660X_PFI_OUTPUT_DIO);
NI660X_IO_CFG_OUT_SEL_DO);
else else
ni_660x_set_pfi_routing(dev, i, ni_660x_set_pfi_routing(dev, i,
NI660X_IO_CFG_OUT_SEL_COUNTER); NI_660X_PFI_OUTPUT_COUNTER);
ni_660x_select_pfi_output(dev, i, NI660X_IO_CFG_OUT_SEL_HIGH_Z); ni_660x_select_pfi_output(dev, i, 0); /* high-z */
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment