diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2016-05-02 13:11:48 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-05-03 17:11:15 -0400 |
commit | c3c860b395c7ca18bd30917b1cdbde66b7e090e0 (patch) | |
tree | 1bddc842fac8e55b2c6b7a0c4e51eb2dc078242c | |
parent | fc53242394d3a5f73cae507361b9768243b2d5a2 (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.c | 137 | ||||
-rw-r--r-- | drivers/staging/comedi/drivers/mite.h | 21 |
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 | ||
231 | struct 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 | } | ||
256 | EXPORT_SYMBOL_GPL(mite_request_channel_in_range); | ||
257 | |||
258 | void 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 | } | ||
282 | EXPORT_SYMBOL_GPL(mite_release_channel); | ||
283 | |||
284 | void mite_dma_arm(struct mite_channel *mite_chan) | 231 | void 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 | } |
586 | EXPORT_SYMBOL_GPL(mite_done); | 533 | EXPORT_SYMBOL_GPL(mite_done); |
587 | 534 | ||
535 | static 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 | */ | ||
568 | struct 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 | } | ||
575 | EXPORT_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 | */ | ||
582 | struct 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 | } | ||
587 | EXPORT_SYMBOL_GPL(mite_request_channel); | ||
588 | |||
589 | /** | ||
590 | * mite_release_channel() - Release a MITE dma channel. | ||
591 | * @mite_chan: MITE dma channel. | ||
592 | */ | ||
593 | void 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 | } | ||
617 | EXPORT_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 | ||
63 | struct mite_channel *mite_request_channel_in_range(struct mite *, | ||
64 | struct mite_ring *, | ||
65 | unsigned int min_channel, | ||
66 | unsigned int max_channel); | ||
67 | |||
68 | static 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 | |||
75 | void mite_release_channel(struct mite_channel *mite_chan); | ||
76 | |||
77 | void mite_dma_arm(struct mite_channel *mite_chan); | 63 | void mite_dma_arm(struct mite_channel *mite_chan); |
78 | void mite_dma_disarm(struct mite_channel *mite_chan); | 64 | void mite_dma_disarm(struct mite_channel *mite_chan); |
79 | void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s); | 65 | void mite_sync_dma(struct mite_channel *mite_chan, struct comedi_subdevice *s); |
@@ -85,6 +71,13 @@ int mite_done(struct mite_channel *mite_chan); | |||
85 | void mite_prep_dma(struct mite_channel *mite_chan, | 71 | void 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 | ||
74 | struct mite_channel *mite_request_channel_in_range(struct mite *, | ||
75 | struct mite_ring *, | ||
76 | unsigned int min_channel, | ||
77 | unsigned int max_channel); | ||
78 | struct mite_channel *mite_request_channel(struct mite *, struct mite_ring *); | ||
79 | void mite_release_channel(struct mite_channel *); | ||
80 | |||
88 | int mite_init_ring_descriptors(struct mite_ring *, struct comedi_subdevice *, | 81 | int mite_init_ring_descriptors(struct mite_ring *, struct comedi_subdevice *, |
89 | unsigned int nbytes); | 82 | unsigned int nbytes); |
90 | int mite_buf_change(struct mite_ring *, struct comedi_subdevice *); | 83 | int mite_buf_change(struct mite_ring *, struct comedi_subdevice *); |