forked from Minki/linux
More thermal control updates for 6.1-rc1
- Use platform data to get the sensor ID instead of parsing the device in imx_sc thermal driver and remove the dedicated OF function from the core code (Daniel Lezcano). - Fix Kconfig dependency for the QCom tsens thermal driver (Jonathan Cameron). - Add missing const annotation to the RCar ops thermal driver (Lad Prabhakar). - Drop duplicate parameter check from thermal_zone_device_register_with_trips() (Lad Prabhakar). - Fix NULL pointer dereference in trip_point_temp_store() by making it check if the ->set_trip_temp() operation is present (Lad Prabhakar). - Fix the MSM8939 fourth sensor hardware ID in the QCom tsens thermal driver (Vincent Knecht). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmNEVX4SHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxPt8P/RDbDE471D6tvCDUGG5+D17sJiUl5G87 okcAusrYD6wlQJP+/tK6o9p0elR7TbLI2iH3VuTRCgVrAUQYqzVMOH7eYZPq4p0R sNZ1q+wO0AUH1TKGJjtYc72Cx8k/1sVG0jtIncjpN1zsc5dDJkDU9mMYidLw3V+u FYSLOYY6Pj7wfDw0SYqeefCeVTz1d2SmliNBqvoBpvrM7VmfTiWdwiAqv9yqiukg JfrWJ8qEbP0q7Xx9oO5x6NhglgwzZd2HNdldh+kEVTx9iVSe8Pzb8qEi+xU/WP23 5qavneW2ccdxRLYEJAT2zhVszaswPa0vMsymYCbmeVcjpJ3WLoFyPaZuNixFBW0w iVr1z4OiQl6uwhiFbHbpQtTIVJi2Kh7cW8CfxRnF/mITGjnOCLz1alrtkWnhBzi3 muzZcry0ACwGS2s/huhx1jkMhVsGuiqiVPlbsSU+75AW8NORafpZwZPb6usMPtQn /nNgAj+kEI7tKBXI5f39+IwUm5GYQlGLAyboJ6iAKaQhhDw6R8cwkhPsP1rtXLIR wj+dhBG/WFdA/HDYMKvNEg77CFbHceOGvO3nmq6V/5xDMKX+T7lMM0nEp33fkWxC DnuZdKp+E+iopdmAAN6jfl/frGUjdYEuz+MVWJdfxhiLpIpcD7MJDvMbUCkwZwp3 T9dj7CWachx0 =BrtK -----END PGP SIGNATURE----- Merge tag 'thermal-6.1-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull more thermal control updates from Rafael Wysocki: "These fix assorted issues in the thermal core and ARM thermal drivers. Specifics: - Use platform data to get the sensor ID instead of parsing the device in imx_sc thermal driver and remove the dedicated OF function from the core code (Daniel Lezcano). - Fix Kconfig dependency for the QCom tsens thermal driver (Jonathan Cameron). - Add missing const annotation to the RCar ops thermal driver (Lad Prabhakar). - Drop duplicate parameter check from thermal_zone_device_register_with_trips() (Lad Prabhakar). - Fix NULL pointer dereference in trip_point_temp_store() by making it check if the ->set_trip_temp() operation is present (Lad Prabhakar). - Fix the MSM8939 fourth sensor hardware ID in the QCom tsens thermal driver (Vincent Knecht)" * tag 'thermal-6.1-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: thermal/drivers/qcom/tsens-v0_1: Fix MSM8939 fourth sensor hw_id thermal/core: Add a check before calling set_trip_temp() thermal/core: Drop valid pointer check for type thermal/drivers/rcar_thermal: Constify static thermal_zone_device_ops thermal/drivers/qcom: Drop false build dependency of all QCOM drivers on QCOM_TSENS thermal/of: Remove the thermal_zone_of_get_sensor_id() function thermal/drivers/imx_sc: Rely on the platform data to get the resource id
This commit is contained in:
commit
aa512c115a
@ -52,7 +52,7 @@ obj-$(CONFIG_DA9062_THERMAL) += da9062-thermal.o
|
|||||||
obj-y += intel/
|
obj-y += intel/
|
||||||
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
|
obj-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
|
||||||
obj-y += st/
|
obj-y += st/
|
||||||
obj-$(CONFIG_QCOM_TSENS) += qcom/
|
obj-y += qcom/
|
||||||
obj-y += tegra/
|
obj-y += tegra/
|
||||||
obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o
|
obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o
|
||||||
obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o
|
obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o
|
||||||
|
@ -76,59 +76,55 @@ static const struct thermal_zone_device_ops imx_sc_thermal_ops = {
|
|||||||
|
|
||||||
static int imx_sc_thermal_probe(struct platform_device *pdev)
|
static int imx_sc_thermal_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device_node *np, *child, *sensor_np;
|
|
||||||
struct imx_sc_sensor *sensor;
|
struct imx_sc_sensor *sensor;
|
||||||
int ret;
|
const int *resource_id;
|
||||||
|
int i, ret;
|
||||||
|
|
||||||
ret = imx_scu_get_handle(&thermal_ipc_handle);
|
ret = imx_scu_get_handle(&thermal_ipc_handle);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
np = of_find_node_by_name(NULL, "thermal-zones");
|
resource_id = of_device_get_match_data(&pdev->dev);
|
||||||
if (!np)
|
if (!resource_id)
|
||||||
return -ENODEV;
|
return -EINVAL;
|
||||||
|
|
||||||
sensor_np = of_node_get(pdev->dev.of_node);
|
for (i = 0; resource_id[i] > 0; i++) {
|
||||||
|
|
||||||
for_each_available_child_of_node(np, child) {
|
|
||||||
sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
|
sensor = devm_kzalloc(&pdev->dev, sizeof(*sensor), GFP_KERNEL);
|
||||||
if (!sensor) {
|
if (!sensor)
|
||||||
of_node_put(child);
|
return -ENOMEM;
|
||||||
ret = -ENOMEM;
|
|
||||||
goto put_node;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = thermal_zone_of_get_sensor_id(child,
|
sensor->resource_id = resource_id[i];
|
||||||
sensor_np,
|
|
||||||
&sensor->resource_id);
|
|
||||||
if (ret < 0) {
|
|
||||||
dev_err(&pdev->dev,
|
|
||||||
"failed to get valid sensor resource id: %d\n",
|
|
||||||
ret);
|
|
||||||
of_node_put(child);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev,
|
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev, sensor->resource_id,
|
||||||
sensor->resource_id,
|
sensor, &imx_sc_thermal_ops);
|
||||||
sensor,
|
|
||||||
&imx_sc_thermal_ops);
|
|
||||||
if (IS_ERR(sensor->tzd)) {
|
if (IS_ERR(sensor->tzd)) {
|
||||||
dev_err(&pdev->dev, "failed to register thermal zone\n");
|
/*
|
||||||
|
* Save the error value before freeing the
|
||||||
|
* sensor pointer, otherwise we endup with a
|
||||||
|
* use-after-free error
|
||||||
|
*/
|
||||||
ret = PTR_ERR(sensor->tzd);
|
ret = PTR_ERR(sensor->tzd);
|
||||||
of_node_put(child);
|
|
||||||
break;
|
devm_kfree(&pdev->dev, sensor);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The thermal framework notifies us there is
|
||||||
|
* no thermal zone description for such a
|
||||||
|
* sensor id
|
||||||
|
*/
|
||||||
|
if (ret == -ENODEV)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dev_err(&pdev->dev, "failed to register thermal zone\n");
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (devm_thermal_add_hwmon_sysfs(sensor->tzd))
|
if (devm_thermal_add_hwmon_sysfs(sensor->tzd))
|
||||||
dev_warn(&pdev->dev, "failed to add hwmon sysfs attributes\n");
|
dev_warn(&pdev->dev, "failed to add hwmon sysfs attributes\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
put_node:
|
return 0;
|
||||||
of_node_put(sensor_np);
|
|
||||||
of_node_put(np);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int imx_sc_thermal_remove(struct platform_device *pdev)
|
static int imx_sc_thermal_remove(struct platform_device *pdev)
|
||||||
@ -136,8 +132,10 @@ static int imx_sc_thermal_remove(struct platform_device *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int imx_sc_sensors[] = { IMX_SC_R_SYSTEM, IMX_SC_R_PMIC_0, -1 };
|
||||||
|
|
||||||
static const struct of_device_id imx_sc_thermal_table[] = {
|
static const struct of_device_id imx_sc_thermal_table[] = {
|
||||||
{ .compatible = "fsl,imx-sc-thermal", },
|
{ .compatible = "fsl,imx-sc-thermal", .data = imx_sc_sensors },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, imx_sc_thermal_table);
|
MODULE_DEVICE_TABLE(of, imx_sc_thermal_table);
|
||||||
|
@ -604,7 +604,7 @@ static const struct tsens_ops ops_8939 = {
|
|||||||
struct tsens_plat_data data_8939 = {
|
struct tsens_plat_data data_8939 = {
|
||||||
.num_sensors = 10,
|
.num_sensors = 10,
|
||||||
.ops = &ops_8939,
|
.ops = &ops_8939,
|
||||||
.hw_ids = (unsigned int []){ 0, 1, 2, 4, 5, 6, 7, 8, 9, 10 },
|
.hw_ids = (unsigned int []){ 0, 1, 2, 3, 5, 6, 7, 8, 9, 10 },
|
||||||
|
|
||||||
.feat = &tsens_v0_1_feat,
|
.feat = &tsens_v0_1_feat,
|
||||||
.fields = tsens_v0_1_regfields,
|
.fields = tsens_v0_1_regfields,
|
||||||
|
@ -316,7 +316,7 @@ static int rcar_thermal_get_trip_temp(struct thermal_zone_device *zone,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct thermal_zone_device_ops rcar_thermal_zone_of_ops = {
|
static const struct thermal_zone_device_ops rcar_thermal_zone_of_ops = {
|
||||||
.get_temp = rcar_thermal_get_temp,
|
.get_temp = rcar_thermal_get_temp,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1186,7 +1186,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
|
|||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type && strlen(type) >= THERMAL_NAME_LENGTH) {
|
if (strlen(type) >= THERMAL_NAME_LENGTH) {
|
||||||
pr_err("Thermal zone name (%s) too long, should be under %d chars\n",
|
pr_err("Thermal zone name (%s) too long, should be under %d chars\n",
|
||||||
type, THERMAL_NAME_LENGTH);
|
type, THERMAL_NAME_LENGTH);
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
@ -130,50 +130,6 @@ static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* thermal_zone_of_get_sensor_id - get sensor ID from a DT thermal zone
|
|
||||||
* @tz_np: a valid thermal zone device node.
|
|
||||||
* @sensor_np: a sensor node of a valid sensor device.
|
|
||||||
* @id: the sensor ID returned if success.
|
|
||||||
*
|
|
||||||
* This function will get sensor ID from a given thermal zone node and
|
|
||||||
* the sensor node must match the temperature provider @sensor_np.
|
|
||||||
*
|
|
||||||
* Return: 0 on success, proper error code otherwise.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
|
||||||
struct device_node *sensor_np,
|
|
||||||
u32 *id)
|
|
||||||
{
|
|
||||||
struct of_phandle_args sensor_specs;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = of_parse_phandle_with_args(tz_np,
|
|
||||||
"thermal-sensors",
|
|
||||||
"#thermal-sensor-cells",
|
|
||||||
0,
|
|
||||||
&sensor_specs);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (sensor_specs.np != sensor_np) {
|
|
||||||
of_node_put(sensor_specs.np);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sensor_specs.args_count > 1)
|
|
||||||
pr_warn("%pOFn: too many cells in sensor specifier %d\n",
|
|
||||||
sensor_specs.np, sensor_specs.args_count);
|
|
||||||
|
|
||||||
*id = sensor_specs.args_count ? sensor_specs.args[0] : 0;
|
|
||||||
|
|
||||||
of_node_put(sensor_specs.np);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(thermal_zone_of_get_sensor_id);
|
|
||||||
|
|
||||||
/*** functions parsing device tree nodes ***/
|
/*** functions parsing device tree nodes ***/
|
||||||
|
|
||||||
static int of_find_trip_id(struct device_node *np, struct device_node *trip)
|
static int of_find_trip_id(struct device_node *np, struct device_node *trip)
|
||||||
|
@ -128,9 +128,11 @@ trip_point_temp_store(struct device *dev, struct device_attribute *attr,
|
|||||||
if (kstrtoint(buf, 10, &temperature))
|
if (kstrtoint(buf, 10, &temperature))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (tz->ops->set_trip_temp) {
|
||||||
ret = tz->ops->set_trip_temp(tz, trip, temperature);
|
ret = tz->ops->set_trip_temp(tz, trip, temperature);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if (tz->trips)
|
if (tz->trips)
|
||||||
tz->trips[trip].temperature = temperature;
|
tz->trips[trip].temperature = temperature;
|
||||||
|
@ -308,9 +308,6 @@ void devm_thermal_of_zone_unregister(struct device *dev, struct thermal_zone_dev
|
|||||||
|
|
||||||
void thermal_of_zone_unregister(struct thermal_zone_device *tz);
|
void thermal_of_zone_unregister(struct thermal_zone_device *tz);
|
||||||
|
|
||||||
int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
|
||||||
struct device_node *sensor_np,
|
|
||||||
u32 *id);
|
|
||||||
#else
|
#else
|
||||||
static inline
|
static inline
|
||||||
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
|
struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor, int id, void *data,
|
||||||
@ -334,13 +331,6 @@ static inline void devm_thermal_of_zone_unregister(struct device *dev,
|
|||||||
struct thermal_zone_device *tz)
|
struct thermal_zone_device *tz)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
|
||||||
struct device_node *sensor_np,
|
|
||||||
u32 *id)
|
|
||||||
{
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_THERMAL
|
#ifdef CONFIG_THERMAL
|
||||||
|
Loading…
Reference in New Issue
Block a user