summaryrefslogtreecommitdiffstats
path: root/drivers/media/media-device.c
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-08-29 19:07:09 -0300
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2016-01-11 12:18:55 -0200
commita28971ad141bf41b8d6c24f8c4e8736be0c57677 (patch)
tree7d2632bfa3d2b42e429bbea6a52bb47a4aa1612c /drivers/media/media-device.c
parent7c4696a910d404eda3477e76a35c155a6b83ca3e (diff)
downloadlinux-a28971ad141bf41b8d6c24f8c4e8736be0c57677.tar.bz2
[media] remove interface links at media_entity_unregister()
Interface links connected to an entity should be removed before the entity itself can be removed. Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/media-device.c')
-rw-r--r--drivers/media/media-device.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c
index 96a476eeb16e..7c37aeab05bb 100644
--- a/drivers/media/media-device.c
+++ b/drivers/media/media-device.c
@@ -638,14 +638,30 @@ void media_device_unregister_entity(struct media_entity *entity)
return;
spin_lock(&mdev->lock);
+
+ /* Remove interface links with this entity on it */
+ list_for_each_entry_safe(link, tmp, &mdev->links, graph_obj.list) {
+ if (media_type(link->gobj1) == MEDIA_GRAPH_ENTITY
+ && link->entity == entity) {
+ media_gobj_remove(&link->graph_obj);
+ kfree(link);
+ }
+ }
+
+ /* Remove all data links that belong to this entity */
list_for_each_entry_safe(link, tmp, &entity->links, list) {
media_gobj_remove(&link->graph_obj);
list_del(&link->list);
kfree(link);
}
+
+ /* Remove all pads that belong to this entity */
for (i = 0; i < entity->num_pads; i++)
media_gobj_remove(&entity->pads[i].graph_obj);
+
+ /* Remove the entity */
media_gobj_remove(&entity->graph_obj);
+
spin_unlock(&mdev->lock);
entity->graph_obj.mdev = NULL;
}