Commit dd235832 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge tag 'thermal-v6.4-rc1-3' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux

Pull more thermal control changes for 6.4-rc1 from Daniel Lezcano:

"- Add compatible strings DT bindings for imx6sll and imx6ul to fix
   dtbs check warning (Stefan Wahren)

 - Update the example in the DT bindings to reflect changes with the
   ADC node name for QCom TM and TM5 (Marijn Suijten)

 - Fix the comments for the cpuidle_cooling_register() function to
   match the function prototype (Chenggang Wang)

 - Fix inconsistent temperature read and some Mediatek variant board
   reboot by reverting a change and handling the temperature
   differently (AngeloGioacchino Del Regno)

 - Fix a memory leak in the initialization error path for the Mediatek
   driver (Kang Chen)

 - Use of_address_to_resource() in the Mediatek driver (Rob Herring)

 - Fix unit address in the QCom tsens driver DT bindings (Krzysztof
   Kozlowski)"

* tag 'thermal-v6.4-rc1-3' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux:
  dt-bindings: thermal: qcom-tsens: Correct unit address
  thermal/drivers/mediatek: Use of_address_to_resource()
  thermal/drivers/mediatek: Change clk_prepare_enable to devm_clk_get_enabled in mtk_thermal_probe
  thermal/drivers/mediatek: Use devm_of_iomap to avoid resource leak in mtk_thermal_probe
  thermal/drivers/mediatek: Add temperature constraints to validate read
  Revert "thermal/drivers/mediatek: Add delay after thermal banks initialization"
  thermal/drivers/cpuidle_cooling: Delete unmatched comments
  dt-bindings: thermal: Use generic ADC node name in examples
  dt-bindings: imx-thermal: Add imx6sll and imx6ul compatible
parents 5e0ca0bf 2afa82d1
......@@ -12,10 +12,16 @@ maintainers:
properties:
compatible:
enum:
- fsl,imx6q-tempmon
- fsl,imx6sx-tempmon
- fsl,imx7d-tempmon
oneOf:
- enum:
- fsl,imx6q-tempmon
- fsl,imx6sx-tempmon
- fsl,imx7d-tempmon
- items:
- enum:
- fsl,imx6sll-tempmon
- fsl,imx6ul-tempmon
- const: fsl,imx6sx-tempmon
interrupts:
description: |
......
......@@ -124,8 +124,8 @@ examples:
#size-cells = <0>;
#io-channel-cells = <1>;
/* Other propreties are omitted */
adc-chan@4c {
/* Other properties are omitted */
channel@4c {
reg = <ADC5_XO_THERM_100K_PU>;
};
};
......
......@@ -178,10 +178,11 @@ examples:
#io-channel-cells = <1>;
/* Other properties are omitted */
conn-therm@4f {
channel@4f {
reg = <ADC5_AMUX_THM3_100K_PU>;
qcom,ratiometric;
qcom,hw-settle-time = <200>;
label = "conn_therm";
};
};
......@@ -217,16 +218,18 @@ examples:
#io-channel-cells = <1>;
/* Other properties are omitted */
xo-therm@44 {
channel@44 {
reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>;
qcom,ratiometric;
qcom,hw-settle-time = <200>;
label = "xo_therm";
};
conn-therm@147 {
channel@147 {
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>;
qcom,ratiometric;
qcom,hw-settle-time = <200>;
label = "conn_therm";
};
};
......
......@@ -326,7 +326,7 @@ examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
// Example 1 (new calbiration data: for pre v1 IP):
thermal-sensor@900000 {
thermal-sensor@4a9000 {
compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
reg = <0x4a9000 0x1000>, /* TM */
<0x4a8000 0x1000>; /* SROT */
......@@ -356,7 +356,7 @@ examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
// Example 1 (legacy: for pre v1 IP):
tsens1: thermal-sensor@900000 {
tsens1: thermal-sensor@4a9000 {
compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
reg = <0x4a9000 0x1000>, /* TM */
<0x4a8000 0x1000>; /* SROT */
......
......@@ -236,9 +236,6 @@ static int __cpuidle_cooling_register(struct device_node *np,
*
* This function is in charge of creating a cooling device per cpuidle
* driver and register it to the thermal framework.
*
* Return: zero on success, or negative value corresponding to the
* error detected in the underlying subsystems.
*/
void cpuidle_cooling_register(struct cpuidle_driver *drv)
{
......
......@@ -116,6 +116,10 @@
/* The calibration coefficient of sensor */
#define MT8173_CALIBRATION 165
/* Valid temperatures range */
#define MT8173_TEMP_MIN -20000
#define MT8173_TEMP_MAX 150000
/*
* Layout of the fuses providing the calibration data
* These macros could be used for MT8183, MT8173, MT2701, and MT2712.
......@@ -689,6 +693,11 @@ static const struct mtk_thermal_data mt7986_thermal_data = {
.version = MTK_THERMAL_V3,
};
static bool mtk_thermal_temp_is_valid(int temp)
{
return (temp >= MT8173_TEMP_MIN) && (temp <= MT8173_TEMP_MAX);
}
/**
* raw_to_mcelsius_v1 - convert a raw ADC value to mcelsius
* @mt: The thermal controller
......@@ -815,6 +824,17 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
temp = mt->raw_to_mcelsius(
mt, conf->bank_data[bank->id].sensors[i], raw);
/*
* Depending on the filt/sen intervals and ADC polling time,
* we may need up to 60 milliseconds after initialization: this
* will result in the first reading containing an out of range
* temperature value.
* Validate the reading to both address the aforementioned issue
* and to eventually avoid bogus readings during runtime in the
* event that the AUXADC gets unstable due to high EMI, etc.
*/
if (!mtk_thermal_temp_is_valid(temp))
temp = THERMAL_TEMP_INVALID;
if (temp > max)
max = temp;
......@@ -959,14 +979,12 @@ static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num,
static u64 of_get_phys_base(struct device_node *np)
{
u64 size64;
const __be32 *regaddr_p;
struct resource res;
regaddr_p = of_get_address(np, 0, &size64, NULL);
if (!regaddr_p)
if (of_address_to_resource(np, 0, &res))
return OF_BAD_ADDR;
return of_translate_address(np, regaddr_p);
return res.start;
}
static int mtk_thermal_extract_efuse_v1(struct mtk_thermal *mt, u32 *buf)
......@@ -1186,14 +1204,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)
mt->conf = of_device_get_match_data(&pdev->dev);
mt->clk_peri_therm = devm_clk_get(&pdev->dev, "therm");
if (IS_ERR(mt->clk_peri_therm))
return PTR_ERR(mt->clk_peri_therm);
mt->clk_auxadc = devm_clk_get(&pdev->dev, "auxadc");
if (IS_ERR(mt->clk_auxadc))
return PTR_ERR(mt->clk_auxadc);
mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(mt->thermal_base))
return PTR_ERR(mt->thermal_base);
......@@ -1212,7 +1222,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}
auxadc_base = of_iomap(auxadc, 0);
auxadc_base = devm_of_iomap(&pdev->dev, auxadc, 0, NULL);
if (IS_ERR(auxadc_base)) {
of_node_put(auxadc);
return PTR_ERR(auxadc_base);
}
auxadc_phys_base = of_get_phys_base(auxadc);
of_node_put(auxadc);
......@@ -1228,7 +1243,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV;
}
apmixed_base = of_iomap(apmixedsys, 0);
apmixed_base = devm_of_iomap(&pdev->dev, apmixedsys, 0, NULL);
if (IS_ERR(apmixed_base)) {
of_node_put(apmixedsys);
return PTR_ERR(apmixed_base);
}
apmixed_phys_base = of_get_phys_base(apmixedsys);
of_node_put(apmixedsys);
......@@ -1242,16 +1262,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)
if (ret)
return ret;
ret = clk_prepare_enable(mt->clk_auxadc);
if (ret) {
mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
if (IS_ERR(mt->clk_auxadc)) {
ret = PTR_ERR(mt->clk_auxadc);
dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
return ret;
}
ret = clk_prepare_enable(mt->clk_peri_therm);
if (ret) {
mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
if (IS_ERR(mt->clk_peri_therm)) {
ret = PTR_ERR(mt->clk_peri_therm);
dev_err(&pdev->dev, "Can't enable peri clk: %d\n", ret);
goto err_disable_clk_auxadc;
return ret;
}
mtk_thermal_turn_on_buffer(mt, apmixed_base);
......@@ -1273,43 +1295,20 @@ static int mtk_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mt);
/* Delay for thermal banks to be ready */
msleep(30);
tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops);
if (IS_ERR(tzdev)) {
ret = PTR_ERR(tzdev);
goto err_disable_clk_peri_therm;
}
if (IS_ERR(tzdev))
return PTR_ERR(tzdev);
ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev);
if (ret)
dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
return 0;
err_disable_clk_peri_therm:
clk_disable_unprepare(mt->clk_peri_therm);
err_disable_clk_auxadc:
clk_disable_unprepare(mt->clk_auxadc);
return ret;
}
static int mtk_thermal_remove(struct platform_device *pdev)
{
struct mtk_thermal *mt = platform_get_drvdata(pdev);
clk_disable_unprepare(mt->clk_peri_therm);
clk_disable_unprepare(mt->clk_auxadc);
return 0;
}
static struct platform_driver mtk_thermal_driver = {
.probe = mtk_thermal_probe,
.remove = mtk_thermal_remove,
.driver = {
.name = "mtk-thermal",
.of_match_table = mtk_thermal_of_match,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment