- Used the platform data to get the sensor id instead of parsing the

device in the driver and remove the dedicated OF function (Daniel
   Lezcano)
 
 - Fixed Kconfig dependency for the QCom tsens driver (Jonathan
   Cameron)
 
 - Fixed missing const annotation for the RCar ops driver and removed a
   duplicate parameter check (Lad Prabhakar)
 
 - Fixed a NULL pointer dereference when calling set_trip_temp() (Lad
   Prabhakar)
 
 - Fixed the fourth hardware id in the QCom tsens driver (Vincent
   Knecht)
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCAAdFiEEGn3N4YVz0WNVyHskqDIjiipP6E8FAmM7/JIACgkQqDIjiipP
 6E/Emwf9GCy6aJHBzvU1cKkrHr6ShuTRG1nkdhuHpzt/oDZ5kRYIL7vZKbRAQ7N3
 YjKEi0F6x0V5CeCkHybMDHN8VvIVJEyhASUvWoV4eqYqlavaXVrT7/QQGnkCMrm/
 QYrkEbnxUyAt97tp+D7FD7vDOu2D6YCyb6kQWbnPMfEQolQcGx6vAuUmHW5RHrrD
 FoaP+XQHe5cuKG1h38TKxOx2q1ROeJqWlOX+3Aqw+Py9/QTrFfWni2i8+hs5BS9y
 5hX85RoHyuUW5PDG5aoSejQ2U1dZkxilB8ywAoMHGApUX2UyGp97wTUtLoMffdy+
 47+GqKUrt6w/ph9Z+7ZWvG+M9/Z0mw==
 =Tqak
 -----END PGP SIGNATURE-----

Merge tag 'thermal-v6.1-rc1-2' of https://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux

Pull thermal control fixes for 6.1-rc1 from Daniel Lezcano:

"- Used the platform data to get the sensor id instead of parsing the
   device in the driver and remove the dedicated OF function (Daniel
   Lezcano)

 - Fixed Kconfig dependency for the QCom tsens driver (Jonathan Cameron)

 - Fixed missing const annotation for the RCar ops driver and removed a
   duplicate parameter check (Lad Prabhakar)

 - Fixed a NULL pointer dereference when calling set_trip_temp() (Lad
   Prabhakar)

 - Fixed the fourth hardware id in the QCom tsens driver (Vincent
   Knecht)"

* tag 'thermal-v6.1-rc1-2' of https://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux:
  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:
Rafael J. Wysocki 2022-10-04 16:48:16 +02:00
commit e021563fd0
8 changed files with 42 additions and 96 deletions

View File

@ -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

View File

@ -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);

View File

@ -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,

View File

@ -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,
};

View File

@ -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);

View File

@ -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)

View File

@ -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;

View File

@ -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