Lines Matching +full:dynamic +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0
14 * Made things a lot mode modular - easy to compile in just one or two
17 * Support for loadable modules. 8-Sep-95 Philip Blundell <[email protected]>
20 * Alan Cox <[email protected]> 21-Jan-96
22 * Dynamic minors and /proc/mice by Alessandro Rubini. 26-Mar-96
24 * Renamed to misc and miscdevice to be more accurate. Alan Cox 26-Mar-96
34 * Added devfs support. Richard Gooch <[email protected]> 10-Jan-1998
61 * Assigned numbers, used for dynamic minors
63 #define DYNAMIC_MINORS 128 /* like dynamic majors */
72 ret = ida_alloc_max(&misc_minors_ida, DYNAMIC_MINORS - 1, GFP_KERNEL); in misc_minor_alloc()
74 ret = DYNAMIC_MINORS - ret - 1; in misc_minor_alloc()
80 /* specific minor, check if it is in dynamic or misc dynamic range */ in misc_minor_alloc()
82 minor = DYNAMIC_MINORS - minor - 1; in misc_minor_alloc()
87 /* case of non-dynamic minors, no need to allocate id */ in misc_minor_alloc()
97 ida_free(&misc_minors_ida, DYNAMIC_MINORS - minor - 1); in misc_minor_free()
123 seq_printf(seq, "%3i %s\n", p->minor, p->name ? p->name : ""); in misc_seq_show()
140 int err = -ENODEV; in misc_open()
146 if (iter->minor != minor) in misc_open()
149 new_fops = fops_get(iter->fops); in misc_open()
155 request_module("char-major-%d-%d", MISC_MAJOR, minor); in misc_open()
159 if (iter->minor != minor) in misc_open()
162 new_fops = fops_get(iter->fops); in misc_open()
172 * file operations, including f_op->open below in misc_open()
174 file->private_data = c; in misc_open()
178 if (file->f_op->open) in misc_open()
179 err = file->f_op->open(inode, file); in misc_open()
185 static char *misc_devnode(const struct device *dev, umode_t *mode) in misc_devnode() argument
189 if (mode && c->mode) in misc_devnode()
190 *mode = c->mode; in misc_devnode()
191 if (c->nodename) in misc_devnode()
192 return kstrdup(c->nodename, GFP_KERNEL); in misc_devnode()
208 * misc_register - register a miscellaneous device
218 * syscall to the device sets file->private_data to point to the
229 bool is_dynamic = (misc->minor == MISC_DYNAMIC_MINOR); in misc_register()
231 INIT_LIST_HEAD(&misc->list); in misc_register()
236 int i = misc_minor_alloc(misc->minor); in misc_register()
239 err = -EBUSY; in misc_register()
242 misc->minor = i; in misc_register()
248 if (c->minor == misc->minor) { in misc_register()
249 err = -EBUSY; in misc_register()
254 i = misc_minor_alloc(misc->minor); in misc_register()
256 err = -EBUSY; in misc_register()
261 dev = MKDEV(MISC_MAJOR, misc->minor); in misc_register()
263 misc->this_device = in misc_register()
264 device_create_with_groups(&misc_class, misc->parent, dev, in misc_register()
265 misc, misc->groups, "%s", misc->name); in misc_register()
266 if (IS_ERR(misc->this_device)) { in misc_register()
267 misc_minor_free(misc->minor); in misc_register()
269 misc->minor = MISC_DYNAMIC_MINOR; in misc_register()
271 err = PTR_ERR(misc->this_device); in misc_register()
279 list_add(&misc->list, &misc_list); in misc_register()
287 * misc_deregister - unregister a miscellaneous device
296 if (WARN_ON(list_empty(&misc->list))) in misc_deregister()
300 list_del(&misc->list); in misc_deregister()
301 device_destroy(&misc_class, MKDEV(MISC_MAJOR, misc->minor)); in misc_deregister()
302 misc_minor_free(misc->minor); in misc_deregister()
317 err = -EIO; in misc_init()