• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * LIRC base driver
3   *
4   * by Artur Lipowski <alipowski@interia.pl>
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
8   *  the Free Software Foundation; either version 2 of the License, or
9   *  (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   *  GNU General Public License for more details.
15   *
16   */
17  
18  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19  
20  #include <linux/module.h>
21  #include <linux/sched/signal.h>
22  #include <linux/ioctl.h>
23  #include <linux/poll.h>
24  #include <linux/mutex.h>
25  #include <linux/device.h>
26  #include <linux/cdev.h>
27  
28  #include <media/rc-core.h>
29  #include <media/lirc.h>
30  #include <media/lirc_dev.h>
31  
32  #define NOPLUG		-1
33  #define LOGHEAD		"lirc_dev (%s[%d]): "
34  
35  static dev_t lirc_base_dev;
36  
37  struct irctl {
38  	struct lirc_driver d;
39  	int attached;
40  	int open;
41  
42  	struct mutex irctl_lock;
43  	struct lirc_buffer *buf;
44  	bool buf_internal;
45  	unsigned int chunk_size;
46  
47  	struct device dev;
48  	struct cdev cdev;
49  };
50  
51  static DEFINE_MUTEX(lirc_dev_lock);
52  
53  static struct irctl *irctls[MAX_IRCTL_DEVICES];
54  
55  /* Only used for sysfs but defined to void otherwise */
56  static struct class *lirc_class;
57  
lirc_release(struct device * ld)58  static void lirc_release(struct device *ld)
59  {
60  	struct irctl *ir = container_of(ld, struct irctl, dev);
61  
62  	put_device(ir->dev.parent);
63  
64  	if (ir->buf_internal) {
65  		lirc_buffer_free(ir->buf);
66  		kfree(ir->buf);
67  	}
68  
69  	mutex_lock(&lirc_dev_lock);
70  	irctls[ir->d.minor] = NULL;
71  	mutex_unlock(&lirc_dev_lock);
72  	kfree(ir);
73  }
74  
lirc_allocate_buffer(struct irctl * ir)75  static int lirc_allocate_buffer(struct irctl *ir)
76  {
77  	int err = 0;
78  	int bytes_in_key;
79  	unsigned int chunk_size;
80  	unsigned int buffer_size;
81  	struct lirc_driver *d = &ir->d;
82  
83  	bytes_in_key = BITS_TO_LONGS(d->code_length) +
84  						(d->code_length % 8 ? 1 : 0);
85  	buffer_size = d->buffer_size ? d->buffer_size : BUFLEN / bytes_in_key;
86  	chunk_size  = d->chunk_size  ? d->chunk_size  : bytes_in_key;
87  
88  	if (d->rbuf) {
89  		ir->buf = d->rbuf;
90  		ir->buf_internal = false;
91  	} else {
92  		ir->buf = kmalloc(sizeof(struct lirc_buffer), GFP_KERNEL);
93  		if (!ir->buf) {
94  			err = -ENOMEM;
95  			goto out;
96  		}
97  
98  		err = lirc_buffer_init(ir->buf, chunk_size, buffer_size);
99  		if (err) {
100  			kfree(ir->buf);
101  			ir->buf = NULL;
102  			goto out;
103  		}
104  
105  		ir->buf_internal = true;
106  		d->rbuf = ir->buf;
107  	}
108  	ir->chunk_size = ir->buf->chunk_size;
109  
110  out:
111  	return err;
112  }
113  
lirc_register_driver(struct lirc_driver * d)114  int lirc_register_driver(struct lirc_driver *d)
115  {
116  	struct irctl *ir;
117  	int minor;
118  	int err;
119  
120  	if (!d) {
121  		pr_err("driver pointer must be not NULL!\n");
122  		return -EBADRQC;
123  	}
124  
125  	if (!d->dev) {
126  		pr_err("dev pointer not filled in!\n");
127  		return -EINVAL;
128  	}
129  
130  	if (!d->fops) {
131  		pr_err("fops pointer not filled in!\n");
132  		return -EINVAL;
133  	}
134  
135  	if (d->minor >= MAX_IRCTL_DEVICES) {
136  		dev_err(d->dev, "minor must be between 0 and %d!\n",
137  						MAX_IRCTL_DEVICES - 1);
138  		return -EBADRQC;
139  	}
140  
141  	if (d->code_length < 1 || d->code_length > (BUFLEN * 8)) {
142  		dev_err(d->dev, "code length must be less than %d bits\n",
143  								BUFLEN * 8);
144  		return -EBADRQC;
145  	}
146  
147  	if (!d->rbuf && !(d->fops && d->fops->read &&
148  			  d->fops->poll && d->fops->unlocked_ioctl)) {
149  		dev_err(d->dev, "undefined read, poll, ioctl\n");
150  		return -EBADRQC;
151  	}
152  
153  	mutex_lock(&lirc_dev_lock);
154  
155  	minor = d->minor;
156  
157  	if (minor < 0) {
158  		/* find first free slot for driver */
159  		for (minor = 0; minor < MAX_IRCTL_DEVICES; minor++)
160  			if (!irctls[minor])
161  				break;
162  		if (minor == MAX_IRCTL_DEVICES) {
163  			dev_err(d->dev, "no free slots for drivers!\n");
164  			err = -ENOMEM;
165  			goto out_lock;
166  		}
167  	} else if (irctls[minor]) {
168  		dev_err(d->dev, "minor (%d) just registered!\n", minor);
169  		err = -EBUSY;
170  		goto out_lock;
171  	}
172  
173  	ir = kzalloc(sizeof(struct irctl), GFP_KERNEL);
174  	if (!ir) {
175  		err = -ENOMEM;
176  		goto out_lock;
177  	}
178  
179  	mutex_init(&ir->irctl_lock);
180  	irctls[minor] = ir;
181  	d->minor = minor;
182  
183  	/* some safety check 8-) */
184  	d->name[sizeof(d->name)-1] = '\0';
185  
186  	if (d->features == 0)
187  		d->features = LIRC_CAN_REC_LIRCCODE;
188  
189  	ir->d = *d;
190  
191  	if (LIRC_CAN_REC(d->features)) {
192  		err = lirc_allocate_buffer(irctls[minor]);
193  		if (err) {
194  			kfree(ir);
195  			goto out_lock;
196  		}
197  		d->rbuf = ir->buf;
198  	}
199  
200  	device_initialize(&ir->dev);
201  	ir->dev.devt = MKDEV(MAJOR(lirc_base_dev), ir->d.minor);
202  	ir->dev.class = lirc_class;
203  	ir->dev.parent = d->dev;
204  	ir->dev.release = lirc_release;
205  	dev_set_name(&ir->dev, "lirc%d", ir->d.minor);
206  
207  	cdev_init(&ir->cdev, d->fops);
208  	ir->cdev.owner = ir->d.owner;
209  	ir->cdev.kobj.parent = &ir->dev.kobj;
210  
211  	err = cdev_add(&ir->cdev, ir->dev.devt, 1);
212  	if (err)
213  		goto out_free_dev;
214  
215  	ir->attached = 1;
216  
217  	err = device_add(&ir->dev);
218  	if (err)
219  		goto out_cdev;
220  
221  	mutex_unlock(&lirc_dev_lock);
222  
223  	get_device(ir->dev.parent);
224  
225  	dev_info(ir->d.dev, "lirc_dev: driver %s registered at minor = %d\n",
226  		 ir->d.name, ir->d.minor);
227  
228  	return minor;
229  
230  out_cdev:
231  	cdev_del(&ir->cdev);
232  out_free_dev:
233  	put_device(&ir->dev);
234  out_lock:
235  	mutex_unlock(&lirc_dev_lock);
236  
237  	return err;
238  }
239  EXPORT_SYMBOL(lirc_register_driver);
240  
lirc_unregister_driver(int minor)241  int lirc_unregister_driver(int minor)
242  {
243  	struct irctl *ir;
244  
245  	if (minor < 0 || minor >= MAX_IRCTL_DEVICES) {
246  		pr_err("minor (%d) must be between 0 and %d!\n",
247  					minor, MAX_IRCTL_DEVICES - 1);
248  		return -EBADRQC;
249  	}
250  
251  	ir = irctls[minor];
252  	if (!ir) {
253  		pr_err("failed to get irctl\n");
254  		return -ENOENT;
255  	}
256  
257  	mutex_lock(&lirc_dev_lock);
258  
259  	if (ir->d.minor != minor) {
260  		dev_err(ir->d.dev, "lirc_dev: minor %d device not registered\n",
261  									minor);
262  		mutex_unlock(&lirc_dev_lock);
263  		return -ENOENT;
264  	}
265  
266  	dev_dbg(ir->d.dev, "lirc_dev: driver %s unregistered from minor = %d\n",
267  		ir->d.name, ir->d.minor);
268  
269  	ir->attached = 0;
270  	if (ir->open) {
271  		dev_dbg(ir->d.dev, LOGHEAD "releasing opened driver\n",
272  			ir->d.name, ir->d.minor);
273  		wake_up_interruptible(&ir->buf->wait_poll);
274  	}
275  
276  	mutex_unlock(&lirc_dev_lock);
277  
278  	device_del(&ir->dev);
279  	cdev_del(&ir->cdev);
280  	put_device(&ir->dev);
281  
282  	return 0;
283  }
284  EXPORT_SYMBOL(lirc_unregister_driver);
285  
lirc_dev_fop_open(struct inode * inode,struct file * file)286  int lirc_dev_fop_open(struct inode *inode, struct file *file)
287  {
288  	struct irctl *ir;
289  	int retval = 0;
290  
291  	if (iminor(inode) >= MAX_IRCTL_DEVICES) {
292  		pr_err("open result for %d is -ENODEV\n", iminor(inode));
293  		return -ENODEV;
294  	}
295  
296  	if (mutex_lock_interruptible(&lirc_dev_lock))
297  		return -ERESTARTSYS;
298  
299  	ir = irctls[iminor(inode)];
300  	mutex_unlock(&lirc_dev_lock);
301  
302  	if (!ir) {
303  		retval = -ENODEV;
304  		goto error;
305  	}
306  
307  	dev_dbg(ir->d.dev, LOGHEAD "open called\n", ir->d.name, ir->d.minor);
308  
309  	if (ir->d.minor == NOPLUG) {
310  		retval = -ENODEV;
311  		goto error;
312  	}
313  
314  	if (ir->open) {
315  		retval = -EBUSY;
316  		goto error;
317  	}
318  
319  	if (ir->d.rdev) {
320  		retval = rc_open(ir->d.rdev);
321  		if (retval)
322  			goto error;
323  	}
324  
325  	if (ir->buf)
326  		lirc_buffer_clear(ir->buf);
327  
328  	ir->open++;
329  
330  error:
331  	nonseekable_open(inode, file);
332  
333  	return retval;
334  }
335  EXPORT_SYMBOL(lirc_dev_fop_open);
336  
lirc_dev_fop_close(struct inode * inode,struct file * file)337  int lirc_dev_fop_close(struct inode *inode, struct file *file)
338  {
339  	struct irctl *ir = irctls[iminor(inode)];
340  	int ret;
341  
342  	if (!ir) {
343  		pr_err("called with invalid irctl\n");
344  		return -EINVAL;
345  	}
346  
347  	ret = mutex_lock_killable(&lirc_dev_lock);
348  	WARN_ON(ret);
349  
350  	rc_close(ir->d.rdev);
351  
352  	ir->open--;
353  	if (!ret)
354  		mutex_unlock(&lirc_dev_lock);
355  
356  	return 0;
357  }
358  EXPORT_SYMBOL(lirc_dev_fop_close);
359  
lirc_dev_fop_poll(struct file * file,poll_table * wait)360  unsigned int lirc_dev_fop_poll(struct file *file, poll_table *wait)
361  {
362  	struct irctl *ir = irctls[iminor(file_inode(file))];
363  	unsigned int ret;
364  
365  	if (!ir) {
366  		pr_err("called with invalid irctl\n");
367  		return POLLERR;
368  	}
369  
370  	if (!ir->attached)
371  		return POLLHUP | POLLERR;
372  
373  	if (ir->buf) {
374  		poll_wait(file, &ir->buf->wait_poll, wait);
375  
376  		if (lirc_buffer_empty(ir->buf))
377  			ret = 0;
378  		else
379  			ret = POLLIN | POLLRDNORM;
380  	} else
381  		ret = POLLERR;
382  
383  	dev_dbg(ir->d.dev, LOGHEAD "poll result = %d\n",
384  		ir->d.name, ir->d.minor, ret);
385  
386  	return ret;
387  }
388  EXPORT_SYMBOL(lirc_dev_fop_poll);
389  
lirc_dev_fop_ioctl(struct file * file,unsigned int cmd,unsigned long arg)390  long lirc_dev_fop_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
391  {
392  	__u32 mode;
393  	int result = 0;
394  	struct irctl *ir = irctls[iminor(file_inode(file))];
395  
396  	if (!ir) {
397  		pr_err("no irctl found!\n");
398  		return -ENODEV;
399  	}
400  
401  	dev_dbg(ir->d.dev, LOGHEAD "ioctl called (0x%x)\n",
402  		ir->d.name, ir->d.minor, cmd);
403  
404  	if (ir->d.minor == NOPLUG || !ir->attached) {
405  		dev_err(ir->d.dev, LOGHEAD "ioctl result = -ENODEV\n",
406  			ir->d.name, ir->d.minor);
407  		return -ENODEV;
408  	}
409  
410  	mutex_lock(&ir->irctl_lock);
411  
412  	switch (cmd) {
413  	case LIRC_GET_FEATURES:
414  		result = put_user(ir->d.features, (__u32 __user *)arg);
415  		break;
416  	case LIRC_GET_REC_MODE:
417  		if (!LIRC_CAN_REC(ir->d.features)) {
418  			result = -ENOTTY;
419  			break;
420  		}
421  
422  		result = put_user(LIRC_REC2MODE
423  				  (ir->d.features & LIRC_CAN_REC_MASK),
424  				  (__u32 __user *)arg);
425  		break;
426  	case LIRC_SET_REC_MODE:
427  		if (!LIRC_CAN_REC(ir->d.features)) {
428  			result = -ENOTTY;
429  			break;
430  		}
431  
432  		result = get_user(mode, (__u32 __user *)arg);
433  		if (!result && !(LIRC_MODE2REC(mode) & ir->d.features))
434  			result = -EINVAL;
435  		/*
436  		 * FIXME: We should actually set the mode somehow but
437  		 * for now, lirc_serial doesn't support mode changing either
438  		 */
439  		break;
440  	case LIRC_GET_LENGTH:
441  		result = put_user(ir->d.code_length, (__u32 __user *)arg);
442  		break;
443  	case LIRC_GET_MIN_TIMEOUT:
444  		if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
445  		    ir->d.min_timeout == 0) {
446  			result = -ENOTTY;
447  			break;
448  		}
449  
450  		result = put_user(ir->d.min_timeout, (__u32 __user *)arg);
451  		break;
452  	case LIRC_GET_MAX_TIMEOUT:
453  		if (!(ir->d.features & LIRC_CAN_SET_REC_TIMEOUT) ||
454  		    ir->d.max_timeout == 0) {
455  			result = -ENOTTY;
456  			break;
457  		}
458  
459  		result = put_user(ir->d.max_timeout, (__u32 __user *)arg);
460  		break;
461  	default:
462  		result = -ENOTTY;
463  	}
464  
465  	mutex_unlock(&ir->irctl_lock);
466  
467  	return result;
468  }
469  EXPORT_SYMBOL(lirc_dev_fop_ioctl);
470  
lirc_dev_fop_read(struct file * file,char __user * buffer,size_t length,loff_t * ppos)471  ssize_t lirc_dev_fop_read(struct file *file,
472  			  char __user *buffer,
473  			  size_t length,
474  			  loff_t *ppos)
475  {
476  	struct irctl *ir = irctls[iminor(file_inode(file))];
477  	unsigned char *buf;
478  	int ret = 0, written = 0;
479  	DECLARE_WAITQUEUE(wait, current);
480  
481  	if (!ir) {
482  		pr_err("called with invalid irctl\n");
483  		return -ENODEV;
484  	}
485  
486  	if (!LIRC_CAN_REC(ir->d.features))
487  		return -EINVAL;
488  
489  	dev_dbg(ir->d.dev, LOGHEAD "read called\n", ir->d.name, ir->d.minor);
490  
491  	buf = kzalloc(ir->chunk_size, GFP_KERNEL);
492  	if (!buf)
493  		return -ENOMEM;
494  
495  	if (mutex_lock_interruptible(&ir->irctl_lock)) {
496  		ret = -ERESTARTSYS;
497  		goto out_unlocked;
498  	}
499  	if (!ir->attached) {
500  		ret = -ENODEV;
501  		goto out_locked;
502  	}
503  
504  	if (length % ir->chunk_size) {
505  		ret = -EINVAL;
506  		goto out_locked;
507  	}
508  
509  	/*
510  	 * we add ourselves to the task queue before buffer check
511  	 * to avoid losing scan code (in case when queue is awaken somewhere
512  	 * between while condition checking and scheduling)
513  	 */
514  	add_wait_queue(&ir->buf->wait_poll, &wait);
515  
516  	/*
517  	 * while we didn't provide 'length' bytes, device is opened in blocking
518  	 * mode and 'copy_to_user' is happy, wait for data.
519  	 */
520  	while (written < length && ret == 0) {
521  		if (lirc_buffer_empty(ir->buf)) {
522  			/* According to the read(2) man page, 'written' can be
523  			 * returned as less than 'length', instead of blocking
524  			 * again, returning -EWOULDBLOCK, or returning
525  			 * -ERESTARTSYS
526  			 */
527  			if (written)
528  				break;
529  			if (file->f_flags & O_NONBLOCK) {
530  				ret = -EWOULDBLOCK;
531  				break;
532  			}
533  			if (signal_pending(current)) {
534  				ret = -ERESTARTSYS;
535  				break;
536  			}
537  
538  			mutex_unlock(&ir->irctl_lock);
539  			set_current_state(TASK_INTERRUPTIBLE);
540  			schedule();
541  			set_current_state(TASK_RUNNING);
542  
543  			if (mutex_lock_interruptible(&ir->irctl_lock)) {
544  				ret = -ERESTARTSYS;
545  				remove_wait_queue(&ir->buf->wait_poll, &wait);
546  				goto out_unlocked;
547  			}
548  
549  			if (!ir->attached) {
550  				ret = -ENODEV;
551  				goto out_locked;
552  			}
553  		} else {
554  			lirc_buffer_read(ir->buf, buf);
555  			ret = copy_to_user((void __user *)buffer+written, buf,
556  					   ir->buf->chunk_size);
557  			if (!ret)
558  				written += ir->buf->chunk_size;
559  			else
560  				ret = -EFAULT;
561  		}
562  	}
563  
564  	remove_wait_queue(&ir->buf->wait_poll, &wait);
565  
566  out_locked:
567  	mutex_unlock(&ir->irctl_lock);
568  
569  out_unlocked:
570  	kfree(buf);
571  
572  	return ret ? ret : written;
573  }
574  EXPORT_SYMBOL(lirc_dev_fop_read);
575  
lirc_get_pdata(struct file * file)576  void *lirc_get_pdata(struct file *file)
577  {
578  	return irctls[iminor(file_inode(file))]->d.data;
579  }
580  EXPORT_SYMBOL(lirc_get_pdata);
581  
582  
lirc_dev_init(void)583  static int __init lirc_dev_init(void)
584  {
585  	int retval;
586  
587  	lirc_class = class_create(THIS_MODULE, "lirc");
588  	if (IS_ERR(lirc_class)) {
589  		pr_err("class_create failed\n");
590  		return PTR_ERR(lirc_class);
591  	}
592  
593  	retval = alloc_chrdev_region(&lirc_base_dev, 0, MAX_IRCTL_DEVICES,
594  				     "BaseRemoteCtl");
595  	if (retval) {
596  		class_destroy(lirc_class);
597  		pr_err("alloc_chrdev_region failed\n");
598  		return retval;
599  	}
600  
601  	pr_info("IR Remote Control driver registered, major %d\n",
602  						MAJOR(lirc_base_dev));
603  
604  	return 0;
605  }
606  
lirc_dev_exit(void)607  static void __exit lirc_dev_exit(void)
608  {
609  	class_destroy(lirc_class);
610  	unregister_chrdev_region(lirc_base_dev, MAX_IRCTL_DEVICES);
611  	pr_info("module unloaded\n");
612  }
613  
614  module_init(lirc_dev_init);
615  module_exit(lirc_dev_exit);
616  
617  MODULE_DESCRIPTION("LIRC base driver module");
618  MODULE_AUTHOR("Artur Lipowski");
619  MODULE_LICENSE("GPL");
620