19af5c5 dtv_demod: add AGC control for board t309 [1/1]
authorHui Zhang <hui.zhang@amlogic.com>
Fri, 1 Mar 2019 01:02:26 +0000 (09:02 +0800)
committerNick Xie <nick@khadas.com>
Mon, 5 Aug 2019 06:14:06 +0000 (14:14 +0800)
a9eb626 dtv_demod: Prevent NULL pointer crash caused by tuner attach failure [1/1]
d27b145 dtv_demod: TL1 dtmb suspend hangup issue [1/1]
27c05dd dtv_demod: tl1,dvbc, new method for fast channel searching [1/1]
fa80091 dtv_demod: txlx atsc-t loses lock when play video for a long time [1/1]
43db0c5 build: fix build err [1/1]
d4abd67 dtv_demod: TXLX ISDB-T can't search channel [1/1]
70f2c39 dtv_demod: TL1 dvbc search time more than 3 min [1/1]
16d4727 dtv_demod: TL1 dtmb cma allocate fail after dtmb->dvbc->dtmb by cmd [1/1]
b5aa9de media_module: h264/mpeg2/h265 [2/2]
3d6a5ed ppmgr: use light reg for video decoder local reset [1/1]
ppmgr: use light reg for video decoder local reset [1/1]

PD#SWPL-5014

Problem:
ppmgr provider error sometimes in long time run under poor signal

Solution:
use light reg for video decoder local reset

Verify:
X301

Change-Id: I1500c9ddfdce76b3e9cb2b24a35cdee765f82d5f
Signed-off-by: Hui Zhang <hui.zhang@amlogic.com>
media_module: h264/mpeg2/h265 [2/2]

PD#SWPL-3654

Problem:
provide aspect_ratio information by AMSTREAM_IOC_VDECSTAT

Solution:
add ration_control information in vdec_status function for
h264/mh264/vh265/mpeg12/mmpeg12, and normalized it for
aspect_ratio in AMSTREAM_IOC_VDECSTAT message.

Verify:
Verified U212

Change-Id: Icd9270eb8f2ce2f6f7455ec28780d26ac6c56348
Signed-off-by: Rong Zhang <rong.zhang@amlogic.com>
dtv_demod: TL1 dtmb cma allocate fail after dtmb->dvbc->dtmb by cmd [1/1]

PD#TV-1748

Problem:
[Hisense-T962X2-P-customer-DTV]:Failed to lock frequency in dtmb system

Solution:
leave the last mode before enter current mode to release the resources

Verify:
verified by t962x2_x301

Change-Id: Ibd7e1d4c67f5a5ad2191e0031fdd0b81812c8606
Signed-off-by: Zhiwei Yuan <zhiwei.yuan@amlogic.com>
dtv_demod: TL1 dvbc search time more than 3 min [1/1]

PD#SWPL-3555

Problem:
{DVB-C}Hisense needs less than 3 minutes for dvb-c search.(5/5,None)

Solution:
1.use demod internal state machine to optimize time
2.remove j.83b filter setting in dvbc mode for tl1 & txlx

Verify:
verified by t962x2_x301&t962x_r311

Change-Id: Ic922e3da727179e2e35a0fc80e52ac7242c54129
Signed-off-by: Zhiwei Yuan <zhiwei.yuan@amlogic.com>
dtv_demod: TXLX ISDB-T can't search channel [1/1]

PD#SWPL-3987

Problem:
[Einstein]use ISDB-T cannot search any channel

Solution:
release cma memory at leave_mode for ISDB-t&DVB-T

Verify:
verified by t962x_r311

Change-Id: I9b79687a4d5270932ab30afaa3e7d2817e900149
Signed-off-by: Zhiwei Yuan <zhiwei.yuan@amlogic.com>
build: fix build err [1/1]

PD#SWPL-4150

Problem:
When switch to the toolchain shipped with android P, multipile
"-Werror=maybe-uninitialized" error occurs, and the code fail
to be compiled

Solution:
Initialize variables if necessary

Verify:
Locally on Ampere

Change-Id: I280de648914565656831e211539bf41a7dee2b4a
Signed-off-by: Jiamin Ma <jiamin.ma@amlogic.com>
dtv_demod: txlx atsc-t loses lock when play video for a long time [1/1]

PD#SWPL-3418

Problem:
[Einstein]when AC off/on,enter live TV ,
TV display blank screen and no signal about 5S

Solution:
use post-eq to track(0x912=0x50)

Verify:
verified by t962x_r311

Change-Id: I924c55a8f1c92328e4371cb730e1b03bd720457f
Signed-off-by: Zhiwei Yuan <zhiwei.yuan@amlogic.com>
dtv_demod: tl1,dvbc, new method for fast channel searching [1/1]

PD#TV-2154

Problem:
[Hisense-T962X2-P-customer-DTV]:DVBC QAM is set to auto to search channels

Solution:
add new searching method
note:
use "demod_dvbc_speedup_en" to mark the new method
it's disabled as default, can be enabled if needed
we can make it always enabled after all testing are passed
enable: echo fast_search on > /sys/kernel/debug/demod/dvbc_channel_fast

Verify:
verified by t962x2_x301

Change-Id: Icaaab9f27eb058a062d7048c6ca9fa2e3bff008e
Signed-off-by: Zhiwei Yuan <zhiwei.yuan@amlogic.com>
dtv_demod: TL1 dtmb suspend hangup issue [1/1]

PD#SWPL-5202

Problem:
cma memory is not released when suspend

Solution:
provide suspend interface to release cma memory

Verify:
verified by t962x2_x301

Change-Id: I1d808a8a6119a2f385961c4c5bded5ab71c9c9d1
Signed-off-by: zhiwei.yuan <zhiwei.yuan@amlogic.com>
dtv_demod: Prevent NULL pointer crash caused by tuner attach failure [1/1]

PD#TV-1539

Problem:
Prevent NULL pointer crash caused by tuner attach failure.

Solution:
Prevent NULL pointer crash caused by tuner attach failure.

Verify:
verified by x301

Change-Id: I57cf32947775626467eb952dd2298ae9ec84601d
Signed-off-by: nengwen.chen <nengwen.chen@amlogic.com>
dtv_demod: add AGC control for board t309 [1/1]

PD#SWPL-5175

Problem:
r842 agc control need be controlled by demod

Solution:
add agc control function

Verify:
verified by t962x2_x301 t962x2_t309

Change-Id: If712e22276b97c457e2e2ed1c79bdf3673813dff
Signed-off-by: zhiwei.yuan <zhiwei.yuan@amlogic.com>
23 files changed:
MAINTAINERS
drivers/amlogic/media/common/canvas/canvas_mgr.c
drivers/amlogic/media/common/vfm/vframe_provider.c
drivers/amlogic/media/dtv_demod/Makefile
drivers/amlogic/media/dtv_demod/aml_demod.c
drivers/amlogic/media/dtv_demod/amlfrontend.c
drivers/amlogic/media/dtv_demod/atsc_func.c
drivers/amlogic/media/dtv_demod/demod_dbg.c [new file with mode: 0644]
drivers/amlogic/media/dtv_demod/dvbc_func.c
drivers/amlogic/media/dtv_demod/dvbc_v3.c
drivers/amlogic/media/dtv_demod/include/amlfrontend.h
drivers/amlogic/media/dtv_demod/include/demod_dbg.h [new file with mode: 0644]
drivers/amlogic/media/dtv_demod/include/demod_func.h
drivers/amlogic/media/dtv_demod/include/depend.h
drivers/amlogic/media/dtv_demod/tuner_func.c
drivers/amlogic/media/video_processor/ppmgr/ppmgr_vpp.c
drivers/media/tuners/xc5000.c
include/linux/amlogic/media/utils/amstream.h
include/linux/amlogic/media/vfm/vframe_provider.h
kernel/compat.c
kernel/time/posix-cpu-timers.c
kernel/time/time.c
net/unix/af_unix.c

index 9c2fb06..d92e12d 100644 (file)
@@ -14508,6 +14508,8 @@ F:      drivers/amlogic/media/dtv_demod/*
 AMLOGIC DTV DEMOD DRIVER
 M:      Zhiwei Yuan <zhiwei.yuan@amlogic.com>
 F:      drivers/amlogic/media/dtv_demod/include/addr_atsc*.h
+F:      drivers/amlogic/media/dtv_demod/include/demod_dbg.h
+F:      drivers/amlogic/media/dtv_demod/demod_dbg.c
 
 AMLOGIC DEFENDKEY DRIVER
 M:     Zhongfu Luo <zhongfu.luo@amlogic.com>
index 56ab75d..db416df 100644 (file)
@@ -375,7 +375,7 @@ canvas_pool_map_show(struct class *class,
        int ret;
        int i;
        ssize_t size = 0;
-       struct canvas_info info;
+       struct canvas_info info = {NULL, 0, NULL, 0};
        struct canvas_s canvas;
 
        if (jiffies - pool->last_cat_map > 5 * HZ) {
index e208060..af6d1bd 100644 (file)
@@ -367,6 +367,33 @@ void vf_unreg_provider(struct vframe_provider_s *prov)
        }
 }
 EXPORT_SYMBOL(vf_unreg_provider);
+void vf_light_reg_provider(struct vframe_provider_s *prov)
+{
+       struct vframe_provider_s *p = NULL;
+       struct vframe_receiver_s *receiver = NULL;
+       int i;
+
+       for (i = 0; i < MAX_PROVIDER_NUM; i++) {
+               p = provider_table[i];
+               if (p && !strcmp(p->name, prov->name)) {
+                       if (vfm_debug_flag & 1)
+                               pr_err("%s:%s\n", __func__, prov->name);
+                       receiver = vf_get_receiver(prov->name);
+                       if (receiver && receiver->ops
+                               && receiver->ops->event_cb) {
+                               receiver->ops->event_cb(
+                                               VFRAME_EVENT_PROVIDER_REG,
+                                               (void *)prov->name,
+                                               receiver->op_arg);
+                       } else{
+                               pr_err("%s Error to notify receiver\n",
+                                               __func__);
+                       }
+                       break;
+               }
+       }
+}
+EXPORT_SYMBOL(vf_light_reg_provider);
 
 void vf_light_unreg_provider(struct vframe_provider_s *prov)
 {
index 4d75e20..d88c5f6 100644 (file)
@@ -5,7 +5,7 @@ obj-$(CONFIG_AMLOGIC_DTV_DEMOD) += dtvdemod.o
 
 dtvdemod-objs := demod_func.o  dvbc_func.o i2c_func.o tuner_func.o atsc_func.o dvbc_v2.o dvbc_v3.o dtmb_func.o dvbt_v2.o#dvbt_func.o
 
-dtvdemod-objs += amlfrontend.o
+dtvdemod-objs += amlfrontend.o demod_dbg.o
 
 dtvdemod-objs  += aml_demod.o
 
index ea2b742..c350537 100644 (file)
 /* #include <mach/am_regs.h> */
 #include <linux/device.h>
 #include <linux/cdev.h>
-#include <linux/debugfs.h>
 
 /* #include <asm/fiq.h> */
 #include <linux/uaccess.h>
 #include <linux/dvb/aml_demod.h>
 #include "demod_func.h"
+#include "demod_dbg.h"
 
 #include <linux/slab.h>
 #ifdef CONFIG_COMPAT
 #include <linux/compat.h>
 #endif
+
 /*#include "sdio/sdio_init.h"*/
 #define DRIVER_NAME "aml_demod"
 #define MODULE_NAME "aml_demod"
@@ -280,6 +281,7 @@ static long aml_demod_ioctl(struct file *file,
                dvbfe = aml_get_fe();/*get_si2177_tuner();*/
 #if 0
                if (dvbfe != NULL)
+                       if (dvbfe->ops.tuner_ops.get_strength)
                        strength = dvbfe->ops.tuner_ops.get_strength(dvbfe);
 #else
                strength = tuner_get_ch_power2();
@@ -323,7 +325,8 @@ static long aml_demod_ioctl(struct file *file,
        #if 0 /*ary temp for my_tool:*/
                if (dvbfe != NULL) {
                        pr_dbg("calling tuner ops\n");
-                       dvbfe->ops.tuner_ops.set_params(dvbfe);
+                       if (dvbfe->ops.tuner_ops.set_params)
+                               dvbfe->ops.tuner_ops.set_params(dvbfe);
                }
        #endif
                break;
@@ -493,288 +496,6 @@ static const struct file_operations aml_demod_fops = {
 #endif
 };
 
-#if 0
-static int aml_demod_dbg_open(struct inode *inode, struct file *file)
-{
-       pr_dbg("Amlogic Demod debug Open\n");
-       return 0;
-}
-
-static int aml_demod_dbg_release(struct inode *inode, struct file *file)
-{
-       pr_dbg("Amlogic Demod debug Release\n");
-       return 0;
-}
-
-static unsigned int addr_for_read;
-static unsigned int register_val;
-static unsigned int symb_rate;
-static unsigned int ch_freq;
-static unsigned int modulation;
-static char *dbg_name[] = {
-       "demod top r/w",
-       "dvbc r/w",
-       "atsc r/w",
-       "dtmb r/w",
-       "front r/w",
-       "isdbt r/w",
-       "dvbc init",
-       "atsc init",
-       "dtmb init",
-};
-
-unsigned int get_symbol_rate(void)
-{// / 1000
-       return symb_rate;
-}
-
-unsigned int get_ch_freq(void)
-{// / 1000
-       return ch_freq;
-}
-
-unsigned int get_modu(void)
-{
-       return modulation;
-}
-
-/*
- *TVFE_VAFE_CTRL0      0x000d0710
- *TVFE_VAFE_CTRL1      0x00003000
- *TVFE_VAFE_CTRL2      0x1fe09e31
- *HHI_DADC_CNTL                0x0030303c
- *HHI_DADC_CNTL2               0x00003480
- *HHI_DADC_CNTL3               0x08700b83
- *HHI_VDAC_CNTL1               0x0000000
-
- *ADC_PLL_CNTL0                0X012004e0
- *ADC_PLL_CNTL0                0X312004e0
- *ADC_PLL_CNTL1                0X05400000
- *ADC_PLL_CNTL2                0xe1800000
- *ADC_PLL_CNTL3                0x48681c00
- *ADC_PLL_CNTL4                0x88770290
- *ADC_PLL_CNTL5                0x39272000
- *ADC_PLL_CNTL6                0x56540000
- *ADC_PLL_CNTL0                0X111104e0
- */
-static void aml_demod_adc_init(void)
-{
-       PR_INFO("%s\n", __func__);
-       demod_init_mutex();
-       demod_power_switch(PWR_ON);
-       //TVFE_VAFE_CTRL0
-       demod_set_tvfe_reg(0x000d0710, 0xff654ec0);
-       //TVFE_VAFE_CTRL1
-       demod_set_tvfe_reg(0x00003000, 0xff654ec4);
-       //TVFE_VAFE_CTRL2
-       demod_set_tvfe_reg(0x1fe09e31, 0xff654ec8);
-       //HHI_DADC_CNTL
-       dd_tvafe_hiu_reg_write(0x9c, 0x0030303c);
-       //HHI_DADC_CNTL2
-       dd_tvafe_hiu_reg_write(0xa0, 0x00003480);
-       //HHI_DADC_CNTL3
-       //dd_tvafe_hiu_reg_write(0xa8, 0x08700b83);
-       dd_tvafe_hiu_reg_write(0xa8, 0x08300b83);
-       //HHI_VDAC_CNTL1
-       dd_tvafe_hiu_reg_write(0x2f0, 0x0000000);
-       //ADC_PLL_CNTL0
-       dd_tvafe_hiu_reg_write(0x2c0, 0X012004e0);
-       dd_tvafe_hiu_reg_write(0x2c0, 0X312004e0);
-       //ADC_PLL_CNTL1
-       dd_tvafe_hiu_reg_write(0x2c4, 0X05400000);
-       //ADC_PLL_CNTL2
-       //dd_tvafe_hiu_reg_write(0x2c8, 0xe1800000);
-       dd_tvafe_hiu_reg_write(0x2c8, 0xE0800000);//shijie modify, crystal 24M
-       //dd_tvafe_hiu_reg_write(0x2c8, 0xe9800000);
-       //ADC_PLL_CNTL3
-       dd_tvafe_hiu_reg_write(0x2cc, 0x48681c00);
-       //ADC_PLL_CNTL4
-       dd_tvafe_hiu_reg_write(0x2d0, 0x88770290);
-       //ADC_PLL_CNTL5
-       dd_tvafe_hiu_reg_write(0x2d4, 0x39272000);
-       //ADC_PLL_CNTL6
-       dd_tvafe_hiu_reg_write(0x2d8, 0x56540000);
-       //ADC_PLL_CNTL0
-       dd_tvafe_hiu_reg_write(0x2c0, 0X111104e0);
-       //zou weihua
-       dd_tvafe_hiu_reg_write(0x3cc, 0x00800000);
-       //shijie
-       dd_tvafe_hiu_reg_write(0x1d0, 0x501);//0x705
-       //shixi, switch to demod mode, enable pclk
-       //demod_write_reg(DEMOD_TOP_REG0, 0x11);
-       dtvpll_init_flag(1);
-}
-
-static ssize_t aml_demod_dbg_show(struct file *file, char __user *userbuf,
-                                size_t count, loff_t *ppos)
-{
-       char buf[80];
-       ssize_t len = 0;
-
-       #if 1
-       len = snprintf(buf, sizeof(buf), "%s :0x%x = %i\n",
-               dbg_name[addr_for_read >> 28], addr_for_read & 0xff,
-               register_val);
-       #else
-       len = snprintf(buf, sizeof(buf), "%s\n", __func__);
-       #endif
-       //demod_read_reg(DEMOD_TOP_REGC);
-       //dtmb_read_reg(0);
-       //dd_tvafe_hiu_reg_write(0x9c, 0x0030303c);
-       PR_INFO("%s\n", __func__);
-       //PR_INFO("0xec0 = 0x%x\n", dd_tvafe_hiu_reg_read(0x9c));
-       //dvbt_read_reg(0x38);
-
-       return simple_read_from_buffer(userbuf, count, ppos, buf, len);
-}
-
-/*echo dbg_md [0xaddr] [val] > /sys/kernel/debug/demod/xxxx*/
-static ssize_t aml_demod_dbg_store(struct file *file,
-               const char __user *userbuf, size_t count, loff_t *ppos)
-{
-       char buf[80];
-       unsigned int reg, val, dbg_md;
-       int ret;
-
-       count = min_t(size_t, count, (sizeof(buf)-1));
-       if (copy_from_user(buf, userbuf, count))
-               return -EFAULT;
-
-       buf[count] = 0;
-
-       ret = sscanf(buf, "%d %x %i", &dbg_md, &reg, &val);
-       aml_demod_adc_init();
-
-       switch (ret) {
-       case 1://cmd
-               switch (dbg_md) {
-               case AML_DBG_DVBC_INIT:
-                       Gxtv_Demod_Dvbc_v4_Init();
-                       break;
-               case AML_DBG_ATSC_INIT:
-                       demod_set_sys_atsc_v4();
-                       break;
-               case AML_DBG_DTMB_INIT:
-                       break;
-               default:
-                       break;
-               }
-
-               PR_INFO("%s\n", dbg_name[dbg_md]);
-               break;
-       case 2://read register, set param
-               switch (dbg_md) {
-               case AML_DBG_DEMOD_TOP_RW:
-                       addr_for_read = (AML_DBG_DEMOD_TOP_RW << 28) | reg;
-                       register_val = demod_read_reg(reg);
-                       break;
-               case AML_DBG_DVBC_RW:
-                       addr_for_read = (AML_DBG_DVBC_RW << 28) | reg;
-                       register_val = dvbc_read_reg(reg);
-                       break;
-               case AML_DBG_ATSC_RW:
-                       addr_for_read = (AML_DBG_ATSC_RW << 28) | reg;
-                       register_val = atsc_read_reg_v4(reg);
-                       break;
-               case AML_DBG_DTMB_RW:
-                       addr_for_read = (AML_DBG_DTMB_RW << 28) | reg;
-                       register_val = dtmb_read_reg(reg);
-                       break;
-               case AML_DBG_FRONT_RW:
-                       addr_for_read = (AML_DBG_FRONT_RW << 28) | reg;
-                       register_val = front_read_reg_v4(reg);
-                       break;
-               case AML_DBG_ISDBT_RW:
-                       addr_for_read = (AML_DBG_ISDBT_RW << 28) | reg;
-                       register_val = isdbt_read_reg_v4(reg);
-                       break;
-               case AML_DBG_DEMOD_SYMB_RATE:
-                       symb_rate = reg;
-                       break;
-               case AML_DBG_DEMOD_CH_FREQ:
-                       ch_freq = reg;
-                       break;
-               case AML_DBG_DEMOD_MODUL:
-                       modulation = reg;
-                       break;
-               default:
-                       break;
-               }
-
-               PR_INFO("%s reg:0x%x\n", dbg_name[dbg_md], reg);
-               break;
-       case 3://write register
-               switch (dbg_md) {
-               case AML_DBG_DEMOD_TOP_RW:
-                       demod_write_reg(reg, val);
-                       break;
-               case AML_DBG_DVBC_RW:
-                       dvbc_write_reg(reg, val);
-                       break;
-               case AML_DBG_ATSC_RW:
-                       atsc_write_reg_v4(reg, val);
-                       break;
-               case AML_DBG_DTMB_RW:
-                       dtmb_write_reg(reg, val);
-                       break;
-               case AML_DBG_FRONT_RW:
-                       front_write_reg_v4(reg, val);
-                       break;
-               case AML_DBG_ISDBT_RW:
-                       isdbt_write_reg_v4(reg, val);
-                       break;
-               default:
-                       break;
-               }
-
-               PR_INFO("%s reg:0x%x,val=%d\n", dbg_name[dbg_md], reg, val);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return count;
-}
-
-static const struct file_operations aml_demod_dvbc_dbg_fops = {
-       .owner          = THIS_MODULE,
-       .open           = aml_demod_dbg_open,
-       .release        = aml_demod_dbg_release,
-       //.unlocked_ioctl = aml_demod_ioctl,
-       .read = aml_demod_dbg_show,
-       .write = aml_demod_dbg_store,
-};
-
-static void aml_demod_dbg_init(void)
-{
-       struct dentry *root_entry = dtvdd_devp->demod_root;
-       struct dentry *entry;
-
-       PR_INFO("%s\n", __func__);
-
-       root_entry = debugfs_create_dir("frontend", NULL);
-       if (!root_entry) {
-               PR_INFO("Can't create debugfs dir frontend.\n");
-               return;
-       }
-
-       entry = debugfs_create_file("demod", S_IFREG | 0644, root_entry, NULL,
-                                      &aml_demod_dvbc_dbg_fops);
-       if (!entry) {
-               PR_INFO("Can't create debugfs file demod.\n");
-               return;
-       }
-}
-
-static void aml_demod_dbg_exit(void)
-{
-       struct dentry *root_entry = dtvdd_devp->demod_root;
-
-       if (dtvdd_devp && root_entry)
-               debugfs_remove_recursive(root_entry);
-}
-#endif
-
 static int aml_demod_ui_open(struct inode *inode, struct file *file)
 {
        pr_dbg("Amlogic aml_demod_ui_open Open\n");
@@ -988,7 +709,7 @@ static int __init aml_demod_init(void)
        sdio_init();
 #endif
        aml_demod_ui_init();
-       //aml_demod_dbg_init();
+       aml_demod_dbg_init();
 
        return 0;
 
@@ -1028,7 +749,7 @@ static void __exit aml_demod_exit(void)
        class_unregister(&aml_demod_class);
 
        aml_demod_exit_ui();
-       //aml_demod_dbg_exit();
+       aml_demod_dbg_exit();
 }
 
 #ifndef CONFIG_AM_DEMOD_DVBAPI
index 0e9f226..3d43b53 100644 (file)
 #include <linux/dvb/aml_demod.h>
 #include "demod_func.h"
 
-#include "depend.h" /**/
-
-#include "amlfrontend.h"
-
 /*dma_get_cma_size_int_byte*/
 #include <linux/amlogic/media/codec_mm/codec_mm.h>
 #include <linux/dma-contiguous.h>
@@ -73,12 +69,21 @@ module_param(auto_search_std, int, 0644);
 MODULE_PARM_DESC(std_lock_timeout, "\n\t\t atsc-c std lock timeout");
 static unsigned int std_lock_timeout = 1000;
 module_param(std_lock_timeout, int, 0644);
-/*0.001for field,0.002 for performance*/
-static char *demod_version = "V0.03";
+
+/*0.001for field,0.002 for performance
+ *0.04: new method of tl1 dvbc channel fast search(Hisense project)
+ */
+static char *demod_version = "V0.04";
 
 
 int aml_demod_debug = DBG_INFO;
 
+/*use this flag to mark the new method for dvbc channel fast search
+ *it's disabled as default, can be enabled if needed
+ *we can make it always enabled after all testing are passed
+ */
+static unsigned int demod_dvbc_speedup_en;
+
 
 #if 0
 #define PR_DBG(fmt, args ...) \
@@ -183,19 +188,21 @@ const char *name_fe_delivery_system[] = {
        "DVBC_ANNEX_C",
        "ANALOG",       /*19*/
 };
-void dbg_delsys(unsigned char id)
-{
-       if (id <= END_SYS_DELIVERY)
-               PR_INFO("%s:%s:\n", __func__, name_fe_delivery_system[id]);
-       else
-               PR_INFO("%s:%d\n", __func__, id);
 
-}
+static const char * const name_fe_n_mode[] = {
+       "AM_FE_UNKNOWN_N",
+       "AM_FE_QPSK_N",
+       "AM_FE_QAM_N",
+       "AM_FE_OFDM_N",
+       "AM_FE_ATSC_N",
+       "AM_FE_DTMB_N",
+       "AM_FE_ISDBT_N",
+       "AM_FE_NUM",
+};
+
 static void dtvdemod_vdac_enable(bool on);
 static void dtvdemod_set_agc_pinmux(int on);
 
-
-
 static int Gxtv_Demod_Dvbc_Init(/*struct aml_fe_dev *dev, */int mode);
 static ssize_t dvbc_auto_sym_show(struct class *cls,
                                  struct class_attribute *attr, char *buf)
@@ -213,7 +220,7 @@ static ssize_t dvbc_auto_sym_store(struct class *cls,
 
 static unsigned int dtmb_mode;
 static unsigned int atsc_mode_para;
-static unsigned int demod_mode_para;
+static enum demod_md demod_mode_para;
 
 
 enum {
@@ -231,20 +238,10 @@ enum {
        ATSC_READ_FREQ = 4,
 };
 
-enum {
-       UNKNOWN = 0,
-       AML_DVBC,
-       AML_DTMB,
-       AML_DVBT,
-       AML_ATSC,
-       AML_J83B,
-       AML_ISDBT,
-       AML_DVBT2
-};
-
-
-
-
+enum demod_md demod_get_current_mode(void)
+{
+       return demod_mode_para;
+}
 
 int convert_snr(int in_snr)
 {
@@ -933,20 +930,33 @@ static int gxtv_demod_dvbc_read_status_timer
        struct aml_demod_sts demod_sts;
        struct aml_demod_sta demod_sta;
        int strenth;
-
-       int ilock;
+       int ilock = 0;
 
        /*check tuner*/
        if (!timer_tuner_not_enough()) {
                strenth = tuner_get_ch_power2();
+
+               /*agc control,fine tune strength*/
+               if (is_ic_ver(IC_VER_TL1) && (dtvdd_devp->pin_name != NULL) &&
+                       (strncmp(fe->ops.tuner_ops.info.name, "r842", 4)
+                       == 0)) {
+                       strenth += 22;
+
+                       if (strenth <= -80)
+                               strenth = dvbc_get_power_strength(
+                                       qam_read_reg(0x27) & 0x7ff, strenth);
+               }
+
                if (strenth < -87) {
                        *status = FE_TIMEDOUT;
                        return 0;
                }
        }
+
        /*demod_sts.ch_sts = qam_read_reg(0x6);*/
        demod_sts.ch_sts = dvbc_get_ch_sts();
        dvbc_status(&demod_sta, /*&demod_i2c,*/ &demod_sts);
+
        if (demod_sts.ch_sts & 0x1) {
                ilock = 1;
                *status =
@@ -963,6 +973,7 @@ static int gxtv_demod_dvbc_read_status_timer
                        timer_disable(D_TIMER_DETECT);
                }
        }
+
        if (last_lock != ilock) {
                PR_DBG("%s.\n",
                         ilock ? "!!  >> LOCK << !!" : "!! >> UNLOCK << !!");
@@ -972,6 +983,60 @@ static int gxtv_demod_dvbc_read_status_timer
        return 0;
 }
 
+static int demod_dvbc_speed_up(enum fe_status *status)
+{
+       unsigned int cnt, i, sts, check_ok = 0;
+       struct aml_demod_sts demod_sts;
+       const int dvbc_count = 5;
+       int ilock = 0;
+
+       if (*status == 0) {
+               for (cnt = 0; cnt < 10; cnt++) {
+                       demod_sts.ch_sts = dvbc_get_ch_sts();
+
+                       if (demod_sts.ch_sts & 0x1) {
+                               /*have signal*/
+                               *status =
+                                       FE_HAS_LOCK | FE_HAS_SIGNAL |
+                                       FE_HAS_CARRIER |
+                                       FE_HAS_VITERBI | FE_HAS_SYNC;
+                               ilock = 1;
+                               check_ok = 1;
+                       } else {
+                               for (i = 0; i < dvbc_count; i++) {
+                                       msleep(25);
+                                       sts = dvbc_get_status();
+
+                                       if (sts >= 0x3)
+                                               break;
+                               }
+
+                               PR_DBG("[rsj]dvbc_status is 0x%x\n", sts);
+
+                               if (sts < 0x3) {
+                                       *status = FE_TIMEDOUT;
+                                       ilock = 0;
+                                       check_ok = 1;
+                                       timer_disable(D_TIMER_DETECT);
+                               }
+                       }
+
+                       if (check_ok == 1)
+                               break;
+
+                       msleep(20);
+               }
+       }
+
+       if (last_lock != ilock) {
+               PR_DBG("%s : %s.\n", __func__,
+                        ilock ? "!!  >> LOCK << !!" : "!! >> UNLOCK << !!");
+               last_lock = ilock;
+       }
+
+       return 0;
+}
+
 static int gxtv_demod_dvbc_read_ber(struct dvb_frontend *fe, u32 *ber)
 {
        /*struct aml_fe_dev *dev = afe->dtv_demod;*/
@@ -987,6 +1052,7 @@ static int gxtv_demod_dvbc_read_ber(struct dvb_frontend *fe, u32 *ber)
 static int gxtv_demod_dvbc_read_signal_strength
        (struct dvb_frontend *fe, u16 *strength)
 {
+       int tuner_sr;
 
 
 #if 0
@@ -994,7 +1060,22 @@ static int gxtv_demod_dvbc_read_signal_strength
                tn_strength = fe->ops.tuner_ops.get_strength(fe);
        *strength = 256 - tn_strength;
 #else
-       *strength = tuner_get_ch_power3();
+       if (is_ic_ver(IC_VER_TL1) &&
+               (dtvdd_devp->pin_name != NULL) &&
+               (strncmp(fe->ops.tuner_ops.info.name, "r842", 4) == 0)) {
+               tuner_sr = tuner_get_ch_power2();
+               tuner_sr += 22;
+
+               if (tuner_sr <= -80)
+                       tuner_sr = dvbc_get_power_strength(
+                               qam_read_reg(0x27) & 0x7ff, tuner_sr);
+
+               if (tuner_sr < -100)
+                       *strength = 0;
+               else
+                       *strength = tuner_sr + 100;
+       } else
+               *strength = tuner_get_ch_power3();
 #endif
 
        return 0;
@@ -1018,7 +1099,6 @@ static int gxtv_demod_dvbc_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 }
 
 /*extern int aml_fe_analog_set_frontend(struct dvb_frontend *fe);*/
-
 static int gxtv_demod_dvbc_set_frontend(struct dvb_frontend *fe)
 {
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
@@ -1028,7 +1108,6 @@ static int gxtv_demod_dvbc_set_frontend(struct dvb_frontend *fe)
        PR_INFO("%s\n", __func__);
        /*timer_set_max(D_TIMER_DETECT, 4000);*/
        /*timer_begain(D_TIMER_DETECT);*/
-
        memset(&param, 0, sizeof(param));
        param.ch_freq = c->frequency / 1000;
        param.mode = amdemod_qam(c->modulation);
@@ -1085,7 +1164,9 @@ static int gxtv_demod_dvbc_set_frontend(struct dvb_frontend *fe)
 }
 
 static int gxtv_demod_dvbc_get_frontend(struct dvb_frontend *fe)
-{                               /*these content will be writed into eeprom .*/
+{
+       #if 0
+       /*these content will be writed into eeprom .*/
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
        u32 qam_mode;
 
@@ -1093,6 +1174,7 @@ static int gxtv_demod_dvbc_get_frontend(struct dvb_frontend *fe)
        qam_mode = dvbc_get_qam_mode();
        c->modulation = qam_mode + 1;
        PR_DBG("[mode] is %d\n", c->modulation);
+       #endif
 
        return 0;
 }
@@ -1136,194 +1218,6 @@ static int Gxtv_Demod_Dvbc_Init(/*struct aml_fe_dev *dev, */int mode)
        return 0;
 }
 
-#if 0
-/*TL1*/
-void Gxtv_Demod_Dvbc_v4_Init(void)
-{
-       //struct dtv_frontend_properties *c = &fe->dtv_property_cache;
-       struct aml_demod_dvbc dvbc;
-       int nco_rate;
-       int tmp;
-
-       //printf("frequency point is(KHz):");
-       //scanf("%d", &tmp);
-       //dvbc.ch_freq = tmp;
-       //dvbc.ch_freq = 474000;
-       dvbc.ch_freq = 474000;
-       //dvbc.mode = tmp;
-       dvbc.mode = 4;// 0=16QAM, 1=32QAM, 2 = 64QAM, 3 = 128QAM, 4 = 256QAM
-       //dvbc.symb_rate = tmp;
-       dvbc.symb_rate = 5360;//6875;5056(J.83b 64QAM),5360(J.83b 256QAM)
-       //ioctl(fd, AML_DEMOD_DVBC_SET_CH, &dvbc);
-       dvbc.dat0 = 24000;
-       nco_rate = (24*256)/250+2;
-
-       //app_apb_write_reg(0xf00*4,0x88);
-       demod_write_reg(DEMOD_TOP_REG0, 0x88);
-       //app_apb_write_reg(0xf08*4,0x201);
-       demod_write_reg(DEMOD_TOP_REG8, 0x201);
-       //app_apb_write_reg(0xf0c*4,0x11); //open write enable
-       demod_write_reg(DEMOD_TOP_REGC, 0x11);
-       //app_apb_write_reg(0xe20,
-               //((app_apb_read_reg(0xe20) &~ 0xff) | (nco_rate & 0xff)));
-       //app_apb_write_reg(0xe20,      (app_apb_read_reg(0xe20) | (1 << 8)));
-       front_write_reg_v4(0x20,
-               ((front_read_reg_v4(0x20) & ~0xff) | (nco_rate & 0xff)));
-       front_write_reg_v4(0x20,        (front_read_reg_v4(0x20) | (1 << 8)));
-
-       //dvbc_reg_initial_tmp(&dvbc);
-       dvbc_reg_initial_tmp_v4(&dvbc);
-
-       //printf("set J.83B(1) OR DVBC(2)");
-       tmp = 2;
-       if (tmp == 1) {
-               //app_apb_write_reg(reg_reset,0x10f33);
-               qam_write_reg(0x7, 0x10f33);
-               //set_j83b_filter_reg();
-               set_j83b_filter_reg_v4();
-       } else {
-               //app_apb_write_reg(reg_reset,0xf33);
-               qam_write_reg(0x7, 0xf33);
-       }
-
-       #if 0
-       printf("select  0~3 mode:");
-       scanf("%d", &tmp);
-       if (tmp == 0) {
-       //set_dvbc_reg_1();
-       set_dvbc_reg_1_v4();
-       //set_dvbc_reg_2();
-       set_dvbc_reg_2_v4();
-       } else if (tmp == 1) {
-       //set_dvbc_reg_1();
-       set_dvbc_reg_1_v4();
-       //set_j83b_reg_2();
-       set_j83b_reg_2_v4();
-       } else if (tmp == 2) {
-       //set_j83b_reg_1();
-       set_j83b_reg_1_v4();
-       //set_dvbc_reg_2();
-       set_dvbc_reg_2_v4();
-       } else if (tmp == 3) {
-       //set_j83b_reg_1();
-       set_j83b_reg_1_v4();
-       //set_j83b_reg_2();
-       set_j83b_reg_2_v4();
-       }
-       #endif
-
-       #if 0
-       app_apb_write_reg(0x48, 0x50e1000);
-       app_apb_write_reg(0xc0, 0x41f2f69);
-       #else
-       qam_write_reg(0x12, 0x50e1000);
-       qam_write_reg(0x30, 0x41f2f69);
-       #endif
-}
-
-int uart_error_confirm(int a_0, int a_1)
-{
-       int flag_out_of_range;
-       int flag_error;
-       int flag_zero;
-       int flag_sta_check;
-       int st[2];
-       int out;
-
-       st[0] = a_0&0xf;
-       st[1] = (a_0>>4)&0xf;
-       if (st[1] == 0)
-               flag_sta_check = ((st[0] == 1) || (st[0] == 2)) ? 0 : 1;
-       if (st[1] == 1)
-               flag_sta_check = ((st[0] == 2) || (st[0] == 3)) ? 0 : 1;
-       if (st[1] == 2)
-               flag_sta_check = (st[0] == 3) ? 0 : 1;
-       if (st[1] == 3)
-               flag_sta_check = (st[0] == 4) ? 0 : 1;
-       if (st[1] == 4)
-               flag_sta_check = (st[0] == 6) ? 0 : 1;
-       if (st[1] == 6)
-               flag_sta_check = ((st[0] == 4) || (st[0] == 5)) ? 0 : 1;
-
-       flag_zero = (a_0 == 0) ? 1 : 0;
-       flag_out_of_range = ((a_0 & 0xf) > 6) ? 1 : 0;
-       flag_error = (((a_0 >> 4) & 0x0fffffff) == (a_1 & 0x0fffffff)) ? 0 : 1;
-       out = ((flag_out_of_range == 1) || (flag_error == 1)
-               || (flag_zero == 1)) ? 1 : 0;
-       return out;
-}
-
-void print_dvbc_result(void)
-{
-       //int timer1,
-       int time;
-       int i, tmp;
-       //float ftmp;
-       //struct aml_demod_sts  sts;
-       int status[2], uart_error;
-       int record = 6, cnt = 0, cur_res = 0;
-
-       //timer1 = read_time_usecond();
-       status[0] = status[1] = 0;
-       time = 1;
-       i = 0;
-       while (i < time) {
-               status[0] = qam_read_reg(0x31);
-               //if((status[0]&0xf) == 5){
-               //    timer2=read_time_usecond();
-               //    printf("\n\n\n\n[sync timer]%d\n",timer2-timer1);
-               //    break;
-               //}
-               uart_error = uart_error_confirm(status[0], status[1]);
-               usleep_range(10000, 10001);
-               status[1] = status[0];
-               i = i + 1;
-
-               //lg add state cnt
-               cur_res = status[1] & 0xf;
-               if (cur_res != 6) {
-                       record = cur_res;
-               } else {
-                       if (record != cur_res)
-                               cnt++;
-                       record = cur_res;
-               }
-
-               // ioctl(fd, AML_DEMOD_DVBC_GET_CH, &sts);
-               //tmp = sts.ch_sts;
-               PR_INFO("sta %08x  ulock_n %d  ", qam_read_reg(0x6), cnt);
-               //ftmp = sts.ch_snr;
-               //ftmp /= 100.0;
-               //ftmp=(app_apb_read_reg(0x174)&0xfff0)/16/32;
-               //ftmp=(dvbc_read_reg(0x174)&0xfff0)/16/32;
-               //PR_INFO("snr %5.2f dB ", ftmp);
-               PR_INFO("eq status is %d ", qam_read_reg(0x5d)&0xf);
-               PR_INFO("npn_det  %d impdet  %d imp_n  %d ",
-                       qam_read_reg(0x58)>>20&0x1, qam_read_reg(0x58)>>16&0x3,
-                       qam_read_reg(0x58)&0xffff);
-               //  ftmp = sts.ch_ber;
-               //  ftmp /= 1e6;
-               //  printf("ber %.2e ", ftmp);
-               //      if(ber_avg == 0)
-               //              ber_avg = ftmp;
-               //      ber_avg = ber_avg + (ftmp-ber_avg)/32;
-               //      printf("beravg %.2e ", ber_avg);
-               tmp = (qam_read_reg(0x33)&0xffff);
-               //tmp = sts.ch_per;
-               PR_INFO("per %d ", tmp);
-               //ftmp=(dvbc_read_reg(0x34)&0xffff)/1e3;
-               //      ftmp = sts.symb_rate;
-               //PR_INFO("srate %.3f ", ftmp);
-               //ftmp = (dvbc_read_reg(0x28)&0x7fffff)/1e3;
-               //PR_INFO("freqoff %.3f kHz ", ftmp);
-               tmp = (qam_read_reg(0x27));
-               //PR_INFO("power %ddb,gain %.3d  ",
-                       //((tmp>>22) & 0x1ff)/16.0, tmp & 0x7ff);
-               PR_INFO("lock sta %x\n", qam_read_reg(0x6));
-       }
-}
-#endif
-
 static void gxtv_demod_dvbt_release(struct dvb_frontend *fe)
 {
 
@@ -1682,17 +1576,31 @@ static int gxtv_demod_atsc_read_ber(struct dvb_frontend *fe, u32 *ber)
 static int gxtv_demod_atsc_read_signal_strength
        (struct dvb_frontend *fe, u16 *strength)
 {
+       int strenth;
+
+       strenth = tuner_get_ch_power(fe);
 /*     struct aml_fe *afe = fe->demodulator_priv;*/
        /*struct aml_fe_dev *dev = afe->dtv_demod; */
+       if (is_ic_ver(IC_VER_TL1) && (dtvdd_devp->pin_name != NULL) &&
+               (strncmp(fe->ops.tuner_ops.info.name, "r842", 4) == 0)) {
+               if ((fe->dtv_property_cache.modulation <= QAM_AUTO) &&
+                       (fe->dtv_property_cache.modulation != QPSK))
+                       strenth += 18;
+               else {
+                       strenth += 15;
+                       if (strenth <= -80)
+                               strenth = atsc_get_power_strength(
+                                       atsc_read_reg_v4(0x44) & 0xfff,
+                                               strenth);
+               }
 
+               if (strenth < -100)
+                       *strength = 0;
+               else
+                       *strength = strenth + 100;
+       } else
+               *strength = tuner_get_ch_power3();
 
-       *strength = tuner_get_ch_power3();
-       #if 0
-       if (*strength < 0)
-               *strength = 0;
-       else if (*strength > 100)
-               *strength = 100;
-       #endif
        if (*strength > 100)
                *strength = 100;
 
@@ -1739,6 +1647,8 @@ static int gxtv_demod_atsc_set_frontend(struct dvb_frontend *fe)
        union ATSC_DEMOD_REG_0X6A_BITS Val_0x6a;
        union ATSC_CNTR_REG_0X20_BITS Val_0x20;
        int nco_rate;
+       /*[0]: specturm inverse(1),normal(0); [1]:if_frequency*/
+       unsigned int tuner_freq[2] = {0};
 
        memset(&param_atsc, 0, sizeof(param_atsc));
        memset(&param_j83b, 0, sizeof(param_j83b));
@@ -1755,8 +1665,8 @@ static int gxtv_demod_atsc_set_frontend(struct dvb_frontend *fe)
                if (atsc_flag != QAM_AUTO)
                        atsc_flag = QAM_AUTO;
                /* demod_set_demod_reg(0x502, TXLX_ADC_REG6);*/
-               if (!is_ic_ver(IC_VER_TL1))
-                       dd_tvafe_hiu_reg_write(D_HHI_DEMOD_CLK_CNTL, 0x502);
+               //sys_clk=167M
+               dd_tvafe_hiu_reg_write(D_HHI_DEMOD_CLK_CNTL, 0x502);
 
                demod_set_mode_ts(Gxtv_Dvbc);
                param_j83b.ch_freq = c->frequency / 1000;
@@ -1777,7 +1687,6 @@ static int gxtv_demod_atsc_set_frontend(struct dvb_frontend *fe)
                                ((front_read_reg_v4(0x20) & ~0xff)
                                | (nco_rate & 0xff)));
                        front_write_reg_v4(0x2f, 0x5);//for timeshift mosaic
-                       dd_tvafe_hiu_reg_write(0x1d0, 0x502);//sys_clk=167M
                }
 
                dvbc_set_ch(&demod_status, /*&demod_i2c, */&param_j83b);
@@ -1787,18 +1696,24 @@ static int gxtv_demod_atsc_set_frontend(struct dvb_frontend *fe)
                        set_j83b_filter_reg_v4();
                        qam_write_reg(0x12, 0x50e1000);
                        qam_write_reg(0x30, 0x41f2f69);
-                       //for timeshift mosaic issue
-                       //qam_write_reg(0x84, 0x2190000);
                }
-
        } else if (c->modulation > QAM_AUTO) {
                if (is_ic_ver(IC_VER_TL1)) {
-                       //demod_set_sys_atsc_v4();
                        Val_0x6a.bits = atsc_read_reg_v4(ATSC_DEMOD_REG_0X6A);
                        Val_0x6a.b.peak_thd = 0x6;//Let CCFO Quality over 6
                        atsc_write_reg_v4(ATSC_DEMOD_REG_0X6A, Val_0x6a.bits);
                        atsc_write_reg_v4(ATSC_EQ_REG_0XA5, 0x8c);
 
+                       if (fe->ops.tuner_ops.get_if_frequency)
+                               fe->ops.tuner_ops.
+                                       get_if_frequency(fe, tuner_freq);
+
+                       /*bit 2: invert specturm, for r842 tuner AGC control*/
+                       if (tuner_freq[0] == 1)
+                               atsc_write_reg_v4(ATSC_DEMOD_REG_0X56, 0x4);
+                       else
+                               atsc_write_reg_v4(ATSC_DEMOD_REG_0X56, 0x0);
+
                        if (demod_status.adc_freq == Adc_Clk_24M) {
                                atsc_write_reg_v4(ATSC_DEMOD_REG_0X54,
                                        0x1aaaaa);
@@ -1829,9 +1744,6 @@ static int gxtv_demod_atsc_set_frontend(struct dvb_frontend *fe)
                }
        }
 
-       if (is_ic_ver(IC_VER_TL1))
-               return 0;
-
        if ((auto_search_std == 1) && ((c->modulation <= QAM_AUTO)
        && (c->modulation != QPSK))) {
                unsigned char s = 0;
@@ -1929,6 +1841,16 @@ void atsc_detect_first(struct dvb_frontend *fe, enum fe_status *status)
                msleep(dvb_tuner_delay);
 
        strenth = tuner_get_ch_power(fe);
+
+       /*agc control,fine tune strength*/
+       if (is_ic_ver(IC_VER_TL1) && (dtvdd_devp->pin_name != NULL) &&
+               (strncmp(fe->ops.tuner_ops.info.name, "r842", 4) == 0)) {
+               strenth += 15;
+               if (strenth <= -80)
+                       strenth = atsc_get_power_strength(
+                               atsc_read_reg_v4(0x44) & 0xfff, strenth);
+       }
+
        if (strenth < THRD_TUNER_STRENTH_ATSC) {
                *status = FE_TIMEDOUT;
                PR_ATSC("tuner:no signal!\n");
@@ -1985,11 +1907,19 @@ static int atsc_j83b_detect_first(struct dvb_frontend *fe, enum fe_status *s)
        int cnt;
        int check_ok;
 
+       j83b_status = 0;
+
        /*tuner:*/
        if (dvb_tuner_delay > 9)
                msleep(dvb_tuner_delay);
 
        strenth = tuner_get_ch_power(fe);
+
+       /*agc control,fine tune strength*/
+       if (is_ic_ver(IC_VER_TL1) && (dtvdd_devp->pin_name != NULL) &&
+               (strncmp(fe->ops.tuner_ops.info.name, "r842", 4) == 0))
+               strenth += 18;
+
        if (strenth < THRD_TUNER_STRENTH_J83) {
                *s = FE_TIMEDOUT;
                PR_ATSC("tuner:no signal!j83\n");
@@ -2003,11 +1933,6 @@ static int atsc_j83b_detect_first(struct dvb_frontend *fe, enum fe_status *s)
        for (cnt = 0; cnt < CNT_FIRST; cnt++) {
                gxtv_demod_atsc_read_status(fe, &cs);
 
-               if (is_ic_ver(IC_VER_TL1)) {
-                       *s = cs;
-                       return 0;
-               }
-
                if (cs != 0x1f) {
                        /*msleep(200);*/
                        PR_DBG("[j.83b] 1\n");
@@ -2056,7 +1981,7 @@ static int atsc_j83b_polling(struct dvb_frontend *fe, enum fe_status *s)
 
        PR_DBG("+7+");
 
-
+       j83b_status = 0;
        strenth = tuner_get_ch_power(fe);
        if (strenth < THRD_TUNER_STRENTH_J83) {
                *s = FE_TIMEDOUT;
@@ -2095,6 +2020,9 @@ void atsc_polling(struct dvb_frontend *fe, enum fe_status *status)
 {
        struct dtv_frontend_properties *c = &fe->dtv_property_cache;
 
+       if (!demod_thread)
+               return;
+
        if (c->modulation == QPSK) {
                PR_DBG("mode is qpsk, return;\n");
                /*return;*/
@@ -2521,8 +2449,9 @@ static int gxtv_demod_dtmb_read_status_old
                PR_ERR("%s:not support %d!\n", __func__, get_dtmb_ver());
                return -1;
        }
+
        s = amdemod_dtmb_stat_islock();
-/*      s=1;*/
+
        if (s == 1) {
                ilock = 1;
                *status =
@@ -2551,8 +2480,20 @@ static int gxtv_demod_dtmb_read_ber(struct dvb_frontend *fe, u32 *ber)
 static int gxtv_demod_dtmb_read_signal_strength
                (struct dvb_frontend *fe, u16 *strength)
 {
+       int tuner_sr;
 
-       *strength = tuner_get_ch_power3();
+       if (is_ic_ver(IC_VER_TL1) &&
+               (dtvdd_devp->pin_name != NULL) &&
+               (strncmp(fe->ops.tuner_ops.info.name, "r842", 4) == 0)) {
+               tuner_sr = tuner_get_ch_power2();
+               tuner_sr += 16;
+
+               if (tuner_sr < -100)
+                       *strength = 0;
+               else
+                       *strength = tuner_sr + 100;
+       } else
+               *strength = tuner_get_ch_power3();
        return 0;
 }
 
@@ -2646,40 +2587,222 @@ int Gxtv_Demod_Dtmb_Init(struct amldtvdemod_device_s *dev)
 
        return 0;
 }
+
 #ifdef DVB_CORE_ORI
+unsigned int demod_dvbc_get_fast_search(void)
+{
+       return demod_dvbc_speedup_en;
+}
+
+void demod_dvbc_set_fast_search(unsigned int en)
+{
+       if (en)
+               demod_dvbc_speedup_en = 1;
+       else
+               demod_dvbc_speedup_en = 0;
+}
+
+void demod_dvbc_fsm_reset(void)
+{
+       //qam_write_reg(0x7, 0xf23);
+       qam_write_reg(0x7, qam_read_reg(0x7) & ~(1 << 4));
+       qam_write_reg(0x3a, 0x0);
+       //qam_write_reg(0x7, 0xf33);
+       qam_write_reg(0x7, qam_read_reg(0x7) | (1 << 4));
+       qam_write_reg(0x3a, 0x4);
+}
+
+//return val : 0=no signal,1=has signal,2=waiting
+unsigned int demod_dvbc_64_256_auto_fast(unsigned int *delay)
+{
+       static unsigned int times, no_sig_cnt;
+       static unsigned int qam64 = 1;
+
+       if (tuner_get_ch_power2() < -87)
+               return 0;
+
+       times++;
+       PR_DVBC("fast search : times = %d\n", times);
+       if (times < 6)
+               *delay = HZ / 8;//125ms
+       else
+               *delay = HZ / 2;//500ms
+
+       if ((qam_read_reg(0x31) & 0xf) < 3) {
+               no_sig_cnt++;
+
+               if (no_sig_cnt == 2 && times == 2) {//250ms
+                       no_sig_cnt = 0;
+                       times = 0;
+                       *delay = HZ / 4;
+                       qam64 = 1;
+                       return 0;
+               }
+       } else if ((qam_read_reg(0x31) & 0xf) == 5) {
+               no_sig_cnt = 0;
+               times = 0;
+               *delay = HZ / 4;
+               qam64 = 1;
+               return 1;
+       }
+
+       if (times == 14) {
+               times = 0;
+               no_sig_cnt = 0;
+               *delay = HZ / 4;
+               qam64 = 1;
+               return 0;
+       }
 
+       qam64 = !qam64;
+
+       PR_DVBC("fast search : qam64 = %d\n", qam64);
+       if (qam64)
+               demod_dvbc_set_qam(2);//64qam
+       else
+               demod_dvbc_set_qam(4);//256qam
+
+       demod_dvbc_fsm_reset();
+
+       return 2;
+}
+
+//return val : 0=no signal,1=has signal,2=waiting
+unsigned int demod_dvbc_fast_search(unsigned int *delay)
+{
+       static unsigned int times, no_sig_cnt;
+
+       if (tuner_get_ch_power2() < -87)
+               return 0;
+
+       times++;
+       PR_DVBC("fast search : times = %d\n", times);
+       if (times < 3)
+               *delay = HZ / 8;//125ms
+       else
+               *delay = HZ / 2;//500ms
+
+       if ((qam_read_reg(0x31) & 0xf) < 3) {
+               no_sig_cnt++;
+
+               if (no_sig_cnt == 2 && times == 2) {//250ms
+                       no_sig_cnt = 0;
+                       times = 0;
+                       *delay = HZ / 4;
+                       return 0;
+               }
+       } else if ((qam_read_reg(0x31) & 0xf) == 5) {
+               no_sig_cnt = 0;
+               times = 0;
+               *delay = HZ / 4;
+               return 1;
+       }
+
+       if (times == 7) {
+               times = 0;
+               no_sig_cnt = 0;
+               *delay = HZ / 4;
+               return 0;
+       }
+
+       demod_dvbc_fsm_reset();
+
+       return 2;
+}
 
 static int gxtv_demod_dvbc_tune(struct dvb_frontend *fe, bool re_tune,
        unsigned int mode_flags, unsigned int *delay, enum fe_status *status)
 {
        /*struct dtv_frontend_properties *c = &fe->dtv_property_cache;*/
        int ret = 0;
+       unsigned int sig_flg;
+       static unsigned int fast_search_finish = 1;
        /*unsigned int up_delay;*/
        /*unsigned int firstdetet;*/
 
        *delay = HZ / 4;
 
-#if 1
+       if (!demod_thread)
+               return 0;
+
        if (re_tune) {
                /*first*/
                dtvdd_devp->en_detect = 1;
 
                gxtv_demod_dvbc_set_frontend(fe);
+
+               if (demod_dvbc_speedup_en == 1) {
+                       fast_search_finish = 0;
+                       *status = 0;
+                       *delay = HZ / 8;
+                       qam_write_reg(0x65, 0x400c);
+                       qam_write_reg(0x60, 0x10466000);
+                       qam_write_reg(0xac, (qam_read_reg(0xac) & (~0xff00))
+                               | 0x800);
+                       qam_write_reg(0xae, (qam_read_reg(0xae)
+                               & (~0xff000000)) | 0x8000000);
+
+                       if (fe->dtv_property_cache.modulation == QAM_AUTO)
+                               demod_dvbc_set_qam(2);//64 QAM
+               } else
+                       qam_write_reg(0x65, 0x800c);
+
+               if (demod_dvbc_speedup_en == 1)
+                       return 0;
+
                /*timer_set_max(D_TIMER_DETECT, 4000);*/
                timer_begain(D_TIMER_DETECT);
                gxtv_demod_dvbc_read_status_timer(fe, status);
 
+               if (is_ic_ver(IC_VER_TL1))
+                       demod_dvbc_speed_up(status);
+
                PR_DBG("tune finish!\n");
 
                return ret;
        }
-#endif
+
        if (!dtvdd_devp->en_detect) {
                PR_DBGL("tune:not enable\n");
                return ret;
        }
 
-       gxtv_demod_dvbc_read_status_timer(fe, status);
+       if (demod_dvbc_speedup_en == 1) {
+               if (!fast_search_finish) {
+                       if (fe->dtv_property_cache.modulation == QAM_AUTO)
+                               sig_flg = demod_dvbc_64_256_auto_fast(delay);
+                       else
+                               sig_flg = demod_dvbc_fast_search(delay);
+
+                       switch (sig_flg) {
+                       case 0:
+                               *status = FE_TIMEDOUT;
+                               fast_search_finish = 1;
+                               PR_DVBC(">>>unlock<<<\n");
+                               break;
+                       case 1:
+                               *status =
+                               FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER |
+                               FE_HAS_VITERBI | FE_HAS_SYNC;
+                               fast_search_finish = 1;
+                               PR_DVBC(">>>lock<<<\n");
+                               break;
+                       case 2:
+                               *status = 0;
+                               break;
+                       default:
+                               PR_DVBC("wrong return value\n");
+                               break;
+                       }
+               }       else {
+                       gxtv_demod_dvbc_read_status_timer(fe, status);
+               }
+       }       else {
+               gxtv_demod_dvbc_read_status_timer(fe, status);
+       }
+
+       if (demod_dvbc_speedup_en == 1)
+               return 0;
 
        #if 0
        if (is_ic_ver(IC_VER_TL1))
@@ -2828,14 +2951,17 @@ void dtmb_cma_release(struct amldtvdemod_device_s *devp)
 }
 #endif
 
-static bool enter_mode(int mode)
+static bool enter_mode(enum aml_fe_n_mode_t mode)
 {
        /*struct aml_fe_dev *dev = fe->dtv_demod;*/
        struct amldtvdemod_device_s *devn = dtvdd_devp;
        int memstart_dtmb;
        bool ret = true;
 
-       PR_INFO("%s:%d\n", __func__, mode);
+       if (mode < AM_FE_NUM)
+               PR_INFO("%s:%s\n", __func__, name_fe_n_mode[mode]);
+       else
+               PR_ERR("%s:%d\n", __func__, mode);
 
        dtvdemod_set_agc_pinmux(1);
 
@@ -2855,20 +2981,20 @@ static bool enter_mode(int mode)
        if (mode == AM_FE_DTMB_N) {
                Gxtv_Demod_Dtmb_Init(devn);
 
-       if (devn->cma_flag == 1) {
-               PR_DBG("CMA MODE, cma flag is %d,mem size is %d",
-                       devn->cma_flag, devn->cma_mem_size);
-               if (dtmb_cma_alloc(devn)) {
-                       memstart_dtmb = devn->mem_start;
-               } else {
-                       ret = false;
-                       return ret;
+               if (devn->cma_flag == 1) {
+                       PR_DBG("CMA MODE, cma flag is %d,mem size is %d",
+                               devn->cma_flag, devn->cma_mem_size);
 
+                       if (dtmb_cma_alloc(devn)) {
+                               memstart_dtmb = devn->mem_start;
+                       } else {
+                               ret = false;
+                               return ret;
+                       }
+               } else {
+                       memstart_dtmb = devn->mem_start;/*??*/
                }
 
-       } else {
-               memstart_dtmb = devn->mem_start;/*??*/
-       }
                devn->act_dtmb = true;
                dtmb_set_mem_st(memstart_dtmb);
 
@@ -2893,6 +3019,7 @@ static bool enter_mode(int mode)
                timer_set_max(D_TIMER_DETECT, 2000);
                /*reset is 4s*/
                timer_set_max(D_TIMER_SET, 4000);
+
                if (devn->cma_flag == 1) {
                        PR_DBG("CMA MODE, cma flag is %d,mem size is %d",
                                devn->cma_flag,
@@ -2902,11 +3029,11 @@ static bool enter_mode(int mode)
                        } else {
                                ret = false;
                                return ret;
-
                        }
                } else {
                        memstart_dtmb = devn->mem_start;/*??*/
                }
+
                PR_DBG("[im]memstart is %x\n", memstart_dtmb);
                dvbt_write_reg((0x10 << 2), memstart_dtmb);
        }
@@ -2915,40 +3042,43 @@ static bool enter_mode(int mode)
 
 }
 
-static int leave_mode(int mode)
+static int leave_mode(enum aml_fe_n_mode_t mode)
 {
 /*     struct aml_fe_dev *dev = fe->dtv_demod;*/
        struct amldtvdemod_device_s *devn = dtvdd_devp;
 
-       PR_INFO("%s:\n", __func__);
+       if (mode < AM_FE_NUM)
+               PR_INFO("%s:%s\n", __func__, name_fe_n_mode[mode]);
+       else
+               PR_ERR("%s:%d\n", __func__, mode);
+
        dtvdd_devp->en_detect = 0;
        dtvdd_devp->last_delsys = SYS_UNDEFINED;
+       dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
 
        dtvpll_init_flag(0);
        /*dvbc_timer_exit();*/
        if (cci_thread)
                dvbc_kill_cci_task();
-       #if 0
+
        if (mode == AM_FE_DTMB_N) {
-               dtmb_poll_stop();       /*polling mode*/
-               /* close arbit */
+               if (dtvdd_devp->act_dtmb) {
+                       dtmb_poll_stop();       /*polling mode*/
+                       /* close arbit */
+                       demod_write_reg(DEMOD_TOP_REGC, 0x0);
+                       dtvdd_devp->act_dtmb = false;
+               }
 
-               demod_write_reg(DEMOD_TOP_REGC, 0x0);
-               if (devn->cma_flag == 1)
+               if ((devn->cma_flag == 1) && dtvdd_devp->flg_cma_allc) {
                        dtmb_cma_release(devn);
+                       dtvdd_devp->flg_cma_allc = false;
+               }
+       } else if (mode == AM_FE_OFDM_N || mode == AM_FE_ISDBT_N) {
+               if ((devn->cma_flag == 1) && dtvdd_devp->flg_cma_allc) {
+                       dtmb_cma_release(devn);
+                       dtvdd_devp->flg_cma_allc = false;
+               }
        }
-       #else
-       if (dtvdd_devp->act_dtmb) {
-               dtmb_poll_stop();       /*polling mode*/
-               /* close arbit */
-               demod_write_reg(DEMOD_TOP_REGC, 0x0);
-               dtvdd_devp->act_dtmb = false;
-       }
-       if ((devn->cma_flag == 1) && dtvdd_devp->flg_cma_allc) {
-               dtmb_cma_release(devn);
-               dtvdd_devp->flg_cma_allc = false;
-       }
-       #endif
 
        adc_set_pll_cntl(0, 0x04, NULL);
        demod_mode_para = UNKNOWN;
@@ -2958,9 +3088,7 @@ static int leave_mode(int mode)
        dtvdemod_set_agc_pinmux(0);
        msleep(200);
 
-
        return 0;
-
 }
 /* when can't get ic_config by dts, use this*/
 const struct meson_ddemod_data  data_gxtvbb = {
@@ -3599,15 +3727,37 @@ static int __exit aml_dtvdemod_remove(struct platform_device *pdev)
 
 static void aml_dtvdemod_shutdown(struct platform_device *pdev)
 {
+       enum aml_fe_n_mode_t nmode = dtvdd_devp->n_mode;
+
        pr_info("%s\n", __func__);
 
        if (dtvdd_devp->state != DTVDEMOD_ST_IDLE) {
-               leave_mode(0);
+               if (nmode != AM_FE_UNKNOWN_N)
+                       leave_mode(nmode);
                dtvdd_devp->state = DTVDEMOD_ST_IDLE;
        }
 
 }
 
+static int aml_dtvdemod_suspend(struct platform_device *pdev,
+                                       pm_message_t state)
+{
+       enum aml_fe_n_mode_t nmode = dtvdd_devp->n_mode;
+
+       PR_INFO("%s, mode = %d\n", __func__, nmode);
+
+       if (nmode != AM_FE_UNKNOWN_N)
+               leave_mode(nmode);
+
+       return 0;
+}
+
+static int aml_dtvdemod_resume(struct platform_device *pdev)
+{
+       PR_INFO("%s is called\n", __func__);
+       return 0;
+}
+
 static struct platform_driver aml_dtvdemod_driver = {
        .driver = {
                .name = "aml_dtv_demod",
@@ -3618,6 +3768,10 @@ static struct platform_driver aml_dtvdemod_driver = {
        .shutdown   = aml_dtvdemod_shutdown,
        .probe = aml_dtvdemod_probe,
        .remove = __exit_p(aml_dtvdemod_remove),
+#ifdef CONFIG_PM
+       .suspend  = aml_dtvdemod_suspend,
+       .resume   = aml_dtvdemod_resume,
+#endif
 };
 
 
@@ -3792,6 +3946,7 @@ static int delsys_set(struct dvb_frontend *fe, unsigned int delsys)
        }
 
        if (!support) {
+               #if 0
                if (get_dtvpll_init_flag()) {
                        /**/
                        PR_INFO("delsys:%d is not support!\n", cdelsys);
@@ -3801,11 +3956,17 @@ static int delsys_set(struct dvb_frontend *fe, unsigned int delsys)
                        dtvdd_devp->last_delsys = SYS_UNDEFINED;
                        dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
                }
+               #endif
+               PR_INFO("delsys:%d is not support!\n", cdelsys);
                return 0;
        }
 
-       PR_DBG("%s:l=%d,c=%d\n", __func__, ldelsys, cdelsys);
-       dbg_delsys(cdelsys);
+       if (ldelsys <= END_SYS_DELIVERY && cdelsys <= END_SYS_DELIVERY) {
+               PR_DBG("%s:l=%s,c=%s\n", __func__,
+                       name_fe_delivery_system[ldelsys],
+                       name_fe_delivery_system[cdelsys]);
+       } else
+               PR_ERR("%s:last=%d,cur=%d\n", __func__, ldelsys, cdelsys);
 
        switch (cdelsys) {
 
@@ -3869,29 +4030,36 @@ static int delsys_set(struct dvb_frontend *fe, unsigned int delsys)
        case SYS_DAB:
        case SYS_TURBO:
        case SYS_UNDEFINED:
+               return 0;
+
 #ifdef CONFIG_AMLOGIC_DVB_COMPAT
        case SYS_ANALOG:
-#endif
-               mode = AM_FE_UNKNOWN_N;
                if (get_dtvpll_init_flag()) {
-                       PR_INFO("delsys not support!%d=\n", cdelsys);
-                       leave_mode(mode);
+                       PR_INFO("delsys not support : %d\n", cdelsys);
+                       leave_mode(lmode);
+
                        if (fe->ops.tuner_ops.release)
                                fe->ops.tuner_ops.release(fe);
-                       dtvdd_devp->last_delsys = SYS_UNDEFINED;
-                       dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
                }
+
                return 0;
+#endif
        }
 
        if (mode != AM_FE_UNKNOWN_N) {
+               if (lmode != AM_FE_UNKNOWN_N) {
+                       leave_mode(lmode);
+
+                       if (fe->ops.tuner_ops.release)
+                               fe->ops.tuner_ops.release(fe);
+               }
+
                if (!enter_mode(mode)) {
                        PR_INFO("enter_mode failed,leave!\n");
                        leave_mode(mode);
+
                        if (fe->ops.tuner_ops.release)
-                       fe->ops.tuner_ops.release(fe);
-                       dtvdd_devp->last_delsys = SYS_UNDEFINED;
-                       dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
+                               fe->ops.tuner_ops.release(fe);
                        return 0;
                }
        }
@@ -3899,16 +4067,15 @@ static int delsys_set(struct dvb_frontend *fe, unsigned int delsys)
        if (!get_dtvpll_init_flag()) {
                PR_INFO("pll is not set!\n");
                leave_mode(mode);
+
                if (fe->ops.tuner_ops.release)
                        fe->ops.tuner_ops.release(fe);
-               dtvdd_devp->last_delsys = SYS_UNDEFINED;
-               dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
                return 0;
        }
 
        dtvdd_devp->last_delsys = cdelsys;
-#if 1  /*ary add for test*/
        PR_INFO("info type:%d", fe->ops.info.type);
+
        if (mode == AM_FE_ATSC_N)
                fe->ops.info.type = FE_ATSC;
        else if (mode == AM_FE_OFDM_N)
@@ -3920,9 +4087,8 @@ static int delsys_set(struct dvb_frontend *fe, unsigned int delsys)
        else if (mode == AM_FE_ISDBT_N)
                fe->ops.info.type = FE_ISDBT;
 
-       fe->ops.tuner_ops.set_config(fe, NULL);
-
-#endif
+       if (fe->ops.tuner_ops.set_config)
+               fe->ops.tuner_ops.set_config(fe, NULL);
 
        return 0;
 }
@@ -3954,11 +4120,11 @@ static int aml_dtvdm_sleep(struct dvb_frontend *fe)
 
        if (get_dtvpll_init_flag()) {
                PR_INFO("%s\n", __func__);
-               leave_mode(nmode);
+               if (nmode != AM_FE_UNKNOWN_N)
+                       leave_mode(nmode);
+
                if (fe->ops.tuner_ops.release)
                        fe->ops.tuner_ops.release(fe);
-               dtvdd_devp->last_delsys = SYS_UNDEFINED;
-               dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
        }
        return 0;
 }
@@ -4265,6 +4431,7 @@ static int aml_dtvdm_read_snr(struct dvb_frontend *fe, u16 *snr)
        return ret;
 
 }
+
 static int aml_dtvdm_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
 {
        enum aml_fe_n_mode_t nmode = dtvdd_devp->n_mode;
@@ -4334,11 +4501,11 @@ static void aml_dtvdm_release(struct dvb_frontend *fe)
 
        if (get_dtvpll_init_flag()) {
                PR_INFO("%s\n", __func__);
-               leave_mode(nmode);
+               if (nmode != AM_FE_UNKNOWN_N)
+                       leave_mode(nmode);
+
                if (fe->ops.tuner_ops.release)
                        fe->ops.tuner_ops.release(fe);
-               dtvdd_devp->last_delsys = SYS_UNDEFINED;
-               dtvdd_devp->n_mode = AM_FE_UNKNOWN_N;
        }
 }
 
index d95b1ef..1c11596 100644 (file)
@@ -565,6 +565,7 @@ if (!field_test_version) {
        atsc_write_reg(0x54d, 0x08);
        atsc_write_reg(0x54c, 0x08);
        atsc_write_reg(0x53b, 0x0e);
+       atsc_write_reg(0x912, 0x50);
 }
        ar_flag = 0;
 }
diff --git a/drivers/amlogic/media/dtv_demod/demod_dbg.c b/drivers/amlogic/media/dtv_demod/demod_dbg.c
new file mode 100644 (file)
index 0000000..b73b9ac
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * drivers/amlogic/media/dtv_demod/demod_dbg.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/debugfs.h>
+#include "demod_func.h"
+#include "amlfrontend.h"
+#include "demod_dbg.h"
+#include <linux/string.h>
+
+static void demod_dump_atsc_reg(struct seq_file *seq)
+{
+       unsigned int reg_start, reg_end;
+
+       if (is_ic_ver(IC_VER_TXLX)) {
+               reg_start = 0x0;
+               reg_end = 0xfff;
+
+               for (; reg_start <= reg_end; reg_start++) {
+                       if (reg_start % 8 == 0)
+                               seq_printf(seq, "\n[addr 0x%03x] ", reg_start);
+                       seq_printf(seq, "0x%02x\t", atsc_read_reg(reg_start));
+               }
+
+               seq_puts(seq, "\n");
+       } else if (is_ic_ver(IC_VER_TL1)) {
+       }
+}
+
+static int seq_file_demod_dump_reg_show(struct seq_file *seq, void *v)
+{
+       if (demod_get_current_mode() == AML_ATSC)
+               demod_dump_atsc_reg(seq);
+       else if (demod_get_current_mode() == UNKNOWN)
+               seq_puts(seq, "current mode is unknown\n");
+
+       return 0;
+}
+
+#define DEFINE_SHOW_DEMOD(__name) \
+static int __name ## _open(struct inode *inode, struct file *file)     \
+{ \
+       return single_open(file, __name ## _show, inode->i_private);    \
+} \
+                                                                       \
+static const struct file_operations __name ## _fops = {                        \
+       .owner = THIS_MODULE,           \
+       .open = __name ## _open,        \
+       .read = seq_read,               \
+       .llseek = seq_lseek,            \
+       .release = single_release,      \
+}
+
+DEFINE_SHOW_DEMOD(seq_file_demod_dump_reg);
+
+static struct demod_debugfs_files_t demod_debugfs_files[] = {
+       {"dump_reg", S_IFREG | 0644, &seq_file_demod_dump_reg_fops},
+};
+
+static int demod_dbg_dvbc_fast_search_open(struct inode *inode,
+       struct file *file)
+{
+       PR_INFO("Demod debug Open\n");
+       return 0;
+}
+
+static int demod_dbg_dvbc_fast_search_release(struct inode *inode,
+       struct file *file)
+{
+       PR_INFO("Demod debug Release\n");
+       return 0;
+}
+
+#define BUFFER_SIZE 100
+static ssize_t demod_dbg_dvbc_fast_search_show(struct file *file,
+       char __user *userbuf, size_t count, loff_t *ppos)
+{
+       char buf[BUFFER_SIZE];
+       unsigned int len;
+
+       len = snprintf(buf, BUFFER_SIZE, "channel fast search en : %d\n",
+               demod_dvbc_get_fast_search());
+       //len += snprintf(buf + len, BUFFER_SIZE - len, "");
+
+       return simple_read_from_buffer(userbuf, count, ppos, buf, len);
+}
+
+static ssize_t demod_dbg_dvbc_fast_search_store(struct file *file,
+               const char __user *userbuf, size_t count, loff_t *ppos)
+{
+       char buf[80];
+       char cmd[80], para[80];
+       int ret;
+
+       count = min_t(size_t, count, (sizeof(buf)-1));
+       if (copy_from_user(buf, userbuf, count))
+               return -EFAULT;
+
+       buf[count] = 0;
+
+       ret = sscanf(buf, "%s %s", cmd, para);
+
+       if (!strcmp(cmd, "fast_search")) {
+               PR_INFO("channel fast search: ");
+
+               if (!strcmp(para, "on")) {
+                       PR_INFO("on\n");
+                       demod_dvbc_set_fast_search(1);
+               } else if (!strcmp(para, "off")) {
+                       PR_INFO("off\n");
+                       demod_dvbc_set_fast_search(0);
+               }
+       }
+
+       return count;
+}
+
+static const struct file_operations demod_dbg_dvbc_fast_search_fops = {
+       .owner          = THIS_MODULE,
+       .open           = demod_dbg_dvbc_fast_search_open,
+       .release        = demod_dbg_dvbc_fast_search_release,
+       //.unlocked_ioctl = aml_demod_ioctl,
+       .read = demod_dbg_dvbc_fast_search_show,
+       .write = demod_dbg_dvbc_fast_search_store,
+};
+
+void aml_demod_dbg_init(void)
+{
+       struct dentry *root_entry = dtvdd_devp->demod_root;
+       struct dentry *entry;
+       unsigned int i;
+
+       PR_INFO("%s\n", __func__);
+
+       root_entry = debugfs_create_dir("demod", NULL);
+       if (!root_entry) {
+               PR_INFO("Can't create debugfs dir frontend.\n");
+               return;
+       }
+
+       for (i = 0; i < ARRAY_SIZE(demod_debugfs_files); i++) {
+               entry = debugfs_create_file(demod_debugfs_files[i].name,
+                       demod_debugfs_files[i].mode,
+                       root_entry, NULL,
+                       demod_debugfs_files[i].fops);
+               if (!entry)
+                       PR_INFO("Can't create debugfs seq file.\n");
+       }
+
+       entry = debugfs_create_file("dvbc_channel_fast", S_IFREG | 0644,
+               root_entry, NULL,
+               &demod_dbg_dvbc_fast_search_fops);
+       if (!entry)
+               PR_INFO("Can't create debugfs fast search.\n");
+
+}
+
+void aml_demod_dbg_exit(void)
+{
+       struct dentry *root_entry = dtvdd_devp->demod_root;
+
+       if (dtvdd_devp && root_entry)
+               debugfs_remove_recursive(root_entry);
+}
+
+
index ca2ac4e..8bbb208 100644 (file)
@@ -331,7 +331,7 @@ int dvbc_set_ch(struct aml_demod_sta *demod_sta,
                ret = -1;
        }
        /* if (ret != 0) return ret; */
-       demod_sta->dvb_mode = 0;
+       //demod_sta->dvb_mode = 0;
        demod_sta->ch_mode = mode;
        /* 0:16, 1:32, 2:64, 3:128, 4:256 */
        demod_sta->agc_mode = 1;
index 92bd3cc..d94d842 100644 (file)
@@ -179,57 +179,12 @@ static unsigned int get_adc_freq(void)
        return 24000;
 }
 
-void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
+void demod_dvbc_set_qam(unsigned int qam)
 {
-       u32 clk_freq;
-       u32 adc_freq;
-       /*ary no use u8 tuner;*/
-       u8 ch_mode;
-       u8 agc_mode;
-       u32 ch_freq;
-       u16 ch_if;
-       u16 ch_bw;
-       u16 symb_rate;
-       u32 phs_cfg;
-       int afifo_ctr;
-       int max_frq_off, tmp, adc_format;
-
-       clk_freq = demod_sta->clk_freq; /* kHz */
-       /*no use adc_freq = demod_sta->adc_freq;*/      /* kHz */
-       if (is_ic_ver(IC_VER_TL1))
-               adc_freq  = demod_sta->adc_freq;
-       else
-               adc_freq  = get_adc_freq();/*24000*/;
-       adc_format = 1;
-       /*ary no use tuner = demod_sta->tuner;*/
-       ch_mode = demod_sta->ch_mode;
-       agc_mode = demod_sta->agc_mode;
-       ch_freq = demod_sta->ch_freq;   /* kHz */
-       ch_if = demod_sta->ch_if;       /* kHz */
-       ch_bw = demod_sta->ch_bw;       /* kHz */
-       symb_rate = demod_sta->symb_rate;       /* k/sec */
-       PR_DVBC("ch_if is %d,  %d,  %d,  %d, %d %d\n",
-               ch_if, ch_mode, ch_freq, ch_bw, symb_rate, adc_freq);
-/*    ch_mode=4;*/
-       /* disable irq */
-       qam_write_reg(0x34, 0);
-
-       /* reset */
-       /*dvbc_reset(); */
-       qam_write_reg(0x7, qam_read_reg(0x7) & ~(1 << 4));
-       /* disable fsm_en */
-       qam_write_reg(0x7, qam_read_reg(0x7) & ~(1 << 0));
-       /* Sw disable demod */
-       qam_write_reg(0x7, qam_read_reg(0x7) | (1 << 0));
-       /* Sw enable demod */
-       qam_write_reg(0x0, 0x0);
-       /* QAM_STATUS */
-       qam_write_reg(0x7, 0x00000f00);
        /* QAM_GCTL0 */
-       qam_write_reg(0x2, (qam_read_reg(0x2) & ~7) | (ch_mode & 7));
-       /* qam mode */
+       qam_write_reg(0x2, (qam_read_reg(0x2) & ~7) | (qam & 7));
 
-       switch (ch_mode) {
+       switch (qam) {
        case 0: /*16qam*/
                qam_write_reg(0x71, 0x000a2200);
 
@@ -265,6 +220,10 @@ void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
                qam_write_reg(0x94, 0x0c1a1a00);
                break;
        case 2:/*64qam*/
+               if (is_ic_ver(IC_VER_TL1)) {
+                       qam_write_reg(0x9c, 0x2a132100);
+                       qam_write_reg(0x57, 0x606060d);
+               }
                break;
        case 3:/*128qam*/
                qam_write_reg(0x71, 0x0002c200);
@@ -291,13 +250,75 @@ void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
                qam_write_reg(0x93, 0x642a240c);
                qam_write_reg(0x94, 0x0c262600);
                break;
-       case 4:
+       case 4://256 QAM
                if (is_ic_ver(IC_VER_TL1)) {
                        qam_write_reg(0x9c, 0x2a232100);
                        qam_write_reg(0x57, 0x606040d);
                }
                break;
        }
+}
+
+void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
+{
+       u32 clk_freq;
+       u32 adc_freq;
+       /*ary no use u8 tuner;*/
+       u8 ch_mode;
+       u8 agc_mode;
+       u32 ch_freq;
+       u16 ch_if;
+       u16 ch_bw;
+       u16 symb_rate;
+       u32 phs_cfg;
+       int afifo_ctr;
+       int max_frq_off, tmp, adc_format;
+
+       clk_freq = demod_sta->clk_freq; /* kHz */
+       /*no use adc_freq = demod_sta->adc_freq;*/      /* kHz */
+       if (is_ic_ver(IC_VER_TL1))
+               adc_freq  = demod_sta->adc_freq;
+       else
+               adc_freq  = get_adc_freq();/*24000*/;
+       adc_format = 1;
+       /*ary no use tuner = demod_sta->tuner;*/
+       ch_mode = demod_sta->ch_mode;
+       agc_mode = demod_sta->agc_mode;
+       ch_freq = demod_sta->ch_freq;   /* kHz */
+       ch_if = demod_sta->ch_if;       /* kHz */
+       ch_bw = demod_sta->ch_bw;       /* kHz */
+       symb_rate = demod_sta->symb_rate;       /* k/sec */
+       PR_DVBC("ch_if is %d,  %d,  %d,  %d, %d %d\n",
+               ch_if, ch_mode, ch_freq, ch_bw, symb_rate, adc_freq);
+/*    ch_mode=4;*/
+       /* disable irq */
+       qam_write_reg(0x34, 0);
+
+       /* reset */
+       /*dvbc_reset(); */
+       qam_write_reg(0x7, qam_read_reg(0x7) & ~(1 << 4));
+       /* disable fsm_en */
+       qam_write_reg(0x7, qam_read_reg(0x7) & ~(1 << 0));
+       /* Sw disable demod */
+       qam_write_reg(0x7, qam_read_reg(0x7) | (1 << 0));
+
+       if (is_ic_ver(IC_VER_TL1))
+               if (agc_mode == 1) {
+                       qam_write_reg(0x25,
+                               qam_read_reg(0x25) & ~(0x1 << 10));
+                       qam_write_reg(0x24,
+                               qam_read_reg(0x24) | (0x1 << 17));
+               #if 0
+                       qam_write_reg(0x3d,
+                               qam_read_reg(0x3d) | 0xf);
+               #endif
+               }
+
+       /* Sw enable demod */
+       qam_write_reg(0x0, 0x0);
+       /* QAM_STATUS */
+       qam_write_reg(0x7, 0x00000f00);
+       demod_dvbc_set_qam(ch_mode);
        /*dvbc_write_reg(QAM_BASE+0x00c, 0xfffffffe);*/
        /* // adc_cnt, symb_cnt*/
        qam_write_reg(0x3, 0xffff8ffe);
@@ -367,8 +388,10 @@ void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
        /* // configure min symbol_rate fb = 6.95M*/
        qam_write_reg(0x12, (qam_read_reg(0x12) & ~(0xff<<8)) | 3400 * 256);
 
+       #if 0
        if (is_ic_ver(IC_VER_TL1))
                qam_write_reg(0x51, (qam_read_reg(0x51)&~(0x1<<28)));
+       #endif
        /* configure min symbol_rate fb = 6.95M */
 
        /*dvbc_write_reg(QAM_BASE+0x0c0, 0xffffff68); // threshold */
@@ -385,16 +408,19 @@ void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
        /* agc control */
        /* dvbc_write_reg(QAM_BASE+0x094, 0x7f800d2c);// AGC_CTRL  ALPS tuner */
        /* dvbc_write_reg(QAM_BASE+0x094, 0x7f80292c);     // Pilips Tuner */
-       if ((agc_mode & 1) == 0)
-               /* freeze if agc */
-               qam_write_reg(0x25,
-               qam_read_reg(0x25) | (0x1 << 10));
-       if ((agc_mode & 2) == 0) {
-               /* IF control */
-               /*freeze rf agc */
-               qam_write_reg(0x25,
-               qam_read_reg(0x25) | (0x1 << 13));
+       if (!is_ic_ver(IC_VER_TL1)) {
+               if ((agc_mode & 1) == 0)
+                       /* freeze if agc */
+                       qam_write_reg(0x25,
+                       qam_read_reg(0x25) | (0x1 << 10));
+               if ((agc_mode & 2) == 0) {
+                       /* IF control */
+                       /*freeze rf agc */
+                       qam_write_reg(0x25,
+                       qam_read_reg(0x25) | (0x1 << 13));
+               }
        }
+
        /*Maxlinear Tuner */
        /*dvbc_write_reg(QAM_BASE+0x094, 0x7f80292d); */
        /*dvbc_write_reg(QAM_BASE + 0x098, 0x9fcc8190);*/
@@ -432,40 +458,43 @@ void dvbc_reg_initial(struct aml_demod_sta *demod_sta)
 
        /* enable irq */
        qam_write_reg(0x34, 0x7fff << 3);
-#if 1
+
        /*if (is_meson_txlx_cpu()) {*/
-       if (is_ic_ver(IC_VER_TXLX)) {
+       if (is_ic_ver(IC_VER_TXLX) || (is_ic_ver(IC_VER_TL1))) {
                /*my_tool setting j83b mode*/
                qam_write_reg(0x7, 0x10f33);
-               /*j83b filter para*/
-               qam_write_reg(0x40, 0x3f010201);
-               qam_write_reg(0x41, 0x0a003a3b);
-               qam_write_reg(0x42, 0xe1ee030e);
-               qam_write_reg(0x43, 0x002601f2);
-               qam_write_reg(0x44, 0x009b006b);
-               qam_write_reg(0x45, 0xb3a1905);
-               qam_write_reg(0x46, 0x1c396e07);
-               qam_write_reg(0x47, 0x3801cc08);
-               qam_write_reg(0x48, 0x10800a2);
-               qam_write_reg(0x12, 0x50e1000);
-               qam_write_reg(0x30, 0x41f2f69);
-               /*j83b_symbolrate(please see register doc)*/
-               qam_write_reg(0x4d, 0x23d125f7);
-               /*for phase noise case 256qam*/
-               qam_write_reg(0x9c, 0x2a232100);
-               qam_write_reg(0x57, 0x606040d);
-               /*for phase noise case 64qam*/
-               qam_write_reg(0x54, 0x606050d);
-               qam_write_reg(0x52, 0x346dc);
+
+               if (demod_sta->dvb_mode == Gxtv_Atsc ||
+                       is_ic_ver(IC_VER_TXLX)) {
+                       /*j83b filter para*/
+                       qam_write_reg(0x40, 0x3f010201);
+                       qam_write_reg(0x41, 0x0a003a3b);
+                       qam_write_reg(0x42, 0xe1ee030e);
+                       qam_write_reg(0x43, 0x002601f2);
+                       qam_write_reg(0x44, 0x009b006b);
+                       qam_write_reg(0x45, 0xb3a1905);
+                       qam_write_reg(0x46, 0x1c396e07);
+                       qam_write_reg(0x47, 0x3801cc08);
+                       qam_write_reg(0x48, 0x10800a2);
+                       qam_write_reg(0x12, 0x50e1000);
+                       qam_write_reg(0x30, 0x41f2f69);
+                       /*j83b_symbolrate(please see register doc)*/
+                       qam_write_reg(0x4d, 0x23d125f7);
+                       /*for phase noise case 256qam*/
+                       qam_write_reg(0x9c, 0x2a232100);
+                       qam_write_reg(0x57, 0x606040d);
+                       /*for phase noise case 64qam*/
+                       qam_write_reg(0x54, 0x606050d);
+                       qam_write_reg(0x52, 0x346dc);
+               }
+
                qam_auto_scan(1);
        }
-#endif
-       if (!is_ic_ver(IC_VER_TL1)) {
-               qam_write_reg(0x7, 0x10f23);
-               qam_write_reg(0x3a, 0x0);
-               qam_write_reg(0x7, 0x10f33);
-               qam_write_reg(0x3a, 0x4);
-       }
+
+       qam_write_reg(0x7, 0x10f23);
+       qam_write_reg(0x3a, 0x0);
+       qam_write_reg(0x7, 0x10f33);
+       qam_write_reg(0x3a, 0x4);
 /*auto track*/
        /*      dvbc_set_auto_symtrack(); */
 }
index 5d43cab..743caac 100644 (file)
@@ -39,6 +39,18 @@ enum Gxtv_Demod_Dvb_Mode {
        Gxtv_Atsc = 2,
        Gxtv_Dtmb = 3,
 };
+
+enum demod_md {
+       UNKNOWN = 0,
+       AML_DVBC,
+       AML_DTMB,
+       AML_DVBT,
+       AML_ATSC,
+       AML_J83B,
+       AML_ISDBT,
+       AML_DVBT2
+};
+
 #define Adc_Clk_35M             35714  /* adc clk    dvbc */
 #define Demod_Clk_71M   71428  /* demod clk */
 
@@ -448,4 +460,7 @@ extern unsigned int dtmb_is_update_delay(void);
 extern unsigned int dtmb_get_delay_clear(void);
 extern unsigned int dtmb_is_have_check(void);
 extern void dtmb_poll_v3(void);
+extern enum demod_md demod_get_current_mode(void);
+extern unsigned int demod_dvbc_get_fast_search(void);
+extern void demod_dvbc_set_fast_search(unsigned int en);
 #endif
diff --git a/drivers/amlogic/media/dtv_demod/include/demod_dbg.h b/drivers/amlogic/media/dtv_demod/include/demod_dbg.h
new file mode 100644 (file)
index 0000000..a0b8661
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * drivers/amlogic/media/dtv_demod/include/demod_dbg.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.
+ *
+ */
+
+struct demod_debugfs_files_t {
+       const char *name;
+       const umode_t mode;
+       const struct file_operations *fops;
+};
+
+extern void aml_demod_dbg_init(void);
+extern void aml_demod_dbg_exit(void);
index 3329c30..e2c0606 100644 (file)
@@ -454,8 +454,9 @@ u16 tuner_get_ch_power3(void);
 
 int dtmb_get_power_strength(int agc_gain);
 
-
-
+extern int dvbc_get_power_strength(int agc_gain, int tuner_strength);
+extern int j83b_get_power_strength(int agc_gain, int tuner_strength);
+extern int atsc_get_power_strength(int agc_gain, int tuner_strength);
 
 /* dvbt */
 int dvbt_set_ch(struct aml_demod_sta *demod_sta,
@@ -498,6 +499,7 @@ extern void dvbc_reg_initial_old(struct aml_demod_sta *demod_sta);
 
 /*txlx*/
 extern void dvbc_reg_initial(struct aml_demod_sta *demod_sta);
+extern void demod_dvbc_set_qam(unsigned int qam);
 extern void dvbc_init_reg_ext(void);
 extern u32 dvbc_get_ch_sts(void);
 extern u32 dvbc_get_qam_mode(void);
index b594c5b..c664860 100644 (file)
@@ -33,21 +33,21 @@ bool aml_dma_release_contiguous(struct device *dev, struct page *pages,
 
 /*void ary_test(void);*/
 enum aml_fe_n_mode_t {         /*same as aml_fe_mode_t in aml_fe.h*/
-       AM_FE_UNKNOWN_N = 0,
-       AM_FE_QPSK_N = 1,
-       AM_FE_QAM_N = 2,
-       AM_FE_OFDM_N = 4,
-       AM_FE_ATSC_N = 8,
+       AM_FE_UNKNOWN_N,
+       AM_FE_QPSK_N,
+       AM_FE_QAM_N,
+       AM_FE_OFDM_N,
+       AM_FE_ATSC_N,
        /*AM_FE_ANALOG = 16,*/
-       AM_FE_DTMB_N = 32,
-       AM_FE_ISDBT_N = 64
+       AM_FE_DTMB_N,
+       AM_FE_ISDBT_N,
+       AM_FE_NUM,
 };
-
 /*----------------------------------*/
 
 struct aml_exp_func {
 
-       int (*leave_mode)(int mode);
+       int (*leave_mode)(enum aml_fe_n_mode_t mode);
 };
 
 #endif /*__DEPEND_H__*/
index 8fd69f6..bf3ba7d 100644 (file)
@@ -264,4 +264,72 @@ int dtmb_get_power_strength(int agc_gain)
        return strength;
 }
 
+/*tuner has 3 stage gain control, only last is controlled by demod agc*/
+static int dvbc_R842[20] = {
+       /*-90,-89,-88,  -87, -86  , -85 , -84 , -83  , -82 , -81dbm*/
+       1200, 1180, 1150, 1130, 1100, 1065, 1040, 1030, 1000, 970
+};
+
+int dvbc_get_power_strength(int agc_gain, int tuner_strength)
+{
+       int strength;
+       int i;
+
+       for (i = 0; i < sizeof(dvbc_R842)/sizeof(int); i++)
+               if (agc_gain >= dvbc_R842[i])
+                       break;
+
+       if (agc_gain >= 970)
+               strength = -90+i*1;
+       else
+               strength = tuner_strength + 22;
+
+       return strength;
+}
+
+static int j83b_R842[10] = {
+       /*-90,-89,-88,  -87, -86  , -85 , -84 , -83  , -82 , -81dbm*/
+       1140, 1110, 1080, 1060, 1030, 1000, 980, 1000, 970, 1000,
+       /*-80,-79,-78,  -77, -76  , -75 , -74 , -73  , -72 , -71dbm*/
+       /*970 ,    980, 960,  970, 950,   960,   970, 980,   960,   970*/
+};
+
+int  j83b_get_power_strength(int agc_gain, int tuner_strength)
+{
+       int strength;
+       int i;
+
+       for (i = 0; i < sizeof(j83b_R842)/sizeof(int); i++)
+               if (agc_gain >= j83b_R842[i])
+                       break;
+
+       if (agc_gain >= 970)
+               strength = -90+i*1;
+       else
+               strength = tuner_strength + 18;
+
+       return strength;
+}
+
+static int atsc_R842[6] = {
+       /*-90,-89,-88,  -87, -86  , -85 , -84 , -83  , -82 , -81dbm*/
+       2160, 2110, 2060, 2010, 1960, 1910/*, 1870, 1910, 1860, 1900*/
+};
+
+int atsc_get_power_strength(int agc_gain, int tuner_strength)
+{
+       int strength;
+       int i;
+
+       for (i = 0; i < sizeof(atsc_R842)/sizeof(int); i++)
+               if (agc_gain >= atsc_R842[i])
+                       break;
+
+       if (agc_gain >= 1910)
+               strength = -90+i*1;
+       else
+               strength = tuner_strength;
+
+       return strength;
+}
 
index 664ad0b..42cc0a6 100644 (file)
@@ -3248,7 +3248,7 @@ SKIP_DETECT:
                        vf_local_init();
                        vf_light_unreg_provider(&ppmgr_vf_prov);
                        msleep(30);
-                       vf_reg_provider(&ppmgr_vf_prov);
+                       vf_light_reg_provider(&ppmgr_vf_prov);
                        ppmgr_blocking = false;
                        up(&thread_sem);
                        PPMGRVPP_WARN("ppmgr rebuild from light-unregister\n");
index e6e5e90..2f44e5c 100644 (file)
@@ -931,7 +931,7 @@ static void xc5000_config_tv(struct dvb_frontend *fe,
 static int xc5000_set_tv_freq(struct dvb_frontend *fe)
 {
        struct xc5000_priv *priv = fe->tuner_priv;
-       u16 pll_lock_status;
+       u16 pll_lock_status = 0;
        int ret;
 
 tune_channel:
index e79e5b2..09f94ab 100644 (file)
@@ -300,12 +300,20 @@ struct buf_status {
 
 #define DECODER_ERROR_MASK     (0xffff<<16)
 
+
+enum E_ASPECT_RATIO {
+       ASPECT_RATIO_4_3,
+       ASPECT_RATIO_16_9,
+       ASPECT_UNDEFINED = 255
+};
+
 struct vdec_status {
        unsigned int width;
        unsigned int height;
        unsigned int fps;
        unsigned int error_count;
        unsigned int status;
+       enum E_ASPECT_RATIO euAspectRatio;
 };
 
 struct vdec_info {
@@ -325,6 +333,7 @@ struct vdec_info {
        unsigned long long total_data;
        unsigned int samp_cnt;
        unsigned int offset;
+       unsigned int ratio_control;
        char reserved[32];
 };
 
index 157359a..014f163 100644 (file)
@@ -92,6 +92,7 @@ extern int vf_notify_provider(const char *receiver_name, int event_type,
 extern int vf_notify_provider_by_name(const char *provider_name,
                                int event_type, void *data);
 
+void vf_light_reg_provider(struct vframe_provider_s *prov);
 void vf_light_unreg_provider(struct vframe_provider_s *prov);
 void vf_ext_light_unreg_provider(struct vframe_provider_s *prov);
 struct vframe_provider_s *vf_get_provider(const char *name);
index 333d364..57ccf3c 100644 (file)
@@ -112,6 +112,11 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct compat_timeval __user *, tv,
        struct timespec new_ts;
        struct timezone new_tz;
 
+#ifdef CONFIG_AMLOGIC_MODIFY
+       new_ts.tv_sec = 0;
+       new_ts.tv_nsec = 0;
+#endif
+
        if (tv) {
                if (compat_get_timeval(&user_tv, tv))
                        return -EFAULT;
index 21a27bb..1ac6189 100644 (file)
@@ -1222,6 +1222,10 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,
 {
        unsigned long long now;
 
+#ifdef CONFIG_AMLOGIC_MODIFY
+       now = 0;
+#endif
+
        WARN_ON_ONCE(clock_idx == CPUCLOCK_SCHED);
        cpu_timer_sample_group(clock_idx, tsk, &now);
 
index a5b6d98..9c2526a 100644 (file)
@@ -198,6 +198,11 @@ SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
        struct timespec new_ts;
        struct timezone new_tz;
 
+#ifdef CONFIG_AMLOGIC_MODIFY
+       new_ts.tv_sec = 0;
+       new_ts.tv_nsec = 0;
+#endif
+
        if (tv) {
                if (copy_from_user(&user_tv, tv, sizeof(*tv)))
                        return -EFAULT;
index cecf51a..f5afd24 100644 (file)
@@ -997,6 +997,10 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
        struct hlist_head *list;
        struct path path = { NULL, NULL };
 
+#ifdef CONFIG_AMLOGIC_MODIFY
+       hash = 0;
+#endif
+
        err = -EINVAL;
        if (addr_len < offsetofend(struct sockaddr_un, sun_family) ||
            sunaddr->sun_family != AF_UNIX)