cec: cec a support multi-logical addr for tm2 [1/1]
authorYong Qin <yong.qin@amlogic.com>
Thu, 9 May 2019 11:55:51 +0000 (19:55 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Fri, 10 May 2019 02:46:27 +0000 (19:46 -0700)
PD#SWPL-5637

Problem:
1.verify cec a function on tm2
2.cec a support multi-address

Solution:
verify the cec a multi-addr function

Verify:
ab311

Change-Id: I641621212fa3096b3906a87d443c7bd40cb6d7e9
Signed-off-by: Yong Qin <yong.qin@amlogic.com>
drivers/amlogic/cec/hdmi_ao_cec.c
drivers/amlogic/cec/hdmi_ao_cec.h

index bda8680..269824d 100644 (file)
@@ -963,20 +963,31 @@ void cec_logicaddr_set(int l_add)
 
                CEC_INFO("set cecb logical addr:0x%x\n", l_add);
        } else {
-               /*clear all logical address*/
-               aocec_wr_reg(CEC_LOGICAL_ADDR0, 0);
-               aocec_wr_reg(CEC_LOGICAL_ADDR1, 0);
-               aocec_wr_reg(CEC_LOGICAL_ADDR2, 0);
-               aocec_wr_reg(CEC_LOGICAL_ADDR3, 0);
-               aocec_wr_reg(CEC_LOGICAL_ADDR4, 0);
+               if (cec_dev->plat_data->ceca_ver == CECA_VER_0) {
+                       /*clear all logical address*/
+                       aocec_wr_reg(CEC_LOGICAL_ADDR0, 0);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR1, 0);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR2, 0);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR3, 0);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR4, 0);
 
-               cec_hw_buf_clear();
-               aocec_wr_reg(CEC_LOGICAL_ADDR0, (l_add & 0xf));
-               udelay(100);
-               aocec_wr_reg(CEC_LOGICAL_ADDR0, (0x1 << 4) | (l_add & 0xf));
-               if (cec_msg_dbg_en)
-                       CEC_INFO("set cec alogical addr:0x%x\n",
-                               aocec_rd_reg(CEC_LOGICAL_ADDR0));
+                       cec_hw_buf_clear();
+                       aocec_wr_reg(CEC_LOGICAL_ADDR0, (l_add & 0xf));
+                       udelay(100);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR0,
+                               (0x1 << 4) | (l_add & 0xf));
+                       if (cec_msg_dbg_en)
+                               CEC_INFO("set cec alogical addr:0x%x\n",
+                                       aocec_rd_reg(CEC_LOGICAL_ADDR0));
+               } else {
+                       if (l_add < 8)
+                               aocec_wr_reg(CEC_LOGICAL_ADDR0, 1 << l_add);
+                       else
+                               aocec_wr_reg(CEC_LOGICAL_ADDR1,
+                                       1 << (l_add - 8) | 0x80);
+
+                       CEC_INFO("set ceca logical addr:0x%x\n", l_add);
+               }
        }
 }
 
@@ -985,29 +996,42 @@ void ceca_addr_add(unsigned int l_add)
        unsigned int addr;
        unsigned int i;
 
-       /* check if the logical addr is exist ? */
-       for (i = CEC_LOGICAL_ADDR0; i <= CEC_LOGICAL_ADDR4; i++) {
-               addr = aocec_rd_reg(i);
-               if ((addr & 0x10) && ((addr & 0xf) == (l_add & 0xf))) {
-                       CEC_INFO("add 0x%x exist\n", l_add);
-                       return;
+       if (cec_dev->plat_data->ceca_ver == CECA_VER_0) {
+               /* check if the logical addr is exist ? */
+               for (i = CEC_LOGICAL_ADDR0; i <= CEC_LOGICAL_ADDR4; i++) {
+                       addr = aocec_rd_reg(i);
+                       if ((addr & 0x10) && ((addr & 0xf) == (l_add & 0xf))) {
+                               CEC_INFO("add 0x%x exist\n", l_add);
+                               return;
+                       }
                }
-       }
 
-       /* find a empty place */
-       for (i = CEC_LOGICAL_ADDR0; i <= CEC_LOGICAL_ADDR4; i++) {
-               addr = aocec_rd_reg(i);
-               if (addr & 0x10) {
-                       CEC_INFO(" skip 0x%x ,val=0x%x\n", i, addr);
-                       continue;
+               /* find a empty place */
+               for (i = CEC_LOGICAL_ADDR0; i <= CEC_LOGICAL_ADDR4; i++) {
+                       addr = aocec_rd_reg(i);
+                       if (addr & 0x10) {
+                               CEC_INFO(" skip 0x%x ,val=0x%x\n", i, addr);
+                               continue;
+                       } else {
+                               cec_hw_buf_clear();
+                               aocec_wr_reg(i, (l_add & 0xf));
+                               udelay(100);
+                               aocec_wr_reg(i, (l_add & 0xf)|0x10);
+                               CEC_INFO("cec a add addr %d at 0x%x\n",
+                                       l_add, i);
+                               break;
+                       }
+               }
+       } else {
+               /*every bit means a logical address*/
+               if (l_add < 8) {
+                       addr = aocec_rd_reg(CEC_LOGICAL_ADDR0);
+                       addr |= (1 << l_add);
+                       aocec_wr_reg(CEC_LOGICAL_ADDR0, addr);
                } else {
-                       cec_hw_buf_clear();
-                       aocec_wr_reg(i, (l_add & 0xf));
-                       udelay(100);
-                       aocec_wr_reg(i, (l_add & 0xf)|0x10);
-                       CEC_INFO("cec a add addr %d at 0x%x\n",
-                               l_add, i);
-                       break;
+                       addr = aocec_rd_reg(CEC_LOGICAL_ADDR1);
+                       addr |= (1 << (l_add - 8));
+                       aocec_wr_reg(CEC_LOGICAL_ADDR1, addr);
                }
        }
 }
@@ -1056,16 +1080,30 @@ void cec_logicaddr_remove(unsigned int cec_sel, unsigned int l_add)
                }
                CEC_INFO("cec b remove addr %d\n", l_add);
        } else {
-               for (i = CEC_LOGICAL_ADDR0; i <= CEC_LOGICAL_ADDR4; i++) {
-                       addr = aocec_rd_reg(i);
-                       if ((addr & 0xf) == (l_add & 0xf)) {
-                               aocec_wr_reg(i, (addr & 0xf));
-                               udelay(100);
-                               aocec_wr_reg(i, 0);
-                               cec_hw_buf_clear();
-                               CEC_INFO("cec a rm addr %d at 0x%x\n",
-                                       l_add, i);
+               if (cec_dev->plat_data->ceca_ver == CECA_VER_0) {
+                       for (i = CEC_LOGICAL_ADDR0;
+                               i <= CEC_LOGICAL_ADDR4; i++) {
+                               addr = aocec_rd_reg(i);
+                               if ((addr & 0xf) == (l_add & 0xf)) {
+                                       aocec_wr_reg(i, (addr & 0xf));
+                                       udelay(100);
+                                       aocec_wr_reg(i, 0);
+                                       cec_hw_buf_clear();
+                                       CEC_INFO("cec a rm addr %d at 0x%x\n",
+                                               l_add, i);
+                               }
                        }
+               } else {
+                       if (l_add < 8) {
+                               addr = aocec_rd_reg(CEC_LOGICAL_ADDR0);
+                               addr &= ~(1 << l_add);
+                               aocec_wr_reg(CEC_LOGICAL_ADDR0, addr);
+                       } else {
+                               addr = aocec_rd_reg(CEC_LOGICAL_ADDR1);
+                               addr &= ~(1 << (l_add - 8));
+                               aocec_wr_reg(CEC_LOGICAL_ADDR1, addr);
+                       }
+                       CEC_INFO("cec a remove addr %d\n", l_add);
                }
        }
 }
@@ -2780,6 +2818,9 @@ void cec_dump_info(void)
        CEC_ERR("hpd_state:0x%x\n", cec_dev->tx_dev->hpd_state);
        CEC_ERR("cec_config:0x%x\n", cec_config(0, 0));
        CEC_ERR("log_addr:0x%x\n", cec_dev->cec_info.log_addr);
+       CEC_ERR("ceca_ver:0x%x\n", cec_dev->plat_data->ceca_ver);
+       CEC_ERR("cecb_ver:0x%x\n", cec_dev->plat_data->cecb_ver);
+
        port = kcalloc(cec_dev->port_num, sizeof(*port), GFP_KERNEL);
        if (port) {
                init_cec_port_info(port, cec_dev);
@@ -3102,6 +3143,7 @@ static const struct cec_platform_data_s cec_gxl_data = {
        .line_bit = 8,
        .ee_to_ao = 0,
        .ceca_sts_reg = 0,
+       .ceca_ver = CECA_VER_0,
        .cecb_ver = CECB_VER_0,
 };
 
@@ -3110,6 +3152,7 @@ static const struct cec_platform_data_s cec_txlx_data = {
        .line_bit = 7,
        .ee_to_ao = 1,
        .ceca_sts_reg = 0,
+       .ceca_ver = CECA_VER_0,
        .cecb_ver = CECB_VER_1,
 };
 
index 5613c5c..aba634b 100644 (file)
@@ -20,7 +20,7 @@
 
 
 
-#define CEC_DRIVER_VERSION     "Ver 2019/3/25\n"
+#define CEC_DRIVER_VERSION     "2019/5/9:tm2 cec a support multi-addr"
 
 #define CEC_FRAME_DELAY                msecs_to_jiffies(400)
 #define CEC_DEV_NAME           "cec"
 #define HR_DELAY(n)            (ktime_set(0, n * 1000 * 1000))
 
 enum cecaver {
-       /*first version*/
+       /*
+        * first version, only support one logical addr
+        * "0xf" broadcast addr is default on
+        */
        CECA_VER_0 = 0,
 
-       /*support multi logical address*/
+       /*
+        * support multi logical address, "0xf" broadcast
+        * addr is default on
+        */
        CECA_VER_1 = 1,
 };
 
 enum cecbver {
-       /*first version*/
+       /* first version
+        * support multi logical address, "0xf" broadcast
+        * addr is default on
+        */
        CECB_VER_0 = 0,
        /*ee to ao */
        CECB_VER_1 = 1,