aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/IR/ir-raw-event.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2010-04-15 17:46:00 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:57:42 -0400
commite40b1127f994a427568319d1be9b9e5ab1f58dd1 (patch)
tree5d4f892dbe90588f8932cd4e1768b953814f3f47 /drivers/media/IR/ir-raw-event.c
parent21677cfc562a27e099719d413287bc8d1d24deb7 (diff)
V4L/DVB: ir-core: change duration to be coded as a u32 integer
This patch implements the agreed upon 1:31 integer encoded pulse/duration struct for ir-core raw decoders. All decoders have been tested after the change. Comments are welcome. Signed-off-by: David Härdeman <david@hardeman.nu> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/IR/ir-raw-event.c')
-rw-r--r--drivers/media/IR/ir-raw-event.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/media/IR/ir-raw-event.c b/drivers/media/IR/ir-raw-event.c
index 674442b2f0a..59f173c45b9 100644
--- a/drivers/media/IR/ir-raw-event.c
+++ b/drivers/media/IR/ir-raw-event.c
@@ -57,12 +57,12 @@ static struct work_struct wq_load;
57 57
58static void ir_raw_event_work(struct work_struct *work) 58static void ir_raw_event_work(struct work_struct *work)
59{ 59{
60 s64 d; 60 struct ir_raw_event ev;
61 struct ir_raw_event_ctrl *raw = 61 struct ir_raw_event_ctrl *raw =
62 container_of(work, struct ir_raw_event_ctrl, rx_work); 62 container_of(work, struct ir_raw_event_ctrl, rx_work);
63 63
64 while (kfifo_out(&raw->kfifo, &d, sizeof(d)) == sizeof(d)) 64 while (kfifo_out(&raw->kfifo, &ev, sizeof(ev)) == sizeof(ev))
65 RUN_DECODER(decode, raw->input_dev, d); 65 RUN_DECODER(decode, raw->input_dev, ev);
66} 66}
67 67
68int ir_raw_event_register(struct input_dev *input_dev) 68int ir_raw_event_register(struct input_dev *input_dev)
@@ -114,21 +114,21 @@ void ir_raw_event_unregister(struct input_dev *input_dev)
114/** 114/**
115 * ir_raw_event_store() - pass a pulse/space duration to the raw ir decoders 115 * ir_raw_event_store() - pass a pulse/space duration to the raw ir decoders
116 * @input_dev: the struct input_dev device descriptor 116 * @input_dev: the struct input_dev device descriptor
117 * @duration: duration of the pulse or space in ns 117 * @ev: the struct ir_raw_event descriptor of the pulse/space
118 * 118 *
119 * This routine (which may be called from an interrupt context) stores a 119 * This routine (which may be called from an interrupt context) stores a
120 * pulse/space duration for the raw ir decoding state machines. Pulses are 120 * pulse/space duration for the raw ir decoding state machines. Pulses are
121 * signalled as positive values and spaces as negative values. A zero value 121 * signalled as positive values and spaces as negative values. A zero value
122 * will reset the decoding state machines. 122 * will reset the decoding state machines.
123 */ 123 */
124int ir_raw_event_store(struct input_dev *input_dev, s64 duration) 124int ir_raw_event_store(struct input_dev *input_dev, struct ir_raw_event *ev)
125{ 125{
126 struct ir_input_dev *ir = input_get_drvdata(input_dev); 126 struct ir_input_dev *ir = input_get_drvdata(input_dev);
127 127
128 if (!ir->raw) 128 if (!ir->raw)
129 return -EINVAL; 129 return -EINVAL;
130 130
131 if (kfifo_in(&ir->raw->kfifo, &duration, sizeof(duration)) != sizeof(duration)) 131 if (kfifo_in(&ir->raw->kfifo, ev, sizeof(*ev)) != sizeof(*ev))
132 return -ENOMEM; 132 return -ENOMEM;
133 133
134 return 0; 134 return 0;
@@ -151,6 +151,7 @@ int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type typ
151 struct ir_input_dev *ir = input_get_drvdata(input_dev); 151 struct ir_input_dev *ir = input_get_drvdata(input_dev);
152 ktime_t now; 152 ktime_t now;
153 s64 delta; /* ns */ 153 s64 delta; /* ns */
154 struct ir_raw_event ev;
154 int rc = 0; 155 int rc = 0;
155 156
156 if (!ir->raw) 157 if (!ir->raw)
@@ -163,16 +164,21 @@ int ir_raw_event_store_edge(struct input_dev *input_dev, enum raw_event_type typ
163 * being called for the first time, note that delta can't 164 * being called for the first time, note that delta can't
164 * possibly be negative. 165 * possibly be negative.
165 */ 166 */
166 if (delta > NSEC_PER_SEC || !ir->raw->last_type) 167 ev.duration = 0;
168 if (delta > IR_MAX_DURATION || !ir->raw->last_type)
167 type |= IR_START_EVENT; 169 type |= IR_START_EVENT;
170 else
171 ev.duration = delta;
168 172
169 if (type & IR_START_EVENT) 173 if (type & IR_START_EVENT)
170 ir_raw_event_reset(input_dev); 174 ir_raw_event_reset(input_dev);
171 else if (ir->raw->last_type & IR_SPACE) 175 else if (ir->raw->last_type & IR_SPACE) {
172 rc = ir_raw_event_store(input_dev, -delta); 176 ev.pulse = false;
173 else if (ir->raw->last_type & IR_PULSE) 177 rc = ir_raw_event_store(input_dev, &ev);
174 rc = ir_raw_event_store(input_dev, delta); 178 } else if (ir->raw->last_type & IR_PULSE) {
175 else 179 ev.pulse = true;
180 rc = ir_raw_event_store(input_dev, &ev);
181 } else
176 return 0; 182 return 0;
177 183
178 ir->raw->last_event = now; 184 ir->raw->last_event = now;