hdmitx: move work_internal_intr to delayed_work [1/1]
authorZongdong Jiao <zongdong.jiao@amlogic.com>
Mon, 22 Apr 2019 09:20:09 +0000 (17:20 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Tue, 23 Apr 2019 03:21:17 +0000 (20:21 -0700)
PD#SWPL-6894

Problem:
Queue work 'work_internal_intr' cause the hdcp22 flicker

Solution:
Move work_internal_intr to delayed_work

Verify:
G12/U212

Change-Id: Ib05c82bb66c9ad7396790d5eb237ff486c56c980
Signed-off-by: Zongdong Jiao <zongdong.jiao@amlogic.com>
drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c
drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c
include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h

index 5e1a461..c4c86f7 100644 (file)
@@ -4009,7 +4009,7 @@ static void hdmitx_hpd_plugout_handler(struct work_struct *work)
 
 static void hdmitx_internal_intr_handler(struct work_struct *work)
 {
-       struct hdmitx_dev *hdev = container_of((struct work_struct *)work,
+       struct hdmitx_dev *hdev = container_of((struct delayed_work *)work,
                struct hdmitx_dev, work_internal_intr);
 
        hdev->HWOp.DebugFun(hdev, "dumpintr");
@@ -4062,7 +4062,7 @@ static int hdmi_task_handle(void *data)
                hdmitx_hpd_plugin_handler);
        INIT_DELAYED_WORK(&hdmitx_device->work_hpd_plugout,
                hdmitx_hpd_plugout_handler);
-       INIT_WORK(&hdmitx_device->work_internal_intr,
+       INIT_DELAYED_WORK(&hdmitx_device->work_internal_intr,
                hdmitx_internal_intr_handler);
 
        /* for rx sense feature */
index 5ca9cf3..7bf3202 100644 (file)
@@ -647,9 +647,7 @@ static irqreturn_t intr_handler(int irq, void *dev)
        hdmitx_wr_reg(HDMITX_TOP_INTR_STAT_CLR, ~0);
        hdmitx_wr_reg(HDMITX_DWC_HDCP22REG_STAT, 0xff);
 
-       pr_info(SYS "irq %x\n", dat_top);
-       if (dat_dwc)
-               pr_info(SYS "irq %x\n", dat_dwc);
+       pr_info(SYS "irq %x %x\n", dat_top, dat_dwc);
 
        if (hdev->hpd_lock == 1) {
                pr_info(HW "HDMI hpd locked\n");
@@ -681,7 +679,8 @@ static irqreturn_t intr_handler(int irq, void *dev)
        /* internal interrupt */
        if (dat_top & (1 << 0)) {
                hdev->hdmitx_event |= HDMI_TX_INTERNAL_INTR;
-               queue_work(hdev->hdmi_wq, &hdev->work_internal_intr);
+               queue_delayed_work(hdev->hdmi_wq,
+                       &hdev->work_internal_intr, HZ / 10);
        }
        if (dat_top & (1 << 3)) {
                unsigned int rd_nonce_mode =
@@ -2972,11 +2971,9 @@ do { \
 
 #define DUMP_HDMITXREG_SECTION(start, end) \
 do { \
-       if (start > end) { \
-               pr_info("Error start = 0x%lx > end = 0x%lx\n", start, end); \
+       if (start > end) \
                break; \
-       } \
-       pr_info("Start = 0x%lx   End = 0x%lx\n", start, end); \
+\
        for (addr = start; addr < end + 1; addr++) { \
                val = hdmitx_rd_reg(addr); \
                if (val) \
@@ -2988,7 +2985,12 @@ static void hdmitx_dump_intr(void)
 {
        unsigned int addr = 0, val = 0;
 
-       DUMP_HDMITXREG_SECTION(HDMITX_DWC_IH_FC_STAT0, HDMITX_DWC_IH_MUTE);
+       DUMP_HDMITXREG_SECTION(HDMITX_DWC_IH_FC_STAT0,
+               HDMITX_DWC_IH_I2CMPHY_STAT0);
+       DUMP_HDMITXREG_SECTION(HDMITX_DWC_IH_DECODE, HDMITX_DWC_IH_DECODE);
+       DUMP_HDMITXREG_SECTION(HDMITX_DWC_IH_MUTE_FC_STAT0,
+               HDMITX_DWC_IH_MUTE_I2CMPHY_STAT0);
+       DUMP_HDMITXREG_SECTION(HDMITX_DWC_IH_MUTE, HDMITX_DWC_IH_MUTE);
 }
 
 static void mode420_half_horizontal_para(void)
index 6542996..3bbc0d2 100644 (file)
@@ -310,7 +310,7 @@ struct hdmitx_dev {
        struct delayed_work work_hpd_plugin;
        struct delayed_work work_hpd_plugout;
        struct delayed_work work_rxsense;
-       struct work_struct work_internal_intr;
+       struct delayed_work work_internal_intr;
        struct work_struct work_hdr;
        struct delayed_work work_do_hdcp;
 #ifdef CONFIG_AML_HDMI_TX_14