Lines Matching refs:dev

61 	struct comedi_device *dev;  member
102 static void comedi_device_init(struct comedi_device *dev) in comedi_device_init() argument
104 kref_init(&dev->refcount); in comedi_device_init()
105 spin_lock_init(&dev->spinlock); in comedi_device_init()
106 mutex_init(&dev->mutex); in comedi_device_init()
107 init_rwsem(&dev->attach_lock); in comedi_device_init()
108 dev->minor = -1; in comedi_device_init()
113 struct comedi_device *dev = in comedi_dev_kref_release() local
116 mutex_destroy(&dev->mutex); in comedi_dev_kref_release()
117 put_device(dev->class_dev); in comedi_dev_kref_release()
118 kfree(dev); in comedi_dev_kref_release()
133 int comedi_dev_put(struct comedi_device *dev) in comedi_dev_put() argument
135 if (dev) in comedi_dev_put()
136 return kref_put(&dev->refcount, comedi_dev_kref_release); in comedi_dev_put()
141 static struct comedi_device *comedi_dev_get(struct comedi_device *dev) in comedi_dev_get() argument
143 if (dev) in comedi_dev_get()
144 kref_get(&dev->refcount); in comedi_dev_get()
145 return dev; in comedi_dev_get()
148 static void comedi_device_cleanup(struct comedi_device *dev) in comedi_device_cleanup() argument
152 if (!dev) in comedi_device_cleanup()
154 mutex_lock(&dev->mutex); in comedi_device_cleanup()
155 if (dev->attached) in comedi_device_cleanup()
156 driver_module = dev->driver->module; in comedi_device_cleanup()
157 comedi_device_detach(dev); in comedi_device_cleanup()
158 if (driver_module && dev->use_count) in comedi_device_cleanup()
160 mutex_unlock(&dev->mutex); in comedi_device_cleanup()
163 static bool comedi_clear_board_dev(struct comedi_device *dev) in comedi_clear_board_dev() argument
165 unsigned int i = dev->minor; in comedi_clear_board_dev()
168 lockdep_assert_held(&dev->mutex); in comedi_clear_board_dev()
170 if (dev == comedi_board_minor_table[i]) { in comedi_clear_board_dev()
180 struct comedi_device *dev; in comedi_clear_board_minor() local
183 dev = comedi_board_minor_table[minor]; in comedi_clear_board_minor()
186 return dev; in comedi_clear_board_minor()
190 comedi_subdevice_from_minor(const struct comedi_device *dev, unsigned int minor) in comedi_subdevice_from_minor() argument
197 if (s && s->device != dev) in comedi_subdevice_from_minor()
205 struct comedi_device *dev; in comedi_dev_get_from_board_minor() local
208 dev = comedi_dev_get(comedi_board_minor_table[minor]); in comedi_dev_get_from_board_minor()
210 return dev; in comedi_dev_get_from_board_minor()
216 struct comedi_device *dev; in comedi_dev_get_from_subdevice_minor() local
222 dev = comedi_dev_get(s ? s->device : NULL); in comedi_dev_get_from_subdevice_minor()
224 return dev; in comedi_dev_get_from_subdevice_minor()
249 comedi_read_subdevice(const struct comedi_device *dev, unsigned int minor) in comedi_read_subdevice() argument
253 lockdep_assert_held(&dev->mutex); in comedi_read_subdevice()
255 s = comedi_subdevice_from_minor(dev, minor); in comedi_read_subdevice()
259 return dev->read_subdev; in comedi_read_subdevice()
263 comedi_write_subdevice(const struct comedi_device *dev, unsigned int minor) in comedi_write_subdevice() argument
267 lockdep_assert_held(&dev->mutex); in comedi_write_subdevice()
269 s = comedi_subdevice_from_minor(dev, minor); in comedi_write_subdevice()
273 return dev->write_subdev; in comedi_write_subdevice()
279 struct comedi_device *dev = cfp->dev; in comedi_file_reset() local
283 read_s = dev->read_subdev; in comedi_file_reset()
284 write_s = dev->write_subdev; in comedi_file_reset()
286 s = comedi_subdevice_from_minor(dev, minor); in comedi_file_reset()
292 cfp->last_attached = dev->attached; in comedi_file_reset()
293 cfp->last_detach_count = dev->detach_count; in comedi_file_reset()
301 struct comedi_device *dev = cfp->dev; in comedi_file_check() local
303 if (cfp->last_attached != dev->attached || in comedi_file_check()
304 cfp->last_detach_count != dev->detach_count) in comedi_file_check()
324 static int resize_async_buffer(struct comedi_device *dev, in resize_async_buffer() argument
331 lockdep_assert_held(&dev->mutex); in resize_async_buffer()
337 dev_dbg(dev->class_dev, in resize_async_buffer()
342 dev_dbg(dev->class_dev, in resize_async_buffer()
350 retval = comedi_buf_alloc(dev, s, new_size); in resize_async_buffer()
355 retval = s->buf_change(dev, s); in resize_async_buffer()
360 dev_dbg(dev->class_dev, "subd %d buffer resized to %i bytes\n", in resize_async_buffer()
371 struct comedi_device *dev; in max_read_buffer_kb_show() local
375 dev = comedi_dev_get_from_minor(minor); in max_read_buffer_kb_show()
376 if (!dev) in max_read_buffer_kb_show()
379 mutex_lock(&dev->mutex); in max_read_buffer_kb_show()
380 s = comedi_read_subdevice(dev, minor); in max_read_buffer_kb_show()
383 mutex_unlock(&dev->mutex); in max_read_buffer_kb_show()
385 comedi_dev_put(dev); in max_read_buffer_kb_show()
394 struct comedi_device *dev; in max_read_buffer_kb_store() local
406 dev = comedi_dev_get_from_minor(minor); in max_read_buffer_kb_store()
407 if (!dev) in max_read_buffer_kb_store()
410 mutex_lock(&dev->mutex); in max_read_buffer_kb_store()
411 s = comedi_read_subdevice(dev, minor); in max_read_buffer_kb_store()
416 mutex_unlock(&dev->mutex); in max_read_buffer_kb_store()
418 comedi_dev_put(dev); in max_read_buffer_kb_store()
427 struct comedi_device *dev; in read_buffer_kb_show() local
431 dev = comedi_dev_get_from_minor(minor); in read_buffer_kb_show()
432 if (!dev) in read_buffer_kb_show()
435 mutex_lock(&dev->mutex); in read_buffer_kb_show()
436 s = comedi_read_subdevice(dev, minor); in read_buffer_kb_show()
439 mutex_unlock(&dev->mutex); in read_buffer_kb_show()
441 comedi_dev_put(dev); in read_buffer_kb_show()
450 struct comedi_device *dev; in read_buffer_kb_store() local
462 dev = comedi_dev_get_from_minor(minor); in read_buffer_kb_store()
463 if (!dev) in read_buffer_kb_store()
466 mutex_lock(&dev->mutex); in read_buffer_kb_store()
467 s = comedi_read_subdevice(dev, minor); in read_buffer_kb_store()
469 err = resize_async_buffer(dev, s, size); in read_buffer_kb_store()
472 mutex_unlock(&dev->mutex); in read_buffer_kb_store()
474 comedi_dev_put(dev); in read_buffer_kb_store()
484 struct comedi_device *dev; in max_write_buffer_kb_show() local
488 dev = comedi_dev_get_from_minor(minor); in max_write_buffer_kb_show()
489 if (!dev) in max_write_buffer_kb_show()
492 mutex_lock(&dev->mutex); in max_write_buffer_kb_show()
493 s = comedi_write_subdevice(dev, minor); in max_write_buffer_kb_show()
496 mutex_unlock(&dev->mutex); in max_write_buffer_kb_show()
498 comedi_dev_put(dev); in max_write_buffer_kb_show()
507 struct comedi_device *dev; in max_write_buffer_kb_store() local
519 dev = comedi_dev_get_from_minor(minor); in max_write_buffer_kb_store()
520 if (!dev) in max_write_buffer_kb_store()
523 mutex_lock(&dev->mutex); in max_write_buffer_kb_store()
524 s = comedi_write_subdevice(dev, minor); in max_write_buffer_kb_store()
529 mutex_unlock(&dev->mutex); in max_write_buffer_kb_store()
531 comedi_dev_put(dev); in max_write_buffer_kb_store()
540 struct comedi_device *dev; in write_buffer_kb_show() local
544 dev = comedi_dev_get_from_minor(minor); in write_buffer_kb_show()
545 if (!dev) in write_buffer_kb_show()
548 mutex_lock(&dev->mutex); in write_buffer_kb_show()
549 s = comedi_write_subdevice(dev, minor); in write_buffer_kb_show()
552 mutex_unlock(&dev->mutex); in write_buffer_kb_show()
554 comedi_dev_put(dev); in write_buffer_kb_show()
563 struct comedi_device *dev; in write_buffer_kb_store() local
575 dev = comedi_dev_get_from_minor(minor); in write_buffer_kb_store()
576 if (!dev) in write_buffer_kb_store()
579 mutex_lock(&dev->mutex); in write_buffer_kb_store()
580 s = comedi_write_subdevice(dev, minor); in write_buffer_kb_store()
582 err = resize_async_buffer(dev, s, size); in write_buffer_kb_store()
585 mutex_unlock(&dev->mutex); in write_buffer_kb_store()
587 comedi_dev_put(dev); in write_buffer_kb_store()
606 static void comedi_free_board_dev(struct comedi_device *dev) in comedi_free_board_dev() argument
608 if (dev) { in comedi_free_board_dev()
609 comedi_device_cleanup(dev); in comedi_free_board_dev()
610 if (dev->class_dev) { in comedi_free_board_dev()
612 MKDEV(COMEDI_MAJOR, dev->minor)); in comedi_free_board_dev()
614 comedi_dev_put(dev); in comedi_free_board_dev()
735 static void do_become_nonbusy(struct comedi_device *dev, in do_become_nonbusy() argument
740 lockdep_assert_held(&dev->mutex); in do_become_nonbusy()
750 dev_err(dev->class_dev, in do_become_nonbusy()
756 static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s) in do_cancel() argument
760 lockdep_assert_held(&dev->mutex); in do_cancel()
762 ret = s->cancel(dev, s); in do_cancel()
764 do_become_nonbusy(dev, s); in do_cancel()
769 void comedi_device_cancel_all(struct comedi_device *dev) in comedi_device_cancel_all() argument
774 lockdep_assert_held(&dev->mutex); in comedi_device_cancel_all()
775 if (!dev->attached) in comedi_device_cancel_all()
778 for (i = 0; i < dev->n_subdevices; i++) { in comedi_device_cancel_all()
779 s = &dev->subdevices[i]; in comedi_device_cancel_all()
781 do_cancel(dev, s); in comedi_device_cancel_all()
785 static int is_device_busy(struct comedi_device *dev) in is_device_busy() argument
790 lockdep_assert_held(&dev->mutex); in is_device_busy()
791 if (!dev->attached) in is_device_busy()
794 for (i = 0; i < dev->n_subdevices; i++) { in is_device_busy()
795 s = &dev->subdevices[i]; in is_device_busy()
818 static int do_devconfig_ioctl(struct comedi_device *dev, in do_devconfig_ioctl() argument
823 lockdep_assert_held(&dev->mutex); in do_devconfig_ioctl()
828 if (is_device_busy(dev)) in do_devconfig_ioctl()
830 if (dev->attached) { in do_devconfig_ioctl()
831 struct module *driver_module = dev->driver->module; in do_devconfig_ioctl()
833 comedi_device_detach(dev); in do_devconfig_ioctl()
845 dev_warn(dev->class_dev, in do_devconfig_ioctl()
850 if (dev->minor >= comedi_num_legacy_minors) in do_devconfig_ioctl()
855 return comedi_device_attach(dev, &it); in do_devconfig_ioctl()
871 static int do_bufconfig_ioctl(struct comedi_device *dev, in do_bufconfig_ioctl() argument
879 lockdep_assert_held(&dev->mutex); in do_bufconfig_ioctl()
883 if (bc.subdevice >= dev->n_subdevices) in do_bufconfig_ioctl()
886 s = &dev->subdevices[bc.subdevice]; in do_bufconfig_ioctl()
890 dev_dbg(dev->class_dev, in do_bufconfig_ioctl()
905 retval = resize_async_buffer(dev, s, bc.size); in do_bufconfig_ioctl()
933 static int do_devinfo_ioctl(struct comedi_device *dev, in do_devinfo_ioctl() argument
940 lockdep_assert_held(&dev->mutex); in do_devinfo_ioctl()
945 devinfo.n_subdevs = dev->n_subdevices; in do_devinfo_ioctl()
946 strscpy(devinfo.driver_name, dev->driver->driver_name, COMEDI_NAMELEN); in do_devinfo_ioctl()
947 strscpy(devinfo.board_name, dev->board_name, COMEDI_NAMELEN); in do_devinfo_ioctl()
980 static int do_subdinfo_ioctl(struct comedi_device *dev, in do_subdinfo_ioctl() argument
987 lockdep_assert_held(&dev->mutex); in do_subdinfo_ioctl()
988 tmp = kcalloc(dev->n_subdevices, sizeof(*tmp), GFP_KERNEL); in do_subdinfo_ioctl()
993 for (i = 0; i < dev->n_subdevices; i++) { in do_subdinfo_ioctl()
994 s = &dev->subdevices[i]; in do_subdinfo_ioctl()
1034 ret = copy_to_user(arg, tmp, dev->n_subdevices * sizeof(*tmp)); in do_subdinfo_ioctl()
1055 static int do_chaninfo_ioctl(struct comedi_device *dev, in do_chaninfo_ioctl() argument
1060 lockdep_assert_held(&dev->mutex); in do_chaninfo_ioctl()
1062 if (it->subdev >= dev->n_subdevices) in do_chaninfo_ioctl()
1064 s = &dev->subdevices[it->subdev]; in do_chaninfo_ioctl()
1085 x = (dev->minor << 28) | (it->subdev << 24) | (i << 16) | in do_chaninfo_ioctl()
1108 static int do_bufinfo_ioctl(struct comedi_device *dev, in do_bufinfo_ioctl() argument
1118 lockdep_assert_held(&dev->mutex); in do_bufinfo_ioctl()
1122 if (bi.subdevice >= dev->n_subdevices) in do_bufinfo_ioctl()
1125 s = &dev->subdevices[bi.subdevice]; in do_bufinfo_ioctl()
1174 do_become_nonbusy(dev, s); in do_bufinfo_ioctl()
1302 static int get_valid_routes(struct comedi_device *dev, unsigned int *data) in get_valid_routes() argument
1304 lockdep_assert_held(&dev->mutex); in get_valid_routes()
1305 data[1] = dev->get_valid_routes(dev, data[1], data + 2); in get_valid_routes()
1309 static int parse_insn(struct comedi_device *dev, struct comedi_insn *insn, in parse_insn() argument
1316 lockdep_assert_held(&dev->mutex); in parse_insn()
1351 if (insn->subdev >= dev->n_subdevices) { in parse_insn()
1352 dev_dbg(dev->class_dev, in parse_insn()
1358 s = &dev->subdevices[insn->subdev]; in parse_insn()
1360 dev_dbg(dev->class_dev, "no async\n"); in parse_insn()
1365 dev_dbg(dev->class_dev, "no inttrig\n"); in parse_insn()
1369 ret = s->async->inttrig(dev, s, data[0]); in parse_insn()
1384 ret = get_valid_routes(dev, data); in parse_insn()
1389 ret = dev->insn_device_config(dev, insn, data); in parse_insn()
1392 dev_dbg(dev->class_dev, "invalid insn\n"); in parse_insn()
1400 if (insn->subdev >= dev->n_subdevices) { in parse_insn()
1401 dev_dbg(dev->class_dev, "subdevice %d out of range\n", in parse_insn()
1406 s = &dev->subdevices[insn->subdev]; in parse_insn()
1409 dev_dbg(dev->class_dev, "%d not usable subdevice\n", in parse_insn()
1417 dev_dbg(dev->class_dev, "device locked\n"); in parse_insn()
1425 dev_dbg(dev->class_dev, "bad chanspec\n"); in parse_insn()
1437 ret = s->insn_read(dev, s, insn, data); in parse_insn()
1439 dev_dbg(dev->class_dev, in parse_insn()
1451 dev_dbg(dev->class_dev, in parse_insn()
1457 ret = s->insn_write(dev, s, insn, data); in parse_insn()
1459 dev_dbg(dev->class_dev, in parse_insn()
1485 ret = s->insn_bits(dev, s, insn, data); in parse_insn()
1495 ret = s->insn_config(dev, s, insn, data); in parse_insn()
1527 static int do_insnlist_ioctl(struct comedi_device *dev, in do_insnlist_ioctl() argument
1537 lockdep_assert_held(&dev->mutex); in do_insnlist_ioctl()
1542 dev_dbg(dev->class_dev, in do_insnlist_ioctl()
1562 dev_dbg(dev->class_dev, in do_insnlist_ioctl()
1568 ret = parse_insn(dev, insns + i, data, file); in do_insnlist_ioctl()
1574 dev_dbg(dev->class_dev, in do_insnlist_ioctl()
1606 static int do_insn_ioctl(struct comedi_device *dev, in do_insn_ioctl() argument
1613 lockdep_assert_held(&dev->mutex); in do_insn_ioctl()
1637 ret = parse_insn(dev, insn, data, file); in do_insn_ioctl()
1656 static int __comedi_get_user_cmd(struct comedi_device *dev, in __comedi_get_user_cmd() argument
1661 lockdep_assert_held(&dev->mutex); in __comedi_get_user_cmd()
1662 if (cmd->subdev >= dev->n_subdevices) { in __comedi_get_user_cmd()
1663 dev_dbg(dev->class_dev, "%d no such subdevice\n", cmd->subdev); in __comedi_get_user_cmd()
1667 s = &dev->subdevices[cmd->subdev]; in __comedi_get_user_cmd()
1670 dev_dbg(dev->class_dev, "%d not valid subdevice\n", in __comedi_get_user_cmd()
1676 dev_dbg(dev->class_dev, in __comedi_get_user_cmd()
1684 dev_dbg(dev->class_dev, "channel/gain list too long %d > %d\n", in __comedi_get_user_cmd()
1707 static int __comedi_get_user_chanlist(struct comedi_device *dev, in __comedi_get_user_chanlist() argument
1715 lockdep_assert_held(&dev->mutex); in __comedi_get_user_chanlist()
1748 static int do_cmd_ioctl(struct comedi_device *dev, in do_cmd_ioctl() argument
1756 lockdep_assert_held(&dev->mutex); in do_cmd_ioctl()
1759 ret = __comedi_get_user_cmd(dev, cmd); in do_cmd_ioctl()
1766 s = &dev->subdevices[cmd->subdev]; in do_cmd_ioctl()
1771 dev_dbg(dev->class_dev, "subdevice locked\n"); in do_cmd_ioctl()
1777 dev_dbg(dev->class_dev, "subdevice busy\n"); in do_cmd_ioctl()
1783 dev_dbg(dev->class_dev, "channel/gain list too short %u < 1\n", in do_cmd_ioctl()
1792 ret = __comedi_get_user_chanlist(dev, s, user_chanlist, &async->cmd); in do_cmd_ioctl()
1796 ret = s->do_cmdtest(dev, s, &async->cmd); in do_cmd_ioctl()
1799 dev_dbg(dev->class_dev, "test returned %d\n", ret); in do_cmd_ioctl()
1811 dev_dbg(dev->class_dev, "no buffer (?)\n"); in do_cmd_ioctl()
1829 ret = s->do_cmd(dev, s); in do_cmd_ioctl()
1834 do_become_nonbusy(dev, s); in do_cmd_ioctl()
1853 static int do_cmdtest_ioctl(struct comedi_device *dev, in do_cmdtest_ioctl() argument
1860 lockdep_assert_held(&dev->mutex); in do_cmdtest_ioctl()
1863 ret = __comedi_get_user_cmd(dev, cmd); in do_cmdtest_ioctl()
1870 s = &dev->subdevices[cmd->subdev]; in do_cmdtest_ioctl()
1875 ret = __comedi_get_user_chanlist(dev, s, user_chanlist, cmd); in do_cmdtest_ioctl()
1880 ret = s->do_cmdtest(dev, s, cmd); in do_cmdtest_ioctl()
1904 static int do_lock_ioctl(struct comedi_device *dev, unsigned long arg, in do_lock_ioctl() argument
1911 lockdep_assert_held(&dev->mutex); in do_lock_ioctl()
1912 if (arg >= dev->n_subdevices) in do_lock_ioctl()
1914 s = &dev->subdevices[arg]; in do_lock_ioctl()
1939 static int do_unlock_ioctl(struct comedi_device *dev, unsigned long arg, in do_unlock_ioctl() argument
1944 lockdep_assert_held(&dev->mutex); in do_unlock_ioctl()
1945 if (arg >= dev->n_subdevices) in do_unlock_ioctl()
1947 s = &dev->subdevices[arg]; in do_unlock_ioctl()
1974 static int do_cancel_ioctl(struct comedi_device *dev, unsigned long arg, in do_cancel_ioctl() argument
1979 lockdep_assert_held(&dev->mutex); in do_cancel_ioctl()
1980 if (arg >= dev->n_subdevices) in do_cancel_ioctl()
1982 s = &dev->subdevices[arg]; in do_cancel_ioctl()
1992 return do_cancel(dev, s); in do_cancel_ioctl()
2008 static int do_poll_ioctl(struct comedi_device *dev, unsigned long arg, in do_poll_ioctl() argument
2013 lockdep_assert_held(&dev->mutex); in do_poll_ioctl()
2014 if (arg >= dev->n_subdevices) in do_poll_ioctl()
2016 s = &dev->subdevices[arg]; in do_poll_ioctl()
2025 return s->poll(dev, s); in do_poll_ioctl()
2043 static int do_setrsubd_ioctl(struct comedi_device *dev, unsigned long arg, in do_setrsubd_ioctl() argument
2049 lockdep_assert_held(&dev->mutex); in do_setrsubd_ioctl()
2050 if (arg >= dev->n_subdevices) in do_setrsubd_ioctl()
2053 s_new = &dev->subdevices[arg]; in do_setrsubd_ioctl()
2086 static int do_setwsubd_ioctl(struct comedi_device *dev, unsigned long arg, in do_setwsubd_ioctl() argument
2092 lockdep_assert_held(&dev->mutex); in do_setwsubd_ioctl()
2093 if (arg >= dev->n_subdevices) in do_setwsubd_ioctl()
2096 s_new = &dev->subdevices[arg]; in do_setwsubd_ioctl()
2121 struct comedi_device *dev = cfp->dev; in comedi_unlocked_ioctl() local
2124 mutex_lock(&dev->mutex); in comedi_unlocked_ioctl()
2136 rc = do_devconfig_ioctl(dev, in comedi_unlocked_ioctl()
2140 dev->minor >= comedi_num_legacy_minors) { in comedi_unlocked_ioctl()
2145 if (comedi_clear_board_dev(dev)) { in comedi_unlocked_ioctl()
2146 mutex_unlock(&dev->mutex); in comedi_unlocked_ioctl()
2147 comedi_free_board_dev(dev); in comedi_unlocked_ioctl()
2155 if (!dev->attached) { in comedi_unlocked_ioctl()
2156 dev_dbg(dev->class_dev, "no driver attached\n"); in comedi_unlocked_ioctl()
2163 rc = do_bufconfig_ioctl(dev, in comedi_unlocked_ioctl()
2167 rc = do_devinfo_ioctl(dev, (struct comedi_devinfo __user *)arg, in comedi_unlocked_ioctl()
2171 rc = do_subdinfo_ioctl(dev, in comedi_unlocked_ioctl()
2181 rc = do_chaninfo_ioctl(dev, &it); in comedi_unlocked_ioctl()
2190 rc = do_rangeinfo_ioctl(dev, &it); in comedi_unlocked_ioctl()
2194 rc = do_bufinfo_ioctl(dev, in comedi_unlocked_ioctl()
2199 rc = do_lock_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2202 rc = do_unlock_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2205 rc = do_cancel_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2215 rc = do_cmd_ioctl(dev, &cmd, &copy, file); in comedi_unlocked_ioctl()
2228 rc = do_cmdtest_ioctl(dev, &cmd, &copy, file); in comedi_unlocked_ioctl()
2253 rc = do_insnlist_ioctl(dev, insns, insnlist.n_insns, file); in comedi_unlocked_ioctl()
2263 rc = do_insn_ioctl(dev, &insn, file); in comedi_unlocked_ioctl()
2267 rc = do_poll_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2270 rc = do_setrsubd_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2273 rc = do_setwsubd_ioctl(dev, arg, file); in comedi_unlocked_ioctl()
2281 mutex_unlock(&dev->mutex); in comedi_unlocked_ioctl()
2324 struct comedi_device *dev = cfp->dev; in comedi_mmap() local
2341 if (!down_read_trylock(&dev->attach_lock)) in comedi_mmap()
2344 if (!dev->attached) { in comedi_mmap()
2345 dev_dbg(dev->class_dev, "no driver attached\n"); in comedi_mmap()
2366 dev_dbg(dev->class_dev, "mmap() offset must be 0.\n"); in comedi_mmap()
2420 up_read(&dev->attach_lock); in comedi_mmap()
2429 struct comedi_device *dev = cfp->dev; in comedi_poll() local
2432 down_read(&dev->attach_lock); in comedi_poll()
2434 if (!dev->attached) { in comedi_poll()
2435 dev_dbg(dev->class_dev, "no driver attached\n"); in comedi_poll()
2462 up_read(&dev->attach_lock); in comedi_poll()
2476 struct comedi_device *dev = cfp->dev; in comedi_write() local
2482 down_read(&dev->attach_lock); in comedi_write()
2484 old_detach_count = dev->detach_count; in comedi_write()
2486 if (!dev->attached) { in comedi_write()
2487 dev_dbg(dev->class_dev, "no driver attached\n"); in comedi_write()
2574 up_read(&dev->attach_lock); in comedi_write()
2576 mutex_lock(&dev->mutex); in comedi_write()
2588 if (dev->attached && old_detach_count == dev->detach_count && in comedi_write()
2592 do_become_nonbusy(dev, s); in comedi_write()
2593 mutex_unlock(&dev->mutex); in comedi_write()
2597 up_read(&dev->attach_lock); in comedi_write()
2612 struct comedi_device *dev = cfp->dev; in comedi_read() local
2618 down_read(&dev->attach_lock); in comedi_read()
2620 old_detach_count = dev->detach_count; in comedi_read()
2622 if (!dev->attached) { in comedi_read()
2623 dev_dbg(dev->class_dev, "no driver attached\n"); in comedi_read()
2710 up_read(&dev->attach_lock); in comedi_read()
2712 mutex_lock(&dev->mutex); in comedi_read()
2724 if (dev->attached && old_detach_count == dev->detach_count && in comedi_read()
2729 do_become_nonbusy(dev, s); in comedi_read()
2730 mutex_unlock(&dev->mutex); in comedi_read()
2734 up_read(&dev->attach_lock); in comedi_read()
2743 struct comedi_device *dev = comedi_dev_get_from_minor(minor); in comedi_open() local
2746 if (!dev) { in comedi_open()
2753 comedi_dev_put(dev); in comedi_open()
2757 cfp->dev = dev; in comedi_open()
2759 mutex_lock(&dev->mutex); in comedi_open()
2760 if (!dev->attached && !capable(CAP_SYS_ADMIN)) { in comedi_open()
2761 dev_dbg(dev->class_dev, "not attached and not CAP_SYS_ADMIN\n"); in comedi_open()
2765 if (dev->attached && dev->use_count == 0) { in comedi_open()
2766 if (!try_module_get(dev->driver->module)) { in comedi_open()
2770 if (dev->open) { in comedi_open()
2771 rc = dev->open(dev); in comedi_open()
2773 module_put(dev->driver->module); in comedi_open()
2779 dev->use_count++; in comedi_open()
2785 mutex_unlock(&dev->mutex); in comedi_open()
2787 comedi_dev_put(dev); in comedi_open()
2796 struct comedi_device *dev = cfp->dev; in comedi_fasync() local
2798 return fasync_helper(fd, file, on, &dev->async_queue); in comedi_fasync()
2804 struct comedi_device *dev = cfp->dev; in comedi_close() local
2808 mutex_lock(&dev->mutex); in comedi_close()
2810 if (dev->subdevices) { in comedi_close()
2811 for (i = 0; i < dev->n_subdevices; i++) { in comedi_close()
2812 s = &dev->subdevices[i]; in comedi_close()
2815 do_cancel(dev, s); in comedi_close()
2820 if (dev->attached && dev->use_count == 1) { in comedi_close()
2821 if (dev->close) in comedi_close()
2822 dev->close(dev); in comedi_close()
2823 module_put(dev->driver->module); in comedi_close()
2826 dev->use_count--; in comedi_close()
2828 mutex_unlock(&dev->mutex); in comedi_close()
2829 comedi_dev_put(dev); in comedi_close()
2902 struct comedi_device *dev = cfp->dev; in compat_chaninfo() local
2916 mutex_lock(&dev->mutex); in compat_chaninfo()
2917 err = do_chaninfo_ioctl(dev, &chaninfo); in compat_chaninfo()
2918 mutex_unlock(&dev->mutex); in compat_chaninfo()
2926 struct comedi_device *dev = cfp->dev; in compat_rangeinfo() local
2937 mutex_lock(&dev->mutex); in compat_rangeinfo()
2938 err = do_rangeinfo_ioctl(dev, &rangeinfo); in compat_rangeinfo()
2939 mutex_unlock(&dev->mutex); in compat_rangeinfo()
3004 struct comedi_device *dev = cfp->dev; in compat_cmd() local
3013 mutex_lock(&dev->mutex); in compat_cmd()
3014 rc = do_cmd_ioctl(dev, &cmd, &copy, file); in compat_cmd()
3015 mutex_unlock(&dev->mutex); in compat_cmd()
3029 struct comedi_device *dev = cfp->dev; in compat_cmdtest() local
3038 mutex_lock(&dev->mutex); in compat_cmdtest()
3039 rc = do_cmdtest_ioctl(dev, &cmd, &copy, file); in compat_cmdtest()
3040 mutex_unlock(&dev->mutex); in compat_cmdtest()
3071 struct comedi_device *dev = cfp->dev; in compat_insnlist() local
3095 mutex_lock(&dev->mutex); in compat_insnlist()
3096 rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file); in compat_insnlist()
3097 mutex_unlock(&dev->mutex); in compat_insnlist()
3106 struct comedi_device *dev = cfp->dev; in compat_insn() local
3114 mutex_lock(&dev->mutex); in compat_insn()
3115 rc = do_insn_ioctl(dev, &insn, file); in compat_insn()
3116 mutex_unlock(&dev->mutex); in compat_insn()
3201 void comedi_event(struct comedi_device *dev, struct comedi_subdevice *s) in comedi_event() argument
3235 kill_fasync(&dev->async_queue, SIGIO, si_code); in comedi_event()
3242 struct comedi_device *dev; in comedi_alloc_board_minor() local
3246 dev = kzalloc(sizeof(*dev), GFP_KERNEL); in comedi_alloc_board_minor()
3247 if (!dev) in comedi_alloc_board_minor()
3249 comedi_device_init(dev); in comedi_alloc_board_minor()
3250 comedi_set_hw_dev(dev, hardware_device); in comedi_alloc_board_minor()
3251 mutex_lock(&dev->mutex); in comedi_alloc_board_minor()
3256 comedi_board_minor_table[i] = dev; in comedi_alloc_board_minor()
3262 mutex_unlock(&dev->mutex); in comedi_alloc_board_minor()
3263 comedi_device_cleanup(dev); in comedi_alloc_board_minor()
3264 comedi_dev_put(dev); in comedi_alloc_board_minor()
3269 dev->minor = i; in comedi_alloc_board_minor()
3273 dev->class_dev = get_device(csdev); in comedi_alloc_board_minor()
3276 return dev; in comedi_alloc_board_minor()
3282 struct comedi_device *dev; in comedi_release_hardware_device() local
3287 dev = comedi_board_minor_table[minor]; in comedi_release_hardware_device()
3288 if (dev && dev->hw_dev == hardware_device) { in comedi_release_hardware_device()
3291 comedi_free_board_dev(dev); in comedi_release_hardware_device()
3300 struct comedi_device *dev = s->device; in comedi_alloc_subdevice_minor() local
3313 dev_err(dev->class_dev, in comedi_alloc_subdevice_minor()
3319 csdev = device_create(&comedi_class, dev->class_dev, in comedi_alloc_subdevice_minor()
3321 dev->minor, s->index); in comedi_alloc_subdevice_minor()
3351 struct comedi_device *dev; in comedi_cleanup_board_minors() local
3355 dev = comedi_clear_board_minor(i); in comedi_cleanup_board_minors()
3356 comedi_free_board_dev(dev); in comedi_cleanup_board_minors()
3398 struct comedi_device *dev; in comedi_init() local
3400 dev = comedi_alloc_board_minor(NULL); in comedi_init()
3401 if (IS_ERR(dev)) { in comedi_init()
3402 retval = PTR_ERR(dev); in comedi_init()
3406 lockdep_assert_held(&dev->mutex); in comedi_init()
3407 mutex_unlock(&dev->mutex); in comedi_init()