2015-07-19 181 views
0

新的C語言,從看代碼我無法弄清楚如何初始化p_data。從我可以看出p_data是結構的一部分。
有人可以解釋如何初始化p_data?GCC編譯器錯誤,'p_data'可能未初始化使用

#ifdef CUST_LGE_TOUCH_BRING_UP 
struct synaptics_rmi4_data *rmi4_data; 
struct synaptics_rmi4_device_info *rmi; 
const struct synaptics_dsx_board_data *platform_data = 
     client->dev.platform_data; 
struct synaptics_dsx_board_data *p_data; 

printk("[Touch] %s START!!!!!!!!!!!!!!\n",__func__); 
#endif 

if (!i2c_check_functionality(client->adapter, 
     I2C_FUNC_SMBUS_BYTE_DATA)) { 
    dev_err(&client->dev, 
      "%s: SMBus byte data commands not supported by host\n", 
      __func__); 
    return -EIO; 
} 
#ifdef CUST_LGE_TOUCH_BRING_UP 
rmi4_data = kzalloc(sizeof(*rmi4_data), GFP_KERNEL); 
if (!rmi4_data) { 
    dev_err(&client->dev, 
      "%s: Failed to alloc mem for rmi4_data\n", 
      __func__); 
    return -ENOMEM; 
} 
#endif 

synaptics_dsx_i2c_device = kzalloc(
     sizeof(struct platform_device), 
     GFP_KERNEL); 
if (!synaptics_dsx_i2c_device) { 
    dev_err(&client->dev, 
      "%s: Failed to allocate memory for synaptics_dsx_i2c_device\n", 
      __func__); 
    ret = -ENOMEM; 
    goto err_alloc_dsx_i2c_device; 
} 

#ifdef CUST_LGE_TOUCH_BRING_UP 
if (client->dev.of_node) { 
    p_data = devm_kzalloc(&client->dev, 
     sizeof(struct synaptics_dsx_board_data), GFP_KERNEL); 
    if (!p_data) { 
     dev_err(&client->dev, "%s : Failed to allocate memory\n", __func__); 
     ret = -ENOMEM; 
     goto error_alloc_dsx_board_data; 
    } 

    retval = synaptics_rmi4_parse_dt(&client->dev, p_data); 
    platform_data = p_data; 
    client->dev.platform_data = p_data; 
    if (retval) { 
     printk("%s : Failed to parse device Tree",__func__); 
     ret = retval; 
     goto error; 
    } 

} else { 
    platform_data = client->dev.platform_data; 
    if (!platform_data) { 
     printk("%s : Failed to copy platform_data\n", __func__); 
     retval = -EINVAL; 
    } 
} 

printk("%s: Probing i2c RMI device, addr: 0x%02x\n", __func__, client->addr); 

rmi = &(rmi4_data->rmi4_mod_info); 

if (!platform_data) { 
    dev_err(&client->dev, 
      "%s: No platform data found\n", 
      __func__); 
    ret = -EINVAL; 
    goto error; 
} 

printk("[Touch D] x_flip = %d\n", platform_data->x_flip); 
printk("[Touch D] y_flip = %d\n", platform_data->y_flip); 
printk("[Touch D] regulator_en = %d\n", platform_data->regulator_en); 
printk("[Touch D] reset_gpio = %d\n", platform_data->reset_gpio); 
printk("[Touch D] irq_gpio = %d\n", platform_data->irq_gpio); 
printk("[Touch D] irq_flags = %lx\n", platform_data->irq_flags); 
printk("[Touch D] panel_x = %d\n", platform_data->panel_x); 
printk("[Touch D] panel_y = %d\n", platform_data->panel_y); 
printk("[Touch D] reset_delay_ms = %d\n", platform_data->reset_delay_ms); 

if (platform_data->regulator_en) { 
    rmi4_data->vreg_l22 = regulator_get(&client->dev, "vdd_ana"); 
    if (IS_ERR(rmi4_data->vreg_l22)) { 
     dev_err(&client->dev, 
       "%s: Failed to get regulator vreg_l22\n", 
       __func__); 
     retval = PTR_ERR(rmi4_data->vreg_l22); 
     ret = -retval; 
     goto error; 
    } 
    regulator_set_voltage(rmi4_data->vreg_l22, 3300000, 3300000); 
    regulator_enable(rmi4_data->vreg_l22); 

    rmi4_data->vreg_lvs3 = regulator_get(&client->dev, "vcc_i2c"); 
    if (IS_ERR(rmi4_data->vreg_lvs3)) { 
     dev_err(&client->dev, 
       "%s: Failed to get regulator vreg_l22\n", 
       __func__); 
     retval = PTR_ERR(rmi4_data->vreg_lvs3); 
     ret = -retval; 
     goto error; 
    } 
    regulator_enable(rmi4_data->vreg_lvs3); 
    }else 
    rmi4_power_on(client, 1); 
    msleep(400); 

printk("[Touch D] %s : Done regulator set!!! \n",__func__); 
#endif 

hw_if.board_data = client->dev.platform_data; 
hw_if.bus_access = &bus_access; 

synaptics_dsx_i2c_device->name = PLATFORM_DRIVER_NAME; 
synaptics_dsx_i2c_device->id = 0; 
synaptics_dsx_i2c_device->num_resources = 0; 
synaptics_dsx_i2c_device->dev.parent = &client->dev; 
synaptics_dsx_i2c_device->dev.platform_data = &hw_if; 
synaptics_dsx_i2c_device->dev.release = synaptics_rmi4_i2c_dev_release; 

retval = platform_device_register(synaptics_dsx_i2c_device); 
if (retval) { 
    dev_err(&client->dev, 
      "%s: Failed to register platform device\n", 
      __func__); 
    ret = -ENODEV; 
    goto error; 
} 

#ifdef CUST_LGE_TOUCH_BRING_UP 
printk("[Touch D] Complete %s !!! \n",__func__); 
#endif 
return 0; 

#ifdef CUST_LGE_TOUCH_BRING_UP 
error: 
devm_kfree(&client->dev, p_data); 
#endif 

最後一部分是編譯器警告的地方,可以,因爲error:是在返回0之後; ?

#ifdef CUST_LGE_TOUCH_BRING_UP 
error: 
devm_kfree(&client->dev, p_data); 
#endif 
+0

強烈建議重新考慮代碼,所以沒有'goto'語句。在出現錯誤的地方處理錯誤,而不是在代碼中的某些標籤之後。 – user3629249

回答

3

如果client->dev.of_node是假這裏

if (client->dev.of_node) { 

p_data從未初始化,但仍代碼最後調用

devm_kfree(&client->dev, p_data); 

因此警告。

爲了解決這個問題,你可能要改變這種

struct synaptics_dsx_board_data *p_data; 

struct synaptics_dsx_board_data *p_data = NULL; 

此修復程序假定devm_kfree(&client->dev, p_data);可以處理NULL是過去作爲最後一個參數。

+0

好的,將嘗試,看看這個作品 – Jcfunk

+0

@Jcfunk:我不知道我是否理解你的評論。關於如何初始化'p_data',請參閱上面的答案。 – alk

+0

對不起,堆棧溢出android應用程序不顯示您的整個答案,去網站,因爲我不能在評論中輸入代碼。它編譯,現在需要測試錯誤。感謝幫助 – Jcfunk

相關問題