diff options
author | Ming Lei <ming.lei@canonical.com> | 2013-08-17 11:25:07 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-10-02 05:48:13 -0400 |
commit | 503f2de78d8358ca6feee07871ac6a0cf160a75e (patch) | |
tree | d1c19652178c38ee6d4da34867f9c7d5b9c072f0 | |
parent | cbbe1c03e762abd3303434c787963c613f3e7da8 (diff) |
[media] media: dvb-core: prepare for enabling irq in complete()
Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().
These functions may be called inside URB->complete(), so use
spin_lock_irqsave().
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r-- | drivers/media/dvb-core/dvb_demux.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/media/dvb-core/dvb_demux.c b/drivers/media/dvb-core/dvb_demux.c index 3485655fa082..58de4410c525 100644 --- a/drivers/media/dvb-core/dvb_demux.c +++ b/drivers/media/dvb-core/dvb_demux.c | |||
@@ -476,7 +476,9 @@ static void dvb_dmx_swfilter_packet(struct dvb_demux *demux, const u8 *buf) | |||
476 | void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, | 476 | void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, |
477 | size_t count) | 477 | size_t count) |
478 | { | 478 | { |
479 | spin_lock(&demux->lock); | 479 | unsigned long flags; |
480 | |||
481 | spin_lock_irqsave(&demux->lock, flags); | ||
480 | 482 | ||
481 | while (count--) { | 483 | while (count--) { |
482 | if (buf[0] == 0x47) | 484 | if (buf[0] == 0x47) |
@@ -484,7 +486,7 @@ void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, | |||
484 | buf += 188; | 486 | buf += 188; |
485 | } | 487 | } |
486 | 488 | ||
487 | spin_unlock(&demux->lock); | 489 | spin_unlock_irqrestore(&demux->lock, flags); |
488 | } | 490 | } |
489 | 491 | ||
490 | EXPORT_SYMBOL(dvb_dmx_swfilter_packets); | 492 | EXPORT_SYMBOL(dvb_dmx_swfilter_packets); |
@@ -519,8 +521,9 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, | |||
519 | { | 521 | { |
520 | int p = 0, i, j; | 522 | int p = 0, i, j; |
521 | const u8 *q; | 523 | const u8 *q; |
524 | unsigned long flags; | ||
522 | 525 | ||
523 | spin_lock(&demux->lock); | 526 | spin_lock_irqsave(&demux->lock, flags); |
524 | 527 | ||
525 | if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */ | 528 | if (demux->tsbufp) { /* tsbuf[0] is now 0x47. */ |
526 | i = demux->tsbufp; | 529 | i = demux->tsbufp; |
@@ -564,7 +567,7 @@ static inline void _dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, | |||
564 | } | 567 | } |
565 | 568 | ||
566 | bailout: | 569 | bailout: |
567 | spin_unlock(&demux->lock); | 570 | spin_unlock_irqrestore(&demux->lock, flags); |
568 | } | 571 | } |
569 | 572 | ||
570 | void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) | 573 | void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) |
@@ -581,11 +584,13 @@ EXPORT_SYMBOL(dvb_dmx_swfilter_204); | |||
581 | 584 | ||
582 | void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count) | 585 | void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count) |
583 | { | 586 | { |
584 | spin_lock(&demux->lock); | 587 | unsigned long flags; |
588 | |||
589 | spin_lock_irqsave(&demux->lock, flags); | ||
585 | 590 | ||
586 | demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, DMX_OK); | 591 | demux->feed->cb.ts(buf, count, NULL, 0, &demux->feed->feed.ts, DMX_OK); |
587 | 592 | ||
588 | spin_unlock(&demux->lock); | 593 | spin_unlock_irqrestore(&demux->lock, flags); |
589 | } | 594 | } |
590 | EXPORT_SYMBOL(dvb_dmx_swfilter_raw); | 595 | EXPORT_SYMBOL(dvb_dmx_swfilter_raw); |
591 | 596 | ||