atv_demod: optimize calls with other modules [1/1]
authornengwen.chen <nengwen.chen@amlogic.com>
Thu, 22 Aug 2019 08:01:54 +0000 (16:01 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Fri, 23 Aug 2019 04:10:55 +0000 (21:10 -0700)
PD#TV-9100

Problem:
1.optimize calls with other modules.

Solution:
1.optimize calls with other modules.
2.add ext file interacts with other modules.
3.add sync to prevent NULL pointer crashes.

Verify:
Verified by x301

Change-Id: Id1930400454b020616e0c669cae5f473f498b6de
Signed-off-by: nengwen.chen <nengwen.chen@amlogic.com>
drivers/amlogic/atv_demod/Makefile
drivers/amlogic/atv_demod/atv_demod_ext.c [new file with mode: 0644]
drivers/amlogic/atv_demod/atv_demod_ext.h [new file with mode: 0644]
drivers/amlogic/atv_demod/atv_demod_ops.c
drivers/amlogic/atv_demod/atv_demod_v4l2.c

index a2628ba..181980f 100644 (file)
@@ -10,6 +10,7 @@ atvdemod_fe-objs = atvdemod_func.o \
                atv_demod_access.o \
                atv_demod_debug.o \
                atv_demod_isr.o \
+               atv_demod_ext.o \
 
 ccflags-y += -I.
 ccflags-y += -Idrivers/media/dvb-core
\ No newline at end of file
diff --git a/drivers/amlogic/atv_demod/atv_demod_ext.c b/drivers/amlogic/atv_demod/atv_demod_ext.c
new file mode 100644 (file)
index 0000000..d50d5b9
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * drivers/amlogic/atv_demod/atv_demod_ext.c
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#include <linux/types.h>
+#include <linux/mutex.h>
+
+#include "atv_demod_ext.h"
+
+hook_func_t aml_fe_hook_atv_status;
+hook_func_t aml_fe_hook_hv_lock;
+hook_func_t aml_fe_hook_get_fmt;
+hook_func1_t aml_fe_hook_set_mode;
+
+static DEFINE_MUTEX(aml_fe_hook_mutex);
+
+void aml_fe_hook_cvd(hook_func_t atv_mode, hook_func_t cvd_hv_lock,
+       hook_func_t get_fmt, hook_func1_t set_mode)
+{
+       mutex_lock(&aml_fe_hook_mutex);
+
+       aml_fe_hook_atv_status = atv_mode;
+       aml_fe_hook_hv_lock = cvd_hv_lock;
+       aml_fe_hook_get_fmt = get_fmt;
+       aml_fe_hook_set_mode = set_mode;
+
+       mutex_unlock(&aml_fe_hook_mutex);
+
+       pr_info("%s: %s OK.\n", __func__, atv_mode != NULL ? "set" : "reset");
+}
+EXPORT_SYMBOL(aml_fe_hook_cvd);
+
+bool aml_fe_has_hook_up(void)
+{
+       bool state = false;
+
+       mutex_lock(&aml_fe_hook_mutex);
+
+       if (!aml_fe_hook_atv_status ||
+                       !aml_fe_hook_hv_lock ||
+                       !aml_fe_hook_get_fmt ||
+                       !aml_fe_hook_set_mode)
+               state = false;
+       else
+               state = true;
+
+       mutex_unlock(&aml_fe_hook_mutex);
+
+       return state;
+}
+
+bool aml_fe_hook_call_get_fmt(int *fmt)
+{
+       bool state = false;
+
+       mutex_lock(&aml_fe_hook_mutex);
+
+       if (aml_fe_hook_get_fmt && fmt) {
+               *fmt = aml_fe_hook_get_fmt();
+               state = true;
+       } else
+               state = false;
+
+       mutex_unlock(&aml_fe_hook_mutex);
+
+       return state;
+}
+
+bool aml_fe_hook_call_set_mode(bool mode)
+{
+       bool state = false;
+
+       mutex_lock(&aml_fe_hook_mutex);
+
+       if (aml_fe_hook_set_mode) {
+               aml_fe_hook_set_mode(mode);
+               state = true;
+       } else
+               state = false;
+
+       mutex_unlock(&aml_fe_hook_mutex);
+
+       return state;
+}
diff --git a/drivers/amlogic/atv_demod/atv_demod_ext.h b/drivers/amlogic/atv_demod/atv_demod_ext.h
new file mode 100644 (file)
index 0000000..9b441e2
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * drivers/amlogic/atv_demod/atv_demod_ext.h
+ *
+ * Copyright (C) 2017 Amlogic, Inc. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ */
+
+#ifndef __ATV_DEMOD_EXT_H__
+#define __ATV_DEMOD_EXT_H__
+
+/* This module is atv demod interacts with other modules */
+
+typedef int (*hook_func_t) (void);
+typedef int (*hook_func1_t)(bool);
+
+extern hook_func_t aml_fe_hook_atv_status;
+extern hook_func_t aml_fe_hook_hv_lock;
+extern hook_func_t aml_fe_hook_get_fmt;
+extern hook_func1_t aml_fe_hook_set_mode;
+
+extern bool aml_fe_has_hook_up(void);
+extern bool aml_fe_hook_call_get_fmt(int *fmt);
+extern bool aml_fe_hook_call_set_mode(bool mode);
+
+#endif /* __ATV_DEMOD_EXT_H__ */
index f1fef21..88affa4 100644 (file)
@@ -34,6 +34,7 @@
 #include "atv_demod_afc.h"
 #include "atv_demod_monitor.h"
 #include "atv_demod_isr.h"
+#include "atv_demod_ext.h"
 
 #define DEVICE_NAME "aml_atvdemod"
 
@@ -383,6 +384,8 @@ static int atv_demod_set_config(struct dvb_frontend *fe, void *priv_cfg)
 
                if (priv->monitor.disable)
                        priv->monitor.disable(&priv->monitor);
+
+               aml_fe_hook_call_set_mode(true);
                break;
 
        case AML_ATVDEMOD_UNSCAN_MODE:
@@ -397,6 +400,7 @@ static int atv_demod_set_config(struct dvb_frontend *fe, void *priv_cfg)
                if (priv->monitor.enable)
                        priv->monitor.enable(&priv->monitor);
 #endif
+               aml_fe_hook_call_set_mode(false);
                break;
        }
 
@@ -431,24 +435,6 @@ bool support_secam_l;
 
 bool slow_mode;
 
-typedef int (*hook_func_t) (void);
-typedef int (*hook_func1_t)(bool);
-hook_func_t aml_fe_hook_atv_status;
-hook_func_t aml_fe_hook_hv_lock;
-hook_func_t aml_fe_hook_get_fmt;
-hook_func1_t aml_fe_hook_set_mode;
-
-void aml_fe_hook_cvd(hook_func_t atv_mode, hook_func_t cvd_hv_lock,
-       hook_func_t get_fmt, hook_func1_t set_mode)
-{
-       aml_fe_hook_atv_status = atv_mode;
-       aml_fe_hook_hv_lock = cvd_hv_lock;
-       aml_fe_hook_get_fmt = get_fmt;
-       aml_fe_hook_set_mode = set_mode;
-
-       pr_info("%s: OK.\n", __func__);
-}
-EXPORT_SYMBOL(aml_fe_hook_cvd);
 
 static v4l2_std_id atvdemod_fmt_2_v4l2_std(int fmt)
 {
@@ -555,12 +541,12 @@ static void atvdemod_fe_try_analog_format(struct v4l2_frontend *v4l2_fe,
                                break;
                        }
 
-                       if (aml_fe_hook_get_fmt == NULL) {
+                       if (aml_fe_hook_call_get_fmt(&cvbs_std) == false) {
                                pr_err("%s: aml_fe_hook_get_fmt == NULL.\n",
                                                __func__);
                                break;
                        }
-                       cvbs_std = aml_fe_hook_get_fmt();
+
                        if (cvbs_std) {
                                varify_cnt++;
                                pr_dbg("get cvbs_std varify_cnt:%d, cnt:%d, cvbs_std:0x%x\n",
@@ -1144,7 +1130,7 @@ static enum v4l2_search atvdemod_fe_search(struct v4l2_frontend *v4l2_fe)
                        !fe->ops.analog_ops.has_signal ||
                        !fe->ops.analog_ops.set_params ||
                        !fe->ops.analog_ops.set_config ||
-                       !aml_fe_hook_set_mode || !aml_fe_hook_set_mode)) {
+                       (aml_fe_has_hook_up() == false))) {
                pr_err("[%s] error: NULL function or pointer.\n", __func__);
                return V4L2_SEARCH_INVALID;
        }
@@ -1157,11 +1143,8 @@ static enum v4l2_search atvdemod_fe_search(struct v4l2_frontend *v4l2_fe)
 
        if (p->afc_range == 0) {
                pr_err("[%s] afc_range == 0, skip the search\n", __func__);
-               aml_fe_hook_set_mode(0);
 
                return V4L2_SEARCH_INVALID;
-       } else {
-               aml_fe_hook_set_mode(1);
        }
 
        tuner_id = priv->atvdemod_param.tuner_id;
index 44a4cd6..a0ad662 100644 (file)
@@ -399,6 +399,10 @@ static int v4l2_set_frontend(struct v4l2_frontend *v4l2_fe,
 
        /* Request the search algorithm to search */
        if (params->flag & ANALOG_FLAG_ENABLE_AFC) {
+
+               if (v4l2_fe->params.afc_range == 0)
+                       return 0;
+
                fepriv->state = V4L2FE_STATE_RETUNE;
 
                fepriv->algo_status |= V4L2_SEARCH_AGAIN;