lcd: fix code coverity
authorEvoke Zhang <evoke.zhang@amlogic.com>
Wed, 20 Jun 2018 10:28:48 +0000 (18:28 +0800)
committerYixun Lan <yixun.lan@amlogic.com>
Tue, 3 Jul 2018 06:05:10 +0000 (23:05 -0700)
PD#168738: lcd: fix code coverity

Change-Id: I24eac191b7168a949c17fcb0478b4caee1453e4b
Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
12 files changed:
drivers/amlogic/media/vout/backlight/aml_bl.c
drivers/amlogic/media/vout/backlight/bl_extern/i2c_lp8556.c
drivers/amlogic/media/vout/lcd/lcd_clk_config.c
drivers/amlogic/media/vout/lcd/lcd_common.h
drivers/amlogic/media/vout/lcd/lcd_debug.c
drivers/amlogic/media/vout/lcd/lcd_extern/i2c_T5800Q.c
drivers/amlogic/media/vout/lcd/lcd_extern/i2c_anx6345.c
drivers/amlogic/media/vout/lcd/lcd_extern/lcd_extern.c
drivers/amlogic/media/vout/lcd/lcd_tablet/lcd_drv.c
drivers/amlogic/media/vout/lcd/lcd_tablet/mipi_dsi_util.c
drivers/amlogic/media/vout/lcd/lcd_unifykey.c
include/linux/amlogic/media/vout/lcd/lcd_extern.h

index 751a9bf..7536707 100644 (file)
@@ -330,7 +330,8 @@ static void bl_gpio_set(int index, int value)
 }
 
 /* ****************************************************** */
-static char *bl_pinmux_str[] = {
+#define BL_PINMUX_MAX    6
+static char *bl_pinmux_str[BL_PINMUX_MAX] = {
        "pwm_on",               /* 0 */
        "pwm_vs_on",            /* 1 */
        "pwm_combo_0_1_on",     /* 2 */
@@ -368,6 +369,11 @@ static void bl_pwm_pinmux_set(struct bl_config_s *bconf)
                break;
        }
 
+       if (index >= BL_PINMUX_MAX) {
+               BLERR("%s: pinmux index %d is invalid\n", __func__, index);
+               return;
+       }
+
        /* request pwm pinmux */
        bconf->pin = devm_pinctrl_get_select(bl_drv->dev, bl_pinmux_str[index]);
        if (IS_ERR(bconf->pin)) {
index d214153..77e1a2a 100644 (file)
@@ -55,14 +55,13 @@ static unsigned char init_off_table[] = {
        0xff, 0x00, 0x00, 0x00, //ending
 };
 
-static int i2c_lp8556_write(unsigned char *buff, unsigned int len)
+static int i2c_lp8556_write(struct i2c_client *i2client,
+               unsigned char *buff, unsigned int len)
 {
        int ret = 0;
-       struct aml_bl_extern_i2c_dev_s *i2c_dev = aml_bl_extern_i2c_get_dev();
-
        struct i2c_msg msg[] = {
                {
-                       .addr = i2c_dev->client->addr,
+                       .addr = i2client->addr,
                        .flags = 0,
                        .len = len,
                        .buf = buff,
@@ -70,15 +69,9 @@ static int i2c_lp8556_write(unsigned char *buff, unsigned int len)
        };
        BLEX("%s\n", __func__);
 
-       if (i2c_dev == NULL) {
-               BLEXERR("invalid i2c device\n");
-               return -1;
-       }
-
-       ret = i2c_transfer(i2c_dev->client->adapter, msg, 1);
+       ret = i2c_transfer(i2client->adapter, msg, 1);
        if (ret < 0)
-               BLEXERR("i2c write failed [addr 0x%02x]\n",
-                       i2c_dev->client->addr);
+               BLEXERR("i2c write failed [addr 0x%02x]\n", i2client->addr);
 
        return ret;
 }
@@ -88,6 +81,8 @@ static int i2c_lp8556_power_cmd(unsigned char *init_table)
        int i = 0, len;
        int ret = 0;
        struct aml_bl_extern_driver_s *bl_extern = aml_bl_extern_get_driver();
+       struct aml_bl_extern_i2c_dev_s *i2c_dev = aml_bl_extern_i2c_get_dev();
+
        BLEX("%s\n", __func__);
 
        len = BL_EXTERN_CMD_SIZE;
@@ -97,7 +92,11 @@ static int i2c_lp8556_power_cmd(unsigned char *init_table)
                } else if (init_table[i] == BL_EXTERN_INIT_NONE) {
                        /* do nothing, only for delay */
                } else if (init_table[i] == BL_EXTERN_INIT_CMD) {
-                       ret = i2c_lp8556_write(
+                       if (i2c_dev == NULL) {
+                               BLEXERR("invalid i2c device\n");
+                               return -1;
+                       }
+                       ret = i2c_lp8556_write(i2c_dev->client,
                                &init_table[i+1], (len-2));
                } else {
                        BLEXERR("%s(%d: %s): power_type %d is invalid\n",
@@ -157,6 +156,7 @@ static int i2c_lp8556_set_level(unsigned int level)
        int ret = 0;
        struct aml_bl_drv_s *bl_drv = aml_bl_get_driver();
        struct aml_bl_extern_driver_s *bl_extern = aml_bl_extern_get_driver();
+       struct aml_bl_extern_i2c_dev_s *i2c_dev = aml_bl_extern_i2c_get_dev();
        unsigned int level_max, level_min;
        unsigned int dim_max, dim_min;
 
@@ -170,10 +170,14 @@ static int i2c_lp8556_set_level(unsigned int level)
                        (level_max - level_min);
        level &= 0xff;
 
+       if (i2c_dev == NULL) {
+               BLEXERR("invalid i2c device\n");
+               return -1;
+       }
        if (bl_status) {
                tData[0] = 0x0;
                tData[1] = level;
-               ret = i2c_lp8556_write(tData, 2);
+               ret = i2c_lp8556_write(i2c_dev->client, tData, 2);
        }
        return ret;
 }
index cd5121d..ef7645a 100644 (file)
@@ -2127,10 +2127,13 @@ void lcd_clk_generate_parameter(struct lcd_config_s *pconf)
        }
 }
 
+static char lcd_ss_str[10] = {
+       'u', 'n', 'k', 'n', 'o', 'w', 'n', '\0',
+};
 char *lcd_get_spread_spectrum(void)
 {
        char *ss_str;
-       int ss_level;
+       unsigned int ss_level;
        struct aml_lcd_drv_s *lcd_drv = aml_lcd_get_driver();
 
        ss_level = lcd_drv->lcd_config->lcd_timing.ss_level;
@@ -2143,7 +2146,7 @@ char *lcd_get_spread_spectrum(void)
                ss_str = lcd_pll_ss_table_txlx[ss_level];
                break;
        default:
-               ss_str = "unknown";
+               ss_str = lcd_ss_str;
                break;
        }
 
index fad4a3d..92411f6 100644 (file)
@@ -27,7 +27,8 @@
 /* 20180122: support txlx, optimize lcd noitfier event */
 /* 20180226: g12a support */
 /* 20180425: tvconfig suuport */
-#define LCD_DRV_VERSION    "20180425"
+/* 20180620: fix coverity errors */
+#define LCD_DRV_VERSION    "20180620"
 
 #define VPP_OUT_SATURATE            (1 << 0)
 
index a410dfa..9c6927d 100644 (file)
@@ -2227,16 +2227,16 @@ static ssize_t lcd_debug_dump_show(struct class *class,
        switch (lcd_debug_dump_state) {
        case LCD_DEBUG_DUMP_INFO:
                len = lcd_info_print(print_buf, 0);
-               len += lcd_power_info_print((print_buf+len), len);
+               lcd_power_info_print((print_buf+len), len);
                break;
        case LCD_DEBUG_DUMP_REG:
-               len = lcd_reg_print(print_buf, 0);
+               lcd_reg_print(print_buf, 0);
                break;
        case LCD_DEBUG_DUMP_HDR:
-               len = lcd_hdr_info_print(print_buf, 0);
+               lcd_hdr_info_print(print_buf, 0);
                break;
        default:
-               len = sprintf(print_buf, "%s: invalid command\n", __func__);
+               sprintf(print_buf, "%s: invalid command\n", __func__);
                break;
        }
        len = sprintf(buf, "%s\n", print_buf);
index 1fed5a0..38f8a42 100644 (file)
@@ -114,8 +114,7 @@ static int lcd_extern_power_cmd(unsigned char *init_table, int flag)
                                EXTERR("invalid i2c device\n");
                                return -1;
                        }
-                       ret = lcd_extern_i2c_write(
-                               i2c_device->client,
+                       ret = lcd_extern_i2c_write(i2c_device->client,
                                &init_table[i+1], (cmd_size-2));
                } else {
                        EXTERR("%s(%d: %s): power_type %d is invalid\n",
index df2fa82..40c6388 100644 (file)
@@ -118,6 +118,10 @@ static int SP_TX_Write_Reg(unsigned char addr, unsigned char reg,
        else if (addr == 0x72)
                client = aml_anx6345_72_client;
 
+       if (client == NULL) {
+               EXTERR("%s: invalid i2c client\n", __func__);
+               return -1;
+       }
        ret = aml_i2c_write(client, buff, 1);
        return ret;
 }
@@ -134,6 +138,10 @@ static int SP_TX_Read_Reg(unsigned char addr, unsigned char reg,
        else if (addr == 0x72)
                client = aml_anx6345_72_client;
 
+       if (client == NULL) {
+               EXTERR("%s: invalid i2c client\n", __func__);
+               return -1;
+       }
        ret = aml_i2c_read(client, data, 1);
        return ret;
 }
index ab60e19..f5db99d 100644 (file)
@@ -1402,6 +1402,7 @@ static int lcd_extern_get_config(void)
                        GFP_KERNEL);
        if (lcd_ext_init_off_table == NULL) {
                EXTERR("failed to alloc default init table\n");
+               kfree(lcd_ext_init_on_table);
                return -1;
        }
        lcd_ext_init_on_table[0] = LCD_EXTERN_INIT_END;
index f749d32..52d6789 100644 (file)
@@ -494,8 +494,8 @@ static void lcd_vbyone_clk_util_set(struct lcd_config_s *pconf)
        unsigned int div_sel, phy_div;
 
        phy_div = pconf->lcd_control.vbyone_config->phy_div;
+       lcd_bits = pconf->lcd_basic.lcd_bits;
 
-       lcd_bits = 10;
        switch (lcd_bits) {
        case 6:
                div_sel = 0;
@@ -965,6 +965,7 @@ int lcd_tablet_driver_init(void)
                lcd_vx1_wait_hpd();
                lcd_vbyone_phy_set(pconf, 1);
                lcd_tablet_vbyone_wait_stable();
+               break;
        case LCD_MIPI:
                lcd_mipi_phy_set(pconf, 1);
                lcd_mipi_control_set(pconf, 1);
@@ -1003,6 +1004,7 @@ void lcd_tablet_driver_disable(void)
                lcd_vbyone_phy_set(pconf, 0);
                lcd_vbyone_pinmux_set(0);
                lcd_vbyone_disable();
+               break;
        case LCD_MIPI:
                mipi_dsi_link_off(pconf);
                lcd_mipi_phy_set(pconf, 0);
index e0737a0..175a3a3 100644 (file)
@@ -291,23 +291,30 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
                sprintf(propname, "dsi_init_off");
        }
 
-       para = kmalloc(sizeof(unsigned int)*100, GFP_KERNEL);
+       para = kcalloc(n_max, sizeof(unsigned int), GFP_KERNEL);
        if (para == NULL) {
                LCDERR("%s: Not enough memory\n", __func__);
                return -1;
        }
        ret = of_property_read_u32_index(m_node, propname, 0, &para[0]);
        if (ret) {
-               LCDERR("faild to get %s\n", propname);
-               kfree(para);
-               return -1;
+               LCDERR("failed to get %s\n", propname);
+               goto lcd_mipi_dsi_init_table_detect_err;
        }
        i = 0;
        while ((i + 1) < n_max) {
                ret = of_property_read_u32_index(m_node, propname, i, &val);
+               if (ret) {
+                       LCDERR("failed to get %s\n", propname);
+                       goto lcd_mipi_dsi_init_table_detect_err;
+               }
                if (val == 0xff) {
                        ret = of_property_read_u32_index(m_node,
                                propname, (i+1), &val);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        i += 2;
                        if (val == 0xff)
                                break;
@@ -315,11 +322,19 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
                        /*  probe gpio */
                        ret = of_property_read_u32_index(m_node,
                                propname, (i + DSI_GPIO_INDEX), &val);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        lcd_cpu_gpio_probe(val);
 
-                       /*  cmd size */
+                       /* cmd size */
                        ret = of_property_read_u32_index(m_node,
                                propname, (i + DSI_CMD_SIZE_INDEX), &val);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        if (val < 3) {
                                LCDERR("get %s wrong cmd_size %d for gpio\n",
                                        propname, val);
@@ -334,6 +349,10 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
                } else if (val == 0xfc) { /* check state */
                        ret = of_property_read_u32_index(m_node,
                                propname, (i + DSI_CMD_SIZE_INDEX), &val);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        if ((i + 2 + val) >= n_max) {
                                LCDERR("get %s cmd_size out of max for check\n",
                                        propname);
@@ -342,8 +361,16 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
 
                        ret = of_property_read_u32_index(m_node, propname,
                                (i + DSI_CMD_SIZE_INDEX + 1), &para[0]);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        ret = of_property_read_u32_index(m_node, propname,
                                (i + DSI_CMD_SIZE_INDEX + 2), &para[1]);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        dconf->check_reg = para[0];
                        dconf->check_cnt = para[1];
                        if (dconf->check_cnt > 0)
@@ -356,6 +383,10 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
                } else {
                        ret = of_property_read_u32_index(m_node,
                                propname, (i + DSI_CMD_SIZE_INDEX), &val);
+                       if (ret) {
+                               LCDERR("failed to get %s\n", propname);
+                               goto lcd_mipi_dsi_init_table_detect_err;
+                       }
                        if ((i + 2 + val) >= n_max) {
                                LCDERR("get %s cmd_size out of max\n",
                                        propname);
@@ -367,7 +398,8 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
        i = (i > n_max) ? n_max : i;
        ret = of_property_read_u32_array(m_node, propname, &para[0], i);
        if (ret) {
-               LCDERR("faild to get %s\n", propname);
+               LCDERR("failed to get %s\n", propname);
+               goto lcd_mipi_dsi_init_table_detect_err;
        } else {
                for (j = 0; j < i; j++)
                        dsi_table[j] = (unsigned char)(para[j] & 0xff);
@@ -377,6 +409,10 @@ int lcd_mipi_dsi_init_table_detect(struct device_node *m_node,
                mipi_dsi_init_table_print(dconf, on_off);
 
        kfree(para);
+       return 0;
+
+lcd_mipi_dsi_init_table_detect_err:
+       kfree(para);
        return ret;
 }
 
index d7a9cbc..9438913 100644 (file)
@@ -122,22 +122,23 @@ int lcd_unifykey_check(char *key_name)
        if (lcd_debug_print_flag)
                LCDUKEY("%s size: %d\n", key_name, key_len);
 
-lcd_unifykey_read:
        buf = kzalloc((sizeof(unsigned char) * key_len), GFP_KERNEL);
        if (!buf) {
                LCDUKEYERR("%s: Not enough memory\n", __func__);
                return -1;
        }
+
+lcd_unifykey_check_read:
        ret = key_unify_read(get_ukdev(), key_name, buf, key_len, &key_len);
        if (ret < 0) {
                LCDUKEYERR("%s unify read error\n", key_name);
-               return -1;
+               goto lcd_unifykey_check_err;
        }
 
        /* check header */
        if (key_len <= LCD_UKEY_HEAD_SIZE) {
                LCDUKEYERR("%s unify key_len %d error\n", key_name, key_len);
-               return -1;
+               goto lcd_unifykey_check_err;
        }
        lcd_unifykey_header_check(buf, &key_header);
        if (key_len != key_header.data_len) {  /* length check */
@@ -147,11 +148,11 @@ lcd_unifykey_read:
                }
                if (retry_cnt < LCD_UKEY_RETRY_CNT_MAX) {
                        retry_cnt++;
-                       goto lcd_unifykey_read;
-               } else {
-                       LCDUKEYERR("%s: load unifykey failed\n", key_name);
-                       return -1;
+                       memset(buf, 0, key_len);
+                       goto lcd_unifykey_check_read;
                }
+               LCDUKEYERR("%s: load unifykey failed\n", key_name);
+               goto lcd_unifykey_check_err;
        }
        key_crc32 = cal_crc32(0, &buf[4], (key_len - 4)); /* except crc32 */
        if (lcd_debug_print_flag) {
@@ -163,14 +164,19 @@ lcd_unifykey_read:
                        key_header.crc32, key_crc32);
                if (retry_cnt < LCD_UKEY_RETRY_CNT_MAX) {
                        retry_cnt++;
-                       goto lcd_unifykey_read;
-               } else {
-                       LCDUKEYERR("%s: load unifykey failed\n", key_name);
-                       return -1;
+                       memset(buf, 0, key_len);
+                       goto lcd_unifykey_check_read;
                }
+               LCDUKEYERR("%s: load unifykey failed\n", key_name);
+               goto lcd_unifykey_check_err;
        }
 
+       kfree(buf);
        return 0;
+
+lcd_unifykey_check_err:
+       kfree(buf);
+       return -1;
 }
 
 int lcd_unifykey_get(char *key_name, unsigned char *buf, int *len)
index 58306d1..4f95c78 100644 (file)
@@ -90,7 +90,7 @@ struct aml_lcd_extern_driver_s {
 };
 
 struct aml_lcd_extern_i2c_dev_s {
-       char name[20];
+       char name[30];
        struct i2c_client *client;
 };