[PATCH linux dev-4.10 1/2] drivers: hwmon: occ: Add occs_present attribute
Eddie James
eajames at linux.vnet.ibm.com
Sat Oct 7 07:43:00 AEDT 2017
From: "Edward A. James" <eajames at us.ibm.com>
Remove the error on detecting occs_present mismatch. Add a new sysfs
entry for occs_present field. Add sysfs_notify for this field, if it
changes.
Signed-off-by: Edward A. James <eajames at us.ibm.com>
---
drivers/hwmon/occ/common.c | 32 ++++++++++++++++++++------------
drivers/hwmon/occ/common.h | 3 ---
drivers/hwmon/occ/p8_i2c.c | 4 ----
drivers/hwmon/occ/p9_sbe.c | 4 ----
4 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c
index 34002fb..e8579b6 100644
--- a/drivers/hwmon/occ/common.c
+++ b/drivers/hwmon/occ/common.c
@@ -10,7 +10,7 @@
#include <asm/unaligned.h>
#include "common.h"
-#define OCC_NUM_STATUS_ATTRS 8
+#define OCC_NUM_STATUS_ATTRS 9
#define OCC_STAT_MASTER 0x80
#define OCC_STAT_ACTIVE 0x01
@@ -19,8 +19,6 @@
#define OCC_EXT_STAT_MEM_THROTTLE 0x20
#define OCC_EXT_STAT_QUICK_DROP 0x10
-atomic_t occ_num_occs = ATOMIC_INIT(0);
-
struct temp_sensor_1 {
u16 sensor_id;
u16 value;
@@ -179,9 +177,11 @@ void occ_reset_error(struct occ *occ)
int occ_poll(struct occ *occ)
{
int rc, error = occ->error;
- struct occ_poll_response_header *header;
+ struct occ_poll_response_header *header =
+ (struct occ_poll_response_header *)occ->resp.data;
u16 checksum = occ->poll_cmd_data + 1;
u8 cmd[8];
+ u8 occs_present = header->occs_present;
cmd[0] = 0;
cmd[1] = 0;
@@ -196,8 +196,6 @@ int occ_poll(struct occ *occ)
if (rc)
goto done;
- header = (struct occ_poll_response_header *)occ->resp.data;
-
if (header->occ_state == OCC_STATE_SAFE) {
if (occ->last_safe) {
if (time_after(jiffies,
@@ -208,10 +206,10 @@ int occ_poll(struct occ *occ)
} else
occ->last_safe = 0;
- if (header->status & OCC_STAT_MASTER) {
- if (hweight8(header->occs_present) !=
- atomic_read(&occ_num_occs))
- occ->error = -ENXIO;
+ if (occs_present != header->occs_present && occ->hwmon &&
+ (header->status & OCC_STAT_MASTER)) {
+ sysfs_notify(&occ->bus_dev->kobj, NULL,
+ occ->status_attrs[7].dev_attr.attr.name);
}
done:
@@ -321,6 +319,12 @@ static ssize_t occ_show_status(struct device *dev,
case 6:
val = header->occ_state;
break;
+ case 7:
+ if (header->status & OCC_STAT_MASTER)
+ val = hweight8(header->occs_present);
+ else
+ val = 1;
+ break;
default:
return -EINVAL;
}
@@ -1203,12 +1207,16 @@ int occ_create_status_attrs(struct occ *occ)
(struct sensor_device_attribute)SENSOR_ATTR(occ_status, 0444,
occ_show_status,
NULL, 6);
-
occ->status_attrs[7] =
+ (struct sensor_device_attribute)SENSOR_ATTR(occs_present, 0444,
+ occ_show_status,
+ NULL, 7);
+
+ occ->status_attrs[8] =
(struct sensor_device_attribute)SENSOR_ATTR(occ_error, 0444,
occ_show_error,
NULL, 0);
- occ->error_attr_name = occ->status_attrs[7].dev_attr.attr.name;
+ occ->error_attr_name = occ->status_attrs[8].dev_attr.attr.name;
for (i = 0; i < OCC_NUM_STATUS_ATTRS; ++i) {
rc = device_create_file(dev, &occ->status_attrs[i].dev_attr);
diff --git a/drivers/hwmon/occ/common.h b/drivers/hwmon/occ/common.h
index acb50bc..6670a4b 100644
--- a/drivers/hwmon/occ/common.h
+++ b/drivers/hwmon/occ/common.h
@@ -83,7 +83,6 @@ struct occ_sensor {
u8 version;
void *data;
};
-
struct occ_sensors {
struct occ_sensor temp;
struct occ_sensor freq;
@@ -140,8 +139,6 @@ struct occ {
((struct sensor_device_attribute_2) \
SENSOR_ATTR_OCC(_name, _mode, _show, _store, _nr, _index))
-extern atomic_t occ_num_occs;
-
void occ_parse_poll_response(struct occ *occ);
void occ_reset_error(struct occ *occ);
void occ_set_error(struct occ *occ, int error);
diff --git a/drivers/hwmon/occ/p8_i2c.c b/drivers/hwmon/occ/p8_i2c.c
index e1c6234..020a53b 100644
--- a/drivers/hwmon/occ/p8_i2c.c
+++ b/drivers/hwmon/occ/p8_i2c.c
@@ -248,8 +248,6 @@ static int p8_i2c_occ_probe(struct i2c_client *client,
return rc;
}
- atomic_inc(&occ_num_occs);
-
return 0;
}
@@ -259,8 +257,6 @@ static int p8_i2c_occ_remove(struct i2c_client *client)
occ_remove_status_attrs(occ);
- atomic_dec(&occ_num_occs);
-
return 0;
}
diff --git a/drivers/hwmon/occ/p9_sbe.c b/drivers/hwmon/occ/p9_sbe.c
index 2d50a94..7c17070 100644
--- a/drivers/hwmon/occ/p9_sbe.c
+++ b/drivers/hwmon/occ/p9_sbe.c
@@ -156,8 +156,6 @@ static int p9_sbe_occ_probe(struct platform_device *pdev)
if (rc)
return rc;
- atomic_inc(&occ_num_occs);
-
return rc;
}
@@ -167,8 +165,6 @@ static int p9_sbe_occ_remove(struct platform_device *pdev)
occ_remove_status_attrs(occ);
- atomic_dec(&occ_num_occs);
-
return 0;
}
--
1.8.3.1
More information about the openbmc
mailing list