diff --git a/drivers/thermal/sy7636a_thermal.c b/drivers/thermal/sy7636a_thermal.c index 8bdbee26a3a9..80499f134c1e 100644 --- a/drivers/thermal/sy7636a_thermal.c +++ b/drivers/thermal/sy7636a_thermal.c @@ -18,57 +18,35 @@ #include #include #include +#include #include struct sy7636a_data { struct sy7636a *sy7636a; struct thermal_zone_device *thermal_zone_dev; + struct regulator *regulator; }; static int sy7636a_get_temp(void *arg, int *res) { - unsigned int reg_val, mode_ctr; + unsigned int reg_val; int ret; struct sy7636a_data *data = arg; - bool isVoltageActive; - mutex_lock(&data->sy7636a->reglock); - - ret = regmap_read(data->sy7636a->regmap, - SY7636A_REG_OPERATION_MODE_CRL, &mode_ctr); + ret = regulator_enable(data->regulator); if (ret) - goto done; - - isVoltageActive = mode_ctr & SY7636A_OPERATION_MODE_CRL_ONOFF; - - if (!isVoltageActive) { - ret = regmap_write(data->sy7636a->regmap, - SY7636A_REG_OPERATION_MODE_CRL, - mode_ctr | SY7636A_OPERATION_MODE_CRL_ONOFF); - if (ret) - goto done; - usleep_range(1000, 1500); - } + return ret; ret = regmap_read(data->sy7636a->regmap, SY7636A_REG_TERMISTOR_READOUT, ®_val); - if (ret) - goto done; - if (!isVoltageActive) { - ret = regmap_write(data->sy7636a->regmap, - SY7636A_REG_OPERATION_MODE_CRL, - mode_ctr); - if (ret) - goto done; + if (!ret) { + *res = *((signed char*)®_val); + *res *= 1000; } - *res = *((signed char*)®_val); - *res *= 1000; - - done: - mutex_unlock(&data->sy7636a->reglock); + regulator_disable(data->regulator); return ret; } @@ -91,6 +69,14 @@ static int sy7636a_thermal_probe(struct platform_device *pdev) platform_set_drvdata(pdev, data); + data->regulator = devm_regulator_get(&pdev->dev, "vcom"); + if (IS_ERR(data->regulator)) { + dev_err(&pdev->dev, + "Unable to get vcom regulator, returned %ld\n", + PTR_ERR(data->regulator)); + return PTR_ERR(data->regulator); + } + data->sy7636a = sy7636a; data->thermal_zone_dev = devm_thermal_zone_of_sensor_register( pdev->dev.parent,