diff options
Diffstat (limited to 'drivers/media/IR/ir-raw-event.c')
-rw-r--r-- | drivers/media/IR/ir-raw-event.c | 30 |
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 674442b2f0a8..59f173c45b9d 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 | ||
58 | static void ir_raw_event_work(struct work_struct *work) | 58 | static 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 | ||
68 | int ir_raw_event_register(struct input_dev *input_dev) | 68 | int 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 | */ |
124 | int ir_raw_event_store(struct input_dev *input_dev, s64 duration) | 124 | int 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; |