22 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
25 #include <linux/module.h>
26 #include <linux/errno.h>
27 #include <linux/kernel.h>
30 #include <linux/poll.h>
31 #include <linux/device.h>
33 #include <linux/slab.h>
34 #include <linux/hid.h>
36 #include <linux/sched.h>
38 #include <linux/hidraw.h>
40 static int hidraw_major;
41 static struct cdev hidraw_cdev;
42 static struct class *hidraw_class;
68 if (!list->
hidraw->exist) {
109 static ssize_t hidraw_send_report(
struct file *file,
const char __user *buffer,
size_t count,
unsigned char report_type)
111 unsigned int minor = iminor(file->
f_path.dentry->d_inode);
116 if (!hidraw_table[minor]) {
129 hid_warn(dev,
"pid %d passed too large report\n",
136 hid_warn(dev,
"pid %d passed too short report\n",
161 static ssize_t hidraw_write(
struct file *file,
const char __user *buffer,
size_t count, loff_t *ppos)
177 static ssize_t hidraw_get_report(
struct file *file,
char __user *buffer,
size_t count,
unsigned char report_type)
179 unsigned int minor = iminor(file->
f_path.dentry->d_inode);
239 static unsigned int hidraw_poll(
struct file *file,
poll_table *
wait)
243 poll_wait(file, &list->
hidraw->wait, wait);
251 static int hidraw_open(
struct inode *
inode,
struct file *file)
253 unsigned int minor = iminor(inode);
264 if (!hidraw_table[minor]) {
269 list->
hidraw = hidraw_table[minor];
274 dev = hidraw_table[minor];
282 err = hid_hw_open(dev->
hid);
298 static int hidraw_release(
struct inode * inode,
struct file * file)
300 unsigned int minor = iminor(inode);
307 if (!hidraw_table[minor]) {
313 dev = hidraw_table[minor];
315 if (list->
hidraw->exist) {
317 hid_hw_close(dev->
hid);
333 static long hidraw_ioctl(
struct file *file,
unsigned int cmd,
336 struct inode *inode = file->
f_path.dentry->d_inode;
337 unsigned int minor = iminor(inode);
343 dev = hidraw_table[
minor];
359 if (
get_user(len, (
int __user *)arg))
367 min(dev->
hid->rsize, len)))
376 dinfo.vendor = dev->
hid->vendor;
377 dinfo.product = dev->
hid->product;
436 .write = hidraw_write,
439 .release = hidraw_release,
440 .unlocked_ioctl = hidraw_ioctl,
442 .compat_ioctl = hidraw_ioctl,
454 int new_head = (list->
head + 1) & (HIDRAW_BUFFER_SIZE - 1);
456 if (new_head == list->
tail)
464 list->
head = new_head;
489 if (hidraw_table[minor])
503 NULL,
"%s%d",
"hidraw", minor);
505 if (IS_ERR(dev->
dev)) {
508 result = PTR_ERR(dev->
dev);
515 INIT_LIST_HEAD(&dev->
list);
558 hidraw_major =
MAJOR(dev_id);
561 pr_warn(
"can't get major number\n");
566 if (IS_ERR(hidraw_class)) {
567 result = PTR_ERR(hidraw_class);