mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
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-$(CONFIG_TI_SOC_THERMAL) += ti-soc-thermal/
|
||||
obj-y += st/
|
||||
obj-$(CONFIG_QCOM_TSENS) += qcom/
|
||||
obj-y += qcom/
|
||||
obj-y += tegra/
|
||||
obj-$(CONFIG_HISI_THERMAL) += hisi_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)
|
||||
{
|
||||
struct device_node *np, *child, *sensor_np;
|
||||
struct imx_sc_sensor *sensor;
|
||||
int ret;
|
||||
const int *resource_id;
|
||||
int i, ret;
|
||||
|
||||
ret = imx_scu_get_handle(&thermal_ipc_handle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
np = of_find_node_by_name(NULL, "thermal-zones");
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
resource_id = of_device_get_match_data(&pdev->dev);
|
||||
if (!resource_id)
|
||||
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);
|
||||
if (!sensor) {
|
||||
of_node_put(child);
|
||||
ret = -ENOMEM;
|
||||
goto put_node;
|
||||
}
|
||||
if (!sensor)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = thermal_zone_of_get_sensor_id(child,
|
||||
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->resource_id = resource_id[i];
|
||||
|
||||
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev,
|
||||
sensor->resource_id,
|
||||
sensor,
|
||||
&imx_sc_thermal_ops);
|
||||
sensor->tzd = devm_thermal_of_zone_register(&pdev->dev, sensor->resource_id,
|
||||
sensor, &imx_sc_thermal_ops);
|
||||
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);
|
||||
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))
|
||||
dev_warn(&pdev->dev, "failed to add hwmon sysfs attributes\n");
|
||||
}
|
||||
|
||||
put_node:
|
||||
of_node_put(sensor_np);
|
||||
of_node_put(np);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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[] = {
|
||||
{ .compatible = "fsl,imx-sc-thermal", },
|
||||
{ .compatible = "fsl,imx-sc-thermal", .data = imx_sc_sensors },
|
||||
{}
|
||||
};
|
||||
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 = {
|
||||
.num_sensors = 10,
|
||||
.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,
|
||||
.fields = tsens_v0_1_regfields,
|
||||
|
@ -316,7 +316,7 @@ static int rcar_thermal_get_trip_temp(struct thermal_zone_device *zone,
|
||||
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,
|
||||
};
|
||||
|
||||
|
@ -1186,7 +1186,7 @@ thermal_zone_device_register_with_trips(const char *type, struct thermal_trip *t
|
||||
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",
|
||||
type, THERMAL_NAME_LENGTH);
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
@ -130,50 +130,6 @@ static int of_thermal_get_crit_temp(struct thermal_zone_device *tz,
|
||||
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 ***/
|
||||
|
||||
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))
|
||||
return -EINVAL;
|
||||
|
||||
ret = tz->ops->set_trip_temp(tz, trip, temperature);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (tz->ops->set_trip_temp) {
|
||||
ret = tz->ops->set_trip_temp(tz, trip, temperature);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (tz->trips)
|
||||
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);
|
||||
|
||||
int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
||||
struct device_node *sensor_np,
|
||||
u32 *id);
|
||||
#else
|
||||
static inline
|
||||
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)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int thermal_zone_of_get_sensor_id(struct device_node *tz_np,
|
||||
struct device_node *sensor_np,
|
||||
u32 *id)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_THERMAL
|
||||
|
Loading…
Reference in New Issue
Block a user