Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 51d43005 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: mite: introduce mite_sync_dma()



The struct mite_channel 'dir' member specifies if the dma is input
or output. Wrap the mite_sync_input_dma() and mite_sync_output_dma()
functions with a single mite_sync_dma() so that the drivers don't
have to worry about the sync direction.

The functions that actually sync the input/output dma currently return
-1 if an overflow/underrun is detected otherwise they return 0. If an
overflow/underrun is detected the async->event COMEDI_CB_OVERFLOW is
also set.

The callers never check the return value anyway so just make the
functions return void. The async->event can be checked if necessary
to detect any errors.

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 33b0b691
Loading
Loading
Loading
Loading
+22 −21
Original line number Diff line number Diff line
@@ -680,7 +680,7 @@ void mite_dma_disarm(struct mite_channel *mite_chan)
}
EXPORT_SYMBOL_GPL(mite_dma_disarm);

int mite_sync_input_dma(struct mite_channel *mite_chan,
static void mite_sync_input_dma(struct mite_channel *mite_chan,
				struct comedi_subdevice *s)
{
	struct comedi_async *async = s->async;
@@ -697,7 +697,7 @@ int mite_sync_input_dma(struct mite_channel *mite_chan,
		dev_warn(s->device->class_dev,
			 "mite: DMA overwrite of free area\n");
		async->events |= COMEDI_CB_OVERFLOW;
		return -1;
		return;
	}

	count = nbytes - async->buf_write_count;
@@ -705,17 +705,14 @@ int mite_sync_input_dma(struct mite_channel *mite_chan,
	 * it's possible count will be negative due to conservative value
	 * returned by mite_bytes_written_to_memory_lb
	 */
	if (count <= 0)
		return 0;

	if (count > 0) {
		comedi_buf_write_free(s, count);
		comedi_inc_scan_progress(s, count);
		async->events |= COMEDI_CB_BLOCK;
	return 0;
	}
EXPORT_SYMBOL_GPL(mite_sync_input_dma);
}

int mite_sync_output_dma(struct mite_channel *mite_chan,
static void mite_sync_output_dma(struct mite_channel *mite_chan,
				 struct comedi_subdevice *s)
{
	struct comedi_async *async = s->async;
@@ -739,7 +736,7 @@ int mite_sync_output_dma(struct mite_channel *mite_chan,
	    ((int)(nbytes_ub - old_alloc_count) > 0)) {
		dev_warn(s->device->class_dev, "mite: DMA underrun\n");
		async->events |= COMEDI_CB_OVERFLOW;
		return -1;
		return;
	}

	if (finite_regen) {
@@ -749,20 +746,24 @@ int mite_sync_output_dma(struct mite_channel *mite_chan,
		 * hence we expect that old_alloc_count will reach a maximum of
		 * stop_count bytes.
		 */
		return 0;
		return;
	}

	count = nbytes_lb - async->buf_read_count;
	if (count <= 0)
		return 0;

	if (count) {
	if (count > 0) {
		comedi_buf_read_free(s, count);
		async->events |= COMEDI_CB_BLOCK;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(mite_sync_output_dma);

void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s)
{
	if (mite_chan->dir == COMEDI_INPUT)
		mite_sync_input_dma(mite_chan, s);
	else
		mite_sync_output_dma(mite_chan, s);
}
EXPORT_SYMBOL_GPL(mite_sync_dma);

static unsigned int mite_get_status(struct mite_channel *mite_chan)
{
+1 −4
Original line number Diff line number Diff line
@@ -90,10 +90,7 @@ void mite_release_channel(struct mite_channel *mite_chan);

void mite_dma_arm(struct mite_channel *mite_chan);
void mite_dma_disarm(struct mite_channel *mite_chan);
int mite_sync_input_dma(struct mite_channel *mite_chan,
			struct comedi_subdevice *s);
int mite_sync_output_dma(struct mite_channel *mite_chan,
			 struct comedi_subdevice *s);
void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s);
u32 mite_bytes_in_transit(struct mite_channel *mite_chan);
unsigned int mite_ack_linkc(struct mite_channel *mite_chan);
int mite_done(struct mite_channel *mite_chan);
+1 −1
Original line number Diff line number Diff line
@@ -460,7 +460,7 @@ static int ni_660x_input_poll(struct comedi_device *dev,

	/* lock to avoid race with comedi_poll */
	spin_lock_irqsave(&devpriv->interrupt_lock, flags);
	mite_sync_input_dma(counter->mite_chan, s);
	mite_sync_dma(counter->mite_chan, s);
	spin_unlock_irqrestore(&devpriv->interrupt_lock, flags);
	return comedi_buf_read_n_available(s);
}
+3 −3
Original line number Diff line number Diff line
@@ -890,7 +890,7 @@ static void ni_sync_ai_dma(struct comedi_device *dev)

	spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
	if (devpriv->ai_mite_chan)
		mite_sync_input_dma(devpriv->ai_mite_chan, s);
		mite_sync_dma(devpriv->ai_mite_chan, s);
	spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
}

@@ -936,7 +936,7 @@ static void mite_handle_b_linkc(struct mite_struct *mite,

	spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
	if (devpriv->ao_mite_chan)
		mite_sync_output_dma(devpriv->ao_mite_chan, s);
		mite_sync_dma(devpriv->ao_mite_chan, s);
	spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);
}

@@ -3698,7 +3698,7 @@ static void handle_cdio_interrupt(struct comedi_device *dev)
	spin_lock_irqsave(&devpriv->mite_channel_lock, flags);
	if (devpriv->cdo_mite_chan) {
		mite_ack_linkc(devpriv->cdo_mite_chan);
		mite_sync_output_dma(devpriv->cdo_mite_chan, s);
		mite_sync_dma(devpriv->cdo_mite_chan, s);
	}
	spin_unlock_irqrestore(&devpriv->mite_channel_lock, flags);

+2 −2
Original line number Diff line number Diff line
@@ -368,7 +368,7 @@ static int ni_pcidio_poll(struct comedi_device *dev, struct comedi_subdevice *s)
	spin_lock_irqsave(&dev->spinlock, irq_flags);
	spin_lock(&devpriv->mite_channel_lock);
	if (devpriv->di_mite_chan)
		mite_sync_input_dma(devpriv->di_mite_chan, s);
		mite_sync_dma(devpriv->di_mite_chan, s);
	spin_unlock(&devpriv->mite_channel_lock);
	count = comedi_buf_n_bytes_ready(s);
	spin_unlock_irqrestore(&dev->spinlock, irq_flags);
@@ -403,7 +403,7 @@ static irqreturn_t nidio_interrupt(int irq, void *d)
		unsigned int m_status = mite_ack_linkc(devpriv->di_mite_chan);

		if (m_status & CHSR_LINKC) {
			mite_sync_input_dma(devpriv->di_mite_chan, s);
			mite_sync_dma(devpriv->di_mite_chan, s);
			/* XXX need to byteswap */
		}
		if (m_status & ~(CHSR_INT | CHSR_LINKC | CHSR_DONE | CHSR_DRDY |
Loading