[PATCH 09/15] staging: comedi: mite: introduce mite_ack_linkc()

Ian Abbott abbotti at mev.co.uk
Tue Apr 19 10:22:40 UTC 2016


On 18/04/16 21:28, H Hartley Sweeten wrote:
> Introduce a helper function to handle the ack of a LINKC interrupt.
> Tidy up the drivers that use the new helper.
>
> The mite_get_status() function is not only used by the mite driver.
> Make it static and remove the export.
>
> Signed-off-by: H Hartley Sweeten <hsweeten at visionengravers.com>
> Cc: Ian Abbott <abbotti at mev.co.uk>
> Cc: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
> ---
>   drivers/staging/comedi/drivers/mite.c          | 17 ++++++++++++++--
>   drivers/staging/comedi/drivers/mite.h          |  2 +-
>   drivers/staging/comedi/drivers/ni_mio_common.c | 28 +++++---------------------
>   drivers/staging/comedi/drivers/ni_pcidio.c     | 10 ++-------
>   drivers/staging/comedi/drivers/ni_tiocmd.c     | 11 ++--------
>   5 files changed, 25 insertions(+), 43 deletions(-)
>
[snip]
> diff --git a/drivers/staging/comedi/drivers/ni_pcidio.c b/drivers/staging/comedi/drivers/ni_pcidio.c
> index c044c8b..b67358d 100644
> --- a/drivers/staging/comedi/drivers/ni_pcidio.c
> +++ b/drivers/staging/comedi/drivers/ni_pcidio.c
> @@ -381,12 +381,10 @@ static irqreturn_t nidio_interrupt(int irq, void *d)
>   	struct nidio96_private *devpriv = dev->private;
>   	struct comedi_subdevice *s = dev->read_subdev;
>   	struct comedi_async *async = s->async;
> -	struct mite_struct *mite = devpriv->mite;
>   	unsigned int auxdata;
>   	int flags;
>   	int status;
>   	int work = 0;
> -	unsigned int m_status = 0;
>
>   	/* interrupcions parasites */
>   	if (!dev->attached) {
> @@ -401,14 +399,10 @@ static irqreturn_t nidio_interrupt(int irq, void *d)
>   	flags = readb(dev->mmio + Group_1_Flags);
>
>   	spin_lock(&devpriv->mite_channel_lock);
> -	if (devpriv->di_mite_chan)
> -		m_status = mite_get_status(devpriv->di_mite_chan);
> +	if (devpriv->di_mite_chan) {
> +		unsigned int m_status = mite_ack_linkc(devpriv->di_mite_chan);
>
> -	if (m_status & CHSR_INT) {

Is the removal of that `m_status & CHSR_INT` test deliberate?  It looks 
a bit iffy.

>   		if (m_status & CHSR_LINKC) {
> -			writel(CHOR_CLRLC,
> -			       mite->mite_io_addr +
> -			       MITE_CHOR(devpriv->di_mite_chan->channel));
>   			mite_sync_input_dma(devpriv->di_mite_chan, s);
>   			/* XXX need to byteswap */
>   		}
> diff --git a/drivers/staging/comedi/drivers/ni_tiocmd.c b/drivers/staging/comedi/drivers/ni_tiocmd.c
> index 3c3f543..e9ee06b 100644
> --- a/drivers/staging/comedi/drivers/ni_tiocmd.c
> +++ b/drivers/staging/comedi/drivers/ni_tiocmd.c
> @@ -400,7 +400,6 @@ void ni_tio_handle_interrupt(struct ni_gpct *counter,
>   			     struct comedi_subdevice *s)
>   {
>   	unsigned int cidx = counter->counter_index;
> -	unsigned int gpct_mite_status;
>   	unsigned long flags;
>   	int gate_error;
>   	int tc_error;
> @@ -430,15 +429,9 @@ void ni_tio_handle_interrupt(struct ni_gpct *counter,
>   	}
>   	spin_lock_irqsave(&counter->lock, flags);
>   	if (!counter->mite_chan) {
> -		spin_unlock_irqrestore(&counter->lock, flags);
> -		return;
> +		mite_ack_linkc(counter->mite_chan);
> +		mite_sync_input_dma(counter->mite_chan, s);

That's wrong.  I think you forgot to invert the `!counter->mite_chan` test.

>   	}
> -	gpct_mite_status = mite_get_status(counter->mite_chan);
> -	if (gpct_mite_status & CHSR_LINKC)
> -		writel(CHOR_CLRLC,
> -		       counter->mite_chan->mite->mite_io_addr +
> -		       MITE_CHOR(counter->mite_chan->channel));
> -	mite_sync_input_dma(counter->mite_chan, s);
>   	spin_unlock_irqrestore(&counter->lock, flags);
>   }
>   EXPORT_SYMBOL_GPL(ni_tio_handle_interrupt);
>


-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti at mev.co.uk> )=-
-=(                          Web: http://www.mev.co.uk/  )=-


More information about the devel mailing list