summaryrefslogtreecommitdiff
authorapollo.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)
commit725d8c5c643a267cdf1fa17b2e3556d0ebd89afe (patch)
treee80742eeaeb78fa1a2553da7ec0f4e5ae7413c2a
parentbd8047d087bbad59be84b65bc10a6649514d0363 (diff)
downloadmedia_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>
Diffstat
-rw-r--r--drivers/frame_provider/decoder/utils/vdec.c30
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);