Commit 51699e4c authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

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

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

"- Do preparating cleaning and DT bindings for RK3588 support
   (Sebastian Reichel)

 - Add driver support for RK3588 (Finley Xiao)

 - Use devm_reset_control_array_get_exclusive() for the Rockchip driver
   (Ye Xingchen)

 - Detect power gated thermal zones and return -EAGAIN when reading the
   temperature (Mikko Perttunen)

 - Remove thermal_bind_params structure as it is unused (Zhang Rui)

 - Drop unneeded quotes in DT bindings allowing to run yamllint (Rob
   Herring)

 - Update the power allocator documentation according to the thermal
   trace relocation (Lukas Bulwahn)

 - Fix sensor 1 interrupt status bitmask for the Mediatek LVTS sensor
   (Chen-Yu Tsai)

 - Use the dev_err_probe() helper in the Amlogic driver (Ye Xingchen)

 - Add AP domain support to LVTS thermal controllers for mt8195
   (Balsam CHIHI)

 - Remove buggy call to thermal_of_zone_unregister() (Daniel Lezcano)

 - Make thermal_of_zone_[un]register() private to the thermal OF code
   (Daniel Lezcano)

 - Create a private copy of the thermal zone device parameters
   structure when registering a thermal zone (Daniel Lezcano)"

* tag 'thermal-v6.4-rc1-2' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/thermal/linux:
  thermal/core: Alloc-copy-free the thermal zone parameters structure
  thermal/of: Unexport unused OF functions
  thermal/drivers/bcm2835: Remove buggy call to thermal_of_zone_unregister
  thermal/drivers/mediatek/lvts_thermal: Add AP domain for mt8195
  dt-bindings: thermal: mediatek: Add AP domain to LVTS thermal controllers for mt8195
  thermal: amlogic: Use dev_err_probe()
  thermal/drivers/mediatek/lvts_thermal: Fix sensor 1 interrupt status bitmask
  MAINTAINERS: adjust entry in THERMAL/POWER_ALLOCATOR after header movement
  dt-bindings: thermal: Drop unneeded quotes
  thermal/core: Remove thermal_bind_params structure
  thermal/drivers/tegra-bpmp: Handle offline zones
  thermal/drivers/rockchip: use devm_reset_control_array_get_exclusive()
  dt-bindings: rockchip-thermal: Support the RK3588 SoC compatible
  thermal/drivers/rockchip: Support RK3588 SoC in the thermal driver
  thermal/drivers/rockchip: Support dynamic sized sensor array
  thermal/drivers/rockchip: Simplify channel id logic
  thermal/drivers/rockchip: Use dev_err_probe
  thermal/drivers/rockchip: Simplify clock logic
  thermal/drivers/rockchip: Simplify getting match data
parents cfeeb7d3 3d439b1a
...@@ -30,7 +30,7 @@ properties: ...@@ -30,7 +30,7 @@ properties:
amlogic,ao-secure: amlogic,ao-secure:
description: phandle to the ao-secure syscon description: phandle to the ao-secure syscon
$ref: '/schemas/types.yaml#/definitions/phandle' $ref: /schemas/types.yaml#/definitions/phandle
'#thermal-sensor-cells': '#thermal-sensor-cells':
const: 0 const: 0
......
...@@ -40,11 +40,11 @@ properties: ...@@ -40,11 +40,11 @@ properties:
- const: temp_grade - const: temp_grade
fsl,tempmon: fsl,tempmon:
$ref: '/schemas/types.yaml#/definitions/phandle' $ref: /schemas/types.yaml#/definitions/phandle
description: Phandle to anatop system controller node. description: Phandle to anatop system controller node.
fsl,tempmon-data: fsl,tempmon-data:
$ref: '/schemas/types.yaml#/definitions/phandle' $ref: /schemas/types.yaml#/definitions/phandle
description: | description: |
Deprecated property, phandle pointer to fuse controller that contains Deprecated property, phandle pointer to fuse controller that contains
TEMPMON calibration data, e.g. OCOTP on imx6q. The details about TEMPMON calibration data, e.g. OCOTP on imx6q. The details about
......
...@@ -29,14 +29,14 @@ properties: ...@@ -29,14 +29,14 @@ properties:
maxItems: 1 maxItems: 1
fsl,tmu-range: fsl,tmu-range:
$ref: '/schemas/types.yaml#/definitions/uint32-array' $ref: /schemas/types.yaml#/definitions/uint32-array
description: | description: |
The values to be programmed into TTRnCR, as specified by the SoC The values to be programmed into TTRnCR, as specified by the SoC
reference manual. The first cell is TTR0CR, the second is TTR1CR, etc. reference manual. The first cell is TTR0CR, the second is TTR1CR, etc.
maxItems: 4 maxItems: 4
fsl,tmu-calibration: fsl,tmu-calibration:
$ref: '/schemas/types.yaml#/definitions/uint32-matrix' $ref: /schemas/types.yaml#/definitions/uint32-matrix
description: | description: |
A list of cell pairs containing temperature calibration data, as A list of cell pairs containing temperature calibration data, as
specified by the SoC reference manual. The first cell of each pair specified by the SoC reference manual. The first cell of each pair
......
...@@ -19,6 +19,7 @@ properties: ...@@ -19,6 +19,7 @@ properties:
- rockchip,rk3368-tsadc - rockchip,rk3368-tsadc
- rockchip,rk3399-tsadc - rockchip,rk3399-tsadc
- rockchip,rk3568-tsadc - rockchip,rk3568-tsadc
- rockchip,rk3588-tsadc
- rockchip,rv1108-tsadc - rockchip,rv1108-tsadc
reg: reg:
......
...@@ -304,42 +304,6 @@ temperature) and throttle appropriate devices. ...@@ -304,42 +304,6 @@ temperature) and throttle appropriate devices.
1.4 Thermal Zone Parameters 1.4 Thermal Zone Parameters
--------------------------- ---------------------------
::
struct thermal_bind_params
This structure defines the following parameters that are used to bind
a zone with a cooling device for a particular trip point.
.cdev:
The cooling device pointer
.weight:
The 'influence' of a particular cooling device on this
zone. This is relative to the rest of the cooling
devices. For example, if all cooling devices have a
weight of 1, then they all contribute the same. You can
use percentages if you want, but it's not mandatory. A
weight of 0 means that this cooling device doesn't
contribute to the cooling of this zone unless all cooling
devices have a weight of 0. If all weights are 0, then
they all contribute the same.
.trip_mask:
This is a bit mask that gives the binding relation between
this thermal zone and cdev, for a particular trip point.
If nth bit is set, then the cdev and thermal zone are bound
for trip point n.
.binding_limits:
This is an array of cooling state limits. Must have
exactly 2 * thermal_zone.number_of_trip_points. It is an
array consisting of tuples <lower-state upper-state> of
state limits. Each trip will be associated with one state
limit tuple when binding. A NULL pointer means
<THERMAL_NO_LIMITS THERMAL_NO_LIMITS> on all trips.
These limits are used when binding a cdev to a trip point.
.match:
This call back returns success(0) if the 'tz and cdev' need to
be bound, as per platform data.
:: ::
struct thermal_zone_params struct thermal_zone_params
...@@ -357,10 +321,6 @@ temperature) and throttle appropriate devices. ...@@ -357,10 +321,6 @@ temperature) and throttle appropriate devices.
will be created. when no_hwmon == true, nothing will be done. will be created. when no_hwmon == true, nothing will be done.
In case the thermal_zone_params is NULL, the hwmon interface In case the thermal_zone_params is NULL, the hwmon interface
will be created (for backward compatibility). will be created (for backward compatibility).
.num_tbps:
Number of thermal_bind_params entries for this zone
.tbp:
thermal_bind_params entries
2. sysfs attributes structure 2. sysfs attributes structure
============================= =============================
......
...@@ -20771,7 +20771,7 @@ L: linux-pm@vger.kernel.org ...@@ -20771,7 +20771,7 @@ L: linux-pm@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/driver-api/thermal/power_allocator.rst F: Documentation/driver-api/thermal/power_allocator.rst
F: drivers/thermal/gov_power_allocator.c F: drivers/thermal/gov_power_allocator.c
F: include/trace/events/thermal_power_allocator.h F: drivers/thermal/thermal_trace_ipa.h
THINKPAD ACPI EXTRAS DRIVER THINKPAD ACPI EXTRAS DRIVER
M: Henrique de Moraes Holschuh <hmh@hmh.eng.br> M: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
......
...@@ -262,11 +262,8 @@ static int amlogic_thermal_probe(struct platform_device *pdev) ...@@ -262,11 +262,8 @@ static int amlogic_thermal_probe(struct platform_device *pdev)
return PTR_ERR(pdata->regmap); return PTR_ERR(pdata->regmap);
pdata->clk = devm_clk_get(dev, NULL); pdata->clk = devm_clk_get(dev, NULL);
if (IS_ERR(pdata->clk)) { if (IS_ERR(pdata->clk))
if (PTR_ERR(pdata->clk) != -EPROBE_DEFER) return dev_err_probe(dev, PTR_ERR(pdata->clk), "failed to get clock\n");
dev_err(dev, "failed to get clock\n");
return PTR_ERR(pdata->clk);
}
pdata->sec_ao_map = syscon_regmap_lookup_by_phandle pdata->sec_ao_map = syscon_regmap_lookup_by_phandle
(pdev->dev.of_node, "amlogic,ao-secure"); (pdev->dev.of_node, "amlogic,ao-secure");
......
...@@ -275,7 +275,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev) ...@@ -275,7 +275,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
return 0; return 0;
err_tz: err_tz:
thermal_of_zone_unregister(tz); devm_thermal_of_zone_unregister(&pdev->dev, tz);
err_clk: err_clk:
clk_disable_unprepare(data->clk); clk_disable_unprepare(data->clk);
...@@ -285,10 +285,8 @@ static int bcm2835_thermal_probe(struct platform_device *pdev) ...@@ -285,10 +285,8 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
static int bcm2835_thermal_remove(struct platform_device *pdev) static int bcm2835_thermal_remove(struct platform_device *pdev)
{ {
struct bcm2835_thermal_data *data = platform_get_drvdata(pdev); struct bcm2835_thermal_data *data = platform_get_drvdata(pdev);
struct thermal_zone_device *tz = data->tz;
debugfs_remove_recursive(data->debugfsdir); debugfs_remove_recursive(data->debugfsdir);
thermal_of_zone_unregister(tz);
clk_disable_unprepare(data->clk); clk_disable_unprepare(data->clk);
return 0; return 0;
......
...@@ -66,7 +66,7 @@ ...@@ -66,7 +66,7 @@
#define LVTS_MONINT_CONF 0x9FBF7BDE #define LVTS_MONINT_CONF 0x9FBF7BDE
#define LVTS_INT_SENSOR0 0x0009001F #define LVTS_INT_SENSOR0 0x0009001F
#define LVTS_INT_SENSOR1 0X000881F0 #define LVTS_INT_SENSOR1 0x001203E0
#define LVTS_INT_SENSOR2 0x00247C00 #define LVTS_INT_SENSOR2 0x00247C00
#define LVTS_INT_SENSOR3 0x1FC00000 #define LVTS_INT_SENSOR3 0x1FC00000
...@@ -395,8 +395,8 @@ static irqreturn_t lvts_ctrl_irq_handler(struct lvts_ctrl *lvts_ctrl) ...@@ -395,8 +395,8 @@ static irqreturn_t lvts_ctrl_irq_handler(struct lvts_ctrl *lvts_ctrl)
* => 0x1FC00000 * => 0x1FC00000
* sensor 2 interrupt: 0000 0000 0010 0100 0111 1100 0000 0000 * sensor 2 interrupt: 0000 0000 0010 0100 0111 1100 0000 0000
* => 0x00247C00 * => 0x00247C00
* sensor 1 interrupt: 0000 0000 0001 0001 0000 0011 1110 0000 * sensor 1 interrupt: 0000 0000 0001 0010 0000 0011 1110 0000
* => 0X000881F0 * => 0X001203E0
* sensor 0 interrupt: 0000 0000 0000 1001 0000 0000 0001 1111 * sensor 0 interrupt: 0000 0000 0000 1001 0000 0000 0001 1111
* => 0x0009001F * => 0x0009001F
*/ */
...@@ -530,29 +530,33 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl, ...@@ -530,29 +530,33 @@ static int lvts_sensor_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
* The efuse blob values follows the sensor enumeration per thermal * The efuse blob values follows the sensor enumeration per thermal
* controller. The decoding of the stream is as follow: * controller. The decoding of the stream is as follow:
* *
* <--?-> <----big0 ???---> <-sensor0-> <-0-> * stream index map for MCU Domain :
* ------------------------------------------
* index in the stream: : | 0x0 | 0x1 | 0x2 | 0x3 | 0x4 | 0x5 | 0x6 |
* ------------------------------------------
* *
* <--sensor1--><-0-> <----big1 ???---> <-sen * <-----mcu-tc#0-----> <-----sensor#0-----> <-----sensor#1----->
* ------------------------------------------ * 0x01 | 0x02 | 0x03 | 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09
* | 0x7 | 0x8 | 0x9 | 0xA | 0xB | OxC | OxD |
* ------------------------------------------
* *
* sor0-> <-0-> <-sensor1-> <-0-> .......... * <-----mcu-tc#1-----> <-----sensor#2-----> <-----sensor#3----->
* ------------------------------------------ * 0x0A | 0x0B | 0x0C | 0x0D | 0x0E | 0x0F | 0x10 | 0x11 | 0x12
* | 0x7 | 0x8 | 0x9 | 0xA | 0xB | OxC | OxD |
* ------------------------------------------
* *
* And so on ... * <-----mcu-tc#2-----> <-----sensor#4-----> <-----sensor#5-----> <-----sensor#6-----> <-----sensor#7----->
* 0x13 | 0x14 | 0x15 | 0x16 | 0x17 | 0x18 | 0x19 | 0x1A | 0x1B | 0x1C | 0x1D | 0x1E | 0x1F | 0x20 | 0x21
*
* stream index map for AP Domain :
*
* <-----ap--tc#0-----> <-----sensor#0-----> <-----sensor#1----->
* 0x22 | 0x23 | 0x24 | 0x25 | 0x26 | 0x27 | 0x28 | 0x29 | 0x2A
*
* <-----ap--tc#1-----> <-----sensor#2-----> <-----sensor#3----->
* 0x2B | 0x2C | 0x2D | 0x2E | 0x2F | 0x30 | 0x31 | 0x32 | 0x33
*
* <-----ap--tc#2-----> <-----sensor#4-----> <-----sensor#5-----> <-----sensor#6----->
* 0x34 | 0x35 | 0x36 | 0x37 | 0x38 | 0x39 | 0x3A | 0x3B | 0x3C | 0x3D | 0x3E | 0x3F
*
* <-----ap--tc#3-----> <-----sensor#7-----> <-----sensor#8----->
* 0x40 | 0x41 | 0x42 | 0x43 | 0x44 | 0x45 | 0x46 | 0x47 | 0x48
* *
* The data description gives the offset of the calibration data in * The data description gives the offset of the calibration data in
* this bytes stream for each sensor. * this bytes stream for each sensor.
*
* Each thermal controller can handle up to 4 sensors max, we don't
* care if there are less as the array of calibration is sized to 4
* anyway. The unused sensor slot will be zeroed.
*/ */
static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl, static int lvts_calibration_init(struct device *dev, struct lvts_ctrl *lvts_ctrl,
const struct lvts_ctrl_data *lvts_ctrl_data, const struct lvts_ctrl_data *lvts_ctrl_data,
...@@ -1165,7 +1169,7 @@ static int lvts_remove(struct platform_device *pdev) ...@@ -1165,7 +1169,7 @@ static int lvts_remove(struct platform_device *pdev)
return 0; return 0;
} }
static const struct lvts_ctrl_data mt8195_lvts_data_ctrl[] = { static const struct lvts_ctrl_data mt8195_lvts_mcu_data_ctrl[] = {
{ {
.cal_offset = { 0x04, 0x07 }, .cal_offset = { 0x04, 0x07 },
.lvts_sensor = { .lvts_sensor = {
...@@ -1200,13 +1204,63 @@ static const struct lvts_ctrl_data mt8195_lvts_data_ctrl[] = { ...@@ -1200,13 +1204,63 @@ static const struct lvts_ctrl_data mt8195_lvts_data_ctrl[] = {
} }
}; };
static const struct lvts_ctrl_data mt8195_lvts_ap_data_ctrl[] = {
{
.cal_offset = { 0x25, 0x28 },
.lvts_sensor = {
{ .dt_id = MT8195_AP_VPU0 },
{ .dt_id = MT8195_AP_VPU1 }
},
.num_lvts_sensor = 2,
.offset = 0x0,
.hw_tshut_temp = LVTS_HW_SHUTDOWN_MT8195,
},
{
.cal_offset = { 0x2e, 0x31 },
.lvts_sensor = {
{ .dt_id = MT8195_AP_GPU0 },
{ .dt_id = MT8195_AP_GPU1 }
},
.num_lvts_sensor = 2,
.offset = 0x100,
.hw_tshut_temp = LVTS_HW_SHUTDOWN_MT8195,
},
{
.cal_offset = { 0x37, 0x3a, 0x3d },
.lvts_sensor = {
{ .dt_id = MT8195_AP_VDEC },
{ .dt_id = MT8195_AP_IMG },
{ .dt_id = MT8195_AP_INFRA },
},
.num_lvts_sensor = 3,
.offset = 0x200,
.hw_tshut_temp = LVTS_HW_SHUTDOWN_MT8195,
},
{
.cal_offset = { 0x43, 0x46 },
.lvts_sensor = {
{ .dt_id = MT8195_AP_CAM0 },
{ .dt_id = MT8195_AP_CAM1 }
},
.num_lvts_sensor = 2,
.offset = 0x300,
.hw_tshut_temp = LVTS_HW_SHUTDOWN_MT8195,
}
};
static const struct lvts_data mt8195_lvts_mcu_data = { static const struct lvts_data mt8195_lvts_mcu_data = {
.lvts_ctrl = mt8195_lvts_data_ctrl, .lvts_ctrl = mt8195_lvts_mcu_data_ctrl,
.num_lvts_ctrl = ARRAY_SIZE(mt8195_lvts_data_ctrl), .num_lvts_ctrl = ARRAY_SIZE(mt8195_lvts_mcu_data_ctrl),
};
static const struct lvts_data mt8195_lvts_ap_data = {
.lvts_ctrl = mt8195_lvts_ap_data_ctrl,
.num_lvts_ctrl = ARRAY_SIZE(mt8195_lvts_ap_data_ctrl),
}; };
static const struct of_device_id lvts_of_match[] = { static const struct of_device_id lvts_of_match[] = {
{ .compatible = "mediatek,mt8195-lvts-mcu", .data = &mt8195_lvts_mcu_data }, { .compatible = "mediatek,mt8195-lvts-mcu", .data = &mt8195_lvts_mcu_data },
{ .compatible = "mediatek,mt8195-lvts-ap", .data = &mt8195_lvts_ap_data },
{}, {},
}; };
MODULE_DEVICE_TABLE(of, lvts_of_match); MODULE_DEVICE_TABLE(of, lvts_of_match);
......
...@@ -39,15 +39,6 @@ enum tshut_polarity { ...@@ -39,15 +39,6 @@ enum tshut_polarity {
TSHUT_HIGH_ACTIVE, TSHUT_HIGH_ACTIVE,
}; };
/*
* The system has two Temperature Sensors.
* sensor0 is for CPU, and sensor1 is for GPU.
*/
enum sensor_id {
SENSOR_CPU = 0,
SENSOR_GPU,
};
/* /*
* The conversion table has the adc value and temperature. * The conversion table has the adc value and temperature.
* ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table) * ADC_DECREMENT: the adc value is of diminishing.(e.g. rk3288_code_table)
...@@ -60,12 +51,6 @@ enum adc_sort_mode { ...@@ -60,12 +51,6 @@ enum adc_sort_mode {
#include "thermal_hwmon.h" #include "thermal_hwmon.h"
/*
* The max sensors is two in rockchip SoCs.
* Two sensors: CPU and GPU sensor.
*/
#define SOC_MAX_SENSORS 2
/** /**
* struct chip_tsadc_table - hold information about chip-specific differences * struct chip_tsadc_table - hold information about chip-specific differences
* @id: conversion table * @id: conversion table
...@@ -82,7 +67,7 @@ struct chip_tsadc_table { ...@@ -82,7 +67,7 @@ struct chip_tsadc_table {
/** /**
* struct rockchip_tsadc_chip - hold the private data of tsadc chip * struct rockchip_tsadc_chip - hold the private data of tsadc chip
* @chn_id: array of sensor ids of chip corresponding to the channel * @chn_offset: the channel offset of the first channel
* @chn_num: the channel number of tsadc chip * @chn_num: the channel number of tsadc chip
* @tshut_temp: the hardware-controlled shutdown temperature value * @tshut_temp: the hardware-controlled shutdown temperature value
* @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO) * @tshut_mode: the hardware-controlled shutdown mode (0:CRU 1:GPIO)
...@@ -98,7 +83,7 @@ struct chip_tsadc_table { ...@@ -98,7 +83,7 @@ struct chip_tsadc_table {
*/ */
struct rockchip_tsadc_chip { struct rockchip_tsadc_chip {
/* The sensor id of chip correspond to the ADC channel */ /* The sensor id of chip correspond to the ADC channel */
int chn_id[SOC_MAX_SENSORS]; int chn_offset;
int chn_num; int chn_num;
/* The hardware-controlled tshut property */ /* The hardware-controlled tshut property */
...@@ -156,7 +141,7 @@ struct rockchip_thermal_data { ...@@ -156,7 +141,7 @@ struct rockchip_thermal_data {
struct platform_device *pdev; struct platform_device *pdev;
struct reset_control *reset; struct reset_control *reset;
struct rockchip_thermal_sensor sensors[SOC_MAX_SENSORS]; struct rockchip_thermal_sensor *sensors;
struct clk *clk; struct clk *clk;
struct clk *pclk; struct clk *pclk;
...@@ -180,29 +165,49 @@ struct rockchip_thermal_data { ...@@ -180,29 +165,49 @@ struct rockchip_thermal_data {
#define TSADCV2_AUTO_CON 0x04 #define TSADCV2_AUTO_CON 0x04
#define TSADCV2_INT_EN 0x08 #define TSADCV2_INT_EN 0x08
#define TSADCV2_INT_PD 0x0c #define TSADCV2_INT_PD 0x0c
#define TSADCV3_AUTO_SRC_CON 0x0c
#define TSADCV3_HT_INT_EN 0x14
#define TSADCV3_HSHUT_GPIO_INT_EN 0x18
#define TSADCV3_HSHUT_CRU_INT_EN 0x1c
#define TSADCV3_INT_PD 0x24
#define TSADCV3_HSHUT_PD 0x28
#define TSADCV2_DATA(chn) (0x20 + (chn) * 0x04) #define TSADCV2_DATA(chn) (0x20 + (chn) * 0x04)
#define TSADCV2_COMP_INT(chn) (0x30 + (chn) * 0x04) #define TSADCV2_COMP_INT(chn) (0x30 + (chn) * 0x04)
#define TSADCV2_COMP_SHUT(chn) (0x40 + (chn) * 0x04) #define TSADCV2_COMP_SHUT(chn) (0x40 + (chn) * 0x04)
#define TSADCV3_DATA(chn) (0x2c + (chn) * 0x04)
#define TSADCV3_COMP_INT(chn) (0x6c + (chn) * 0x04)
#define TSADCV3_COMP_SHUT(chn) (0x10c + (chn) * 0x04)
#define TSADCV2_HIGHT_INT_DEBOUNCE 0x60 #define TSADCV2_HIGHT_INT_DEBOUNCE 0x60
#define TSADCV2_HIGHT_TSHUT_DEBOUNCE 0x64 #define TSADCV2_HIGHT_TSHUT_DEBOUNCE 0x64
#define TSADCV3_HIGHT_INT_DEBOUNCE 0x14c
#define TSADCV3_HIGHT_TSHUT_DEBOUNCE 0x150
#define TSADCV2_AUTO_PERIOD 0x68 #define TSADCV2_AUTO_PERIOD 0x68
#define TSADCV2_AUTO_PERIOD_HT 0x6c #define TSADCV2_AUTO_PERIOD_HT 0x6c
#define TSADCV3_AUTO_PERIOD 0x154
#define TSADCV3_AUTO_PERIOD_HT 0x158
#define TSADCV2_AUTO_EN BIT(0) #define TSADCV2_AUTO_EN BIT(0)
#define TSADCV2_AUTO_EN_MASK BIT(16)
#define TSADCV2_AUTO_SRC_EN(chn) BIT(4 + (chn)) #define TSADCV2_AUTO_SRC_EN(chn) BIT(4 + (chn))
#define TSADCV3_AUTO_SRC_EN(chn) BIT(chn)
#define TSADCV3_AUTO_SRC_EN_MASK(chn) BIT(16 + chn)
#define TSADCV2_AUTO_TSHUT_POLARITY_HIGH BIT(8) #define TSADCV2_AUTO_TSHUT_POLARITY_HIGH BIT(8)
#define TSADCV2_AUTO_TSHUT_POLARITY_MASK BIT(24)
#define TSADCV3_AUTO_Q_SEL_EN BIT(1) #define TSADCV3_AUTO_Q_SEL_EN BIT(1)
#define TSADCV2_INT_SRC_EN(chn) BIT(chn) #define TSADCV2_INT_SRC_EN(chn) BIT(chn)
#define TSADCV2_INT_SRC_EN_MASK(chn) BIT(16 + (chn))
#define TSADCV2_SHUT_2GPIO_SRC_EN(chn) BIT(4 + (chn)) #define TSADCV2_SHUT_2GPIO_SRC_EN(chn) BIT(4 + (chn))
#define TSADCV2_SHUT_2CRU_SRC_EN(chn) BIT(8 + (chn)) #define TSADCV2_SHUT_2CRU_SRC_EN(chn) BIT(8 + (chn))
#define TSADCV2_INT_PD_CLEAR_MASK ~BIT(8) #define TSADCV2_INT_PD_CLEAR_MASK ~BIT(8)
#define TSADCV3_INT_PD_CLEAR_MASK ~BIT(16) #define TSADCV3_INT_PD_CLEAR_MASK ~BIT(16)
#define TSADCV4_INT_PD_CLEAR_MASK 0xffffffff
#define TSADCV2_DATA_MASK 0xfff #define TSADCV2_DATA_MASK 0xfff
#define TSADCV3_DATA_MASK 0x3ff #define TSADCV3_DATA_MASK 0x3ff
#define TSADCV4_DATA_MASK 0x1ff
#define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT 4 #define TSADCV2_HIGHT_INT_DEBOUNCE_COUNT 4
#define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT 4 #define TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT 4
...@@ -213,6 +218,8 @@ struct rockchip_thermal_data { ...@@ -213,6 +218,8 @@ struct rockchip_thermal_data {
#define TSADCV5_AUTO_PERIOD_TIME 1622 /* 2.5ms */ #define TSADCV5_AUTO_PERIOD_TIME 1622 /* 2.5ms */
#define TSADCV5_AUTO_PERIOD_HT_TIME 1622 /* 2.5ms */ #define TSADCV5_AUTO_PERIOD_HT_TIME 1622 /* 2.5ms */
#define TSADCV6_AUTO_PERIOD_TIME 5000 /* 2.5ms */
#define TSADCV6_AUTO_PERIOD_HT_TIME 5000 /* 2.5ms */
#define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */ #define TSADCV2_USER_INTER_PD_SOC 0x340 /* 13 clocks */
#define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */ #define TSADCV5_USER_INTER_PD_SOC 0xfc0 /* 97us, at least 90us */
...@@ -229,6 +236,12 @@ struct rockchip_thermal_data { ...@@ -229,6 +236,12 @@ struct rockchip_thermal_data {
#define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2) #define RK3568_GRF_TSADC_ANA_REG2 (0x10001 << 2)
#define RK3568_GRF_TSADC_TSEN (0x10001 << 8) #define RK3568_GRF_TSADC_TSEN (0x10001 << 8)
#define RK3588_GRF0_TSADC_CON 0x0100
#define RK3588_GRF0_TSADC_TRM (0xff0077 << 0)
#define RK3588_GRF0_TSADC_SHUT_2CRU (0x30003 << 10)
#define RK3588_GRF0_TSADC_SHUT_2GPIO (0x70007 << 12)
#define GRF_SARADC_TESTBIT_ON (0x10001 << 2) #define GRF_SARADC_TESTBIT_ON (0x10001 << 2)
#define GRF_TSADC_TESTBIT_H_ON (0x10001 << 2) #define GRF_TSADC_TESTBIT_H_ON (0x10001 << 2)
#define GRF_TSADC_VCM_EN_L (0x10001 << 7) #define GRF_TSADC_VCM_EN_L (0x10001 << 7)
...@@ -523,6 +536,15 @@ static const struct tsadc_table rk3568_code_table[] = { ...@@ -523,6 +536,15 @@ static const struct tsadc_table rk3568_code_table[] = {
{TSADCV2_DATA_MASK, 125000}, {TSADCV2_DATA_MASK, 125000},
}; };
static const struct tsadc_table rk3588_code_table[] = {
{0, -40000},
{215, -40000},
{285, 25000},
{350, 85000},
{395, 125000},
{TSADCV4_DATA_MASK, 125000},
};
static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table, static u32 rk_tsadcv2_temp_to_code(const struct chip_tsadc_table *table,
int temp) int temp)
{ {
...@@ -793,6 +815,25 @@ static void rk_tsadcv7_initialize(struct regmap *grf, void __iomem *regs, ...@@ -793,6 +815,25 @@ static void rk_tsadcv7_initialize(struct regmap *grf, void __iomem *regs,
} }
} }
static void rk_tsadcv8_initialize(struct regmap *grf, void __iomem *regs,
enum tshut_polarity tshut_polarity)
{
writel_relaxed(TSADCV6_AUTO_PERIOD_TIME, regs + TSADCV3_AUTO_PERIOD);
writel_relaxed(TSADCV6_AUTO_PERIOD_HT_TIME,
regs + TSADCV3_AUTO_PERIOD_HT);
writel_relaxed(TSADCV2_HIGHT_INT_DEBOUNCE_COUNT,
regs + TSADCV3_HIGHT_INT_DEBOUNCE);
writel_relaxed(TSADCV2_HIGHT_TSHUT_DEBOUNCE_COUNT,
regs + TSADCV3_HIGHT_TSHUT_DEBOUNCE);
if (tshut_polarity == TSHUT_HIGH_ACTIVE)
writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_HIGH |
TSADCV2_AUTO_TSHUT_POLARITY_MASK,
regs + TSADCV2_AUTO_CON);
else
writel_relaxed(TSADCV2_AUTO_TSHUT_POLARITY_MASK,
regs + TSADCV2_AUTO_CON);
}
static void rk_tsadcv2_irq_ack(void __iomem *regs) static void rk_tsadcv2_irq_ack(void __iomem *regs)
{ {
u32 val; u32 val;
...@@ -809,6 +850,17 @@ static void rk_tsadcv3_irq_ack(void __iomem *regs) ...@@ -809,6 +850,17 @@ static void rk_tsadcv3_irq_ack(void __iomem *regs)
writel_relaxed(val & TSADCV3_INT_PD_CLEAR_MASK, regs + TSADCV2_INT_PD); writel_relaxed(val & TSADCV3_INT_PD_CLEAR_MASK, regs + TSADCV2_INT_PD);
} }
static void rk_tsadcv4_irq_ack(void __iomem *regs)
{
u32 val;
val = readl_relaxed(regs + TSADCV3_INT_PD);
writel_relaxed(val & TSADCV4_INT_PD_CLEAR_MASK, regs + TSADCV3_INT_PD);
val = readl_relaxed(regs + TSADCV3_HSHUT_PD);
writel_relaxed(val & TSADCV3_INT_PD_CLEAR_MASK,
regs + TSADCV3_HSHUT_PD);
}
static void rk_tsadcv2_control(void __iomem *regs, bool enable) static void rk_tsadcv2_control(void __iomem *regs, bool enable)
{ {
u32 val; u32 val;
...@@ -844,6 +896,18 @@ static void rk_tsadcv3_control(void __iomem *regs, bool enable) ...@@ -844,6 +896,18 @@ static void rk_tsadcv3_control(void __iomem *regs, bool enable)
writel_relaxed(val, regs + TSADCV2_AUTO_CON); writel_relaxed(val, regs + TSADCV2_AUTO_CON);
} }
static void rk_tsadcv4_control(void __iomem *regs, bool enable)
{
u32 val;
if (enable)
val = TSADCV2_AUTO_EN | TSADCV2_AUTO_EN_MASK;
else
val = TSADCV2_AUTO_EN_MASK;
writel_relaxed(val, regs + TSADCV2_AUTO_CON);
}
static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table, static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int *temp) int chn, void __iomem *regs, int *temp)
{ {
...@@ -854,6 +918,16 @@ static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table, ...@@ -854,6 +918,16 @@ static int rk_tsadcv2_get_temp(const struct chip_tsadc_table *table,
return rk_tsadcv2_code_to_temp(table, val, temp); return rk_tsadcv2_code_to_temp(table, val, temp);
} }
static int rk_tsadcv4_get_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int *temp)
{
u32 val;
val = readl_relaxed(regs + TSADCV3_DATA(chn));
return rk_tsadcv2_code_to_temp(table, val, temp);
}
static int rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table, static int rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int temp) int chn, void __iomem *regs, int temp)
{ {
...@@ -888,6 +962,33 @@ static int rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table, ...@@ -888,6 +962,33 @@ static int rk_tsadcv2_alarm_temp(const struct chip_tsadc_table *table,
return 0; return 0;
} }
static int rk_tsadcv3_alarm_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int temp)
{
u32 alarm_value;
/*
* In some cases, some sensors didn't need the trip points, the
* set_trips will pass {-INT_MAX, INT_MAX} to trigger tsadc alarm
* in the end, ignore this case and disable the high temperature
* interrupt.
*/
if (temp == INT_MAX) {
writel_relaxed(TSADCV2_INT_SRC_EN_MASK(chn),
regs + TSADCV3_HT_INT_EN);
return 0;
}
/* Make sure the value is valid */
alarm_value = rk_tsadcv2_temp_to_code(table, temp);
if (alarm_value == table->data_mask)
return -ERANGE;
writel_relaxed(alarm_value & table->data_mask,
regs + TSADCV3_COMP_INT(chn));
writel_relaxed(TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn),
regs + TSADCV3_HT_INT_EN);
return 0;
}
static int rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table, static int rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int temp) int chn, void __iomem *regs, int temp)
{ {
...@@ -907,6 +1008,25 @@ static int rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table, ...@@ -907,6 +1008,25 @@ static int rk_tsadcv2_tshut_temp(const struct chip_tsadc_table *table,
return 0; return 0;
} }
static int rk_tsadcv3_tshut_temp(const struct chip_tsadc_table *table,
int chn, void __iomem *regs, int temp)
{
u32 tshut_value;
/* Make sure the value is valid */
tshut_value = rk_tsadcv2_temp_to_code(table, temp);
if (tshut_value == table->data_mask)
return -ERANGE;
writel_relaxed(tshut_value, regs + TSADCV3_COMP_SHUT(chn));
/* TSHUT will be valid */
writel_relaxed(TSADCV3_AUTO_SRC_EN(chn) | TSADCV3_AUTO_SRC_EN_MASK(chn),
regs + TSADCV3_AUTO_SRC_CON);
return 0;
}
static void rk_tsadcv2_tshut_mode(int chn, void __iomem *regs, static void rk_tsadcv2_tshut_mode(int chn, void __iomem *regs,
enum tshut_mode mode) enum tshut_mode mode)
{ {
...@@ -924,9 +1044,25 @@ static void rk_tsadcv2_tshut_mode(int chn, void __iomem *regs, ...@@ -924,9 +1044,25 @@ static void rk_tsadcv2_tshut_mode(int chn, void __iomem *regs,
writel_relaxed(val, regs + TSADCV2_INT_EN); writel_relaxed(val, regs + TSADCV2_INT_EN);
} }
static void rk_tsadcv3_tshut_mode(int chn, void __iomem *regs,
enum tshut_mode mode)
{
u32 val_gpio, val_cru;
if (mode == TSHUT_MODE_GPIO) {
val_gpio = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
val_cru = TSADCV2_INT_SRC_EN_MASK(chn);
} else {
val_cru = TSADCV2_INT_SRC_EN(chn) | TSADCV2_INT_SRC_EN_MASK(chn);
val_gpio = TSADCV2_INT_SRC_EN_MASK(chn);
}
writel_relaxed(val_gpio, regs + TSADCV3_HSHUT_GPIO_INT_EN);
writel_relaxed(val_cru, regs + TSADCV3_HSHUT_CRU_INT_EN);
}
static const struct rockchip_tsadc_chip px30_tsadc_data = { static const struct rockchip_tsadc_chip px30_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ .chn_offset = 0,
.chn_num = 2, /* 2 channels for tsadc */ .chn_num = 2, /* 2 channels for tsadc */
.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
...@@ -949,7 +1085,8 @@ static const struct rockchip_tsadc_chip px30_tsadc_data = { ...@@ -949,7 +1085,8 @@ static const struct rockchip_tsadc_chip px30_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rv1108_tsadc_data = { static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu */
.chn_offset = 0,
.chn_num = 1, /* one channel for tsadc */ .chn_num = 1, /* one channel for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -973,7 +1110,8 @@ static const struct rockchip_tsadc_chip rv1108_tsadc_data = { ...@@ -973,7 +1110,8 @@ static const struct rockchip_tsadc_chip rv1108_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3228_tsadc_data = { static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu */
.chn_offset = 0,
.chn_num = 1, /* one channel for tsadc */ .chn_num = 1, /* one channel for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -997,8 +1135,8 @@ static const struct rockchip_tsadc_chip rk3228_tsadc_data = { ...@@ -997,8 +1135,8 @@ static const struct rockchip_tsadc_chip rk3228_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3288_tsadc_data = { static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
.chn_id[SENSOR_CPU] = 1, /* cpu sensor is channel 1 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 2, /* gpu sensor is channel 2 */ .chn_offset = 1,
.chn_num = 2, /* two channels for tsadc */ .chn_num = 2, /* two channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -1022,7 +1160,8 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = { ...@@ -1022,7 +1160,8 @@ static const struct rockchip_tsadc_chip rk3288_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3328_tsadc_data = { static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu */
.chn_offset = 0,
.chn_num = 1, /* one channels for tsadc */ .chn_num = 1, /* one channels for tsadc */
.tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */ .tshut_mode = TSHUT_MODE_CRU, /* default TSHUT via CRU */
...@@ -1045,8 +1184,8 @@ static const struct rockchip_tsadc_chip rk3328_tsadc_data = { ...@@ -1045,8 +1184,8 @@ static const struct rockchip_tsadc_chip rk3328_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3366_tsadc_data = { static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ .chn_offset = 0,
.chn_num = 2, /* two channels for tsadc */ .chn_num = 2, /* two channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -1070,8 +1209,8 @@ static const struct rockchip_tsadc_chip rk3366_tsadc_data = { ...@@ -1070,8 +1209,8 @@ static const struct rockchip_tsadc_chip rk3366_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3368_tsadc_data = { static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ .chn_offset = 0,
.chn_num = 2, /* two channels for tsadc */ .chn_num = 2, /* two channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -1095,8 +1234,8 @@ static const struct rockchip_tsadc_chip rk3368_tsadc_data = { ...@@ -1095,8 +1234,8 @@ static const struct rockchip_tsadc_chip rk3368_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3399_tsadc_data = { static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ .chn_offset = 0,
.chn_num = 2, /* two channels for tsadc */ .chn_num = 2, /* two channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -1120,8 +1259,8 @@ static const struct rockchip_tsadc_chip rk3399_tsadc_data = { ...@@ -1120,8 +1259,8 @@ static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
}; };
static const struct rockchip_tsadc_chip rk3568_tsadc_data = { static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
.chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */ /* cpu, gpu */
.chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */ .chn_offset = 0,
.chn_num = 2, /* two channels for tsadc */ .chn_num = 2, /* two channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
...@@ -1144,6 +1283,28 @@ static const struct rockchip_tsadc_chip rk3568_tsadc_data = { ...@@ -1144,6 +1283,28 @@ static const struct rockchip_tsadc_chip rk3568_tsadc_data = {
}, },
}; };
static const struct rockchip_tsadc_chip rk3588_tsadc_data = {
/* top, big_core0, big_core1, little_core, center, gpu, npu */
.chn_offset = 0,
.chn_num = 7, /* seven channels for tsadc */
.tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */
.tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */
.tshut_temp = 95000,
.initialize = rk_tsadcv8_initialize,
.irq_ack = rk_tsadcv4_irq_ack,
.control = rk_tsadcv4_control,
.get_temp = rk_tsadcv4_get_temp,
.set_alarm_temp = rk_tsadcv3_alarm_temp,
.set_tshut_temp = rk_tsadcv3_tshut_temp,
.set_tshut_mode = rk_tsadcv3_tshut_mode,
.table = {
.id = rk3588_code_table,
.length = ARRAY_SIZE(rk3588_code_table),
.data_mask = TSADCV4_DATA_MASK,
.mode = ADC_INCREMENT,
},
};
static const struct of_device_id of_rockchip_thermal_match[] = { static const struct of_device_id of_rockchip_thermal_match[] = {
{ .compatible = "rockchip,px30-tsadc", { .compatible = "rockchip,px30-tsadc",
.data = (void *)&px30_tsadc_data, .data = (void *)&px30_tsadc_data,
...@@ -1180,6 +1341,10 @@ static const struct of_device_id of_rockchip_thermal_match[] = { ...@@ -1180,6 +1341,10 @@ static const struct of_device_id of_rockchip_thermal_match[] = {
.compatible = "rockchip,rk3568-tsadc", .compatible = "rockchip,rk3568-tsadc",
.data = (void *)&rk3568_tsadc_data, .data = (void *)&rk3568_tsadc_data,
}, },
{
.compatible = "rockchip,rk3588-tsadc",
.data = (void *)&rk3588_tsadc_data,
},
{ /* end */ }, { /* end */ },
}; };
MODULE_DEVICE_TABLE(of, of_rockchip_thermal_match); MODULE_DEVICE_TABLE(of, of_rockchip_thermal_match);
...@@ -1350,15 +1515,10 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1350,15 +1515,10 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
{ {
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
struct rockchip_thermal_data *thermal; struct rockchip_thermal_data *thermal;
const struct of_device_id *match;
int irq; int irq;
int i; int i;
int error; int error;
match = of_match_node(of_rockchip_thermal_match, np);
if (!match)
return -ENXIO;
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq < 0) if (irq < 0)
return -EINVAL; return -EINVAL;
...@@ -1370,57 +1530,40 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1370,57 +1530,40 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
thermal->pdev = pdev; thermal->pdev = pdev;
thermal->chip = (const struct rockchip_tsadc_chip *)match->data; thermal->chip = device_get_match_data(&pdev->dev);
if (!thermal->chip) if (!thermal->chip)
return -EINVAL; return -EINVAL;
thermal->sensors = devm_kcalloc(&pdev->dev, thermal->chip->chn_num,
sizeof(*thermal->sensors), GFP_KERNEL);
if (!thermal->sensors)
return -ENOMEM;
thermal->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); thermal->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
if (IS_ERR(thermal->regs)) if (IS_ERR(thermal->regs))
return PTR_ERR(thermal->regs); return PTR_ERR(thermal->regs);
thermal->reset = devm_reset_control_array_get(&pdev->dev, false, false); thermal->reset = devm_reset_control_array_get_exclusive(&pdev->dev);
if (IS_ERR(thermal->reset)) { if (IS_ERR(thermal->reset))
error = PTR_ERR(thermal->reset); return dev_err_probe(&pdev->dev, PTR_ERR(thermal->reset),
dev_err(&pdev->dev, "failed to get tsadc reset: %d\n", error); "failed to get tsadc reset.\n");
return error;
}
thermal->clk = devm_clk_get(&pdev->dev, "tsadc");
if (IS_ERR(thermal->clk)) {
error = PTR_ERR(thermal->clk);
dev_err(&pdev->dev, "failed to get tsadc clock: %d\n", error);
return error;
}
thermal->pclk = devm_clk_get(&pdev->dev, "apb_pclk"); thermal->clk = devm_clk_get_enabled(&pdev->dev, "tsadc");
if (IS_ERR(thermal->pclk)) { if (IS_ERR(thermal->clk))
error = PTR_ERR(thermal->pclk); return dev_err_probe(&pdev->dev, PTR_ERR(thermal->clk),
dev_err(&pdev->dev, "failed to get apb_pclk clock: %d\n", "failed to get tsadc clock.\n");
error);
return error;
}
error = clk_prepare_enable(thermal->clk); thermal->pclk = devm_clk_get_enabled(&pdev->dev, "apb_pclk");
if (error) { if (IS_ERR(thermal->pclk))
dev_err(&pdev->dev, "failed to enable converter clock: %d\n", return dev_err_probe(&pdev->dev, PTR_ERR(thermal->pclk),
error); "failed to get apb_pclk clock.\n");
return error;
}
error = clk_prepare_enable(thermal->pclk);
if (error) {
dev_err(&pdev->dev, "failed to enable pclk: %d\n", error);
goto err_disable_clk;
}
rockchip_thermal_reset_controller(thermal->reset); rockchip_thermal_reset_controller(thermal->reset);
error = rockchip_configure_from_dt(&pdev->dev, np, thermal); error = rockchip_configure_from_dt(&pdev->dev, np, thermal);
if (error) { if (error)
dev_err(&pdev->dev, "failed to parse device tree data: %d\n", return dev_err_probe(&pdev->dev, error,
error); "failed to parse device tree data\n");
goto err_disable_pclk;
}
thermal->chip->initialize(thermal->grf, thermal->regs, thermal->chip->initialize(thermal->grf, thermal->regs,
thermal->tshut_polarity); thermal->tshut_polarity);
...@@ -1428,24 +1571,19 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1428,24 +1571,19 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
for (i = 0; i < thermal->chip->chn_num; i++) { for (i = 0; i < thermal->chip->chn_num; i++) {
error = rockchip_thermal_register_sensor(pdev, thermal, error = rockchip_thermal_register_sensor(pdev, thermal,
&thermal->sensors[i], &thermal->sensors[i],
thermal->chip->chn_id[i]); thermal->chip->chn_offset + i);
if (error) { if (error)
dev_err(&pdev->dev, return dev_err_probe(&pdev->dev, error,
"failed to register sensor[%d] : error = %d\n", "failed to register sensor[%d].\n", i);
i, error);
goto err_disable_pclk;
}
} }
error = devm_request_threaded_irq(&pdev->dev, irq, NULL, error = devm_request_threaded_irq(&pdev->dev, irq, NULL,
&rockchip_thermal_alarm_irq_thread, &rockchip_thermal_alarm_irq_thread,
IRQF_ONESHOT, IRQF_ONESHOT,
"rockchip_thermal", thermal); "rockchip_thermal", thermal);
if (error) { if (error)
dev_err(&pdev->dev, return dev_err_probe(&pdev->dev, error,
"failed to request tsadc irq: %d\n", error); "failed to request tsadc irq.\n");
goto err_disable_pclk;
}
thermal->chip->control(thermal->regs, true); thermal->chip->control(thermal->regs, true);
...@@ -1461,13 +1599,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev) ...@@ -1461,13 +1599,6 @@ static int rockchip_thermal_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, thermal); platform_set_drvdata(pdev, thermal);
return 0; return 0;
err_disable_pclk:
clk_disable_unprepare(thermal->pclk);
err_disable_clk:
clk_disable_unprepare(thermal->clk);
return error;
} }
static int rockchip_thermal_remove(struct platform_device *pdev) static int rockchip_thermal_remove(struct platform_device *pdev)
...@@ -1484,9 +1615,6 @@ static int rockchip_thermal_remove(struct platform_device *pdev) ...@@ -1484,9 +1615,6 @@ static int rockchip_thermal_remove(struct platform_device *pdev)
thermal->chip->control(thermal->regs, false); thermal->chip->control(thermal->regs, false);
clk_disable_unprepare(thermal->pclk);
clk_disable_unprepare(thermal->clk);
return 0; return 0;
} }
......
...@@ -52,6 +52,8 @@ static int __tegra_bpmp_thermal_get_temp(struct tegra_bpmp_thermal_zone *zone, ...@@ -52,6 +52,8 @@ static int __tegra_bpmp_thermal_get_temp(struct tegra_bpmp_thermal_zone *zone,
err = tegra_bpmp_transfer(zone->tegra->bpmp, &msg); err = tegra_bpmp_transfer(zone->tegra->bpmp, &msg);
if (err) if (err)
return err; return err;
if (msg.rx.ret == -BPMP_EFAULT)
return -EAGAIN;
if (msg.rx.ret) if (msg.rx.ret)
return -EINVAL; return -EINVAL;
...@@ -209,7 +211,12 @@ static int tegra_bpmp_thermal_probe(struct platform_device *pdev) ...@@ -209,7 +211,12 @@ static int tegra_bpmp_thermal_probe(struct platform_device *pdev)
zone->tegra = tegra; zone->tegra = tegra;
err = __tegra_bpmp_thermal_get_temp(zone, &temp); err = __tegra_bpmp_thermal_get_temp(zone, &temp);
if (err < 0) {
/*
* Sensors in powergated domains may temporarily fail to be read
* (-EAGAIN), but will become accessible when the domain is powered on.
*/
if (err < 0 && err != -EAGAIN) {
devm_kfree(&pdev->dev, zone); devm_kfree(&pdev->dev, zone);
continue; continue;
} }
......
...@@ -794,62 +794,16 @@ void print_bind_err_msg(struct thermal_zone_device *tz, ...@@ -794,62 +794,16 @@ void print_bind_err_msg(struct thermal_zone_device *tz,
tz->type, cdev->type, ret); tz->type, cdev->type, ret);
} }
static void __bind(struct thermal_zone_device *tz, int mask,
struct thermal_cooling_device *cdev,
unsigned long *limits,
unsigned int weight)
{
int i, ret;
for (i = 0; i < tz->num_trips; i++) {
if (mask & (1 << i)) {
unsigned long upper, lower;
upper = THERMAL_NO_LIMIT;
lower = THERMAL_NO_LIMIT;
if (limits) {
lower = limits[i * 2];
upper = limits[i * 2 + 1];
}
ret = thermal_zone_bind_cooling_device(tz, i, cdev,
upper, lower,
weight);
if (ret)
print_bind_err_msg(tz, cdev, ret);
}
}
}
static void bind_cdev(struct thermal_cooling_device *cdev) static void bind_cdev(struct thermal_cooling_device *cdev)
{ {
int i, ret; int ret;
const struct thermal_zone_params *tzp;
struct thermal_zone_device *pos = NULL; struct thermal_zone_device *pos = NULL;
list_for_each_entry(pos, &thermal_tz_list, node) { list_for_each_entry(pos, &thermal_tz_list, node) {
if (!pos->tzp && !pos->ops->bind)
continue;
if (pos->ops->bind) { if (pos->ops->bind) {
ret = pos->ops->bind(pos, cdev); ret = pos->ops->bind(pos, cdev);
if (ret) if (ret)
print_bind_err_msg(pos, cdev, ret); print_bind_err_msg(pos, cdev, ret);
continue;
}
tzp = pos->tzp;
if (!tzp || !tzp->tbp)
continue;
for (i = 0; i < tzp->num_tbps; i++) {
if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
continue;
if (tzp->tbp[i].match(pos, cdev))
continue;
tzp->tbp[i].cdev = cdev;
__bind(pos, tzp->tbp[i].trip_mask, cdev,
tzp->tbp[i].binding_limits,
tzp->tbp[i].weight);
} }
} }
} }
...@@ -1134,16 +1088,6 @@ void thermal_cooling_device_update(struct thermal_cooling_device *cdev) ...@@ -1134,16 +1088,6 @@ void thermal_cooling_device_update(struct thermal_cooling_device *cdev)
} }
EXPORT_SYMBOL_GPL(thermal_cooling_device_update); EXPORT_SYMBOL_GPL(thermal_cooling_device_update);
static void __unbind(struct thermal_zone_device *tz, int mask,
struct thermal_cooling_device *cdev)
{
int i;
for (i = 0; i < tz->num_trips; i++)
if (mask & (1 << i))
thermal_zone_unbind_cooling_device(tz, i, cdev);
}
/** /**
* thermal_cooling_device_unregister - removes a thermal cooling device * thermal_cooling_device_unregister - removes a thermal cooling device
* @cdev: the thermal cooling device to remove. * @cdev: the thermal cooling device to remove.
...@@ -1153,8 +1097,6 @@ static void __unbind(struct thermal_zone_device *tz, int mask, ...@@ -1153,8 +1097,6 @@ static void __unbind(struct thermal_zone_device *tz, int mask,
*/ */
void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
{ {
int i;
const struct thermal_zone_params *tzp;
struct thermal_zone_device *tz; struct thermal_zone_device *tz;
if (!cdev) if (!cdev)
...@@ -1171,21 +1113,8 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) ...@@ -1171,21 +1113,8 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev)
/* Unbind all thermal zones associated with 'this' cdev */ /* Unbind all thermal zones associated with 'this' cdev */
list_for_each_entry(tz, &thermal_tz_list, node) { list_for_each_entry(tz, &thermal_tz_list, node) {
if (tz->ops->unbind) { if (tz->ops->unbind)
tz->ops->unbind(tz, cdev); tz->ops->unbind(tz, cdev);
continue;
}
if (!tz->tzp || !tz->tzp->tbp)
continue;
tzp = tz->tzp;
for (i = 0; i < tzp->num_tbps; i++) {
if (tzp->tbp[i].cdev == cdev) {
__unbind(tz, tzp->tbp[i].trip_mask, cdev);
tzp->tbp[i].cdev = NULL;
}
}
} }
mutex_unlock(&thermal_list_lock); mutex_unlock(&thermal_list_lock);
...@@ -1196,41 +1125,20 @@ EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); ...@@ -1196,41 +1125,20 @@ EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister);
static void bind_tz(struct thermal_zone_device *tz) static void bind_tz(struct thermal_zone_device *tz)
{ {
int i, ret; int ret;
struct thermal_cooling_device *pos = NULL; struct thermal_cooling_device *pos = NULL;
const struct thermal_zone_params *tzp = tz->tzp;
if (!tzp && !tz->ops->bind) if (!tz->ops->bind)
return; return;
mutex_lock(&thermal_list_lock); mutex_lock(&thermal_list_lock);
/* If there is ops->bind, try to use ops->bind */
if (tz->ops->bind) {
list_for_each_entry(pos, &thermal_cdev_list, node) { list_for_each_entry(pos, &thermal_cdev_list, node) {
ret = tz->ops->bind(tz, pos); ret = tz->ops->bind(tz, pos);
if (ret) if (ret)
print_bind_err_msg(tz, pos, ret); print_bind_err_msg(tz, pos, ret);
} }
goto exit;
}
if (!tzp || !tzp->tbp)
goto exit;
list_for_each_entry(pos, &thermal_cdev_list, node) {
for (i = 0; i < tzp->num_tbps; i++) {
if (tzp->tbp[i].cdev || !tzp->tbp[i].match)
continue;
if (tzp->tbp[i].match(tz, pos))
continue;
tzp->tbp[i].cdev = pos;
__bind(tz, tzp->tbp[i].trip_mask, pos,
tzp->tbp[i].binding_limits,
tzp->tbp[i].weight);
}
}
exit:
mutex_unlock(&thermal_list_lock); mutex_unlock(&thermal_list_lock);
} }
...@@ -1348,13 +1256,21 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t ...@@ -1348,13 +1256,21 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
if (!tz) if (!tz)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
if (tzp) {
tz->tzp = kmemdup(tzp, sizeof(*tzp), GFP_KERNEL);
if (!tz->tzp) {
result = -ENOMEM;
goto free_tz;
}
}
INIT_LIST_HEAD(&tz->thermal_instances); INIT_LIST_HEAD(&tz->thermal_instances);
ida_init(&tz->ida); ida_init(&tz->ida);
mutex_init(&tz->lock); mutex_init(&tz->lock);
id = ida_alloc(&thermal_tz_ida, GFP_KERNEL); id = ida_alloc(&thermal_tz_ida, GFP_KERNEL);
if (id < 0) { if (id < 0) {
result = id; result = id;
goto free_tz; goto free_tzp;
} }
tz->id = id; tz->id = id;
...@@ -1364,7 +1280,6 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t ...@@ -1364,7 +1280,6 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
ops->critical = thermal_zone_device_critical; ops->critical = thermal_zone_device_critical;
tz->ops = ops; tz->ops = ops;
tz->tzp = tzp;
tz->device.class = thermal_class; tz->device.class = thermal_class;
tz->devdata = devdata; tz->devdata = devdata;
tz->trips = trips; tz->trips = trips;
...@@ -1446,6 +1361,8 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t ...@@ -1446,6 +1361,8 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
tz = NULL; tz = NULL;
remove_id: remove_id:
ida_free(&thermal_tz_ida, id); ida_free(&thermal_tz_ida, id);
free_tzp:
kfree(tz->tzp);
free_tz: free_tz:
kfree(tz); kfree(tz);
return ERR_PTR(result); return ERR_PTR(result);
...@@ -1487,15 +1404,13 @@ EXPORT_SYMBOL_GPL(thermal_zone_device_id); ...@@ -1487,15 +1404,13 @@ EXPORT_SYMBOL_GPL(thermal_zone_device_id);
*/ */
void thermal_zone_device_unregister(struct thermal_zone_device *tz) void thermal_zone_device_unregister(struct thermal_zone_device *tz)
{ {
int i, tz_id; int tz_id;
const struct thermal_zone_params *tzp;
struct thermal_cooling_device *cdev; struct thermal_cooling_device *cdev;
struct thermal_zone_device *pos = NULL; struct thermal_zone_device *pos = NULL;
if (!tz) if (!tz)
return; return;
tzp = tz->tzp;
tz_id = tz->id; tz_id = tz->id;
mutex_lock(&thermal_list_lock); mutex_lock(&thermal_list_lock);
...@@ -1510,22 +1425,9 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) ...@@ -1510,22 +1425,9 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
list_del(&tz->node); list_del(&tz->node);
/* Unbind all cdevs associated with 'this' thermal zone */ /* Unbind all cdevs associated with 'this' thermal zone */
list_for_each_entry(cdev, &thermal_cdev_list, node) { list_for_each_entry(cdev, &thermal_cdev_list, node)
if (tz->ops->unbind) { if (tz->ops->unbind)
tz->ops->unbind(tz, cdev); tz->ops->unbind(tz, cdev);
continue;
}
if (!tzp || !tzp->tbp)
break;
for (i = 0; i < tzp->num_tbps; i++) {
if (tzp->tbp[i].cdev == cdev) {
__unbind(tz, tzp->tbp[i].trip_mask, cdev);
tzp->tbp[i].cdev = NULL;
}
}
}
mutex_unlock(&thermal_list_lock); mutex_unlock(&thermal_list_lock);
...@@ -1541,6 +1443,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) ...@@ -1541,6 +1443,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
device_del(&tz->device); device_del(&tz->device);
mutex_unlock(&tz->lock); mutex_unlock(&tz->lock);
kfree(tz->tzp);
put_device(&tz->device); put_device(&tz->device);
thermal_notify_tz_delete(tz_id); thermal_notify_tz_delete(tz_id);
......
...@@ -439,7 +439,7 @@ static int thermal_of_unbind(struct thermal_zone_device *tz, ...@@ -439,7 +439,7 @@ static int thermal_of_unbind(struct thermal_zone_device *tz,
* *
* @tz: a pointer to the thermal zone structure * @tz: a pointer to the thermal zone structure
*/ */
void thermal_of_zone_unregister(struct thermal_zone_device *tz) static void thermal_of_zone_unregister(struct thermal_zone_device *tz)
{ {
struct thermal_trip *trips = tz->trips; struct thermal_trip *trips = tz->trips;
struct thermal_zone_params *tzp = tz->tzp; struct thermal_zone_params *tzp = tz->tzp;
...@@ -451,7 +451,6 @@ void thermal_of_zone_unregister(struct thermal_zone_device *tz) ...@@ -451,7 +451,6 @@ void thermal_of_zone_unregister(struct thermal_zone_device *tz)
kfree(tzp); kfree(tzp);
kfree(ops); kfree(ops);
} }
EXPORT_SYMBOL_GPL(thermal_of_zone_unregister);
/** /**
* thermal_of_zone_register - Register a thermal zone with device node * thermal_of_zone_register - Register a thermal zone with device node
...@@ -473,7 +472,7 @@ EXPORT_SYMBOL_GPL(thermal_of_zone_unregister); ...@@ -473,7 +472,7 @@ EXPORT_SYMBOL_GPL(thermal_of_zone_unregister);
* - ENOMEM: if one structure can not be allocated * - ENOMEM: if one structure can not be allocated
* - Other negative errors are returned by the underlying called functions * - Other negative errors are returned by the underlying called functions
*/ */
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data, static struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
const struct thermal_zone_device_ops *ops) const struct thermal_zone_device_ops *ops)
{ {
struct thermal_zone_device *tz; struct thermal_zone_device *tz;
...@@ -550,7 +549,6 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, ...@@ -550,7 +549,6 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
return ERR_PTR(ret); return ERR_PTR(ret);
} }
EXPORT_SYMBOL_GPL(thermal_of_zone_register);
static void devm_thermal_of_zone_release(struct device *dev, void *res) static void devm_thermal_of_zone_release(struct device *dev, void *res)
{ {
......
...@@ -16,4 +16,14 @@ ...@@ -16,4 +16,14 @@
#define MT8195_MCU_LITTLE_CPU2 6 #define MT8195_MCU_LITTLE_CPU2 6
#define MT8195_MCU_LITTLE_CPU3 7 #define MT8195_MCU_LITTLE_CPU3 7
#define MT8195_AP_VPU0 8
#define MT8195_AP_VPU1 9
#define MT8195_AP_GPU0 10
#define MT8195_AP_GPU1 11
#define MT8195_AP_VDEC 12
#define MT8195_AP_IMG 13
#define MT8195_AP_INFRA 14
#define MT8195_AP_CAM0 15
#define MT8195_AP_CAM1 16
#endif /* __MEDIATEK_LVTS_DT_H */ #endif /* __MEDIATEK_LVTS_DT_H */
...@@ -207,41 +207,6 @@ struct thermal_governor { ...@@ -207,41 +207,6 @@ struct thermal_governor {
struct list_head governor_list; struct list_head governor_list;
}; };
/* Structure that holds binding parameters for a zone */
struct thermal_bind_params {
struct thermal_cooling_device *cdev;
/*
* This is a measure of 'how effectively these devices can
* cool 'this' thermal zone. It shall be determined by
* platform characterization. This value is relative to the
* rest of the weights so a cooling device whose weight is
* double that of another cooling device is twice as
* effective. See Documentation/driver-api/thermal/sysfs-api.rst for more
* information.
*/
int weight;
/*
* This is a bit mask that gives the binding relation between this
* thermal zone and cdev, for a particular trip point.
* See Documentation/driver-api/thermal/sysfs-api.rst for more information.
*/
int trip_mask;
/*
* This is an array of cooling state limits. Must have exactly
* 2 * thermal_zone.number_of_trip_points. It is an array consisting
* of tuples <lower-state upper-state> of state limits. Each trip
* will be associated with one state limit tuple when binding.
* A NULL pointer means <THERMAL_NO_LIMITS THERMAL_NO_LIMITS>
* on all trips.
*/
unsigned long *binding_limits;
int (*match) (struct thermal_zone_device *tz,
struct thermal_cooling_device *cdev);
};
/* Structure to define Thermal Zone parameters */ /* Structure to define Thermal Zone parameters */
struct thermal_zone_params { struct thermal_zone_params {
char governor_name[THERMAL_NAME_LENGTH]; char governor_name[THERMAL_NAME_LENGTH];
...@@ -253,9 +218,6 @@ struct thermal_zone_params { ...@@ -253,9 +218,6 @@ struct thermal_zone_params {
*/ */
bool no_hwmon; bool no_hwmon;
int num_tbps; /* Number of tbp entries */
struct thermal_bind_params *tbp;
/* /*
* Sustainable power (heat) that this thermal zone can dissipate in * Sustainable power (heat) that this thermal zone can dissipate in
* mW * mW
...@@ -297,25 +259,12 @@ struct thermal_zone_params { ...@@ -297,25 +259,12 @@ struct thermal_zone_params {
/* Function declarations */ /* Function declarations */
#ifdef CONFIG_THERMAL_OF #ifdef CONFIG_THERMAL_OF
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
const struct thermal_zone_device_ops *ops);
struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data,
const struct thermal_zone_device_ops *ops); const struct thermal_zone_device_ops *ops);
void thermal_of_zone_unregister(struct thermal_zone_device *tz);
void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz); void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_device *tz);
void thermal_of_zone_unregister(struct thermal_zone_device *tz);
#else #else
static inline
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
const struct thermal_zone_device_ops *ops)
{
return ERR_PTR(-ENOTSUPP);
}
static inline static inline
struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data, struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, int id, void *data,
...@@ -324,10 +273,6 @@ struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, in ...@@ -324,10 +273,6 @@ struct thermal_zone_device *devm_thermal_of_zone_register(struct device *dev, in
return ERR_PTR(-ENOTSUPP); return ERR_PTR(-ENOTSUPP);
} }
static inline void thermal_of_zone_unregister(struct thermal_zone_device *tz)
{
}
static inline void devm_thermal_of_zone_unregister(struct device *dev, static inline void devm_thermal_of_zone_unregister(struct device *dev,
struct thermal_zone_device *tz) struct thermal_zone_device *tz)
{ {
......
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