[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 maximlevit...@gmail.com Acked-by: Jarod Wilson ja...@redhat.com --- 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
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 maximlevit...@gmail.com Acked-by: Jarod Wilson ja...@redhat.com 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)) return 0; - if (IS_RESET(ev)) { -
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 maximlevit...@gmail.com Acked-by: Jarod Wilson ja...@redhat.com 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