diff options
author | Cédric Le Goater <clg@fr.ibm.com> | 2015-03-19 18:44:45 +0100 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2015-03-20 08:25:14 -0700 |
commit | fcaf57b67dd03314ade476b847f246ae377160a8 (patch) | |
tree | e4dcede2cdd9cc359cb9abec6f25b6d179286893 | |
parent | f9f54f16bfa1bc76d827d4a2c80f72acbee72b05 (diff) |
hwmon: (ibmpowernv) do not use the OPAL index for hwmon attribute names
The current OPAL firmware exposes the different sensors of an IBM Power
system using node names such as :
sensors/amb-temp#1-data
sensors/amb-temp#1-thrs
cooling-fan#1-data
cooling-fan#1-faulted
cooling-fan#1-thrs
cooling-fan#2-data
...
The ibmpowernv driver, when loaded, parses these names to extract the
sensor index and the sensor attribute name. Unfortunately, this scheme
makes it difficult to add sensors with a different layout (specially of
the same type, like temperature) as the sensor index calculated in OPAL
is directly used in the hwmon sysfs interface.
What this patch does is add a independent hwmon index for each sensor.
The increment of the hwmon index (temp, fan, power, etc.) is kept per
sensor type in the sensor_group table. The sensor_data table is used
to store the association of the hwmon and OPAL indexes, as we need to
have the same hwmon index for different attributes of a same sensor.
Signed-off-by: Cédric Le Goater <clg@fr.ibm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/ibmpowernv.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/hwmon/ibmpowernv.c b/drivers/hwmon/ibmpowernv.c index adfdf59e8f6c..99ca5362dbca 100644 --- a/drivers/hwmon/ibmpowernv.c +++ b/drivers/hwmon/ibmpowernv.c @@ -55,6 +55,7 @@ static struct sensor_group { const char *compatible; struct attribute_group group; u32 attr_count; + u32 hwmon_index; } sensor_groups[] = { {"fan", "ibm,opal-sensor-cooling-fan"}, {"temp", "ibm,opal-sensor-amb-temp"}, @@ -64,6 +65,8 @@ static struct sensor_group { struct sensor_data { u32 id; /* An opaque id of the firmware for each sensor */ + u32 hwmon_index; + u32 opal_index; enum sensors type; char name[MAX_ATTR_LEN]; struct device_attribute dev_attr; @@ -181,6 +184,19 @@ static int get_sensor_type(struct device_node *np) return MAX_SENSOR_TYPE; } +static u32 get_sensor_hwmon_index(struct sensor_data *sdata, + struct sensor_data *sdata_table, int count) +{ + int i; + + for (i = 0; i < count; i++) + if (sdata_table[i].opal_index == sdata->opal_index && + sdata_table[i].type == sdata->type) + return sdata_table[i].hwmon_index; + + return ++sensor_groups[sdata->type].hwmon_index; +} + static int populate_attr_groups(struct platform_device *pdev) { struct platform_data *pdata = platform_get_drvdata(pdev); @@ -270,8 +286,13 @@ static int create_device_attrs(struct platform_device *pdev) goto exit_put_node; } + sdata[count].opal_index = opal_index; + sdata[count].hwmon_index = + get_sensor_hwmon_index(&sdata[count], sdata, count); + snprintf(sdata[count].name, MAX_ATTR_LEN, "%s%d_%s", - sensor_groups[type].name, opal_index, attr_name); + sensor_groups[type].name, sdata[count].hwmon_index, + attr_name); sysfs_attr_init(&sdata[count].dev_attr.attr); sdata[count].dev_attr.attr.name = sdata[count].name; |