Skip to content

Commit

Permalink
[media] rc: do not wake up rc thread unless there is something to do
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sean Young authored and Mauro Carvalho Chehab committed Aug 13, 2012
1 parent 0938069 commit b83bfd1
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 16 deletions.
11 changes: 8 additions & 3 deletions drivers/media/rc/fintek-cir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++) {
Expand Down Expand Up @@ -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;
}

Expand All @@ -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 */
Expand Down
7 changes: 5 additions & 2 deletions drivers/media/rc/iguanair.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);
}
}

Expand Down
6 changes: 4 additions & 2 deletions drivers/media/rc/ir-raw.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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);

Expand Down
10 changes: 7 additions & 3 deletions drivers/media/rc/mceusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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--;
Expand Down Expand Up @@ -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)
Expand Down
19 changes: 13 additions & 6 deletions drivers/media/rc/ttusbir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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 */
Expand All @@ -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)
Expand Down

0 comments on commit b83bfd1

Please sign in to comment.