aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/ir-lirc-codec.c
diff options
context:
space:
mode:
authorDavid Härdeman <david@hardeman.nu>2010-10-29 15:08:23 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-12-29 05:16:37 -0500
commitd8b4b5822f51e2142b731b42c81e3f03eec475b2 (patch)
treefce9a9b7ca5031adc95fbd6be118352fb2527da5 /drivers/media/rc/ir-lirc-codec.c
parent4c7b355df6e7f05304e05f6b7a286e59a5f1cc54 (diff)
[media] ir-core: make struct rc_dev the primary interface
This patch merges the ir_input_dev and ir_dev_props structs into a single struct called rc_dev. The drivers and various functions in rc-core used by the drivers are also changed to use rc_dev as the primary interface when dealing with rc-core. This means that the input_dev is abstracted away from the drivers which is necessary if we ever want to support multiple input devs per rc device. The new API is similar to what the input subsystem uses, i.e: rc_device_alloc() rc_device_free() rc_device_register() rc_device_unregister() [mchehab@redhat.com: Fix compilation on mceusb and cx231xx, due to merge conflicts] Signed-off-by: David Härdeman <david@hardeman.nu> Acked-by: Jarod Wilson <jarod@redhat.com> Tested-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
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 9345995dbf14..ceabea6053de 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);