diff options
author | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2015-08-29 19:07:09 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2016-01-11 12:18:55 -0200 |
commit | a28971ad141bf41b8d6c24f8c4e8736be0c57677 (patch) | |
tree | 7d2632bfa3d2b42e429bbea6a52bb47a4aa1612c /drivers/media/media-device.c | |
parent | 7c4696a910d404eda3477e76a35c155a6b83ca3e (diff) | |
download | linux-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.c | 16 |
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; } |