From 6f7fa704648e69a295f6b8bcf35538692258fbb3 Mon Sep 17 00:00:00 2001 From: H Hartley Sweeten Date: Thu, 14 Apr 2016 09:58:07 -0700 Subject: [PATCH] staging: comedi: ni_mio_common: introduce NI_STC_DMA_CHAN_SEL() The inline helper ni_stc_dma_channel_select_bitfield() returns the bits needed to select a MITE channel to use for DMA. The MITE code is setup to handle up to 8 channels but in reality only channels 0 to 3 are used by most of the drivers. The PCI-6032E and PCI-6033E boards can also use channels 4 and 5. For aesthetics, convert this inline function into a macro and remove the BUG() which will never occur. Signed-off-by: H Hartley Sweeten Reviewed-by: Ian Abbott Signed-off-by: Greg Kroah-Hartman --- .../staging/comedi/drivers/ni_mio_common.c | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c index d3313866ec09..081ed3f37817 100644 --- a/drivers/staging/comedi/drivers/ni_mio_common.c +++ b/drivers/staging/comedi/drivers/ni_mio_common.c @@ -560,20 +560,13 @@ static inline void ni_set_bitfield(struct comedi_device *dev, int reg, } #ifdef PCIDMA -/* DMA channel setup */ -static inline unsigned int -ni_stc_dma_channel_select_bitfield(unsigned int channel) -{ - if (channel < 4) - return 1 << channel; - if (channel == 4) - return 0x3; - if (channel == 5) - return 0x5; - BUG(); - return 0; -} +/* selects the MITE channel to use for DMA */ +#define NI_STC_DMA_CHAN_SEL(x) (((x) < 4) ? BIT(x) : \ + ((x) == 4) ? 0x3 : \ + ((x) == 5) ? 0x5 : 0x0) + +/* DMA channel setup */ static int ni_request_ai_mite_channel(struct comedi_device *dev) { struct ni_private *devpriv = dev->private; @@ -592,7 +585,7 @@ static int ni_request_ai_mite_channel(struct comedi_device *dev) mite_chan->dir = COMEDI_INPUT; devpriv->ai_mite_chan = mite_chan; - bits = ni_stc_dma_channel_select_bitfield(mite_chan->channel); + bits = NI_STC_DMA_CHAN_SEL(mite_chan->channel); ni_set_bitfield(dev, NI_E_DMA_AI_AO_SEL_REG, NI_E_DMA_AI_SEL_MASK, NI_E_DMA_AI_SEL(bits)); @@ -618,7 +611,7 @@ static int ni_request_ao_mite_channel(struct comedi_device *dev) mite_chan->dir = COMEDI_OUTPUT; devpriv->ao_mite_chan = mite_chan; - bits = ni_stc_dma_channel_select_bitfield(mite_chan->channel); + bits = NI_STC_DMA_CHAN_SEL(mite_chan->channel); ni_set_bitfield(dev, NI_E_DMA_AI_AO_SEL_REG, NI_E_DMA_AO_SEL_MASK, NI_E_DMA_AO_SEL(bits)); @@ -648,7 +641,7 @@ static int ni_request_gpct_mite_channel(struct comedi_device *dev, mite_chan->dir = direction; ni_tio_set_mite_channel(counter, mite_chan); - bits = ni_stc_dma_channel_select_bitfield(mite_chan->channel); + bits = NI_STC_DMA_CHAN_SEL(mite_chan->channel); ni_set_bitfield(dev, NI_E_DMA_G0_G1_SEL_REG, NI_E_DMA_G0_G1_SEL_MASK(gpct_index), NI_E_DMA_G0_G1_SEL(gpct_index, bits)); @@ -676,12 +669,12 @@ static int ni_request_cdo_mite_channel(struct comedi_device *dev) devpriv->cdo_mite_chan = mite_chan; /* - * XXX just guessing ni_stc_dma_channel_select_bitfield() + * XXX just guessing NI_STC_DMA_CHAN_SEL() * returns the right bits, under the assumption the cdio dma * selection works just like ai/ao/gpct. * Definitely works for dma channels 0 and 1. */ - bits = ni_stc_dma_channel_select_bitfield(mite_chan->channel); + bits = NI_STC_DMA_CHAN_SEL(mite_chan->channel); ni_set_bitfield(dev, NI_M_CDIO_DMA_SEL_REG, NI_M_CDIO_DMA_SEL_CDO_MASK, NI_M_CDIO_DMA_SEL_CDO(bits)); -- 2.20.1