author | apollo.ling <apollo.ling@amlogic.com> | 2020-03-25 08:09:54 (GMT) |
---|---|---|
committer | Shen Liu <shen.liu@amlogic.com> | 2020-09-10 06:35:36 (GMT) |
commit | 725d8c5c643a267cdf1fa17b2e3556d0ebd89afe (patch) | |
tree | e80742eeaeb78fa1a2553da7ec0f4e5ae7413c2a | |
parent | bd8047d087bbad59be84b65bc10a6649514d0363 (diff) | |
download | media_modules-725d8c5c643a267cdf1fa17b2e3556d0ebd89afe.zip media_modules-725d8c5c643a267cdf1fa17b2e3556d0ebd89afe.tar.gz media_modules-725d8c5c643a267cdf1fa17b2e3556d0ebd89afe.tar.bz2 |
vdec: remove vdec from connected_vdec_list before release it [1/1]
PD#TV-16434
Problem:
When timeout happens both in vdec_disconnect and platform_device_unregister,
we release the vdec, but the vdec still in connected_vdec_list
Solution:
remove vdec from connected_vdec_list before release it
Verify:
X301
Change-Id: I6d732213a4929b2ba718d92bfb64a3e3d154551b
Signed-off-by: apollo.ling <apollo.ling@amlogic.com>
-rw-r--r-- | drivers/frame_provider/decoder/utils/vdec.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/frame_provider/decoder/utils/vdec.c b/drivers/frame_provider/decoder/utils/vdec.c index 107e1a4..d8912f8 100644 --- a/drivers/frame_provider/decoder/utils/vdec.c +++ b/drivers/frame_provider/decoder/utils/vdec.c @@ -2042,6 +2042,34 @@ error: } EXPORT_SYMBOL(vdec_init); +/* + *Remove the vdec after timeout happens both in vdec_disconnect + *and platform_device_unregister. Then after, we can release the vdec. + */ +static void vdec_connect_list_force_clear(struct vdec_core_s *core, struct vdec_s *v_ref) +{ + struct vdec_s *vdec, *tmp; + unsigned long flags; + + flags = vdec_core_lock(core); + + list_for_each_entry_safe(vdec, tmp, + &core->connected_vdec_list, list) { + if ((vdec->status == VDEC_STATUS_DISCONNECTED) && + (vdec == v_ref)) { + pr_err("%s, vdec = %p, active vdec = %p\n", + __func__, vdec, core->active_vdec); + if (core->active_vdec == v_ref) + core->active_vdec = NULL; + if (core->last_vdec == v_ref) + core->last_vdec = NULL; + list_del(&vdec->list); + } + } + + vdec_core_unlock(core, flags); +} + /* vdec_create/init/release/destroy are applied to both dual running decoders */ void vdec_release(struct vdec_s *vdec) @@ -2091,6 +2119,8 @@ void vdec_release(struct vdec_s *vdec) vdec_disable_DMC(vdec); platform_device_unregister(vdec->dev); + /*Check if the vdec still in connected list, if yes, delete it*/ + vdec_connect_list_force_clear(vdec_core, vdec); pr_debug("vdec_release instance %p, total %d\n", vdec, atomic_read(&vdec_core->vdec_nr)); vdec_destroy(vdec); |