GNU Linux-libre 4.9.309-gnu1
[releases.git] / drivers / uio / uio.c
1 /*
2  * drivers/uio/uio.c
3  *
4  * Copyright(C) 2005, Benedikt Spranger <b.spranger@linutronix.de>
5  * Copyright(C) 2005, Thomas Gleixner <tglx@linutronix.de>
6  * Copyright(C) 2006, Hans J. Koch <hjk@hansjkoch.de>
7  * Copyright(C) 2006, Greg Kroah-Hartman <greg@kroah.com>
8  *
9  * Userspace IO
10  *
11  * Base Functions
12  *
13  * Licensed under the GPLv2 only.
14  */
15
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/poll.h>
19 #include <linux/device.h>
20 #include <linux/slab.h>
21 #include <linux/mm.h>
22 #include <linux/idr.h>
23 #include <linux/sched.h>
24 #include <linux/string.h>
25 #include <linux/kobject.h>
26 #include <linux/cdev.h>
27 #include <linux/uio_driver.h>
28
29 #define UIO_MAX_DEVICES         (1U << MINORBITS)
30
31 static int uio_major;
32 static struct cdev *uio_cdev;
33 static DEFINE_IDR(uio_idr);
34 static const struct file_operations uio_fops;
35
36 /* Protect idr accesses */
37 static DEFINE_MUTEX(minor_lock);
38
39 /*
40  * attributes
41  */
42
43 struct uio_map {
44         struct kobject kobj;
45         struct uio_mem *mem;
46 };
47 #define to_map(map) container_of(map, struct uio_map, kobj)
48
49 static ssize_t map_name_show(struct uio_mem *mem, char *buf)
50 {
51         if (unlikely(!mem->name))
52                 mem->name = "";
53
54         return sprintf(buf, "%s\n", mem->name);
55 }
56
57 static ssize_t map_addr_show(struct uio_mem *mem, char *buf)
58 {
59         return sprintf(buf, "%pa\n", &mem->addr);
60 }
61
62 static ssize_t map_size_show(struct uio_mem *mem, char *buf)
63 {
64         return sprintf(buf, "%pa\n", &mem->size);
65 }
66
67 static ssize_t map_offset_show(struct uio_mem *mem, char *buf)
68 {
69         return sprintf(buf, "0x%llx\n", (unsigned long long)mem->addr & ~PAGE_MASK);
70 }
71
72 struct map_sysfs_entry {
73         struct attribute attr;
74         ssize_t (*show)(struct uio_mem *, char *);
75         ssize_t (*store)(struct uio_mem *, const char *, size_t);
76 };
77
78 static struct map_sysfs_entry name_attribute =
79         __ATTR(name, S_IRUGO, map_name_show, NULL);
80 static struct map_sysfs_entry addr_attribute =
81         __ATTR(addr, S_IRUGO, map_addr_show, NULL);
82 static struct map_sysfs_entry size_attribute =
83         __ATTR(size, S_IRUGO, map_size_show, NULL);
84 static struct map_sysfs_entry offset_attribute =
85         __ATTR(offset, S_IRUGO, map_offset_show, NULL);
86
87 static struct attribute *attrs[] = {
88         &name_attribute.attr,
89         &addr_attribute.attr,
90         &size_attribute.attr,
91         &offset_attribute.attr,
92         NULL,   /* need to NULL terminate the list of attributes */
93 };
94
95 static void map_release(struct kobject *kobj)
96 {
97         struct uio_map *map = to_map(kobj);
98         kfree(map);
99 }
100
101 static ssize_t map_type_show(struct kobject *kobj, struct attribute *attr,
102                              char *buf)
103 {
104         struct uio_map *map = to_map(kobj);
105         struct uio_mem *mem = map->mem;
106         struct map_sysfs_entry *entry;
107
108         entry = container_of(attr, struct map_sysfs_entry, attr);
109
110         if (!entry->show)
111                 return -EIO;
112
113         return entry->show(mem, buf);
114 }
115
116 static const struct sysfs_ops map_sysfs_ops = {
117         .show = map_type_show,
118 };
119
120 static struct kobj_type map_attr_type = {
121         .release        = map_release,
122         .sysfs_ops      = &map_sysfs_ops,
123         .default_attrs  = attrs,
124 };
125
126 struct uio_portio {
127         struct kobject kobj;
128         struct uio_port *port;
129 };
130 #define to_portio(portio) container_of(portio, struct uio_portio, kobj)
131
132 static ssize_t portio_name_show(struct uio_port *port, char *buf)
133 {
134         if (unlikely(!port->name))
135                 port->name = "";
136
137         return sprintf(buf, "%s\n", port->name);
138 }
139
140 static ssize_t portio_start_show(struct uio_port *port, char *buf)
141 {
142         return sprintf(buf, "0x%lx\n", port->start);
143 }
144
145 static ssize_t portio_size_show(struct uio_port *port, char *buf)
146 {
147         return sprintf(buf, "0x%lx\n", port->size);
148 }
149
150 static ssize_t portio_porttype_show(struct uio_port *port, char *buf)
151 {
152         const char *porttypes[] = {"none", "x86", "gpio", "other"};
153
154         if ((port->porttype < 0) || (port->porttype > UIO_PORT_OTHER))
155                 return -EINVAL;
156
157         return sprintf(buf, "port_%s\n", porttypes[port->porttype]);
158 }
159
160 struct portio_sysfs_entry {
161         struct attribute attr;
162         ssize_t (*show)(struct uio_port *, char *);
163         ssize_t (*store)(struct uio_port *, const char *, size_t);
164 };
165
166 static struct portio_sysfs_entry portio_name_attribute =
167         __ATTR(name, S_IRUGO, portio_name_show, NULL);
168 static struct portio_sysfs_entry portio_start_attribute =
169         __ATTR(start, S_IRUGO, portio_start_show, NULL);
170 static struct portio_sysfs_entry portio_size_attribute =
171         __ATTR(size, S_IRUGO, portio_size_show, NULL);
172 static struct portio_sysfs_entry portio_porttype_attribute =
173         __ATTR(porttype, S_IRUGO, portio_porttype_show, NULL);
174
175 static struct attribute *portio_attrs[] = {
176         &portio_name_attribute.attr,
177         &portio_start_attribute.attr,
178         &portio_size_attribute.attr,
179         &portio_porttype_attribute.attr,
180         NULL,
181 };
182
183 static void portio_release(struct kobject *kobj)
184 {
185         struct uio_portio *portio = to_portio(kobj);
186         kfree(portio);
187 }
188
189 static ssize_t portio_type_show(struct kobject *kobj, struct attribute *attr,
190                              char *buf)
191 {
192         struct uio_portio *portio = to_portio(kobj);
193         struct uio_port *port = portio->port;
194         struct portio_sysfs_entry *entry;
195
196         entry = container_of(attr, struct portio_sysfs_entry, attr);
197
198         if (!entry->show)
199                 return -EIO;
200
201         return entry->show(port, buf);
202 }
203
204 static const struct sysfs_ops portio_sysfs_ops = {
205         .show = portio_type_show,
206 };
207
208 static struct kobj_type portio_attr_type = {
209         .release        = portio_release,
210         .sysfs_ops      = &portio_sysfs_ops,
211         .default_attrs  = portio_attrs,
212 };
213
214 static ssize_t name_show(struct device *dev,
215                          struct device_attribute *attr, char *buf)
216 {
217         struct uio_device *idev = dev_get_drvdata(dev);
218         return sprintf(buf, "%s\n", idev->info->name);
219 }
220 static DEVICE_ATTR_RO(name);
221
222 static ssize_t version_show(struct device *dev,
223                             struct device_attribute *attr, char *buf)
224 {
225         struct uio_device *idev = dev_get_drvdata(dev);
226         return sprintf(buf, "%s\n", idev->info->version);
227 }
228 static DEVICE_ATTR_RO(version);
229
230 static ssize_t event_show(struct device *dev,
231                           struct device_attribute *attr, char *buf)
232 {
233         struct uio_device *idev = dev_get_drvdata(dev);
234         return sprintf(buf, "%u\n", (unsigned int)atomic_read(&idev->event));
235 }
236 static DEVICE_ATTR_RO(event);
237
238 static struct attribute *uio_attrs[] = {
239         &dev_attr_name.attr,
240         &dev_attr_version.attr,
241         &dev_attr_event.attr,
242         NULL,
243 };
244 ATTRIBUTE_GROUPS(uio);
245
246 /* UIO class infrastructure */
247 static struct class uio_class = {
248         .name = "uio",
249         .dev_groups = uio_groups,
250 };
251
252 bool uio_class_registered;
253
254 /*
255  * device functions
256  */
257 static int uio_dev_add_attributes(struct uio_device *idev)
258 {
259         int ret;
260         int mi, pi;
261         int map_found = 0;
262         int portio_found = 0;
263         struct uio_mem *mem;
264         struct uio_map *map;
265         struct uio_port *port;
266         struct uio_portio *portio;
267
268         for (mi = 0; mi < MAX_UIO_MAPS; mi++) {
269                 mem = &idev->info->mem[mi];
270                 if (mem->size == 0)
271                         break;
272                 if (!map_found) {
273                         map_found = 1;
274                         idev->map_dir = kobject_create_and_add("maps",
275                                                         &idev->dev->kobj);
276                         if (!idev->map_dir) {
277                                 ret = -ENOMEM;
278                                 goto err_map;
279                         }
280                 }
281                 map = kzalloc(sizeof(*map), GFP_KERNEL);
282                 if (!map) {
283                         ret = -ENOMEM;
284                         goto err_map;
285                 }
286                 kobject_init(&map->kobj, &map_attr_type);
287                 map->mem = mem;
288                 mem->map = map;
289                 ret = kobject_add(&map->kobj, idev->map_dir, "map%d", mi);
290                 if (ret)
291                         goto err_map_kobj;
292                 ret = kobject_uevent(&map->kobj, KOBJ_ADD);
293                 if (ret)
294                         goto err_map_kobj;
295         }
296
297         for (pi = 0; pi < MAX_UIO_PORT_REGIONS; pi++) {
298                 port = &idev->info->port[pi];
299                 if (port->size == 0)
300                         break;
301                 if (!portio_found) {
302                         portio_found = 1;
303                         idev->portio_dir = kobject_create_and_add("portio",
304                                                         &idev->dev->kobj);
305                         if (!idev->portio_dir) {
306                                 ret = -ENOMEM;
307                                 goto err_portio;
308                         }
309                 }
310                 portio = kzalloc(sizeof(*portio), GFP_KERNEL);
311                 if (!portio) {
312                         ret = -ENOMEM;
313                         goto err_portio;
314                 }
315                 kobject_init(&portio->kobj, &portio_attr_type);
316                 portio->port = port;
317                 port->portio = portio;
318                 ret = kobject_add(&portio->kobj, idev->portio_dir,
319                                                         "port%d", pi);
320                 if (ret)
321                         goto err_portio_kobj;
322                 ret = kobject_uevent(&portio->kobj, KOBJ_ADD);
323                 if (ret)
324                         goto err_portio_kobj;
325         }
326
327         return 0;
328
329 err_portio:
330         pi--;
331 err_portio_kobj:
332         for (; pi >= 0; pi--) {
333                 port = &idev->info->port[pi];
334                 portio = port->portio;
335                 kobject_put(&portio->kobj);
336         }
337         kobject_put(idev->portio_dir);
338 err_map:
339         mi--;
340 err_map_kobj:
341         for (; mi >= 0; mi--) {
342                 mem = &idev->info->mem[mi];
343                 map = mem->map;
344                 kobject_put(&map->kobj);
345         }
346         kobject_put(idev->map_dir);
347         dev_err(idev->dev, "error creating sysfs files (%d)\n", ret);
348         return ret;
349 }
350
351 static void uio_dev_del_attributes(struct uio_device *idev)
352 {
353         int i;
354         struct uio_mem *mem;
355         struct uio_port *port;
356
357         for (i = 0; i < MAX_UIO_MAPS; i++) {
358                 mem = &idev->info->mem[i];
359                 if (mem->size == 0)
360                         break;
361                 kobject_put(&mem->map->kobj);
362         }
363         kobject_put(idev->map_dir);
364
365         for (i = 0; i < MAX_UIO_PORT_REGIONS; i++) {
366                 port = &idev->info->port[i];
367                 if (port->size == 0)
368                         break;
369                 kobject_put(&port->portio->kobj);
370         }
371         kobject_put(idev->portio_dir);
372 }
373
374 static int uio_get_minor(struct uio_device *idev)
375 {
376         int retval = -ENOMEM;
377
378         mutex_lock(&minor_lock);
379         retval = idr_alloc(&uio_idr, idev, 0, UIO_MAX_DEVICES, GFP_KERNEL);
380         if (retval >= 0) {
381                 idev->minor = retval;
382                 retval = 0;
383         } else if (retval == -ENOSPC) {
384                 dev_err(idev->dev, "too many uio devices\n");
385                 retval = -EINVAL;
386         }
387         mutex_unlock(&minor_lock);
388         return retval;
389 }
390
391 static void uio_free_minor(struct uio_device *idev)
392 {
393         mutex_lock(&minor_lock);
394         idr_remove(&uio_idr, idev->minor);
395         mutex_unlock(&minor_lock);
396 }
397
398 /**
399  * uio_event_notify - trigger an interrupt event
400  * @info: UIO device capabilities
401  */
402 void uio_event_notify(struct uio_info *info)
403 {
404         struct uio_device *idev = info->uio_dev;
405
406         atomic_inc(&idev->event);
407         wake_up_interruptible(&idev->wait);
408         kill_fasync(&idev->async_queue, SIGIO, POLL_IN);
409 }
410 EXPORT_SYMBOL_GPL(uio_event_notify);
411
412 /**
413  * uio_interrupt - hardware interrupt handler
414  * @irq: IRQ number, can be UIO_IRQ_CYCLIC for cyclic timer
415  * @dev_id: Pointer to the devices uio_device structure
416  */
417 static irqreturn_t uio_interrupt(int irq, void *dev_id)
418 {
419         struct uio_device *idev = (struct uio_device *)dev_id;
420         irqreturn_t ret = idev->info->handler(irq, idev->info);
421
422         if (ret == IRQ_HANDLED)
423                 uio_event_notify(idev->info);
424
425         return ret;
426 }
427
428 struct uio_listener {
429         struct uio_device *dev;
430         s32 event_count;
431 };
432
433 static int uio_open(struct inode *inode, struct file *filep)
434 {
435         struct uio_device *idev;
436         struct uio_listener *listener;
437         int ret = 0;
438
439         mutex_lock(&minor_lock);
440         idev = idr_find(&uio_idr, iminor(inode));
441         mutex_unlock(&minor_lock);
442         if (!idev) {
443                 ret = -ENODEV;
444                 goto out;
445         }
446
447         if (!try_module_get(idev->owner)) {
448                 ret = -ENODEV;
449                 goto out;
450         }
451
452         listener = kmalloc(sizeof(*listener), GFP_KERNEL);
453         if (!listener) {
454                 ret = -ENOMEM;
455                 goto err_alloc_listener;
456         }
457
458         listener->dev = idev;
459         listener->event_count = atomic_read(&idev->event);
460         filep->private_data = listener;
461
462         if (idev->info->open) {
463                 ret = idev->info->open(idev->info, inode);
464                 if (ret)
465                         goto err_infoopen;
466         }
467         return 0;
468
469 err_infoopen:
470         kfree(listener);
471
472 err_alloc_listener:
473         module_put(idev->owner);
474
475 out:
476         return ret;
477 }
478
479 static int uio_fasync(int fd, struct file *filep, int on)
480 {
481         struct uio_listener *listener = filep->private_data;
482         struct uio_device *idev = listener->dev;
483
484         return fasync_helper(fd, filep, on, &idev->async_queue);
485 }
486
487 static int uio_release(struct inode *inode, struct file *filep)
488 {
489         int ret = 0;
490         struct uio_listener *listener = filep->private_data;
491         struct uio_device *idev = listener->dev;
492
493         if (idev->info->release)
494                 ret = idev->info->release(idev->info, inode);
495
496         module_put(idev->owner);
497         kfree(listener);
498         return ret;
499 }
500
501 static unsigned int uio_poll(struct file *filep, poll_table *wait)
502 {
503         struct uio_listener *listener = filep->private_data;
504         struct uio_device *idev = listener->dev;
505
506         if (!idev->info->irq)
507                 return -EIO;
508
509         poll_wait(filep, &idev->wait, wait);
510         if (listener->event_count != atomic_read(&idev->event))
511                 return POLLIN | POLLRDNORM;
512         return 0;
513 }
514
515 static ssize_t uio_read(struct file *filep, char __user *buf,
516                         size_t count, loff_t *ppos)
517 {
518         struct uio_listener *listener = filep->private_data;
519         struct uio_device *idev = listener->dev;
520         DECLARE_WAITQUEUE(wait, current);
521         ssize_t retval;
522         s32 event_count;
523
524         if (!idev->info->irq)
525                 return -EIO;
526
527         if (count != sizeof(s32))
528                 return -EINVAL;
529
530         add_wait_queue(&idev->wait, &wait);
531
532         do {
533                 set_current_state(TASK_INTERRUPTIBLE);
534
535                 event_count = atomic_read(&idev->event);
536                 if (event_count != listener->event_count) {
537                         __set_current_state(TASK_RUNNING);
538                         if (copy_to_user(buf, &event_count, count))
539                                 retval = -EFAULT;
540                         else {
541                                 listener->event_count = event_count;
542                                 retval = count;
543                         }
544                         break;
545                 }
546
547                 if (filep->f_flags & O_NONBLOCK) {
548                         retval = -EAGAIN;
549                         break;
550                 }
551
552                 if (signal_pending(current)) {
553                         retval = -ERESTARTSYS;
554                         break;
555                 }
556                 schedule();
557         } while (1);
558
559         __set_current_state(TASK_RUNNING);
560         remove_wait_queue(&idev->wait, &wait);
561
562         return retval;
563 }
564
565 static ssize_t uio_write(struct file *filep, const char __user *buf,
566                         size_t count, loff_t *ppos)
567 {
568         struct uio_listener *listener = filep->private_data;
569         struct uio_device *idev = listener->dev;
570         ssize_t retval;
571         s32 irq_on;
572
573         if (!idev->info->irq)
574                 return -EIO;
575
576         if (count != sizeof(s32))
577                 return -EINVAL;
578
579         if (!idev->info->irqcontrol)
580                 return -ENOSYS;
581
582         if (copy_from_user(&irq_on, buf, count))
583                 return -EFAULT;
584
585         retval = idev->info->irqcontrol(idev->info, irq_on);
586
587         return retval ? retval : sizeof(s32);
588 }
589
590 static int uio_find_mem_index(struct vm_area_struct *vma)
591 {
592         struct uio_device *idev = vma->vm_private_data;
593
594         if (vma->vm_pgoff < MAX_UIO_MAPS) {
595                 if (idev->info->mem[vma->vm_pgoff].size == 0)
596                         return -1;
597                 return (int)vma->vm_pgoff;
598         }
599         return -1;
600 }
601
602 static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
603 {
604         struct uio_device *idev = vma->vm_private_data;
605         struct page *page;
606         unsigned long offset;
607         void *addr;
608
609         int mi = uio_find_mem_index(vma);
610         if (mi < 0)
611                 return VM_FAULT_SIGBUS;
612
613         /*
614          * We need to subtract mi because userspace uses offset = N*PAGE_SIZE
615          * to use mem[N].
616          */
617         offset = (vmf->pgoff - mi) << PAGE_SHIFT;
618
619         addr = (void *)(unsigned long)idev->info->mem[mi].addr + offset;
620         if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
621                 page = virt_to_page(addr);
622         else
623                 page = vmalloc_to_page(addr);
624         get_page(page);
625         vmf->page = page;
626         return 0;
627 }
628
629 static const struct vm_operations_struct uio_logical_vm_ops = {
630         .fault = uio_vma_fault,
631 };
632
633 static int uio_mmap_logical(struct vm_area_struct *vma)
634 {
635         vma->vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
636         vma->vm_ops = &uio_logical_vm_ops;
637         return 0;
638 }
639
640 static const struct vm_operations_struct uio_physical_vm_ops = {
641 #ifdef CONFIG_HAVE_IOREMAP_PROT
642         .access = generic_access_phys,
643 #endif
644 };
645
646 static int uio_mmap_physical(struct vm_area_struct *vma)
647 {
648         struct uio_device *idev = vma->vm_private_data;
649         int mi = uio_find_mem_index(vma);
650         struct uio_mem *mem;
651         if (mi < 0)
652                 return -EINVAL;
653         mem = idev->info->mem + mi;
654
655         if (mem->addr & ~PAGE_MASK)
656                 return -ENODEV;
657         if (vma->vm_end - vma->vm_start > mem->size)
658                 return -EINVAL;
659
660         vma->vm_ops = &uio_physical_vm_ops;
661         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
662
663         /*
664          * We cannot use the vm_iomap_memory() helper here,
665          * because vma->vm_pgoff is the map index we looked
666          * up above in uio_find_mem_index(), rather than an
667          * actual page offset into the mmap.
668          *
669          * So we just do the physical mmap without a page
670          * offset.
671          */
672         return remap_pfn_range(vma,
673                                vma->vm_start,
674                                mem->addr >> PAGE_SHIFT,
675                                vma->vm_end - vma->vm_start,
676                                vma->vm_page_prot);
677 }
678
679 static int uio_mmap(struct file *filep, struct vm_area_struct *vma)
680 {
681         struct uio_listener *listener = filep->private_data;
682         struct uio_device *idev = listener->dev;
683         int mi;
684         unsigned long requested_pages, actual_pages;
685         int ret = 0;
686
687         if (vma->vm_end < vma->vm_start)
688                 return -EINVAL;
689
690         vma->vm_private_data = idev;
691
692         mi = uio_find_mem_index(vma);
693         if (mi < 0)
694                 return -EINVAL;
695
696         requested_pages = vma_pages(vma);
697         actual_pages = ((idev->info->mem[mi].addr & ~PAGE_MASK)
698                         + idev->info->mem[mi].size + PAGE_SIZE -1) >> PAGE_SHIFT;
699         if (requested_pages > actual_pages)
700                 return -EINVAL;
701
702         if (idev->info->mmap) {
703                 ret = idev->info->mmap(idev->info, vma);
704                 return ret;
705         }
706
707         switch (idev->info->mem[mi].memtype) {
708                 case UIO_MEM_PHYS:
709                         return uio_mmap_physical(vma);
710                 case UIO_MEM_LOGICAL:
711                 case UIO_MEM_VIRTUAL:
712                         return uio_mmap_logical(vma);
713                 default:
714                         return -EINVAL;
715         }
716 }
717
718 static const struct file_operations uio_fops = {
719         .owner          = THIS_MODULE,
720         .open           = uio_open,
721         .release        = uio_release,
722         .read           = uio_read,
723         .write          = uio_write,
724         .mmap           = uio_mmap,
725         .poll           = uio_poll,
726         .fasync         = uio_fasync,
727         .llseek         = noop_llseek,
728 };
729
730 static int uio_major_init(void)
731 {
732         static const char name[] = "uio";
733         struct cdev *cdev = NULL;
734         dev_t uio_dev = 0;
735         int result;
736
737         result = alloc_chrdev_region(&uio_dev, 0, UIO_MAX_DEVICES, name);
738         if (result)
739                 goto out;
740
741         result = -ENOMEM;
742         cdev = cdev_alloc();
743         if (!cdev)
744                 goto out_unregister;
745
746         cdev->owner = THIS_MODULE;
747         cdev->ops = &uio_fops;
748         kobject_set_name(&cdev->kobj, "%s", name);
749
750         result = cdev_add(cdev, uio_dev, UIO_MAX_DEVICES);
751         if (result)
752                 goto out_put;
753
754         uio_major = MAJOR(uio_dev);
755         uio_cdev = cdev;
756         return 0;
757 out_put:
758         kobject_put(&cdev->kobj);
759 out_unregister:
760         unregister_chrdev_region(uio_dev, UIO_MAX_DEVICES);
761 out:
762         return result;
763 }
764
765 static void uio_major_cleanup(void)
766 {
767         unregister_chrdev_region(MKDEV(uio_major, 0), UIO_MAX_DEVICES);
768         cdev_del(uio_cdev);
769 }
770
771 static int init_uio_class(void)
772 {
773         int ret;
774
775         /* This is the first time in here, set everything up properly */
776         ret = uio_major_init();
777         if (ret)
778                 goto exit;
779
780         ret = class_register(&uio_class);
781         if (ret) {
782                 printk(KERN_ERR "class_register failed for uio\n");
783                 goto err_class_register;
784         }
785
786         uio_class_registered = true;
787
788         return 0;
789
790 err_class_register:
791         uio_major_cleanup();
792 exit:
793         return ret;
794 }
795
796 static void release_uio_class(void)
797 {
798         uio_class_registered = false;
799         class_unregister(&uio_class);
800         uio_major_cleanup();
801 }
802
803 /**
804  * uio_register_device - register a new userspace IO device
805  * @owner:      module that creates the new device
806  * @parent:     parent device
807  * @info:       UIO device capabilities
808  *
809  * returns zero on success or a negative error code.
810  */
811 int __uio_register_device(struct module *owner,
812                           struct device *parent,
813                           struct uio_info *info)
814 {
815         struct uio_device *idev;
816         int ret = 0;
817
818         if (!uio_class_registered)
819                 return -EPROBE_DEFER;
820
821         if (!parent || !info || !info->name || !info->version)
822                 return -EINVAL;
823
824         info->uio_dev = NULL;
825
826         idev = devm_kzalloc(parent, sizeof(*idev), GFP_KERNEL);
827         if (!idev) {
828                 return -ENOMEM;
829         }
830
831         idev->owner = owner;
832         idev->info = info;
833         init_waitqueue_head(&idev->wait);
834         atomic_set(&idev->event, 0);
835
836         ret = uio_get_minor(idev);
837         if (ret)
838                 return ret;
839
840         idev->dev = device_create(&uio_class, parent,
841                                   MKDEV(uio_major, idev->minor), idev,
842                                   "uio%d", idev->minor);
843         if (IS_ERR(idev->dev)) {
844                 printk(KERN_ERR "UIO: device register failed\n");
845                 ret = PTR_ERR(idev->dev);
846                 goto err_device_create;
847         }
848
849         ret = uio_dev_add_attributes(idev);
850         if (ret)
851                 goto err_uio_dev_add_attributes;
852
853         info->uio_dev = idev;
854
855         if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
856                 /*
857                  * Note that we deliberately don't use devm_request_irq
858                  * here. The parent module can unregister the UIO device
859                  * and call pci_disable_msi, which requires that this
860                  * irq has been freed. However, the device may have open
861                  * FDs at the time of unregister and therefore may not be
862                  * freed until they are released.
863                  */
864                 ret = request_irq(info->irq, uio_interrupt,
865                                   info->irq_flags, info->name, idev);
866                 if (ret) {
867                         info->uio_dev = NULL;
868                         goto err_request_irq;
869                 }
870         }
871
872         return 0;
873
874 err_request_irq:
875         uio_dev_del_attributes(idev);
876 err_uio_dev_add_attributes:
877         device_destroy(&uio_class, MKDEV(uio_major, idev->minor));
878 err_device_create:
879         uio_free_minor(idev);
880         return ret;
881 }
882 EXPORT_SYMBOL_GPL(__uio_register_device);
883
884 /**
885  * uio_unregister_device - unregister a industrial IO device
886  * @info:       UIO device capabilities
887  *
888  */
889 void uio_unregister_device(struct uio_info *info)
890 {
891         struct uio_device *idev;
892
893         if (!info || !info->uio_dev)
894                 return;
895
896         idev = info->uio_dev;
897
898         uio_free_minor(idev);
899
900         uio_dev_del_attributes(idev);
901
902         if (info->irq && info->irq != UIO_IRQ_CUSTOM)
903                 free_irq(info->irq, idev);
904
905         device_destroy(&uio_class, MKDEV(uio_major, idev->minor));
906
907         return;
908 }
909 EXPORT_SYMBOL_GPL(uio_unregister_device);
910
911 static int __init uio_init(void)
912 {
913         return init_uio_class();
914 }
915
916 static void __exit uio_exit(void)
917 {
918         release_uio_class();
919         idr_destroy(&uio_idr);
920 }
921
922 module_init(uio_init)
923 module_exit(uio_exit)
924 MODULE_LICENSE("GPL v2");