aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2016-05-02 13:11:48 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-05-03 17:11:15 -0400
commitc3c860b395c7ca18bd30917b1cdbde66b7e090e0 (patch)
tree1bddc842fac8e55b2c6b7a0c4e51eb2dc078242c
parentfc53242394d3a5f73cae507361b9768243b2d5a2 (diff)
staging: comedi: mite: tidy up mite dma channel request/release
For aesthetics, make the actual "request" function static and change mite_request_channel_in_range() into a wrapper that calls the internal function. Change the inline function that requests any free channel into an export that also calls the internal function. Move the functions to a more logical spot in the code and add docbook comments for the exported functions. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Reviewed-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/staging/comedi/drivers/mite.c137
-rw-r--r--drivers/staging/comedi/drivers/mite.h21
2 files changed, 91 insertions, 67 deletions
diff --git a/drivers/staging/comedi/drivers/mite.c b/drivers/staging/comedi/drivers/mite.c
index 308ceb602e64..b1231eddb592 100644
--- a/drivers/staging/comedi/drivers/mite.c
+++ b/drivers/staging/comedi/drivers/mite.c
@@ -228,59 +228,6 @@ static unsigned int mite_fifo_size(struct mite *mite, unsigned int channel)
228 return empty_count + full_count; 228 return empty_count + full_count;
229} 229}
230 230
231struct mite_channel *mite_request_channel_in_range(struct mite *mite,
232 struct mite_ring *ring,
233 unsigned int min_channel,
234 unsigned int max_channel)
235{
236 struct mite_channel *mite_chan = NULL;
237 unsigned long flags;
238 int i;
239
240 /*
241 * spin lock so mite_release_channel can be called safely
242 * from interrupts
243 */
244 spin_lock_irqsave(&mite->lock, flags);
245 for (i = min_channel; i <= max_channel; ++i) {
246 mite_chan = &mite->channels[i];
247 if (!mite_chan->ring) {
248 mite_chan->ring = ring;
249 break;
250 }
251 mite_chan = NULL;
252 }
253 spin_unlock_irqrestore(&mite->lock, flags);
254 return mite_chan;
255}
256EXPORT_SYMBOL_GPL(mite_request_channel_in_range);
257
258void mite_release_channel(struct mite_channel *mite_chan)
259{
260 struct mite *mite = mite_chan->mite;
261 unsigned long flags;
262
263 /* spin lock to prevent races with mite_request_channel */
264 spin_lock_irqsave(&mite->lock, flags);
265 if (mite_chan->ring) {
266 mite_dma_disarm(mite_chan);
267 mite_dma_reset(mite_chan);
268 /*
269 * disable all channel's interrupts (do it after disarm/reset so
270 * MITE_CHCR reg isn't changed while dma is still active!)
271 */
272 writel(CHCR_CLR_DMA_IE | CHCR_CLR_LINKP_IE |
273 CHCR_CLR_SAR_IE | CHCR_CLR_DONE_IE |
274 CHCR_CLR_MRDY_IE | CHCR_CLR_DRDY_IE |
275 CHCR_CLR_LC_IE | CHCR_CLR_CONT_RB_IE,
276 mite->mmio + MITE_CHCR(mite_chan->channel));
277 mite_chan->ring = NULL;
278 mmiowb();
279 }
280 spin_unlock_irqrestore(&mite->lock, flags);
281}
282EXPORT_SYMBOL_GPL(mite_release_channel);
283
284void mite_dma_arm(struct mite_channel *mite_chan) 231void mite_dma_arm(struct mite_channel *mite_chan)
285{ 232{
286 struct mite *mite = mite_chan->mite; 233 struct mite *mite = mite_chan->mite;
@@ -585,6 +532,90 @@ int mite_done(struct mite_channel *mite_chan)
585} 532}
586EXPORT_SYMBOL_GPL(mite_done); 533EXPORT_SYMBOL_GPL(mite_done);
587 534
535static struct mite_channel *__mite_request_channel(struct mite *mite,
536 struct mite_ring *ring,
537 unsigned int min_channel,
538 unsigned int max_channel)
539{
540 struct mite_channel *mite_chan = NULL;
541 unsigned long flags;
542 int i;
543
544 /*
545 * spin lock so mite_release_channel can be called safely
546 * from interrupts
547 */
548 spin_lock_irqsave(&mite->lock, flags);
549 for (i = min_channel; i <= max_channel; ++i) {
550 mite_chan = &mite->channels[i];
551 if (!mite_chan->ring) {
552 mite_chan->ring = ring;
553 break;
554 }
555 mite_chan = NULL;
556 }
557 spin_unlock_irqrestore(&mite->lock, flags);
558 return mite_chan;
559}
560
561/**
562 * mite_request_channel_in_range() - Request a MITE dma channel.
563 * @mite: MITE device.
564 * @ring: MITE dma ring.
565 * @min_channel: minimum channel index to use.
566 * @max_channel: maximum channel index to use.
567 */
568struct mite_channel *mite_request_channel_in_range(struct mite *mite,
569 struct mite_ring *ring,
570 unsigned int min_channel,
571 unsigned int max_channel)
572{
573 return __mite_request_channel(mite, ring, min_channel, max_channel);
574}
575EXPORT_SYMBOL_GPL(mite_request_channel_in_range);
576
577/**
578 * mite_request_channel() - Request a MITE dma channel.
579 * @mite: MITE device.
580 * @ring: MITE dma ring.
581 */
582struct mite_channel *mite_request_channel(struct mite *mite,
583 struct mite_ring *ring)
584{
585 return __mite_request_channel(mite, ring, 0, mite->num_channels - 1);
586}
587EXPORT_SYMBOL_GPL(mite_request_channel);
588
589/**
590 * mite_release_channel() - Release a MITE dma channel.
591 * @mite_chan: MITE dma channel.
592 */
593void mite_release_channel(struct mite_channel *mite_chan)
594{
595 struct mite *mite = mite_chan->mite;
596 unsigned long flags;
597
598 /* spin lock to prevent races with mite_request_channel */
599 spin_lock_irqsave(&mite->lock, flags);
600 if (mite_chan->ring) {
601 mite_dma_disarm(mite_chan);
602 mite_dma_reset(mite_chan);
603 /*
604 * disable all channel's interrupts (do it after disarm/reset so
605 * MITE_CHCR reg isn't changed while dma is still active!)
606 */
607 writel(CHCR_CLR_DMA_IE | CHCR_CLR_LINKP_IE |
608 CHCR_CLR_SAR_IE | CHCR_CLR_DONE_IE |
609 CHCR_CLR_MRDY_IE | CHCR_CLR_DRDY_IE |
610 CHCR_CLR_LC_IE | CHCR_CLR_CONT_RB_IE,
611 mite->mmio + MITE_CHCR(mite_chan->channel));
612 mite_chan->ring = NULL;
613 mmiowb();
614 }
615 spin_unlock_irqrestore(&mite->lock, flags);
616}
617EXPORT_SYMBOL_GPL(mite_release_channel);
618
588/** 619/**
589 * mite_init_ring_descriptors() - Initialize a MITE dma ring descriptors. 620 * mite_init_ring_descriptors() - Initialize a MITE dma ring descriptors.
590 * @ring: MITE dma ring. 621 * @ring: MITE dma ring.
diff --git a/drivers/staging/comedi/drivers/mite.h b/drivers/staging/comedi/drivers/mite.h
index b5b11d419a38..eedef66c0bb1 100644
--- a/drivers/staging/comedi/drivers/mite.h
+++ b/drivers/staging/comedi/drivers/mite.h
@@ -60,20 +60,6 @@ struct mite {
60 spinlock_t lock; 60 spinlock_t lock;
61}; 61};
62 62
63struct mite_channel *mite_request_channel_in_range(struct mite *,
64 struct mite_ring *,
65 unsigned int min_channel,
66 unsigned int max_channel);
67
68static inline struct mite_channel *mite_request_channel(struct mite *mite,
69 struct mite_ring *ring)
70{
71 return mite_request_channel_in_range(mite, ring, 0,
72 mite->num_channels - 1);
73}
74
75void mite_release_channel(struct mite_channel *mite_chan);
76
77void mite_dma_arm(struct mite_channel *mite_chan); 63void mite_dma_arm(struct mite_channel *mite_chan);
78void mite_dma_disarm(struct mite_channel *mite_chan); 64void mite_dma_disarm(struct mite_channel *mite_chan);
79void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s); 65void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s);
@@ -85,6 +71,13 @@ int mite_done(struct mite_channel *mite_chan);
85void mite_prep_dma(struct mite_channel *mite_chan, 71void mite_prep_dma(struct mite_channel *mite_chan,
86 unsigned int num_device_bits, unsigned int num_memory_bits); 72 unsigned int num_device_bits, unsigned int num_memory_bits);
87 73
74struct mite_channel *mite_request_channel_in_range(struct mite *,
75 struct mite_ring *,
76 unsigned int min_channel,
77 unsigned int max_channel);
78struct mite_channel *mite_request_channel(struct mite *, struct mite_ring *);
79void mite_release_channel(struct mite_channel *);
80
88int mite_init_ring_descriptors(struct mite_ring *, struct comedi_subdevice *, 81int mite_init_ring_descriptors(struct mite_ring *, struct comedi_subdevice *,
89 unsigned int nbytes); 82 unsigned int nbytes);
90int mite_buf_change(struct mite_ring *, struct comedi_subdevice *); 83int mite_buf_change(struct mite_ring *, struct comedi_subdevice *);