mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-24 10:10:20 -04:00
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
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user