On Fri, 2017-07-14 at 11:48 -0600, Prashanth Prakash wrote: > Per ACPI 6.2 spec, platforms can optionally add a string(_STR) > object within each thermal zone package which provides a user > friendly name/description. > > Add support to parse the string object, which will be exposed > to userspace by thermal framework. > is there any real request for this? _STR is a generic control method for all the ACPI devices. Thus I'm wondering, if really needed, should we expose this in acpi bus instead? thanks, rui > Signed-off-by: Prashanth Prakash <pprakash@xxxxxxxxxxxxxx> > --- > drivers/acpi/thermal.c | 38 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c > index 1d0417b..6ab6480 100644 > --- a/drivers/acpi/thermal.c > +++ b/drivers/acpi/thermal.c > @@ -41,6 +41,7 @@ > #include <linux/acpi.h> > #include <linux/workqueue.h> > #include <linux/uaccess.h> > +#include <linux/nls.h> > > #define PREFIX "ACPI: " > > @@ -188,6 +189,7 @@ struct acpi_thermal { > int tz_enabled; > int kelvin_offset; > struct work_struct thermal_check_work; > + char desc[THERMAL_MAX_DESC_STR_LEN]; > }; > > /* --------------------------------------------------------------- > ----------- > @@ -543,6 +545,15 @@ static int thermal_get_temp(struct > thermal_zone_device *thermal, int *temp) > return 0; > } > > +static int thermal_get_desc(struct thermal_zone_device *thermal, > char *desc, > + int size) > +{ > + struct acpi_thermal *tz = thermal->devdata; > + > + strlcpy(desc, tz->desc, size); > + return 0; > +} > + > static int thermal_get_mode(struct thermal_zone_device *thermal, > enum thermal_device_mode *mode) > { > @@ -880,6 +891,7 @@ static int acpi_thermal_cooling_device_cb(struct > thermal_zone_device *thermal, > .get_crit_temp = thermal_get_crit_temp, > .get_trend = thermal_get_trend, > .notify = thermal_notify, > + .get_desc = thermal_get_desc, > }; > > static int acpi_thermal_register_thermal_zone(struct acpi_thermal > *tz) > @@ -1014,6 +1026,29 @@ static void > acpi_thermal_aml_dependency_fix(struct acpi_thermal *tz) > acpi_evaluate_integer(handle, "_TMP", NULL, &value); > } > > +static void acpi_thermal_get_desc(struct acpi_thermal *tz) > +{ > + acpi_handle handle = tz->device->handle; > + acpi_status status; > + struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; > + > + status = acpi_evaluate_object(handle, "_STR", NULL, > &buffer); > + > + if (ACPI_FAILURE(status)) > + strlcpy(tz->desc, "<not supported>", > THERMAL_MAX_DESC_STR_LEN); > + else { > + union acpi_object *str; > + int result; > + > + str = buffer.pointer; > + result = utf16s_to_utf8s((wchar_t *)str- > >string.pointer, > + str->string.length, > UTF16_LITTLE_ENDIAN, > + tz->desc, > THERMAL_MAX_DESC_STR_LEN-1); > + tz->desc[result] = 0; > + kfree(buffer.pointer); > + } > +} > + > static int acpi_thermal_get_info(struct acpi_thermal *tz) > { > int result = 0; > @@ -1045,6 +1080,9 @@ static int acpi_thermal_get_info(struct > acpi_thermal *tz) > else > acpi_thermal_get_polling_frequency(tz); > > + /* Get thermal zone description [_STR] (optional) */ > + acpi_thermal_get_desc(tz); > + > return 0; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html