Skip to contentSkip to conversation

drivers: hwmon: occ: Add "master" attribute and remove status files

PATCH Applied Eddie James 2 participants 2 messages Jun 14, 2017 – Jun 16, 2017 Hardware monitoring

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 drivers: hwmon: occ: Add "master" attribute and remove status files

From: "Edward A. James" <[email protected]>

Driver did not remove status device attributes when the device was unloaded.

---
 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(-)
drivers/hwmon/occ/common.c +28 -11
index bee64cd..f34b400 100644
@@ -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);
+}
drivers/hwmon/occ/common.h +1 -0
index ad21538..a6582a7 100644
@@ -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__ */
drivers/hwmon/occ/p8_i2c.c +10 -0
index a2f10ea..a4d9965 100644
@@ -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,
 };
 
drivers/hwmon/occ/p9_sbe.c +10 -0
index c70858d..6226f6f 100644
@@ -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);
Signature · 1 line
1.8.3.1
Applied
#1 lore raw

2017-06-15 5:56 GMT+09:30 Eddie James <[email protected]>:

Quoted 6 lines

From: "Edward A. James" <[email protected]>

Driver did not remove status device attributes when the device was unloaded.

Applied to dev-4.10.

Quoted 174 lines
---
 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(-)
drivers/hwmon/occ/common.c +28 -11
index bee64cd..f34b400 100644
@@ -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);
+}
drivers/hwmon/occ/common.h +1 -0
index ad21538..a6582a7 100644
@@ -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__ */
drivers/hwmon/occ/p8_i2c.c +10 -0
index a2f10ea..a4d9965 100644
@@ -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,
 };
 
drivers/hwmon/occ/p9_sbe.c +10 -1
index c70858d..6226f6f 100644
@@ -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