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: ...@@ -12,10 +12,16 @@ maintainers:
properties: properties:
compatible: compatible:
enum: oneOf:
- enum:
- fsl,imx6q-tempmon - fsl,imx6q-tempmon
- fsl,imx6sx-tempmon - fsl,imx6sx-tempmon
- fsl,imx7d-tempmon - fsl,imx7d-tempmon
- items:
- enum:
- fsl,imx6sll-tempmon
- fsl,imx6ul-tempmon
- const: fsl,imx6sx-tempmon
interrupts: interrupts:
description: | description: |
......
...@@ -124,8 +124,8 @@ examples: ...@@ -124,8 +124,8 @@ examples:
#size-cells = <0>; #size-cells = <0>;
#io-channel-cells = <1>; #io-channel-cells = <1>;
/* Other propreties are omitted */ /* Other properties are omitted */
adc-chan@4c { channel@4c {
reg = <ADC5_XO_THERM_100K_PU>; reg = <ADC5_XO_THERM_100K_PU>;
}; };
}; };
......
...@@ -178,10 +178,11 @@ examples: ...@@ -178,10 +178,11 @@ examples:
#io-channel-cells = <1>; #io-channel-cells = <1>;
/* Other properties are omitted */ /* Other properties are omitted */
conn-therm@4f { channel@4f {
reg = <ADC5_AMUX_THM3_100K_PU>; reg = <ADC5_AMUX_THM3_100K_PU>;
qcom,ratiometric; qcom,ratiometric;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
label = "conn_therm";
}; };
}; };
...@@ -217,16 +218,18 @@ examples: ...@@ -217,16 +218,18 @@ examples:
#io-channel-cells = <1>; #io-channel-cells = <1>;
/* Other properties are omitted */ /* Other properties are omitted */
xo-therm@44 { channel@44 {
reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>; reg = <PMK8350_ADC7_AMUX_THM1_100K_PU>;
qcom,ratiometric; qcom,ratiometric;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
label = "xo_therm";
}; };
conn-therm@147 { channel@147 {
reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>; reg = <PM8350_ADC7_AMUX_THM4_100K_PU(1)>;
qcom,ratiometric; qcom,ratiometric;
qcom,hw-settle-time = <200>; qcom,hw-settle-time = <200>;
label = "conn_therm";
}; };
}; };
......
...@@ -326,7 +326,7 @@ examples: ...@@ -326,7 +326,7 @@ examples:
- | - |
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
// Example 1 (new calbiration data: for pre v1 IP): // Example 1 (new calbiration data: for pre v1 IP):
thermal-sensor@900000 { thermal-sensor@4a9000 {
compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1"; compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
reg = <0x4a9000 0x1000>, /* TM */ reg = <0x4a9000 0x1000>, /* TM */
<0x4a8000 0x1000>; /* SROT */ <0x4a8000 0x1000>; /* SROT */
...@@ -356,7 +356,7 @@ examples: ...@@ -356,7 +356,7 @@ examples:
- | - |
#include <dt-bindings/interrupt-controller/arm-gic.h> #include <dt-bindings/interrupt-controller/arm-gic.h>
// Example 1 (legacy: for pre v1 IP): // Example 1 (legacy: for pre v1 IP):
tsens1: thermal-sensor@900000 { tsens1: thermal-sensor@4a9000 {
compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1"; compatible = "qcom,msm8916-tsens", "qcom,tsens-v0_1";
reg = <0x4a9000 0x1000>, /* TM */ reg = <0x4a9000 0x1000>, /* TM */
<0x4a8000 0x1000>; /* SROT */ <0x4a8000 0x1000>; /* SROT */
......
...@@ -236,9 +236,6 @@ static int __cpuidle_cooling_register(struct device_node *np, ...@@ -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 * This function is in charge of creating a cooling device per cpuidle
* driver and register it to the thermal framework. * 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) void cpuidle_cooling_register(struct cpuidle_driver *drv)
{ {
......
...@@ -116,6 +116,10 @@ ...@@ -116,6 +116,10 @@
/* The calibration coefficient of sensor */ /* The calibration coefficient of sensor */
#define MT8173_CALIBRATION 165 #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 * Layout of the fuses providing the calibration data
* These macros could be used for MT8183, MT8173, MT2701, and MT2712. * These macros could be used for MT8183, MT8173, MT2701, and MT2712.
...@@ -689,6 +693,11 @@ static const struct mtk_thermal_data mt7986_thermal_data = { ...@@ -689,6 +693,11 @@ static const struct mtk_thermal_data mt7986_thermal_data = {
.version = MTK_THERMAL_V3, .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 * raw_to_mcelsius_v1 - convert a raw ADC value to mcelsius
* @mt: The thermal controller * @mt: The thermal controller
...@@ -815,6 +824,17 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank) ...@@ -815,6 +824,17 @@ static int mtk_thermal_bank_temperature(struct mtk_thermal_bank *bank)
temp = mt->raw_to_mcelsius( temp = mt->raw_to_mcelsius(
mt, conf->bank_data[bank->id].sensors[i], raw); 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) if (temp > max)
max = temp; max = temp;
...@@ -959,14 +979,12 @@ static void mtk_thermal_init_bank(struct mtk_thermal *mt, int num, ...@@ -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) static u64 of_get_phys_base(struct device_node *np)
{ {
u64 size64; struct resource res;
const __be32 *regaddr_p;
regaddr_p = of_get_address(np, 0, &size64, NULL); if (of_address_to_resource(np, 0, &res))
if (!regaddr_p)
return OF_BAD_ADDR; 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) 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) ...@@ -1186,14 +1204,6 @@ static int mtk_thermal_probe(struct platform_device *pdev)
mt->conf = of_device_get_match_data(&pdev->dev); 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); mt->thermal_base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(mt->thermal_base)) if (IS_ERR(mt->thermal_base))
return PTR_ERR(mt->thermal_base); return PTR_ERR(mt->thermal_base);
...@@ -1212,7 +1222,12 @@ static int mtk_thermal_probe(struct platform_device *pdev) ...@@ -1212,7 +1222,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV; 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); auxadc_phys_base = of_get_phys_base(auxadc);
of_node_put(auxadc); of_node_put(auxadc);
...@@ -1228,7 +1243,12 @@ static int mtk_thermal_probe(struct platform_device *pdev) ...@@ -1228,7 +1243,12 @@ static int mtk_thermal_probe(struct platform_device *pdev)
return -ENODEV; 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); apmixed_phys_base = of_get_phys_base(apmixedsys);
of_node_put(apmixedsys); of_node_put(apmixedsys);
...@@ -1242,16 +1262,18 @@ static int mtk_thermal_probe(struct platform_device *pdev) ...@@ -1242,16 +1262,18 @@ static int mtk_thermal_probe(struct platform_device *pdev)
if (ret) if (ret)
return ret; return ret;
ret = clk_prepare_enable(mt->clk_auxadc); mt->clk_auxadc = devm_clk_get_enabled(&pdev->dev, "auxadc");
if (ret) { if (IS_ERR(mt->clk_auxadc)) {
ret = PTR_ERR(mt->clk_auxadc);
dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret); dev_err(&pdev->dev, "Can't enable auxadc clk: %d\n", ret);
return ret; return ret;
} }
ret = clk_prepare_enable(mt->clk_peri_therm); mt->clk_peri_therm = devm_clk_get_enabled(&pdev->dev, "therm");
if (ret) { 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); 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); mtk_thermal_turn_on_buffer(mt, apmixed_base);
...@@ -1273,43 +1295,20 @@ static int mtk_thermal_probe(struct platform_device *pdev) ...@@ -1273,43 +1295,20 @@ static int mtk_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mt); platform_set_drvdata(pdev, mt);
/* Delay for thermal banks to be ready */
msleep(30);
tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt, tzdev = devm_thermal_of_zone_register(&pdev->dev, 0, mt,
&mtk_thermal_ops); &mtk_thermal_ops);
if (IS_ERR(tzdev)) { if (IS_ERR(tzdev))
ret = PTR_ERR(tzdev); return PTR_ERR(tzdev);
goto err_disable_clk_peri_therm;
}
ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev); ret = devm_thermal_add_hwmon_sysfs(&pdev->dev, tzdev);
if (ret) if (ret)
dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs"); dev_warn(&pdev->dev, "error in thermal_add_hwmon_sysfs");
return 0; 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 = { static struct platform_driver mtk_thermal_driver = {
.probe = mtk_thermal_probe, .probe = mtk_thermal_probe,
.remove = mtk_thermal_remove,
.driver = { .driver = {
.name = "mtk-thermal", .name = "mtk-thermal",
.of_match_table = mtk_thermal_of_match, .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