Re: [PATCH] thermal: use device node to get thermal zone

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/08/2014 08:31 PM, Eduardo Valentin wrote:
> * PGP Signed by an unknown key
> 
> On 08-01-2014 07:10, R, Durgadoss wrote:
>> Hi Wei,
>>
>>> -----Original Message-----
>>> From: linux-pm-owner@xxxxxxxxxxxxxxx [mailto:linux-pm-
>>> owner@xxxxxxxxxxxxxxx] On Behalf Of Wei Ni
>>> Sent: Wednesday, January 08, 2014 2:37 PM
>>> To: eduardo.valentin@xxxxxx; Zhang, Rui; mark.rutland@xxxxxxx
>>> Cc: MLongnecker@xxxxxxxxxx; swarren@xxxxxxxxxxxxx; linux-
>>> pm@xxxxxxxxxxxxxxx; linux-tegra@xxxxxxxxxxxxxxx; Wei Ni
>>> Subject: [PATCH] thermal: use device node to get thermal zone
>>>
>>> If use name to get the thermal zone, sometimes it can't
>>> get the unique thermal zone, because the thermal fw support
>>> same name for different thermal zone.
>>> So we can change to use device node to get thermal zone.
> 
> Please check the documentation for .*by_name function. There is an error
> code for the case of multiple instances. In fact, it is designed to be
> used by users who know that in the system there is going to exist only
> one zone with that name.
> 
> I don't think it is correct to simply remove the existing API and
> enforce DT usage. What if the system does not use DT?
> 
>>
>> Eduardo introduced this API because we wanted to get the
>> tzd pointer by using the name. So, for your case, can you
>> introduce a new API *get_by_node instead of changing this
>> API ?
> 
> Agreed, if you need a search by DT node, then you need to provide the
> use cases and propose a new one.

Yes, you are right, I should not remove it simply, I will add a new API
.*by_node.

On the tegra board, it will use two or more sensors to estimate the skin
temperature by reading temps from these sensors and calculate them.
For example, we have two sensors: sensor1 and sensor2. We can register
them to thermal framework by using DT, something like:
thermal-zones {
                sensor1: lm90-local {
			...
                        thermal-sensors = <&lm90 0>;
                };

                sensor2: lm90-remote {
			...
                        thermal-sensors = <&lm90 1>;
                };
}

Then I will add a device node for my skin temperature driver, something
like:
skin_temp {
	...
	#thermal-sensor-cells = <0>;

	sub-devs {
		dev@0 {
			dev = <&sensor1>;
		};

		dev@1 {
			dev = <&sensor2>;
		};
	};
};
So I can parse the DT in the skin temperature driver to get the nodes of
the sensor1 and sensor2, and can use .*get_by_node to get thermal zone
device, then use .get_temp() and other callbacks to get temperature and
other information. If use the *.get_by_name, it may not get the uniqu
one, because I don't know if there has the same name thermal zone,
because some other driver may not use DT to register thermal zone, it
can define any name by itself.

> 
>>
>> Thanks,
>> Durga
>>
>>>
>>> Signed-off-by: Wei Ni <wni@xxxxxxxxxx>
>>> ---
>>>  drivers/thermal/of-thermal.c   |    6 ++++--
>>>  drivers/thermal/thermal_core.c |   37 ++++++++++++++++---------------------
>>>  include/linux/thermal.h        |    4 +++-
>>>  3 files changed, 23 insertions(+), 24 deletions(-)
>>>
>>> diff --git a/drivers/thermal/of-thermal.c b/drivers/thermal/of-thermal.c
>>> index 04b1be7..97c12cf 100644
>>> --- a/drivers/thermal/of-thermal.c
>>> +++ b/drivers/thermal/of-thermal.c
>>> @@ -330,7 +330,7 @@ thermal_zone_of_add_sensor(struct device_node *zone,
>>>  	struct thermal_zone_device *tzd;
>>>  	struct __thermal_zone *tz;
>>>
>>> -	tzd = thermal_zone_get_zone_by_name(zone->name);
>>> +	tzd = thermal_zone_get_zone_by_node(zone);
> 
> In DT, nodes have unique names. Are you seen a problem with the above code?

this file is used for DT parse, I think it's better to use .*by_node
instead.

> 
>>>  	if (IS_ERR(tzd))
>>>  		return ERR_PTR(-EPROBE_DEFER);
>>>
>>> @@ -804,6 +804,8 @@ int __init of_parse_thermal_zones(void)
>>>  			of_thermal_free_zone(tz);
>>>  			/* attempting to build remaining zones still */
>>>  		}
>>> +
>>> +		zone->np = child;
>>>  	}
>>>
>>>  	return 0;
>>> @@ -837,7 +839,7 @@ void of_thermal_destroy_zones(void)
>>>  	for_each_child_of_node(np, child) {
>>>  		struct thermal_zone_device *zone;
>>>
>>> -		zone = thermal_zone_get_zone_by_name(child->name);
>>> +		zone = thermal_zone_get_zone_by_node(child);
>>>  		if (IS_ERR(zone))
>>>  			continue;
>>>
>>> diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
>>> index 338a88b..89e0637 100644
>>> --- a/drivers/thermal/thermal_core.c
>>> +++ b/drivers/thermal/thermal_core.c
>>> @@ -1635,42 +1635,37 @@ void thermal_zone_device_unregister(struct
>>> thermal_zone_device *tz)
>>>  EXPORT_SYMBOL_GPL(thermal_zone_device_unregister);
>>>
>>>  /**
>>> - * thermal_zone_get_zone_by_name() - search for a zone and returns its ref
>>> - * @name: thermal zone name to fetch the temperature
>>> + * thermal_zone_get_zone_by_node() - search for a zone and returns its ref
>>> + * @node: device node of the thermal zone
>>>   *
>>> - * When only one zone is found with the passed name, returns a reference to it.
>>> + * When thermal zone is found with the passed device node, returns a
>>> reference
>>> + * to it.
>>>   *
>>>   * Return: On success returns a reference to an unique thermal zone with
>>> - * matching name equals to @name, an ERR_PTR otherwise (-EINVAL for invalid
>>> - * paramenters, -ENODEV for not found and -EEXIST for multiple matches).
>>> + * matching device node, an ERR_PTR otherwise (-EINVAL for invalid
>>> + * paramenters, -ENODEV for not found).
>>>   */
>>> -struct thermal_zone_device *thermal_zone_get_zone_by_name(const char
>>> *name)
>>> +struct thermal_zone_device *
>>> +thermal_zone_get_zone_by_node(struct device_node *node)
>>>  {
> 
> You are removing an API, are you checking that all existing users of
> this API are changed accordingly? I don't think so.

Sorry, it's my mistake, I will not remove it in my next pactch.

> 
>>> -	struct thermal_zone_device *pos = NULL, *ref = ERR_PTR(-EINVAL);
>>> -	unsigned int found = 0;
>>> +	struct thermal_zone_device *pos = NULL, *ref = ERR_PTR(-ENODEV);
>>> +	bool found = false;
>>>
>>> -	if (!name)
>>> -		goto exit;
>>> +	if (!node)
>>> +		return ERR_PTR(-EINVAL);
>>>
>>>  	mutex_lock(&thermal_list_lock);
>>>  	list_for_each_entry(pos, &thermal_tz_list, node)
>>> -		if (!strnicmp(name, pos->type, THERMAL_NAME_LENGTH)) {
>>> -			found++;
>>> +		if (node == pos->np) {
>>>  			ref = pos;
>>> +			found = true;
>>> +			break;
>>>  		}
>>>  	mutex_unlock(&thermal_list_lock);
>>>
>>> -	/* nothing has been found, thus an error code for it */
>>> -	if (found == 0)
>>> -		ref = ERR_PTR(-ENODEV);
>>> -	else if (found > 1)
>>> -	/* Success only when an unique zone is found */
>>> -		ref = ERR_PTR(-EEXIST);
>>> -
>>> -exit:
>>>  	return ref;
>>>  }
>>> -EXPORT_SYMBOL_GPL(thermal_zone_get_zone_by_name);
>>> +EXPORT_SYMBOL_GPL(thermal_zone_get_zone_by_node);
>>>
>>>  #ifdef CONFIG_NET
>>>  static const struct genl_multicast_group thermal_event_mcgrps[] = {
>>> diff --git a/include/linux/thermal.h b/include/linux/thermal.h
>>> index f7e11c7..a94de8c 100644
>>> --- a/include/linux/thermal.h
>>> +++ b/include/linux/thermal.h
>>> @@ -162,6 +162,7 @@ struct thermal_zone_device {
>>>  	int id;
>>>  	char type[THERMAL_NAME_LENGTH];
>>>  	struct device device;
>>> +	struct device_node *np;
> 
> Please describe better if you want to add this node in here. Better to
> add it in a separated patch.
> 
>>>  	struct thermal_attr *trip_temp_attrs;
>>>  	struct thermal_attr *trip_type_attrs;
>>>  	struct thermal_attr *trip_hyst_attrs;
>>> @@ -285,7 +286,8 @@ struct thermal_cooling_device *
>>>  thermal_of_cooling_device_register(struct device_node *np, char *, void *,
>>>  				   const struct thermal_cooling_device_ops *);
>>>  void thermal_cooling_device_unregister(struct thermal_cooling_device *);
>>> -struct thermal_zone_device *thermal_zone_get_zone_by_name(const char
>>> *name);
>>> +struct thermal_zone_device *
>>> +thermal_zone_get_zone_by_node(struct device_node *node);
>>>  int thermal_zone_get_temp(struct thermal_zone_device *tz, unsigned long
>>> *temp);
>>>
>>>  int get_tz_trend(struct thermal_zone_device *, int);
>>> --
>>> 1.7.9.5
>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
>>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-pm" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>>
>>
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [ARM Kernel]     [Linux ARM]     [Linux ARM MSM]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux