1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2010 Nokia Corporation
7 * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
8 * Sakari Ailus <sakari.ailus@iki.fi>
11 #include <linux/compat.h>
12 #include <linux/export.h>
13 #include <linux/idr.h>
14 #include <linux/ioctl.h>
15 #include <linux/media.h>
16 #include <linux/slab.h>
17 #include <linux/types.h>
18 #include <linux/pci.h>
19 #include <linux/usb.h>
20 #include <linux/version.h>
22 #include <media/media-device.h>
23 #include <media/media-devnode.h>
24 #include <media/media-entity.h>
25 #include <media/media-request.h>
27 #ifdef CONFIG_MEDIA_CONTROLLER
30 * Legacy defines from linux/media.h. This is the only place we need this
31 * so we just define it here. The media.h header doesn't expose it to the
32 * kernel to prevent it from being used by drivers, but here (and only here!)
33 * we need it to handle the legacy behavior.
35 #define MEDIA_ENT_SUBTYPE_MASK 0x0000ffff
36 #define MEDIA_ENT_T_DEVNODE_UNKNOWN (MEDIA_ENT_F_OLD_BASE | \
37 MEDIA_ENT_SUBTYPE_MASK)
39 /* -----------------------------------------------------------------------------
43 static inline void __user
*media_get_uptr(__u64 arg
)
45 return (void __user
*)(uintptr_t)arg
;
48 static int media_device_open(struct file
*filp
)
53 static int media_device_close(struct file
*filp
)
58 static long media_device_get_info(struct media_device
*dev
, void *arg
)
60 struct media_device_info
*info
= arg
;
62 memset(info
, 0, sizeof(*info
));
64 if (dev
->driver_name
[0])
65 strscpy(info
->driver
, dev
->driver_name
, sizeof(info
->driver
));
67 strscpy(info
->driver
, dev
->dev
->driver
->name
,
68 sizeof(info
->driver
));
70 strscpy(info
->model
, dev
->model
, sizeof(info
->model
));
71 strscpy(info
->serial
, dev
->serial
, sizeof(info
->serial
));
72 strscpy(info
->bus_info
, dev
->bus_info
, sizeof(info
->bus_info
));
74 info
->media_version
= LINUX_VERSION_CODE
;
75 info
->driver_version
= info
->media_version
;
76 info
->hw_revision
= dev
->hw_revision
;
81 static struct media_entity
*find_entity(struct media_device
*mdev
, u32 id
)
83 struct media_entity
*entity
;
84 int next
= id
& MEDIA_ENT_ID_FLAG_NEXT
;
86 id
&= ~MEDIA_ENT_ID_FLAG_NEXT
;
88 media_device_for_each_entity(entity
, mdev
) {
89 if (((media_entity_id(entity
) == id
) && !next
) ||
90 ((media_entity_id(entity
) > id
) && next
)) {
98 static long media_device_enum_entities(struct media_device
*mdev
, void *arg
)
100 struct media_entity_desc
*entd
= arg
;
101 struct media_entity
*ent
;
103 ent
= find_entity(mdev
, entd
->id
);
107 memset(entd
, 0, sizeof(*entd
));
109 entd
->id
= media_entity_id(ent
);
111 strscpy(entd
->name
, ent
->name
, sizeof(entd
->name
));
112 entd
->type
= ent
->function
;
113 entd
->revision
= 0; /* Unused */
114 entd
->flags
= ent
->flags
;
115 entd
->group_id
= 0; /* Unused */
116 entd
->pads
= ent
->num_pads
;
117 entd
->links
= ent
->num_links
- ent
->num_backlinks
;
120 * Workaround for a bug at media-ctl <= v1.10 that makes it to
121 * do the wrong thing if the entity function doesn't belong to
122 * either MEDIA_ENT_F_OLD_BASE or MEDIA_ENT_F_OLD_SUBDEV_BASE
125 * Non-subdevices are expected to be at the MEDIA_ENT_F_OLD_BASE,
126 * or, otherwise, will be silently ignored by media-ctl when
127 * printing the graphviz diagram. So, map them into the devnode
130 if (ent
->function
< MEDIA_ENT_F_OLD_BASE
||
131 ent
->function
> MEDIA_ENT_F_TUNER
) {
132 if (is_media_entity_v4l2_subdev(ent
))
133 entd
->type
= MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN
;
134 else if (ent
->function
!= MEDIA_ENT_F_IO_V4L
)
135 entd
->type
= MEDIA_ENT_T_DEVNODE_UNKNOWN
;
138 memcpy(&entd
->raw
, &ent
->info
, sizeof(ent
->info
));
143 static void media_device_kpad_to_upad(const struct media_pad
*kpad
,
144 struct media_pad_desc
*upad
)
146 upad
->entity
= media_entity_id(kpad
->entity
);
147 upad
->index
= kpad
->index
;
148 upad
->flags
= kpad
->flags
;
151 static long media_device_enum_links(struct media_device
*mdev
, void *arg
)
153 struct media_links_enum
*links
= arg
;
154 struct media_entity
*entity
;
156 entity
= find_entity(mdev
, links
->entity
);
163 for (p
= 0; p
< entity
->num_pads
; p
++) {
164 struct media_pad_desc pad
;
166 memset(&pad
, 0, sizeof(pad
));
167 media_device_kpad_to_upad(&entity
->pads
[p
], &pad
);
168 if (copy_to_user(&links
->pads
[p
], &pad
, sizeof(pad
)))
174 struct media_link
*link
;
175 struct media_link_desc __user
*ulink_desc
= links
->links
;
177 list_for_each_entry(link
, &entity
->links
, list
) {
178 struct media_link_desc klink_desc
;
180 /* Ignore backlinks. */
181 if (link
->source
->entity
!= entity
)
183 memset(&klink_desc
, 0, sizeof(klink_desc
));
184 media_device_kpad_to_upad(link
->source
,
186 media_device_kpad_to_upad(link
->sink
,
188 klink_desc
.flags
= link
->flags
;
189 if (copy_to_user(ulink_desc
, &klink_desc
,
190 sizeof(*ulink_desc
)))
195 memset(links
->reserved
, 0, sizeof(links
->reserved
));
200 static long media_device_setup_link(struct media_device
*mdev
, void *arg
)
202 struct media_link_desc
*linkd
= arg
;
203 struct media_link
*link
= NULL
;
204 struct media_entity
*source
;
205 struct media_entity
*sink
;
207 /* Find the source and sink entities and link.
209 source
= find_entity(mdev
, linkd
->source
.entity
);
210 sink
= find_entity(mdev
, linkd
->sink
.entity
);
212 if (source
== NULL
|| sink
== NULL
)
215 if (linkd
->source
.index
>= source
->num_pads
||
216 linkd
->sink
.index
>= sink
->num_pads
)
219 link
= media_entity_find_link(&source
->pads
[linkd
->source
.index
],
220 &sink
->pads
[linkd
->sink
.index
]);
224 memset(linkd
->reserved
, 0, sizeof(linkd
->reserved
));
226 /* Setup the link on both entities. */
227 return __media_entity_setup_link(link
, linkd
->flags
);
230 static long media_device_get_topology(struct media_device
*mdev
, void *arg
)
232 struct media_v2_topology
*topo
= arg
;
233 struct media_entity
*entity
;
234 struct media_interface
*intf
;
235 struct media_pad
*pad
;
236 struct media_link
*link
;
237 struct media_v2_entity kentity
, __user
*uentity
;
238 struct media_v2_interface kintf
, __user
*uintf
;
239 struct media_v2_pad kpad
, __user
*upad
;
240 struct media_v2_link klink
, __user
*ulink
;
244 topo
->topology_version
= mdev
->topology_version
;
246 /* Get entities and number of entities */
248 uentity
= media_get_uptr(topo
->ptr_entities
);
249 media_device_for_each_entity(entity
, mdev
) {
254 if (i
> topo
->num_entities
) {
259 /* Copy fields to userspace struct if not error */
260 memset(&kentity
, 0, sizeof(kentity
));
261 kentity
.id
= entity
->graph_obj
.id
;
262 kentity
.function
= entity
->function
;
263 kentity
.flags
= entity
->flags
;
264 strscpy(kentity
.name
, entity
->name
,
265 sizeof(kentity
.name
));
267 if (copy_to_user(uentity
, &kentity
, sizeof(kentity
)))
271 topo
->num_entities
= i
;
274 /* Get interfaces and number of interfaces */
276 uintf
= media_get_uptr(topo
->ptr_interfaces
);
277 media_device_for_each_intf(intf
, mdev
) {
282 if (i
> topo
->num_interfaces
) {
287 memset(&kintf
, 0, sizeof(kintf
));
289 /* Copy intf fields to userspace struct */
290 kintf
.id
= intf
->graph_obj
.id
;
291 kintf
.intf_type
= intf
->type
;
292 kintf
.flags
= intf
->flags
;
294 if (media_type(&intf
->graph_obj
) == MEDIA_GRAPH_INTF_DEVNODE
) {
295 struct media_intf_devnode
*devnode
;
297 devnode
= intf_to_devnode(intf
);
299 kintf
.devnode
.major
= devnode
->major
;
300 kintf
.devnode
.minor
= devnode
->minor
;
303 if (copy_to_user(uintf
, &kintf
, sizeof(kintf
)))
307 topo
->num_interfaces
= i
;
310 /* Get pads and number of pads */
312 upad
= media_get_uptr(topo
->ptr_pads
);
313 media_device_for_each_pad(pad
, mdev
) {
318 if (i
> topo
->num_pads
) {
323 memset(&kpad
, 0, sizeof(kpad
));
325 /* Copy pad fields to userspace struct */
326 kpad
.id
= pad
->graph_obj
.id
;
327 kpad
.entity_id
= pad
->entity
->graph_obj
.id
;
328 kpad
.flags
= pad
->flags
;
329 kpad
.index
= pad
->index
;
331 if (copy_to_user(upad
, &kpad
, sizeof(kpad
)))
338 /* Get links and number of links */
340 ulink
= media_get_uptr(topo
->ptr_links
);
341 media_device_for_each_link(link
, mdev
) {
342 if (link
->is_backlink
)
350 if (i
> topo
->num_links
) {
355 memset(&klink
, 0, sizeof(klink
));
357 /* Copy link fields to userspace struct */
358 klink
.id
= link
->graph_obj
.id
;
359 klink
.source_id
= link
->gobj0
->id
;
360 klink
.sink_id
= link
->gobj1
->id
;
361 klink
.flags
= link
->flags
;
363 if (copy_to_user(ulink
, &klink
, sizeof(klink
)))
373 static long media_device_request_alloc(struct media_device
*mdev
, void *arg
)
377 if (!mdev
->ops
|| !mdev
->ops
->req_validate
|| !mdev
->ops
->req_queue
)
380 return media_request_alloc(mdev
, alloc_fd
);
383 static long copy_arg_from_user(void *karg
, void __user
*uarg
, unsigned int cmd
)
385 if ((_IOC_DIR(cmd
) & _IOC_WRITE
) &&
386 copy_from_user(karg
, uarg
, _IOC_SIZE(cmd
)))
392 static long copy_arg_to_user(void __user
*uarg
, void *karg
, unsigned int cmd
)
394 if ((_IOC_DIR(cmd
) & _IOC_READ
) &&
395 copy_to_user(uarg
, karg
, _IOC_SIZE(cmd
)))
401 /* Do acquire the graph mutex */
402 #define MEDIA_IOC_FL_GRAPH_MUTEX BIT(0)
404 #define MEDIA_IOC_ARG(__cmd, func, fl, from_user, to_user) \
405 [_IOC_NR(MEDIA_IOC_##__cmd)] = { \
406 .cmd = MEDIA_IOC_##__cmd, \
409 .arg_from_user = from_user, \
410 .arg_to_user = to_user, \
413 #define MEDIA_IOC(__cmd, func, fl) \
414 MEDIA_IOC_ARG(__cmd, func, fl, copy_arg_from_user, copy_arg_to_user)
416 /* the table is indexed by _IOC_NR(cmd) */
417 struct media_ioctl_info
{
419 unsigned short flags
;
420 long (*fn
)(struct media_device
*dev
, void *arg
);
421 long (*arg_from_user
)(void *karg
, void __user
*uarg
, unsigned int cmd
);
422 long (*arg_to_user
)(void __user
*uarg
, void *karg
, unsigned int cmd
);
425 static const struct media_ioctl_info ioctl_info
[] = {
426 MEDIA_IOC(DEVICE_INFO
, media_device_get_info
, MEDIA_IOC_FL_GRAPH_MUTEX
),
427 MEDIA_IOC(ENUM_ENTITIES
, media_device_enum_entities
, MEDIA_IOC_FL_GRAPH_MUTEX
),
428 MEDIA_IOC(ENUM_LINKS
, media_device_enum_links
, MEDIA_IOC_FL_GRAPH_MUTEX
),
429 MEDIA_IOC(SETUP_LINK
, media_device_setup_link
, MEDIA_IOC_FL_GRAPH_MUTEX
),
430 MEDIA_IOC(G_TOPOLOGY
, media_device_get_topology
, MEDIA_IOC_FL_GRAPH_MUTEX
),
431 MEDIA_IOC(REQUEST_ALLOC
, media_device_request_alloc
, 0),
434 static long media_device_ioctl(struct file
*filp
, unsigned int cmd
,
437 struct media_devnode
*devnode
= media_devnode_data(filp
);
438 struct media_device
*dev
= devnode
->media_dev
;
439 const struct media_ioctl_info
*info
;
440 void __user
*arg
= (void __user
*)__arg
;
441 char __karg
[256], *karg
= __karg
;
444 if (_IOC_NR(cmd
) >= ARRAY_SIZE(ioctl_info
)
445 || ioctl_info
[_IOC_NR(cmd
)].cmd
!= cmd
)
448 info
= &ioctl_info
[_IOC_NR(cmd
)];
450 if (_IOC_SIZE(info
->cmd
) > sizeof(__karg
)) {
451 karg
= kmalloc(_IOC_SIZE(info
->cmd
), GFP_KERNEL
);
456 if (info
->arg_from_user
) {
457 ret
= info
->arg_from_user(karg
, arg
, cmd
);
462 if (info
->flags
& MEDIA_IOC_FL_GRAPH_MUTEX
)
463 mutex_lock(&dev
->graph_mutex
);
465 ret
= info
->fn(dev
, karg
);
467 if (info
->flags
& MEDIA_IOC_FL_GRAPH_MUTEX
)
468 mutex_unlock(&dev
->graph_mutex
);
470 if (!ret
&& info
->arg_to_user
)
471 ret
= info
->arg_to_user(arg
, karg
, cmd
);
482 struct media_links_enum32
{
484 compat_uptr_t pads
; /* struct media_pad_desc * */
485 compat_uptr_t links
; /* struct media_link_desc * */
489 static long media_device_enum_links32(struct media_device
*mdev
,
490 struct media_links_enum32 __user
*ulinks
)
492 struct media_links_enum links
;
493 compat_uptr_t pads_ptr
, links_ptr
;
496 memset(&links
, 0, sizeof(links
));
498 if (get_user(links
.entity
, &ulinks
->entity
)
499 || get_user(pads_ptr
, &ulinks
->pads
)
500 || get_user(links_ptr
, &ulinks
->links
))
503 links
.pads
= compat_ptr(pads_ptr
);
504 links
.links
= compat_ptr(links_ptr
);
506 ret
= media_device_enum_links(mdev
, &links
);
510 if (copy_to_user(ulinks
->reserved
, links
.reserved
,
511 sizeof(ulinks
->reserved
)))
516 #define MEDIA_IOC_ENUM_LINKS32 _IOWR('|', 0x02, struct media_links_enum32)
518 static long media_device_compat_ioctl(struct file
*filp
, unsigned int cmd
,
521 struct media_devnode
*devnode
= media_devnode_data(filp
);
522 struct media_device
*dev
= devnode
->media_dev
;
526 case MEDIA_IOC_ENUM_LINKS32
:
527 mutex_lock(&dev
->graph_mutex
);
528 ret
= media_device_enum_links32(dev
,
529 (struct media_links_enum32 __user
*)arg
);
530 mutex_unlock(&dev
->graph_mutex
);
534 return media_device_ioctl(filp
, cmd
, arg
);
539 #endif /* CONFIG_COMPAT */
541 static const struct media_file_operations media_device_fops
= {
542 .owner
= THIS_MODULE
,
543 .open
= media_device_open
,
544 .ioctl
= media_device_ioctl
,
546 .compat_ioctl
= media_device_compat_ioctl
,
547 #endif /* CONFIG_COMPAT */
548 .release
= media_device_close
,
551 /* -----------------------------------------------------------------------------
555 static ssize_t
model_show(struct device
*cd
,
556 struct device_attribute
*attr
, char *buf
)
558 struct media_devnode
*devnode
= to_media_devnode(cd
);
559 struct media_device
*mdev
= devnode
->media_dev
;
561 return sprintf(buf
, "%.*s\n", (int)sizeof(mdev
->model
), mdev
->model
);
564 static DEVICE_ATTR_RO(model
);
566 /* -----------------------------------------------------------------------------
567 * Registration/unregistration
570 static void media_device_release(struct media_devnode
*devnode
)
572 dev_dbg(devnode
->parent
, "Media device released\n");
575 static void __media_device_unregister_entity(struct media_entity
*entity
)
577 struct media_device
*mdev
= entity
->graph_obj
.mdev
;
578 struct media_link
*link
, *tmp
;
579 struct media_interface
*intf
;
580 struct media_pad
*iter
;
582 ida_free(&mdev
->entity_internal_idx
, entity
->internal_idx
);
584 /* Remove all interface links pointing to this entity */
585 list_for_each_entry(intf
, &mdev
->interfaces
, graph_obj
.list
) {
586 list_for_each_entry_safe(link
, tmp
, &intf
->links
, list
) {
587 if (link
->entity
== entity
)
588 __media_remove_intf_link(link
);
592 /* Remove all data links that belong to this entity */
593 __media_entity_remove_links(entity
);
595 /* Remove all pads that belong to this entity */
596 media_entity_for_each_pad(entity
, iter
)
597 media_gobj_destroy(&iter
->graph_obj
);
599 /* Remove the entity */
600 media_gobj_destroy(&entity
->graph_obj
);
602 /* invoke entity_notify callbacks to handle entity removal?? */
605 int __must_check
media_device_register_entity(struct media_device
*mdev
,
606 struct media_entity
*entity
)
608 struct media_entity_notify
*notify
, *next
;
609 struct media_pad
*iter
;
612 if (entity
->function
== MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN
||
613 entity
->function
== MEDIA_ENT_F_UNKNOWN
)
615 "Entity type for entity %s was not initialized!\n",
618 /* Warn if we apparently re-register an entity */
619 WARN_ON(entity
->graph_obj
.mdev
!= NULL
);
620 entity
->graph_obj
.mdev
= mdev
;
621 INIT_LIST_HEAD(&entity
->links
);
622 entity
->num_links
= 0;
623 entity
->num_backlinks
= 0;
625 ret
= ida_alloc_min(&mdev
->entity_internal_idx
, 1, GFP_KERNEL
);
628 entity
->internal_idx
= ret
;
630 mutex_lock(&mdev
->graph_mutex
);
631 mdev
->entity_internal_idx_max
=
632 max(mdev
->entity_internal_idx_max
, entity
->internal_idx
);
634 /* Initialize media_gobj embedded at the entity */
635 media_gobj_create(mdev
, MEDIA_GRAPH_ENTITY
, &entity
->graph_obj
);
637 /* Initialize objects at the pads */
638 media_entity_for_each_pad(entity
, iter
)
639 media_gobj_create(mdev
, MEDIA_GRAPH_PAD
, &iter
->graph_obj
);
641 /* invoke entity_notify callbacks */
642 list_for_each_entry_safe(notify
, next
, &mdev
->entity_notify
, list
)
643 notify
->notify(entity
, notify
->notify_data
);
645 if (mdev
->entity_internal_idx_max
646 >= mdev
->pm_count_walk
.ent_enum
.idx_max
) {
647 struct media_graph
new = { .top
= 0 };
650 * Initialise the new graph walk before cleaning up
651 * the old one in order not to spoil the graph walk
652 * object of the media device if graph walk init fails.
654 ret
= media_graph_walk_init(&new, mdev
);
656 __media_device_unregister_entity(entity
);
657 mutex_unlock(&mdev
->graph_mutex
);
660 media_graph_walk_cleanup(&mdev
->pm_count_walk
);
661 mdev
->pm_count_walk
= new;
663 mutex_unlock(&mdev
->graph_mutex
);
667 EXPORT_SYMBOL_GPL(media_device_register_entity
);
669 void media_device_unregister_entity(struct media_entity
*entity
)
671 struct media_device
*mdev
= entity
->graph_obj
.mdev
;
676 mutex_lock(&mdev
->graph_mutex
);
677 __media_device_unregister_entity(entity
);
678 mutex_unlock(&mdev
->graph_mutex
);
680 EXPORT_SYMBOL_GPL(media_device_unregister_entity
);
682 void media_device_init(struct media_device
*mdev
)
684 INIT_LIST_HEAD(&mdev
->entities
);
685 INIT_LIST_HEAD(&mdev
->interfaces
);
686 INIT_LIST_HEAD(&mdev
->pads
);
687 INIT_LIST_HEAD(&mdev
->links
);
688 INIT_LIST_HEAD(&mdev
->entity_notify
);
690 mutex_init(&mdev
->req_queue_mutex
);
691 mutex_init(&mdev
->graph_mutex
);
692 ida_init(&mdev
->entity_internal_idx
);
694 atomic_set(&mdev
->request_id
, 0);
696 if (!*mdev
->bus_info
)
697 media_set_bus_info(mdev
->bus_info
, sizeof(mdev
->bus_info
),
700 dev_dbg(mdev
->dev
, "Media device initialized\n");
702 EXPORT_SYMBOL_GPL(media_device_init
);
704 void media_device_cleanup(struct media_device
*mdev
)
706 ida_destroy(&mdev
->entity_internal_idx
);
707 mdev
->entity_internal_idx_max
= 0;
708 media_graph_walk_cleanup(&mdev
->pm_count_walk
);
709 mutex_destroy(&mdev
->graph_mutex
);
710 mutex_destroy(&mdev
->req_queue_mutex
);
712 EXPORT_SYMBOL_GPL(media_device_cleanup
);
714 int __must_check
__media_device_register(struct media_device
*mdev
,
715 struct module
*owner
)
717 struct media_devnode
*devnode
;
720 devnode
= kzalloc(sizeof(*devnode
), GFP_KERNEL
);
724 /* Register the device node. */
725 mdev
->devnode
= devnode
;
726 devnode
->fops
= &media_device_fops
;
727 devnode
->parent
= mdev
->dev
;
728 devnode
->release
= media_device_release
;
730 /* Set version 0 to indicate user-space that the graph is static */
731 mdev
->topology_version
= 0;
733 ret
= media_devnode_register(mdev
, devnode
, owner
);
735 /* devnode free is handled in media_devnode_*() */
736 mdev
->devnode
= NULL
;
740 ret
= device_create_file(&devnode
->dev
, &dev_attr_model
);
742 /* devnode free is handled in media_devnode_*() */
743 mdev
->devnode
= NULL
;
744 media_devnode_unregister_prepare(devnode
);
745 media_devnode_unregister(devnode
);
749 dev_dbg(mdev
->dev
, "Media device registered\n");
753 EXPORT_SYMBOL_GPL(__media_device_register
);
755 void media_device_register_entity_notify(struct media_device
*mdev
,
756 struct media_entity_notify
*nptr
)
758 mutex_lock(&mdev
->graph_mutex
);
759 list_add_tail(&nptr
->list
, &mdev
->entity_notify
);
760 mutex_unlock(&mdev
->graph_mutex
);
762 EXPORT_SYMBOL_GPL(media_device_register_entity_notify
);
765 * Note: Should be called with mdev->lock held.
767 static void __media_device_unregister_entity_notify(struct media_device
*mdev
,
768 struct media_entity_notify
*nptr
)
770 list_del(&nptr
->list
);
773 void media_device_unregister_entity_notify(struct media_device
*mdev
,
774 struct media_entity_notify
*nptr
)
776 mutex_lock(&mdev
->graph_mutex
);
777 __media_device_unregister_entity_notify(mdev
, nptr
);
778 mutex_unlock(&mdev
->graph_mutex
);
780 EXPORT_SYMBOL_GPL(media_device_unregister_entity_notify
);
782 void media_device_unregister(struct media_device
*mdev
)
784 struct media_entity
*entity
;
785 struct media_entity
*next
;
786 struct media_interface
*intf
, *tmp_intf
;
787 struct media_entity_notify
*notify
, *nextp
;
792 mutex_lock(&mdev
->graph_mutex
);
794 /* Check if mdev was ever registered at all */
795 if (!media_devnode_is_registered(mdev
->devnode
)) {
796 mutex_unlock(&mdev
->graph_mutex
);
800 /* Clear the devnode register bit to avoid races with media dev open */
801 media_devnode_unregister_prepare(mdev
->devnode
);
803 /* Remove all entities from the media device */
804 list_for_each_entry_safe(entity
, next
, &mdev
->entities
, graph_obj
.list
)
805 __media_device_unregister_entity(entity
);
807 /* Remove all entity_notify callbacks from the media device */
808 list_for_each_entry_safe(notify
, nextp
, &mdev
->entity_notify
, list
)
809 __media_device_unregister_entity_notify(mdev
, notify
);
811 /* Remove all interfaces from the media device */
812 list_for_each_entry_safe(intf
, tmp_intf
, &mdev
->interfaces
,
815 * Unlink the interface, but don't free it here; the
816 * module which created it is responsible for freeing
819 __media_remove_intf_links(intf
);
820 media_gobj_destroy(&intf
->graph_obj
);
823 mutex_unlock(&mdev
->graph_mutex
);
825 dev_dbg(mdev
->dev
, "Media device unregistered\n");
827 device_remove_file(&mdev
->devnode
->dev
, &dev_attr_model
);
828 media_devnode_unregister(mdev
->devnode
);
829 /* devnode free is handled in media_devnode_*() */
830 mdev
->devnode
= NULL
;
832 EXPORT_SYMBOL_GPL(media_device_unregister
);
834 #if IS_ENABLED(CONFIG_PCI)
835 void media_device_pci_init(struct media_device
*mdev
,
836 struct pci_dev
*pci_dev
,
839 mdev
->dev
= &pci_dev
->dev
;
842 strscpy(mdev
->model
, name
, sizeof(mdev
->model
));
844 strscpy(mdev
->model
, pci_name(pci_dev
), sizeof(mdev
->model
));
846 sprintf(mdev
->bus_info
, "PCI:%s", pci_name(pci_dev
));
848 mdev
->hw_revision
= (pci_dev
->subsystem_vendor
<< 16)
849 | pci_dev
->subsystem_device
;
851 media_device_init(mdev
);
853 EXPORT_SYMBOL_GPL(media_device_pci_init
);
856 #if IS_ENABLED(CONFIG_USB)
857 void __media_device_usb_init(struct media_device
*mdev
,
858 struct usb_device
*udev
,
859 const char *board_name
,
860 const char *driver_name
)
862 mdev
->dev
= &udev
->dev
;
865 strscpy(mdev
->driver_name
, driver_name
,
866 sizeof(mdev
->driver_name
));
869 strscpy(mdev
->model
, board_name
, sizeof(mdev
->model
));
870 else if (udev
->product
)
871 strscpy(mdev
->model
, udev
->product
, sizeof(mdev
->model
));
873 strscpy(mdev
->model
, "unknown model", sizeof(mdev
->model
));
875 strscpy(mdev
->serial
, udev
->serial
, sizeof(mdev
->serial
));
876 usb_make_path(udev
, mdev
->bus_info
, sizeof(mdev
->bus_info
));
877 mdev
->hw_revision
= le16_to_cpu(udev
->descriptor
.bcdDevice
);
879 media_device_init(mdev
);
881 EXPORT_SYMBOL_GPL(__media_device_usb_init
);
885 #endif /* CONFIG_MEDIA_CONTROLLER */