aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2013-08-17 11:25:07 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-10-02 05:48:13 -0400
commit503f2de78d8358ca6feee07871ac6a0cf160a75e (patch)
treed1c19652178c38ee6d4da34867f9c7d5b9c072f0
parentcbbe1c03e762abd3303434c787963c613f3e7da8 (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.c17
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)
476void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, 476void 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
490EXPORT_SYMBOL(dvb_dmx_swfilter_packets); 492EXPORT_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
566bailout: 569bailout:
567 spin_unlock(&demux->lock); 570 spin_unlock_irqrestore(&demux->lock, flags);
568} 571}
569 572
570void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count) 573void 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
582void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, size_t count) 585void 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}
590EXPORT_SYMBOL(dvb_dmx_swfilter_raw); 595EXPORT_SYMBOL(dvb_dmx_swfilter_raw);
591 596