mirror of https://gitee.com/openkylin/linux.git
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal
Pull thermal driver fixes from Eduardo Valentin: "This week we have few fixes: - fix in IMX thermal driver to do the correct loading sequence with CPUfreq - fix in Exynos related to TMU_CONTROL offset in Exynos5260 - fix the unit conversion in int3403" [ Still pulling from Eduardo as Rui Zhang is on a business trip and has troubles with his machine ] * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/evalenti/linux-soc-thermal: imx: thermal: imx_get_temp might be called before sensor clock is prepared thermal: exynos: use correct offset for TMU_CONTROL register on Exynos5260 thermal: imx: correct driver load sequence for cpu cooling Thermal/int3403: Fix thermal hysteresis unit conversion
This commit is contained in:
commit
999f81dd19
|
@ -459,6 +459,10 @@ static int imx_thermal_probe(struct platform_device *pdev)
|
||||||
int measure_freq;
|
int measure_freq;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!cpufreq_get_current_driver()) {
|
||||||
|
dev_dbg(&pdev->dev, "no cpufreq driver!");
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
}
|
||||||
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
|
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
|
||||||
if (!data)
|
if (!data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -521,6 +525,30 @@ static int imx_thermal_probe(struct platform_device *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
if (IS_ERR(data->thermal_clk)) {
|
||||||
|
ret = PTR_ERR(data->thermal_clk);
|
||||||
|
if (ret != -EPROBE_DEFER)
|
||||||
|
dev_err(&pdev->dev,
|
||||||
|
"failed to get thermal clk: %d\n", ret);
|
||||||
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Thermal sensor needs clk on to get correct value, normally
|
||||||
|
* we should enable its clk before taking measurement and disable
|
||||||
|
* clk after measurement is done, but if alarm function is enabled,
|
||||||
|
* hardware will auto measure the temperature periodically, so we
|
||||||
|
* need to keep the clk always on for alarm function.
|
||||||
|
*/
|
||||||
|
ret = clk_prepare_enable(data->thermal_clk);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
|
||||||
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
data->tz = thermal_zone_device_register("imx_thermal_zone",
|
data->tz = thermal_zone_device_register("imx_thermal_zone",
|
||||||
IMX_TRIP_NUM,
|
IMX_TRIP_NUM,
|
||||||
BIT(IMX_TRIP_PASSIVE), data,
|
BIT(IMX_TRIP_PASSIVE), data,
|
||||||
|
@ -531,26 +559,11 @@ static int imx_thermal_probe(struct platform_device *pdev)
|
||||||
ret = PTR_ERR(data->tz);
|
ret = PTR_ERR(data->tz);
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"failed to register thermal zone device %d\n", ret);
|
"failed to register thermal zone device %d\n", ret);
|
||||||
|
clk_disable_unprepare(data->thermal_clk);
|
||||||
cpufreq_cooling_unregister(data->cdev);
|
cpufreq_cooling_unregister(data->cdev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->thermal_clk = devm_clk_get(&pdev->dev, NULL);
|
|
||||||
if (IS_ERR(data->thermal_clk)) {
|
|
||||||
dev_warn(&pdev->dev, "failed to get thermal clk!\n");
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* Thermal sensor needs clk on to get correct value, normally
|
|
||||||
* we should enable its clk before taking measurement and disable
|
|
||||||
* clk after measurement is done, but if alarm function is enabled,
|
|
||||||
* hardware will auto measure the temperature periodically, so we
|
|
||||||
* need to keep the clk always on for alarm function.
|
|
||||||
*/
|
|
||||||
ret = clk_prepare_enable(data->thermal_clk);
|
|
||||||
if (ret)
|
|
||||||
dev_warn(&pdev->dev, "failed to enable thermal clk: %d\n", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Enable measurements at ~ 10 Hz */
|
/* Enable measurements at ~ 10 Hz */
|
||||||
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
|
regmap_write(map, TEMPSENSE1 + REG_CLR, TEMPSENSE1_MEASURE_FREQ);
|
||||||
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
|
measure_freq = DIV_ROUND_UP(32768, 10); /* 10 Hz */
|
||||||
|
|
|
@ -92,7 +92,13 @@ static int sys_get_trip_hyst(struct thermal_zone_device *tzone,
|
||||||
if (ACPI_FAILURE(status))
|
if (ACPI_FAILURE(status))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
*temp = DECI_KELVIN_TO_MILLI_CELSIUS(hyst, KELVIN_OFFSET);
|
/*
|
||||||
|
* Thermal hysteresis represents a temperature difference.
|
||||||
|
* Kelvin and Celsius have same degree size. So the
|
||||||
|
* conversion here between tenths of degree Kelvin unit
|
||||||
|
* and Milli-Celsius unit is just to multiply 100.
|
||||||
|
*/
|
||||||
|
*temp = hyst * 100;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -264,7 +264,6 @@ struct exynos_tmu_init_data const exynos5250_default_tmu_data = {
|
||||||
static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
static const struct exynos_tmu_registers exynos5260_tmu_registers = {
|
||||||
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
.triminfo_data = EXYNOS_TMU_REG_TRIMINFO,
|
||||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL,
|
||||||
.tmu_ctrl = EXYNOS_TMU_REG_CONTROL1,
|
|
||||||
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
.therm_trip_mode_shift = EXYNOS_TMU_TRIP_MODE_SHIFT,
|
||||||
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
.therm_trip_mode_mask = EXYNOS_TMU_TRIP_MODE_MASK,
|
||||||
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
.therm_trip_en_shift = EXYNOS_TMU_THERM_TRIP_EN_SHIFT,
|
||||||
|
|
|
@ -75,7 +75,6 @@
|
||||||
#define EXYNOS_MAX_TRIGGER_PER_REG 4
|
#define EXYNOS_MAX_TRIGGER_PER_REG 4
|
||||||
|
|
||||||
/* Exynos5260 specific */
|
/* Exynos5260 specific */
|
||||||
#define EXYNOS_TMU_REG_CONTROL1 0x24
|
|
||||||
#define EXYNOS5260_TMU_REG_INTEN 0xC0
|
#define EXYNOS5260_TMU_REG_INTEN 0xC0
|
||||||
#define EXYNOS5260_TMU_REG_INTSTAT 0xC4
|
#define EXYNOS5260_TMU_REG_INTSTAT 0xC4
|
||||||
#define EXYNOS5260_TMU_REG_INTCLEAR 0xC8
|
#define EXYNOS5260_TMU_REG_INTCLEAR 0xC8
|
||||||
|
|
Loading…
Reference in New Issue