--- a/drivers/thermal/qcom/tsens-ipq8064.c +++ b/drivers/thermal/qcom/tsens-ipq8064.c @@ -13,10 +13,12 @@ */ #include +#include #include #include #include #include +#include #include #include #include @@ -211,9 +213,8 @@ static void tsens_scheduler_fn(struct wo struct tsens_priv *priv = container_of(work, struct tsens_priv, tsens_work); unsigned int threshold, threshold_low, code, reg, sensor, mask; - unsigned int sensor_addr; bool upper_th_x, lower_th_x; - int adc_code, ret; + int ret; ret = regmap_read(priv->tm_map, STATUS_CNTL_8064, ®); if (ret) @@ -262,9 +263,8 @@ static void tsens_scheduler_fn(struct wo if (upper_th_x || lower_th_x) { /* Notify user space */ schedule_work(&priv->sensor[0].notify_work); - regmap_read(priv->tm_map, sensor_addr, &adc_code); pr_debug("Trigger (%d degrees) for sensor %d\n", - code_to_degC(adc_code, &priv->sensor[0]), 0); + code_to_degC(code, &priv->sensor[0]), 0); } } regmap_write(priv->tm_map, STATUS_CNTL_8064, reg & mask); @@ -404,40 +404,55 @@ err_put_device: static int calibrate_ipq8064(struct tsens_priv *priv) { int i; - char *data, *data_backup; - + int ret = 0; + u8 *data, *data_backup; + struct device *dev = priv->dev; ssize_t num_read = priv->num_sensors; struct tsens_sensor *s = priv->sensor; - data = qfprom_read(priv->dev, "calib"); + data = qfprom_read(dev, "calib"); if (IS_ERR(data)) { - pr_err("Calibration not found.\n"); - return PTR_ERR(data); + ret = PTR_ERR(data); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Calibration not found."); + goto exit; } - data_backup = qfprom_read(priv->dev, "calib_backup"); + data_backup = qfprom_read(dev, "calib_backup"); if (IS_ERR(data_backup)) { - pr_err("Backup calibration not found.\n"); - return PTR_ERR(data_backup); + ret = PTR_ERR(data_backup); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Backup Calibration not found."); + goto free_data; } for (i = 0; i < num_read; i++) { s[i].calib_data = readb_relaxed(data + i); - s[i].calib_data_backup = readb_relaxed(data_backup + i); + + if (!s[i].calib_data) { + s[i].calib_data_backup = readb_relaxed(data_backup + i); + + if (!s[i].calib_data_backup) { + dev_err(dev, "QFPROM TSENS calibration data not present"); + ret = -ENODEV; + goto free_backup; + } - if (s[i].calib_data_backup) s[i].calib_data = s[i].calib_data_backup; - if (!s[i].calib_data) { - pr_err("QFPROM TSENS calibration data not present\n"); - return -ENODEV; } + s[i].slope = tsens_8064_slope[i]; s[i].offset = CAL_MDEGC - (s[i].calib_data * s[i].slope); } hw_init(priv); - return 0; +free_backup: + kfree(data_backup); +free_data: + kfree(data); +exit: + return ret; } static int get_temp_ipq8064(struct tsens_priv *priv, int id, int *temp)