[media] rc: do not wake up rc thread unless there is something to do
authorSean Young <sean@mess.org>
Mon, 13 Aug 2012 11:59:47 +0000 (08:59 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 13 Aug 2012 19:19:12 +0000 (16:19 -0300)
The TechnoTrend USB IR Receiver sends 125 ISO URBs per second, even when
there is no IR activity. Reduce the number of wake ups from the other
drivers too.

This saves about 0.25ms/s on a 2.4GHz Core 2 according to powertop.

Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/rc/fintek-cir.c
drivers/media/rc/iguanair.c
drivers/media/rc/ir-raw.c
drivers/media/rc/mceusb.c
drivers/media/rc/ttusbir.c

index ab30c64f812491d186e3a088bea23cc6849651a2..52fd7696b1ba8c7e5bccc9321fd8bd7f4a8fd105 100644 (file)
@@ -295,6 +295,7 @@ static void fintek_process_rx_ir_data(struct fintek_dev *fintek)
 {
        DEFINE_IR_RAW_EVENT(rawir);
        u8 sample;
+       bool event = false;
        int i;
 
        for (i = 0; i < fintek->pkts; i++) {
@@ -332,7 +333,9 @@ static void fintek_process_rx_ir_data(struct fintek_dev *fintek)
                        fit_dbg("Storing %s with duration %d",
                                rawir.pulse ? "pulse" : "space",
                                rawir.duration);
-                       ir_raw_event_store_with_filter(fintek->rdev, &rawir);
+                       if (ir_raw_event_store_with_filter(fintek->rdev,
+                                                                       &rawir))
+                               event = true;
                        break;
                }
 
@@ -342,8 +345,10 @@ static void fintek_process_rx_ir_data(struct fintek_dev *fintek)
 
        fintek->pkts = 0;
 
-       fit_dbg("Calling ir_raw_event_handle");
-       ir_raw_event_handle(fintek->rdev);
+       if (event) {
+               fit_dbg("Calling ir_raw_event_handle");
+               ir_raw_event_handle(fintek->rdev);
+       }
 }
 
 /* copy data from hardware rx register into driver buffer */
index 6a09c2e53753c8320c294c5a644bea88ab1d5761..66ba23738601fc92659a7166eb8cfb8a2ee988c2 100644 (file)
@@ -134,6 +134,7 @@ static void process_ir_data(struct iguanair *ir, unsigned len)
        } else if (len >= 7) {
                DEFINE_IR_RAW_EVENT(rawir);
                unsigned i;
+               bool event = false;
 
                init_ir_raw_event(&rawir);
 
@@ -147,10 +148,12 @@ static void process_ir_data(struct iguanair *ir, unsigned len)
                                                                 RX_RESOLUTION;
                        }
 
-                       ir_raw_event_store_with_filter(ir->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(ir->rc, &rawir))
+                               event = true;
                }
 
-               ir_raw_event_handle(ir->rc);
+               if (event)
+                       ir_raw_event_handle(ir->rc);
        }
 }
 
index a82025121345bdad0dc1d84f425d640fa7010a30..97dc8d13b06b386ab2b93293f227a7de37769a29 100644 (file)
@@ -157,7 +157,9 @@ EXPORT_SYMBOL_GPL(ir_raw_event_store_edge);
  * This routine (which may be called from an interrupt context) works
  * in similar manner to ir_raw_event_store_edge.
  * This routine is intended for devices with limited internal buffer
- * It automerges samples of same type, and handles timeouts
+ * It automerges samples of same type, and handles timeouts. Returns non-zero
+ * if the event was added, and zero if the event was ignored due to idle
+ * processing.
  */
 int ir_raw_event_store_with_filter(struct rc_dev *dev, struct ir_raw_event *ev)
 {
@@ -184,7 +186,7 @@ int ir_raw_event_store_with_filter(struct rc_dev *dev, struct ir_raw_event *ev)
            dev->raw->this_ev.duration >= dev->timeout)
                ir_raw_event_set_idle(dev, true);
 
-       return 0;
+       return 1;
 }
 EXPORT_SYMBOL_GPL(ir_raw_event_store_with_filter);
 
index f38d9a8c6880168a4c6256bdb227218c70123ed9..d289fd42729f72ae1cb783753829b3f36a46edaf 100644 (file)
@@ -974,6 +974,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
 static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
 {
        DEFINE_IR_RAW_EVENT(rawir);
+       bool event = false;
        int i = 0;
 
        /* skip meaningless 0xb1 0x60 header bytes on orig receiver */
@@ -1004,7 +1005,8 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
                                rawir.pulse ? "pulse" : "space",
                                rawir.duration);
 
-                       ir_raw_event_store_with_filter(ir->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(ir->rc, &rawir))
+                               event = true;
                        break;
                case CMD_DATA:
                        ir->rem--;
@@ -1032,8 +1034,10 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
                if (ir->parser_state != CMD_HEADER && !ir->rem)
                        ir->parser_state = CMD_HEADER;
        }
-       mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
-       ir_raw_event_handle(ir->rc);
+       if (event) {
+               mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
+               ir_raw_event_handle(ir->rc);
+       }
 }
 
 static void mceusb_dev_recv(struct urb *urb)
index 71f03acabac88a8bfde3a5f1249764904a05ed10..1aee57fd2f328aff4dd7df675ca4f48daaa2c98d 100644 (file)
@@ -121,8 +121,9 @@ static void ttusbir_bulk_complete(struct urb *urb)
  */
 static void ttusbir_process_ir_data(struct ttusbir *tt, uint8_t *buf)
 {
+       struct ir_raw_event rawir;
        unsigned i, v, b;
-       DEFINE_IR_RAW_EVENT(rawir);
+       bool event = false;
 
        init_ir_raw_event(&rawir);
 
@@ -132,12 +133,14 @@ static void ttusbir_process_ir_data(struct ttusbir *tt, uint8_t *buf)
                case 0xfe:
                        rawir.pulse = false;
                        rawir.duration = NS_PER_BYTE;
-                       ir_raw_event_store_with_filter(tt->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(tt->rc, &rawir))
+                               event = true;
                        break;
                case 0:
                        rawir.pulse = true;
                        rawir.duration = NS_PER_BYTE;
-                       ir_raw_event_store_with_filter(tt->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(tt->rc, &rawir))
+                               event = true;
                        break;
                default:
                        /* one edge per byte */
@@ -150,16 +153,20 @@ static void ttusbir_process_ir_data(struct ttusbir *tt, uint8_t *buf)
                        }
 
                        rawir.duration = NS_PER_BIT * (8 - b);
-                       ir_raw_event_store_with_filter(tt->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(tt->rc, &rawir))
+                               event = true;
 
                        rawir.pulse = !rawir.pulse;
                        rawir.duration = NS_PER_BIT * b;
-                       ir_raw_event_store_with_filter(tt->rc, &rawir);
+                       if (ir_raw_event_store_with_filter(tt->rc, &rawir))
+                               event = true;
                        break;
                }
        }
 
-       ir_raw_event_handle(tt->rc);
+       /* don't wakeup when there's nothing to do */
+       if (event)
+               ir_raw_event_handle(tt->rc);
 }
 
 static void ttusbir_urb_complete(struct urb *urb)