Re: [PATCH 2/5] IR: extend ir_raw_event and do refactoring
On Sat, 2010-10-16 at 00:29 -0300, Mauro Carvalho Chehab wrote: > Em 15-10-2010 13:06, Maxim Levitsky escreveu: > > Add new event types for timeout & carrier report > > Move timeout handling from ir_raw_event_store_with_filter to > > ir-lirc-codec, where it is really needed. > > Now lirc bridge ensures proper gap handling. > > Extend lirc bridge for carrier & timeout reports > > > > Note: all new ir_raw_event variables now should be initialized > > like that: DEFINE_IR_RAW_EVENT(ev); > > > > To clean an existing event, use init_ir_raw_event(&ev); > > > > Signed-off-by: Maxim Levitsky > > Acked-by: Jarod Wilson > > > Applying patch > patches/lmml_257371_2_5_ir_extend_ir_raw_event_and_do_refactoring.patch > patching file drivers/media/IR/ene_ir.c > patching file drivers/media/IR/ir-core-priv.h > Hunk #1 succeeded at 88 (offset 6 lines). > Hunk #2 succeeded at 121 (offset 6 lines). > patching file drivers/media/IR/ir-jvc-decoder.c > patching file drivers/media/IR/ir-lirc-codec.c > Hunk #3 FAILED at 139. > Hunk #4 FAILED at 167. > Hunk #7 succeeded at 330 (offset 3 lines). > 2 out of 7 hunks FAILED -- rejects in file drivers/media/IR/ir-lirc-codec.c > patching file drivers/media/IR/ir-nec-decoder.c > patching file drivers/media/IR/ir-raw-event.c > patching file drivers/media/IR/ir-rc5-decoder.c > patching file drivers/media/IR/ir-rc6-decoder.c > patching file drivers/media/IR/ir-sony-decoder.c > patching file drivers/media/IR/mceusb.c > patching file drivers/media/IR/streamzap.c > Hunk #1 FAILED at 170. > Hunk #2 FAILED at 215. > Hunk #3 FAILED at 233. > Hunk #4 succeeded at 373 (offset -139 lines). > 3 out of 4 hunks FAILED -- rejects in file drivers/media/IR/streamzap.c > patching file include/media/ir-core.h > Hunk #3 succeeded at 165 (offset 1 line). > Patch patches/lmml_257371_2_5_ir_extend_ir_raw_event_and_do_refactoring.patch > does not apply (enforce with -f) > Patch didn't apply. Aborting > > Too much fails for me... -EABORTING... > > I won't apply this patch... there are two copies of it, and it has several > broken hunks. > > > Please fix. Not surprising as v4l tree got many changes and that patch touches many places. Will redo that really against the media_tree :-) Sorry! Best regards, Maxim Levitsky -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 2/5] IR: extend ir_raw_event and do refactoring
Em 15-10-2010 13:06, Maxim Levitsky escreveu: > Add new event types for timeout & carrier report > Move timeout handling from ir_raw_event_store_with_filter to > ir-lirc-codec, where it is really needed. > Now lirc bridge ensures proper gap handling. > Extend lirc bridge for carrier & timeout reports > > Note: all new ir_raw_event variables now should be initialized > like that: DEFINE_IR_RAW_EVENT(ev); > > To clean an existing event, use init_ir_raw_event(&ev); > > Signed-off-by: Maxim Levitsky > Acked-by: Jarod Wilson Applying patch patches/lmml_257371_2_5_ir_extend_ir_raw_event_and_do_refactoring.patch patching file drivers/media/IR/ene_ir.c patching file drivers/media/IR/ir-core-priv.h Hunk #1 succeeded at 88 (offset 6 lines). Hunk #2 succeeded at 121 (offset 6 lines). patching file drivers/media/IR/ir-jvc-decoder.c patching file drivers/media/IR/ir-lirc-codec.c Hunk #3 FAILED at 139. Hunk #4 FAILED at 167. Hunk #7 succeeded at 330 (offset 3 lines). 2 out of 7 hunks FAILED -- rejects in file drivers/media/IR/ir-lirc-codec.c patching file drivers/media/IR/ir-nec-decoder.c patching file drivers/media/IR/ir-raw-event.c patching file drivers/media/IR/ir-rc5-decoder.c patching file drivers/media/IR/ir-rc6-decoder.c patching file drivers/media/IR/ir-sony-decoder.c patching file drivers/media/IR/mceusb.c patching file drivers/media/IR/streamzap.c Hunk #1 FAILED at 170. Hunk #2 FAILED at 215. Hunk #3 FAILED at 233. Hunk #4 succeeded at 373 (offset -139 lines). 3 out of 4 hunks FAILED -- rejects in file drivers/media/IR/streamzap.c patching file include/media/ir-core.h Hunk #3 succeeded at 165 (offset 1 line). Patch patches/lmml_257371_2_5_ir_extend_ir_raw_event_and_do_refactoring.patch does not apply (enforce with -f) Patch didn't apply. Aborting Too much fails for me... -EABORTING... I won't apply this patch... there are two copies of it, and it has several broken hunks. Please fix. > --- > drivers/media/IR/ene_ir.c |4 +- > drivers/media/IR/ir-core-priv.h| 13 - > drivers/media/IR/ir-jvc-decoder.c |5 +- > drivers/media/IR/ir-lirc-codec.c | 128 > +--- > drivers/media/IR/ir-nec-decoder.c |5 +- > drivers/media/IR/ir-raw-event.c| 45 + > drivers/media/IR/ir-rc5-decoder.c |5 +- > drivers/media/IR/ir-rc6-decoder.c |5 +- > drivers/media/IR/ir-sony-decoder.c |5 +- > drivers/media/IR/mceusb.c |3 +- > drivers/media/IR/streamzap.c |8 ++- > include/media/ir-core.h| 40 ++-- > 12 files changed, 176 insertions(+), 90 deletions(-) > > diff --git a/drivers/media/IR/ene_ir.c b/drivers/media/IR/ene_ir.c > index 7880d9c..dc32509 100644 > --- a/drivers/media/IR/ene_ir.c > +++ b/drivers/media/IR/ene_ir.c > @@ -701,7 +701,7 @@ static irqreturn_t ene_isr(int irq, void *data) > unsigned long flags; > irqreturn_t retval = IRQ_NONE; > struct ene_device *dev = (struct ene_device *)data; > - struct ir_raw_event ev; > + DEFINE_IR_RAW_EVENT(ev); > > spin_lock_irqsave(&dev->hw_lock, flags); > > @@ -904,7 +904,7 @@ static int ene_set_learning_mode(void *data, int enable) > } > > /* outside interface: enable or disable idle mode */ > -static void ene_rx_set_idle(void *data, int idle) > +static void ene_rx_set_idle(void *data, bool idle) > { > struct ene_device *dev = (struct ene_device *)data; > > diff --git a/drivers/media/IR/ir-core-priv.h b/drivers/media/IR/ir-core-priv.h > index 5d7e08f..2559e72 100644 > --- a/drivers/media/IR/ir-core-priv.h > +++ b/drivers/media/IR/ir-core-priv.h > @@ -82,6 +82,12 @@ struct ir_raw_event_ctrl { > struct ir_input_dev *ir_dev; > struct lirc_driver *drv; > int carrier_low; > + > + ktime_t gap_start; > + u64 gap_duration; > + bool gap; > + bool send_timeout_reports; > + > } lirc; > }; > > @@ -109,9 +115,14 @@ static inline void decrease_duration(struct ir_raw_event > *ev, unsigned duration) > ev->duration -= duration; > } > > +/* Returns true if event is normal pulse/space event */ > +static inline bool is_timing_event(struct ir_raw_event ev) > +{ > + return !ev.carrier_report && !ev.reset; > +} > + > #define TO_US(duration) DIV_ROUND_CLOSEST((duration), > 1000) > #define TO_STR(is_pulse) ((is_pulse) ? "pulse" : "space") > -#define IS_RESET(ev) (ev.duration == 0) > /* > * Routines from ir-sysfs.c - Meant to be called only internally inside > * ir-core > diff --git a/drivers/media/IR/ir-jvc-decoder.c > b/drivers/media/IR/ir-jvc-decoder.c > index 77a89c4..63dca6e 100644 > --- a/drivers/media/IR/ir-jvc-decoder.c > +++ b/drivers/media/IR/ir-jvc-decoder.c > @@ -50,8 +50,9 @@ static int ir_jvc_decode(struct input_dev *input_dev, > struct ir_raw_event ev) > if (!(ir_dev->raw->enabled_protocols & IR_TYPE_JVC)) >
[PATCH 2/5] IR: extend ir_raw_event and do refactoring
Add new event types for timeout & carrier report Move timeout handling from ir_raw_event_store_with_filter to ir-lirc-codec, where it is really needed. Now lirc bridge ensures proper gap handling. Extend lirc bridge for carrier & timeout reports Note: all new ir_raw_event variables now should be initialized like that: DEFINE_IR_RAW_EVENT(ev); To clean an existing event, use init_ir_raw_event(&ev); Signed-off-by: Maxim Levitsky Acked-by: Jarod Wilson --- drivers/media/IR/ene_ir.c |4 +- drivers/media/IR/ir-core-priv.h| 13 - drivers/media/IR/ir-jvc-decoder.c |5 +- drivers/media/IR/ir-lirc-codec.c | 128 +--- drivers/media/IR/ir-nec-decoder.c |5 +- drivers/media/IR/ir-raw-event.c| 45 + drivers/media/IR/ir-rc5-decoder.c |5 +- drivers/media/IR/ir-rc6-decoder.c |5 +- drivers/media/IR/ir-sony-decoder.c |5 +- drivers/media/IR/mceusb.c |3 +- drivers/media/IR/streamzap.c |8 ++- include/media/ir-core.h| 40 ++-- 12 files changed, 176 insertions(+), 90 deletions(-) diff --git a/drivers/media/IR/ene_ir.c b/drivers/media/IR/ene_ir.c index 7880d9c..dc32509 100644 --- a/drivers/media/IR/ene_ir.c +++ b/drivers/media/IR/ene_ir.c @@ -701,7 +701,7 @@ static irqreturn_t ene_isr(int irq, void *data) unsigned long flags; irqreturn_t retval = IRQ_NONE; struct ene_device *dev = (struct ene_device *)data; - struct ir_raw_event ev; + DEFINE_IR_RAW_EVENT(ev); spin_lock_irqsave(&dev->hw_lock, flags); @@ -904,7 +904,7 @@ static int ene_set_learning_mode(void *data, int enable) } /* outside interface: enable or disable idle mode */ -static void ene_rx_set_idle(void *data, int idle) +static void ene_rx_set_idle(void *data, bool idle) { struct ene_device *dev = (struct ene_device *)data; diff --git a/drivers/media/IR/ir-core-priv.h b/drivers/media/IR/ir-core-priv.h index 5d7e08f..2559e72 100644 --- a/drivers/media/IR/ir-core-priv.h +++ b/drivers/media/IR/ir-core-priv.h @@ -82,6 +82,12 @@ struct ir_raw_event_ctrl { struct ir_input_dev *ir_dev; struct lirc_driver *drv; int carrier_low; + + ktime_t gap_start; + u64 gap_duration; + bool gap; + bool send_timeout_reports; + } lirc; }; @@ -109,9 +115,14 @@ static inline void decrease_duration(struct ir_raw_event *ev, unsigned duration) ev->duration -= duration; } +/* Returns true if event is normal pulse/space event */ +static inline bool is_timing_event(struct ir_raw_event ev) +{ + return !ev.carrier_report && !ev.reset; +} + #define TO_US(duration)DIV_ROUND_CLOSEST((duration), 1000) #define TO_STR(is_pulse) ((is_pulse) ? "pulse" : "space") -#define IS_RESET(ev) (ev.duration == 0) /* * Routines from ir-sysfs.c - Meant to be called only internally inside * ir-core diff --git a/drivers/media/IR/ir-jvc-decoder.c b/drivers/media/IR/ir-jvc-decoder.c index 77a89c4..63dca6e 100644 --- a/drivers/media/IR/ir-jvc-decoder.c +++ b/drivers/media/IR/ir-jvc-decoder.c @@ -50,8 +50,9 @@ static int ir_jvc_decode(struct input_dev *input_dev, struct ir_raw_event ev) if (!(ir_dev->raw->enabled_protocols & IR_TYPE_JVC)) return 0; - if (IS_RESET(ev)) { - data->state = STATE_INACTIVE; + if (!is_timing_event(ev)) { + if (ev.reset) + data->state = STATE_INACTIVE; return 0; } diff --git a/drivers/media/IR/ir-lirc-codec.c b/drivers/media/IR/ir-lirc-codec.c index e63f757..9317be8 100644 --- a/drivers/media/IR/ir-lirc-codec.c +++ b/drivers/media/IR/ir-lirc-codec.c @@ -32,6 +32,7 @@ static int ir_lirc_decode(struct input_dev *input_dev, struct ir_raw_event ev) { struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); + struct lirc_codec *lirc = &ir_dev->raw->lirc; int sample; if (!(ir_dev->raw->enabled_protocols & IR_TYPE_LIRC)) @@ -40,21 +41,57 @@ static int ir_lirc_decode(struct input_dev *input_dev, struct ir_raw_event ev) if (!ir_dev->raw->lirc.drv || !ir_dev->raw->lirc.drv->rbuf) return -EINVAL; - if (IS_RESET(ev)) + /* Packet start */ + if (ev.reset) return 0; - IR_dprintk(2, "LIRC data transfer started (%uus %s)\n", - TO_US(ev.duration), TO_STR(ev.pulse)); + /* Carrier reports */ + if (ev.carrier_report) { + sample = LIRC_FREQUENCY(ev.carrier); + + /* Packet end */ + } else if (ev.timeout) { + + if (lirc->gap) + return 0; + + lirc->gap_start = ktime_get(); + lirc->gap = true; + lirc->gap_duration = ev.duration; + + if (!lirc->send_tim