Lines Matching +full:fixed +full:- +full:links
1 // SPDX-License-Identifier: LGPL-2.1-or-later
92 return -ENODEV; in dvb_device_open()
99 if (dvbdev && dvbdev->fops) { in dvb_device_open()
103 new_fops = fops_get(dvbdev->fops); in dvb_device_open()
106 file->private_data = dvb_device_get(dvbdev); in dvb_device_open()
108 if (file->f_op->open) in dvb_device_open()
109 err = file->f_op->open(inode, file); in dvb_device_open()
119 return -ENODEV; in dvb_device_open()
132 struct dvb_device *dvbdev = file->private_data; in dvb_generic_open()
135 return -ENODEV; in dvb_generic_open()
137 if (!dvbdev->users) in dvb_generic_open()
138 return -EBUSY; in dvb_generic_open()
140 if ((file->f_flags & O_ACCMODE) == O_RDONLY) { in dvb_generic_open()
141 if (!dvbdev->readers) in dvb_generic_open()
142 return -EBUSY; in dvb_generic_open()
143 dvbdev->readers--; in dvb_generic_open()
145 if (!dvbdev->writers) in dvb_generic_open()
146 return -EBUSY; in dvb_generic_open()
147 dvbdev->writers--; in dvb_generic_open()
150 dvbdev->users--; in dvb_generic_open()
157 struct dvb_device *dvbdev = file->private_data; in dvb_generic_release()
160 return -ENODEV; in dvb_generic_release()
162 if ((file->f_flags & O_ACCMODE) == O_RDONLY) in dvb_generic_release()
163 dvbdev->readers++; in dvb_generic_release()
165 dvbdev->writers++; in dvb_generic_release()
167 dvbdev->users++; in dvb_generic_release()
178 struct dvb_device *dvbdev = file->private_data; in dvb_generic_ioctl()
181 return -ENODEV; in dvb_generic_ioctl()
183 if (!dvbdev->kernel_ioctl) in dvb_generic_ioctl()
184 return -EINVAL; in dvb_generic_ioctl()
186 return dvb_usercopy(file, cmd, arg, dvbdev->kernel_ioctl); in dvb_generic_ioctl()
197 list_for_each_entry(dev, &adap->device_list, list_head) in dvbdev_get_free_id()
198 if (dev->type == type && dev->id == id) in dvbdev_get_free_id()
204 return -ENFILE; in dvbdev_get_free_id()
210 if (dvbdev->entity) { in dvb_media_device_free()
211 media_device_unregister_entity(dvbdev->entity); in dvb_media_device_free()
212 kfree(dvbdev->entity); in dvb_media_device_free()
213 kfree(dvbdev->pads); in dvb_media_device_free()
214 dvbdev->entity = NULL; in dvb_media_device_free()
215 dvbdev->pads = NULL; in dvb_media_device_free()
218 if (dvbdev->tsout_entity) { in dvb_media_device_free()
221 for (i = 0; i < dvbdev->tsout_num_entities; i++) { in dvb_media_device_free()
222 media_device_unregister_entity(&dvbdev->tsout_entity[i]); in dvb_media_device_free()
223 kfree(dvbdev->tsout_entity[i].name); in dvb_media_device_free()
225 kfree(dvbdev->tsout_entity); in dvb_media_device_free()
226 kfree(dvbdev->tsout_pads); in dvb_media_device_free()
227 dvbdev->tsout_entity = NULL; in dvb_media_device_free()
228 dvbdev->tsout_pads = NULL; in dvb_media_device_free()
230 dvbdev->tsout_num_entities = 0; in dvb_media_device_free()
233 if (dvbdev->intf_devnode) { in dvb_media_device_free()
234 media_devnode_remove(dvbdev->intf_devnode); in dvb_media_device_free()
235 dvbdev->intf_devnode = NULL; in dvb_media_device_free()
238 if (dvbdev->adapter->conn) { in dvb_media_device_free()
239 media_device_unregister_entity(dvbdev->adapter->conn); in dvb_media_device_free()
240 kfree(dvbdev->adapter->conn); in dvb_media_device_free()
241 dvbdev->adapter->conn = NULL; in dvb_media_device_free()
242 kfree(dvbdev->adapter->conn_pads); in dvb_media_device_free()
243 dvbdev->adapter->conn_pads = NULL; in dvb_media_device_free()
254 dvbdev->tsout_pads = kcalloc(npads, sizeof(*dvbdev->tsout_pads), in dvb_create_tsout_entity()
256 if (!dvbdev->tsout_pads) in dvb_create_tsout_entity()
257 return -ENOMEM; in dvb_create_tsout_entity()
259 dvbdev->tsout_entity = kcalloc(npads, sizeof(*dvbdev->tsout_entity), in dvb_create_tsout_entity()
261 if (!dvbdev->tsout_entity) in dvb_create_tsout_entity()
262 return -ENOMEM; in dvb_create_tsout_entity()
264 dvbdev->tsout_num_entities = npads; in dvb_create_tsout_entity()
267 struct media_pad *pads = &dvbdev->tsout_pads[i]; in dvb_create_tsout_entity()
268 struct media_entity *entity = &dvbdev->tsout_entity[i]; in dvb_create_tsout_entity()
271 entity->name = kasprintf(GFP_KERNEL, "%s #%d", name, i); in dvb_create_tsout_entity()
272 if (!entity->name) in dvb_create_tsout_entity()
273 return -ENOMEM; in dvb_create_tsout_entity()
275 entity->function = MEDIA_ENT_F_IO_DTV; in dvb_create_tsout_entity()
276 pads->flags = MEDIA_PAD_FL_SINK; in dvb_create_tsout_entity()
282 ret = media_device_register_entity(dvbdev->adapter->mdev, in dvb_create_tsout_entity()
290 #define DEMUX_TSOUT "demux-tsout"
291 #define DVR_TSOUT "dvr-tsout"
322 * fixed. As we don't have yet dynamic support for PADs at in dvb_create_media_entity()
331 dvbdev->entity = kzalloc(sizeof(*dvbdev->entity), GFP_KERNEL); in dvb_create_media_entity()
332 if (!dvbdev->entity) in dvb_create_media_entity()
333 return -ENOMEM; in dvb_create_media_entity()
335 dvbdev->entity->name = dvbdev->name; in dvb_create_media_entity()
338 dvbdev->pads = kcalloc(npads, sizeof(*dvbdev->pads), in dvb_create_media_entity()
340 if (!dvbdev->pads) { in dvb_create_media_entity()
341 kfree(dvbdev->entity); in dvb_create_media_entity()
342 dvbdev->entity = NULL; in dvb_create_media_entity()
343 return -ENOMEM; in dvb_create_media_entity()
349 dvbdev->entity->function = MEDIA_ENT_F_DTV_DEMOD; in dvb_create_media_entity()
350 dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK; in dvb_create_media_entity()
351 dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE; in dvb_create_media_entity()
354 dvbdev->entity->function = MEDIA_ENT_F_TS_DEMUX; in dvb_create_media_entity()
355 dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK; in dvb_create_media_entity()
357 dvbdev->pads[i].flags = MEDIA_PAD_FL_SOURCE; in dvb_create_media_entity()
360 dvbdev->entity->function = MEDIA_ENT_F_DTV_CA; in dvb_create_media_entity()
361 dvbdev->pads[0].flags = MEDIA_PAD_FL_SINK; in dvb_create_media_entity()
362 dvbdev->pads[1].flags = MEDIA_PAD_FL_SOURCE; in dvb_create_media_entity()
366 kfree(dvbdev->entity); in dvb_create_media_entity()
367 kfree(dvbdev->pads); in dvb_create_media_entity()
368 dvbdev->entity = NULL; in dvb_create_media_entity()
369 dvbdev->pads = NULL; in dvb_create_media_entity()
374 ret = media_entity_pads_init(dvbdev->entity, npads, dvbdev->pads); in dvb_create_media_entity()
378 ret = media_device_register_entity(dvbdev->adapter->mdev, in dvb_create_media_entity()
379 dvbdev->entity); in dvb_create_media_entity()
384 __func__, dvbdev->entity->name); in dvb_create_media_entity()
399 if (!dvbdev->adapter->mdev) in dvb_register_media_device()
426 dvbdev->intf_devnode = media_devnode_create(dvbdev->adapter->mdev, in dvb_register_media_device()
430 if (!dvbdev->intf_devnode) in dvb_register_media_device()
431 return -ENOMEM; in dvb_register_media_device()
436 * Other links should be created elsewhere, like: in dvb_register_media_device()
437 * DVB FE intf -> tuner in dvb_register_media_device()
438 * DVB demux intf -> dvr in dvb_register_media_device()
441 if (!dvbdev->entity) in dvb_register_media_device()
444 link = media_create_intf_link(dvbdev->entity, in dvb_register_media_device()
445 &dvbdev->intf_devnode->intf, in dvb_register_media_device()
449 return -ENOMEM; in dvb_register_media_device()
472 return -ENFILE; in dvb_register_device()
478 return -ENOMEM; in dvb_register_device()
487 if (node->fops->owner == adap->module && in dvb_register_device()
488 node->type == type && node->template == template) { in dvb_register_device()
489 dvbdevfops = node->fops; in dvb_register_device()
495 dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL); in dvb_register_device()
500 return -ENOMEM; in dvb_register_device()
509 return -ENOMEM; in dvb_register_device()
512 new_node->fops = dvbdevfops; in dvb_register_device()
513 new_node->type = type; in dvb_register_device()
514 new_node->template = template; in dvb_register_device()
515 list_add_tail(&new_node->list_head, &dvbdevfops_list); in dvb_register_device()
519 kref_init(&dvbdev->ref); in dvb_register_device()
520 dvbdev->type = type; in dvb_register_device()
521 dvbdev->id = id; in dvb_register_device()
522 dvbdev->adapter = adap; in dvb_register_device()
523 dvbdev->priv = priv; in dvb_register_device()
524 dvbdev->fops = dvbdevfops; in dvb_register_device()
525 init_waitqueue_head(&dvbdev->wait_queue); in dvb_register_device()
526 dvbdevfops->owner = adap->module; in dvb_register_device()
527 list_add_tail(&dvbdev->list_head, &adap->device_list); in dvb_register_device()
534 minor = nums2minor(adap->num, type, id); in dvb_register_device()
538 list_del(&new_node->list_head); in dvb_register_device()
542 list_del(&dvbdev->list_head); in dvb_register_device()
547 return -EINVAL; in dvb_register_device()
550 dvbdev->minor = minor; in dvb_register_device()
558 list_del(&new_node->list_head); in dvb_register_device()
563 list_del(&dvbdev->list_head); in dvb_register_device()
570 clsdev = device_create(dvb_class, adap->device, in dvb_register_device()
572 dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id); in dvb_register_device()
575 __func__, adap->num, dnames[type], id, PTR_ERR(clsdev)); in dvb_register_device()
577 list_del(&new_node->list_head); in dvb_register_device()
582 list_del(&dvbdev->list_head); in dvb_register_device()
590 adap->num, dnames[type], id, minor, minor); in dvb_register_device()
603 dvb_minors[dvbdev->minor] = NULL; in dvb_remove_device()
609 device_destroy(dvb_class, MKDEV(DVB_MAJOR, dvbdev->minor)); in dvb_remove_device()
611 list_del(&dvbdev->list_head); in dvb_remove_device()
624 kref_get(&dvbdev->ref); in dvb_device_get()
632 kref_put(&dvbdev->ref, dvb_free_device); in dvb_device_put()
648 struct media_device *mdev = adap->mdev; in dvb_create_io_intf_links()
653 if (entity->function == MEDIA_ENT_F_IO_DTV) { in dvb_create_io_intf_links()
654 if (strncmp(entity->name, name, strlen(name))) in dvb_create_io_intf_links()
660 return -ENOMEM; in dvb_create_io_intf_links()
669 struct media_device *mdev = adap->mdev; in dvb_create_media_graph()
684 switch (entity->function) { in dvb_create_media_graph()
704 * entities of the same type exists and a 1:n or n:1 links need to be in dvb_create_media_graph()
707 * to the caller driver to create such links. in dvb_create_media_graph()
717 return -ENOMEM; in dvb_create_media_graph()
718 adap->conn = conn; in dvb_create_media_graph()
720 adap->conn_pads = kzalloc(sizeof(*adap->conn_pads), GFP_KERNEL); in dvb_create_media_graph()
721 if (!adap->conn_pads) in dvb_create_media_graph()
722 return -ENOMEM; in dvb_create_media_graph()
724 conn->flags = MEDIA_ENT_FL_CONNECTOR; in dvb_create_media_graph()
725 conn->function = MEDIA_ENT_F_CONN_RF; in dvb_create_media_graph()
726 conn->name = connector_name; in dvb_create_media_graph()
727 adap->conn_pads->flags = MEDIA_PAD_FL_SOURCE; in dvb_create_media_graph()
729 ret = media_entity_pads_init(conn, 1, adap->conn_pads); in dvb_create_media_graph()
749 return -EINVAL; in dvb_create_media_graph()
767 return -EINVAL; in dvb_create_media_graph()
795 /* Create demux links for each ringbuffer/pad */ in dvb_create_media_graph()
798 if (entity->function == MEDIA_ENT_F_IO_DTV) { in dvb_create_media_graph()
799 if (!strncmp(entity->name, DVR_TSOUT, in dvb_create_media_graph()
807 if (!strncmp(entity->name, DEMUX_TSOUT, in dvb_create_media_graph()
819 /* Create interface links for FE->tuner, DVR->demux and CA->ca */ in dvb_create_media_graph()
821 if (intf->type == MEDIA_INTF_T_DVB_CA && ca) { in dvb_create_media_graph()
826 return -ENOMEM; in dvb_create_media_graph()
829 if (intf->type == MEDIA_INTF_T_DVB_FE && tuner) { in dvb_create_media_graph()
834 return -ENOMEM; in dvb_create_media_graph()
838 * Indirect link - let's not create yet, as we don't know how in dvb_create_media_graph()
839 * to handle indirect links, nor if this will in dvb_create_media_graph()
842 if (intf->type == MEDIA_INTF_T_DVB_DVR && demux) { in dvb_create_media_graph()
847 return -ENOMEM; in dvb_create_media_graph()
850 if (intf->type == MEDIA_INTF_T_DVB_DVR) { in dvb_create_media_graph()
855 if (intf->type == MEDIA_INTF_T_DVB_DEMUX) { in dvb_create_media_graph()
874 if (adap->num == num) in dvbdev_check_free_adapter_num()
890 return -ENFILE; in dvbdev_get_free_adapter_num()
911 num = -1; in dvb_register_adapter()
916 return -ENFILE; in dvb_register_adapter()
920 INIT_LIST_HEAD(&adap->device_list); in dvb_register_adapter()
924 adap->num = num; in dvb_register_adapter()
925 adap->name = name; in dvb_register_adapter()
926 adap->module = module; in dvb_register_adapter()
927 adap->device = device; in dvb_register_adapter()
928 adap->mfe_shared = 0; in dvb_register_adapter()
929 adap->mfe_dvbdev = NULL; in dvb_register_adapter()
930 mutex_init(&adap->mfe_lock); in dvb_register_adapter()
933 mutex_init(&adap->mdev_lock); in dvb_register_adapter()
936 list_add_tail(&adap->list_head, &dvb_adapter_list); in dvb_register_adapter()
947 list_del(&adap->list_head); in dvb_unregister_adapter()
958 * cards (ie. the budget dvb-cards don't need the v4l module...)
968 int err = -EINVAL; in dvb_usercopy()
988 return -ENOMEM; in dvb_usercopy()
992 err = -EFAULT; in dvb_usercopy()
1000 if (err == -ENOIOCTLCMD) in dvb_usercopy()
1001 err = -ENOTTY; in dvb_usercopy()
1011 err = -EFAULT; in dvb_usercopy()
1035 strscpy(board_info->type, name, I2C_NAME_SIZE); in dvb_module_probe()
1037 strscpy(board_info->type, module_name, I2C_NAME_SIZE); in dvb_module_probe()
1039 board_info->addr = addr; in dvb_module_probe()
1040 board_info->platform_data = platform_data; in dvb_module_probe()
1048 if (!try_module_get(client->dev.driver->owner)) { in dvb_module_probe()
1063 module_put(client->dev.driver->owner); in dvb_module_release()
1073 add_uevent_var(env, "DVB_ADAPTER_NUM=%d", dvbdev->adapter->num); in dvb_uevent()
1074 add_uevent_var(env, "DVB_DEVICE_TYPE=%s", dnames[dvbdev->type]); in dvb_uevent()
1075 add_uevent_var(env, "DVB_DEVICE_NUM=%d", dvbdev->id); in dvb_uevent()
1084 dvbdev->adapter->num, dnames[dvbdev->type], dvbdev->id); in dvb_devnode()
1094 pr_err("dvb-core: unable to get major %d\n", DVB_MAJOR); in init_dvbdev()
1101 pr_err("dvb-core: unable register character device\n"); in init_dvbdev()
1110 dvb_class->dev_uevent = dvb_uevent; in init_dvbdev()
1111 dvb_class->devnode = dvb_devnode; in init_dvbdev()
1129 list_del(&node->list_head); in exit_dvbdev()
1130 kfree(node->fops); in exit_dvbdev()