[PATCH linux dev-4.10] drivers: hwmon: occ: Add "master" attribute and remove status files
Eddie James
eajames at linux.vnet.ibm.com
Thu Jun 15 06:26:06 AEST 2017
From: "Edward A. James" <eajames at us.ibm.com>
Driver did not remove status device attributes when the device was
unloaded.
Signed-off-by: Edward A. James <eajames at us.ibm.com>
---
drivers/hwmon/occ/common.c | 39 ++++++++++++++++++++++++++++-----------
drivers/hwmon/occ/common.h | 1 +
drivers/hwmon/occ/p8_i2c.c | 10 ++++++++++
drivers/hwmon/occ/p9_sbe.c | 10 ++++++++++
4 files changed, 49 insertions(+), 11 deletions(-)
diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c
index bee64cd..f34b400 100644
--- a/drivers/hwmon/occ/common.c
+++ b/drivers/hwmon/occ/common.c
@@ -10,8 +10,9 @@
#include <asm/unaligned.h>
#include "common.h"
-#define OCC_NUM_STATUS_ATTRS 6
+#define OCC_NUM_STATUS_ATTRS 7
+#define OCC_STAT_MASTER 0x80
#define OCC_STAT_ACTIVE 0x01
#define OCC_EXT_STAT_DVFS_OT 0x80
#define OCC_EXT_STAT_DVFS_POWER 0x40
@@ -236,21 +237,24 @@ static ssize_t occ_show_status(struct device *dev,
switch (sattr->index) {
case 0:
- val = header->status & OCC_STAT_ACTIVE;
+ val = header->status & OCC_STAT_MASTER;
break;
case 1:
- val = header->ext_status & OCC_EXT_STAT_DVFS_OT;
+ val = header->status & OCC_STAT_ACTIVE;
break;
case 2:
- val = header->ext_status & OCC_EXT_STAT_DVFS_POWER;
+ val = header->ext_status & OCC_EXT_STAT_DVFS_OT;
break;
case 3:
- val = header->ext_status & OCC_EXT_STAT_MEM_THROTTLE;
+ val = header->ext_status & OCC_EXT_STAT_DVFS_POWER;
break;
case 4:
- val = header->ext_status & OCC_EXT_STAT_QUICK_DROP;
+ val = header->ext_status & OCC_EXT_STAT_MEM_THROTTLE;
break;
case 5:
+ val = header->ext_status & OCC_EXT_STAT_QUICK_DROP;
+ break;
+ case 6:
val = header->occ_state;
break;
}
@@ -1061,29 +1065,33 @@ int occ_create_status_attrs(struct occ *occ)
return -ENOMEM;
occ->status_attrs[0] =
- (struct sensor_device_attribute)SENSOR_ATTR(occ_active, 0444,
+ (struct sensor_device_attribute)SENSOR_ATTR(occ_master, 0444,
occ_show_status,
NULL, 0);
occ->status_attrs[1] =
+ (struct sensor_device_attribute)SENSOR_ATTR(occ_active, 0444,
+ occ_show_status,
+ NULL, 0);
+ occ->status_attrs[2] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_dvfs_ot, 0444,
occ_show_status,
NULL, 1);
- occ->status_attrs[2] =
+ occ->status_attrs[3] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_dvfs_power,
0444,
occ_show_status,
NULL, 2);
- occ->status_attrs[3] =
+ occ->status_attrs[4] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_mem_throttle,
0444,
occ_show_status,
NULL, 3);
- occ->status_attrs[4] =
+ occ->status_attrs[5] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_quick_drop,
0444,
occ_show_status,
NULL, 4);
- occ->status_attrs[5] =
+ occ->status_attrs[6] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_status, 0444,
occ_show_status,
NULL, 5);
@@ -1097,3 +1105,12 @@ int occ_create_status_attrs(struct occ *occ)
return 0;
}
+
+void occ_remove_status_attrs(struct occ *occ)
+{
+ int i;
+
+ for (i = 0; i < OCC_NUM_STATUS_ATTRS; ++i)
+ device_remove_file(occ->bus_dev,
+ &occ->status_attrs[i].dev_attr);
+}
diff --git a/drivers/hwmon/occ/common.h b/drivers/hwmon/occ/common.h
index ad21538..a6582a7 100644
--- a/drivers/hwmon/occ/common.h
+++ b/drivers/hwmon/occ/common.h
@@ -137,5 +137,6 @@ struct occ {
int occ_update_response(struct occ *occ);
int occ_setup_sensor_attrs(struct occ *occ);
int occ_create_status_attrs(struct occ *occ);
+void occ_remove_status_attrs(struct occ *occ);
#endif /* __OCC_COMMON_H__ */
diff --git a/drivers/hwmon/occ/p8_i2c.c b/drivers/hwmon/occ/p8_i2c.c
index a2f10ea..a4d9965 100644
--- a/drivers/hwmon/occ/p8_i2c.c
+++ b/drivers/hwmon/occ/p8_i2c.c
@@ -245,6 +245,15 @@ static int p8_i2c_occ_probe(struct i2c_client *client,
return 0;
}
+static int p8_i2c_occ_remove(struct i2c_client *client)
+{
+ struct occ *occ = dev_get_drvdata(&client->dev);
+
+ occ_remove_status_attrs(occ);
+
+ return 0;
+}
+
static const struct of_device_id p8_i2c_occ_of_match[] = {
{ .compatible = "ibm,p8-occ-hwmon" },
{}
@@ -260,6 +269,7 @@ static int p8_i2c_occ_probe(struct i2c_client *client,
.of_match_table = p8_i2c_occ_of_match,
},
.probe = p8_i2c_occ_probe,
+ .remove = p8_i2c_occ_remove,
.address_list = p8_i2c_occ_addr,
};
diff --git a/drivers/hwmon/occ/p9_sbe.c b/drivers/hwmon/occ/p9_sbe.c
index c70858d..6226f6f 100644
--- a/drivers/hwmon/occ/p9_sbe.c
+++ b/drivers/hwmon/occ/p9_sbe.c
@@ -151,6 +151,15 @@ static int p9_sbe_occ_probe(struct platform_device *pdev)
return p9_sbe_occ_setup(p9_sbe_occ);
}
+static int p9_sbe_occ_remove(struct platform_device *pdev)
+{
+ struct occ *occ = platform_get_drvdata(pdev);
+
+ occ_remove_status_attrs(occ);
+
+ return 0;
+}
+
static const struct of_device_id p9_sbe_occ_of_match[] = {
{ .compatible = "ibm,p9-occ-hwmon" },
{ },
@@ -162,6 +171,7 @@ static int p9_sbe_occ_probe(struct platform_device *pdev)
.of_match_table = p9_sbe_occ_of_match,
},
.probe = p9_sbe_occ_probe,
+ .remove = p9_sbe_occ_remove,
};
module_platform_driver(p9_sbe_occ_driver);
--
1.8.3.1
More information about the openbmc
mailing list