aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/ir-lirc-codec.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/rc/ir-lirc-codec.c')
-rw-r--r--drivers/media/rc/ir-lirc-codec.c121
1 files changed, 56 insertions, 65 deletions
diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c
index 9345995dbf1..ceabea6053d 100644
--- a/drivers/media/rc/ir-lirc-codec.c
+++ b/drivers/media/rc/ir-lirc-codec.c
@@ -24,21 +24,20 @@
24/** 24/**
25 * ir_lirc_decode() - Send raw IR data to lirc_dev to be relayed to the 25 * ir_lirc_decode() - Send raw IR data to lirc_dev to be relayed to the
26 * lircd userspace daemon for decoding. 26 * lircd userspace daemon for decoding.
27 * @input_dev: the struct input_dev descriptor of the device 27 * @input_dev: the struct rc_dev descriptor of the device
28 * @duration: the struct ir_raw_event descriptor of the pulse/space 28 * @duration: the struct ir_raw_event descriptor of the pulse/space
29 * 29 *
30 * This function returns -EINVAL if the lirc interfaces aren't wired up. 30 * This function returns -EINVAL if the lirc interfaces aren't wired up.
31 */ 31 */
32static int ir_lirc_decode(struct input_dev *input_dev, struct ir_raw_event ev) 32static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
33{ 33{
34 struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); 34 struct lirc_codec *lirc = &dev->raw->lirc;
35 struct lirc_codec *lirc = &ir_dev->raw->lirc;
36 int sample; 35 int sample;
37 36
38 if (!(ir_dev->raw->enabled_protocols & IR_TYPE_LIRC)) 37 if (!(dev->raw->enabled_protocols & IR_TYPE_LIRC))
39 return 0; 38 return 0;
40 39
41 if (!ir_dev->raw->lirc.drv || !ir_dev->raw->lirc.drv->rbuf) 40 if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf)
42 return -EINVAL; 41 return -EINVAL;
43 42
44 /* Packet start */ 43 /* Packet start */
@@ -79,7 +78,7 @@ static int ir_lirc_decode(struct input_dev *input_dev, struct ir_raw_event ev)
79 (u64)LIRC_VALUE_MASK); 78 (u64)LIRC_VALUE_MASK);
80 79
81 gap_sample = LIRC_SPACE(lirc->gap_duration); 80 gap_sample = LIRC_SPACE(lirc->gap_duration);
82 lirc_buffer_write(ir_dev->raw->lirc.drv->rbuf, 81 lirc_buffer_write(dev->raw->lirc.drv->rbuf,
83 (unsigned char *) &gap_sample); 82 (unsigned char *) &gap_sample);
84 lirc->gap = false; 83 lirc->gap = false;
85 } 84 }
@@ -88,9 +87,9 @@ static int ir_lirc_decode(struct input_dev *input_dev, struct ir_raw_event ev)
88 LIRC_SPACE(ev.duration / 1000); 87 LIRC_SPACE(ev.duration / 1000);
89 } 88 }
90 89
91 lirc_buffer_write(ir_dev->raw->lirc.drv->rbuf, 90 lirc_buffer_write(dev->raw->lirc.drv->rbuf,
92 (unsigned char *) &sample); 91 (unsigned char *) &sample);
93 wake_up(&ir_dev->raw->lirc.drv->rbuf->wait_poll); 92 wake_up(&dev->raw->lirc.drv->rbuf->wait_poll);
94 93
95 return 0; 94 return 0;
96} 95}
@@ -99,7 +98,7 @@ static ssize_t ir_lirc_transmit_ir(struct file *file, const char *buf,
99 size_t n, loff_t *ppos) 98 size_t n, loff_t *ppos)
100{ 99{
101 struct lirc_codec *lirc; 100 struct lirc_codec *lirc;
102 struct ir_input_dev *ir_dev; 101 struct rc_dev *dev;
103 int *txbuf; /* buffer with values to transmit */ 102 int *txbuf; /* buffer with values to transmit */
104 int ret = 0, count; 103 int ret = 0, count;
105 104
@@ -118,14 +117,14 @@ static ssize_t ir_lirc_transmit_ir(struct file *file, const char *buf,
118 if (IS_ERR(txbuf)) 117 if (IS_ERR(txbuf))
119 return PTR_ERR(txbuf); 118 return PTR_ERR(txbuf);
120 119
121 ir_dev = lirc->ir_dev; 120 dev = lirc->dev;
122 if (!ir_dev) { 121 if (!dev) {
123 ret = -EFAULT; 122 ret = -EFAULT;
124 goto out; 123 goto out;
125 } 124 }
126 125
127 if (ir_dev->props && ir_dev->props->tx_ir) 126 if (dev->tx_ir)
128 ret = ir_dev->props->tx_ir(ir_dev->props->priv, txbuf, (u32)n); 127 ret = dev->tx_ir(dev, txbuf, (u32)n);
129 128
130out: 129out:
131 kfree(txbuf); 130 kfree(txbuf);
@@ -136,21 +135,18 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
136 unsigned long __user arg) 135 unsigned long __user arg)
137{ 136{
138 struct lirc_codec *lirc; 137 struct lirc_codec *lirc;
139 struct ir_input_dev *ir_dev; 138 struct rc_dev *dev;
140 int ret = 0; 139 int ret = 0;
141 void *drv_data;
142 __u32 val = 0, tmp; 140 __u32 val = 0, tmp;
143 141
144 lirc = lirc_get_pdata(filep); 142 lirc = lirc_get_pdata(filep);
145 if (!lirc) 143 if (!lirc)
146 return -EFAULT; 144 return -EFAULT;
147 145
148 ir_dev = lirc->ir_dev; 146 dev = lirc->dev;
149 if (!ir_dev || !ir_dev->props || !ir_dev->props->priv) 147 if (!dev)
150 return -EFAULT; 148 return -EFAULT;
151 149
152 drv_data = ir_dev->props->priv;
153
154 if (_IOC_DIR(cmd) & _IOC_WRITE) { 150 if (_IOC_DIR(cmd) & _IOC_WRITE) {
155 ret = get_user(val, (__u32 *)arg); 151 ret = get_user(val, (__u32 *)arg);
156 if (ret) 152 if (ret)
@@ -171,84 +167,85 @@ static long ir_lirc_ioctl(struct file *filep, unsigned int cmd,
171 167
172 /* TX settings */ 168 /* TX settings */
173 case LIRC_SET_TRANSMITTER_MASK: 169 case LIRC_SET_TRANSMITTER_MASK:
174 if (!ir_dev->props->s_tx_mask) 170 if (!dev->s_tx_mask)
175 return -EINVAL; 171 return -EINVAL;
176 172
177 return ir_dev->props->s_tx_mask(drv_data, val); 173 return dev->s_tx_mask(dev, val);
178 174
179 case LIRC_SET_SEND_CARRIER: 175 case LIRC_SET_SEND_CARRIER:
180 if (!ir_dev->props->s_tx_carrier) 176 if (!dev->s_tx_carrier)
181 return -EINVAL; 177 return -EINVAL;
182 178
183 return ir_dev->props->s_tx_carrier(drv_data, val); 179 return dev->s_tx_carrier(dev, val);
184 180
185 case LIRC_SET_SEND_DUTY_CYCLE: 181 case LIRC_SET_SEND_DUTY_CYCLE:
186 if (!ir_dev->props->s_tx_duty_cycle) 182 if (!dev->s_tx_duty_cycle)
187 return -ENOSYS; 183 return -ENOSYS;
188 184
189 if (val <= 0 || val >= 100) 185 if (val <= 0 || val >= 100)
190 return -EINVAL; 186 return -EINVAL;
191 187
192 return ir_dev->props->s_tx_duty_cycle(drv_data, val); 188 return dev->s_tx_duty_cycle(dev, val);
193 189
194 /* RX settings */ 190 /* RX settings */
195 case LIRC_SET_REC_CARRIER: 191 case LIRC_SET_REC_CARRIER:
196 if (!ir_dev->props->s_rx_carrier_range) 192 if (!dev->s_rx_carrier_range)
197 return -ENOSYS; 193 return -ENOSYS;
198 194
199 if (val <= 0) 195 if (val <= 0)
200 return -EINVAL; 196 return -EINVAL;
201 197
202 return ir_dev->props->s_rx_carrier_range(drv_data, 198 return dev->s_rx_carrier_range(dev,
203 ir_dev->raw->lirc.carrier_low, val); 199 dev->raw->lirc.carrier_low,
200 val);
204 201
205 case LIRC_SET_REC_CARRIER_RANGE: 202 case LIRC_SET_REC_CARRIER_RANGE:
206 if (val <= 0) 203 if (val <= 0)
207 return -EINVAL; 204 return -EINVAL;
208 205
209 ir_dev->raw->lirc.carrier_low = val; 206 dev->raw->lirc.carrier_low = val;
210 return 0; 207 return 0;
211 208
212 case LIRC_GET_REC_RESOLUTION: 209 case LIRC_GET_REC_RESOLUTION:
213 val = ir_dev->props->rx_resolution; 210 val = dev->rx_resolution;
214 break; 211 break;
215 212
216 case LIRC_SET_WIDEBAND_RECEIVER: 213 case LIRC_SET_WIDEBAND_RECEIVER:
217 if (!ir_dev->props->s_learning_mode) 214 if (!dev->s_learning_mode)
218 return -ENOSYS; 215 return -ENOSYS;
219 216
220 return ir_dev->props->s_learning_mode(drv_data, !!val); 217 return dev->s_learning_mode(dev, !!val);
221 218
222 case LIRC_SET_MEASURE_CARRIER_MODE: 219 case LIRC_SET_MEASURE_CARRIER_MODE:
223 if (!ir_dev->props->s_carrier_report) 220 if (!dev->s_carrier_report)
224 return -ENOSYS; 221 return -ENOSYS;
225 222
226 return ir_dev->props->s_carrier_report(drv_data, !!val); 223 return dev->s_carrier_report(dev, !!val);
227 224
228 /* Generic timeout support */ 225 /* Generic timeout support */
229 case LIRC_GET_MIN_TIMEOUT: 226 case LIRC_GET_MIN_TIMEOUT:
230 if (!ir_dev->props->max_timeout) 227 if (!dev->max_timeout)
231 return -ENOSYS; 228 return -ENOSYS;
232 val = ir_dev->props->min_timeout / 1000; 229 val = dev->min_timeout / 1000;
233 break; 230 break;
234 231
235 case LIRC_GET_MAX_TIMEOUT: 232 case LIRC_GET_MAX_TIMEOUT:
236 if (!ir_dev->props->max_timeout) 233 if (!dev->max_timeout)
237 return -ENOSYS; 234 return -ENOSYS;
238 val = ir_dev->props->max_timeout / 1000; 235 val = dev->max_timeout / 1000;
239 break; 236 break;
240 237
241 case LIRC_SET_REC_TIMEOUT: 238 case LIRC_SET_REC_TIMEOUT:
242 if (!ir_dev->props->max_timeout) 239 if (!dev->max_timeout)
243 return -ENOSYS; 240 return -ENOSYS;
244 241
245 tmp = val * 1000; 242 tmp = val * 1000;
246 243
247 if (tmp < ir_dev->props->min_timeout || 244 if (tmp < dev->min_timeout ||
248 tmp > ir_dev->props->max_timeout) 245 tmp > dev->max_timeout)
249 return -EINVAL; 246 return -EINVAL;
250 247
251 ir_dev->props->timeout = tmp; 248 dev->timeout = tmp;
252 break; 249 break;
253 250
254 case LIRC_SET_REC_TIMEOUT_REPORTS: 251 case LIRC_SET_REC_TIMEOUT_REPORTS:
@@ -289,9 +286,8 @@ static struct file_operations lirc_fops = {
289 .llseek = no_llseek, 286 .llseek = no_llseek,
290}; 287};
291 288
292static int ir_lirc_register(struct input_dev *input_dev) 289static int ir_lirc_register(struct rc_dev *dev)
293{ 290{
294 struct ir_input_dev *ir_dev = input_get_drvdata(input_dev);
295 struct lirc_driver *drv; 291 struct lirc_driver *drv;
296 struct lirc_buffer *rbuf; 292 struct lirc_buffer *rbuf;
297 int rc = -ENOMEM; 293 int rc = -ENOMEM;
@@ -310,44 +306,40 @@ static int ir_lirc_register(struct input_dev *input_dev)
310 goto rbuf_init_failed; 306 goto rbuf_init_failed;
311 307
312 features = LIRC_CAN_REC_MODE2; 308 features = LIRC_CAN_REC_MODE2;
313 if (ir_dev->props->tx_ir) { 309 if (dev->tx_ir) {
314
315 features |= LIRC_CAN_SEND_PULSE; 310 features |= LIRC_CAN_SEND_PULSE;
316 if (ir_dev->props->s_tx_mask) 311 if (dev->s_tx_mask)
317 features |= LIRC_CAN_SET_TRANSMITTER_MASK; 312 features |= LIRC_CAN_SET_TRANSMITTER_MASK;
318 if (ir_dev->props->s_tx_carrier) 313 if (dev->s_tx_carrier)
319 features |= LIRC_CAN_SET_SEND_CARRIER; 314 features |= LIRC_CAN_SET_SEND_CARRIER;
320 315 if (dev->s_tx_duty_cycle)
321 if (ir_dev->props->s_tx_duty_cycle)
322 features |= LIRC_CAN_SET_SEND_DUTY_CYCLE; 316 features |= LIRC_CAN_SET_SEND_DUTY_CYCLE;
323 } 317 }
324 318
325 if (ir_dev->props->s_rx_carrier_range) 319 if (dev->s_rx_carrier_range)
326 features |= LIRC_CAN_SET_REC_CARRIER | 320 features |= LIRC_CAN_SET_REC_CARRIER |
327 LIRC_CAN_SET_REC_CARRIER_RANGE; 321 LIRC_CAN_SET_REC_CARRIER_RANGE;
328 322
329 if (ir_dev->props->s_learning_mode) 323 if (dev->s_learning_mode)
330 features |= LIRC_CAN_USE_WIDEBAND_RECEIVER; 324 features |= LIRC_CAN_USE_WIDEBAND_RECEIVER;
331 325
332 if (ir_dev->props->s_carrier_report) 326 if (dev->s_carrier_report)
333 features |= LIRC_CAN_MEASURE_CARRIER; 327 features |= LIRC_CAN_MEASURE_CARRIER;
334 328
335 329 if (dev->max_timeout)
336 if (ir_dev->props->max_timeout)
337 features |= LIRC_CAN_SET_REC_TIMEOUT; 330 features |= LIRC_CAN_SET_REC_TIMEOUT;
338 331
339
340 snprintf(drv->name, sizeof(drv->name), "ir-lirc-codec (%s)", 332 snprintf(drv->name, sizeof(drv->name), "ir-lirc-codec (%s)",
341 ir_dev->driver_name); 333 dev->driver_name);
342 drv->minor = -1; 334 drv->minor = -1;
343 drv->features = features; 335 drv->features = features;
344 drv->data = &ir_dev->raw->lirc; 336 drv->data = &dev->raw->lirc;
345 drv->rbuf = rbuf; 337 drv->rbuf = rbuf;
346 drv->set_use_inc = &ir_lirc_open; 338 drv->set_use_inc = &ir_lirc_open;
347 drv->set_use_dec = &ir_lirc_close; 339 drv->set_use_dec = &ir_lirc_close;
348 drv->code_length = sizeof(struct ir_raw_event) * 8; 340 drv->code_length = sizeof(struct ir_raw_event) * 8;
349 drv->fops = &lirc_fops; 341 drv->fops = &lirc_fops;
350 drv->dev = &ir_dev->dev; 342 drv->dev = &dev->dev;
351 drv->owner = THIS_MODULE; 343 drv->owner = THIS_MODULE;
352 344
353 drv->minor = lirc_register_driver(drv); 345 drv->minor = lirc_register_driver(drv);
@@ -356,8 +348,8 @@ static int ir_lirc_register(struct input_dev *input_dev)
356 goto lirc_register_failed; 348 goto lirc_register_failed;
357 } 349 }
358 350
359 ir_dev->raw->lirc.drv = drv; 351 dev->raw->lirc.drv = drv;
360 ir_dev->raw->lirc.ir_dev = ir_dev; 352 dev->raw->lirc.dev = dev;
361 return 0; 353 return 0;
362 354
363lirc_register_failed: 355lirc_register_failed:
@@ -369,10 +361,9 @@ rbuf_alloc_failed:
369 return rc; 361 return rc;
370} 362}
371 363
372static int ir_lirc_unregister(struct input_dev *input_dev) 364static int ir_lirc_unregister(struct rc_dev *dev)
373{ 365{
374 struct ir_input_dev *ir_dev = input_get_drvdata(input_dev); 366 struct lirc_codec *lirc = &dev->raw->lirc;
375 struct lirc_codec *lirc = &ir_dev->raw->lirc;
376 367
377 lirc_unregister_driver(lirc->drv->minor); 368 lirc_unregister_driver(lirc->drv->minor);
378 lirc_buffer_free(lirc->drv->rbuf); 369 lirc_buffer_free(lirc->drv->rbuf);