Commit 6109c3e1 authored by Eddie James's avatar Eddie James Committed by Guenter Roeck
Browse files

hwmon: (occ) Add sysfs entry for IPS (Idle Power Saver) status



BMC control applications need to check the Idle Power Saver status
byte returned by the OCC poll response, so export it in sysfs with
the other OCC-specific data.

Signed-off-by: default avatarEddie James <eajames@linux.ibm.com>
Reviewed-by: default avatarJoel Stanley <joel@jms.id.au>
Link: https://lore.kernel.org/r/20220215151022.7498-2-eajames@linux.ibm.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 567e77a2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ struct occ {
	u8 prev_stat;
	u8 prev_ext_stat;
	u8 prev_occs_present;
	u8 prev_ips_status;
};

int occ_setup(struct occ *occ, const char *name);
+11 −0
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ static ssize_t occ_sysfs_show(struct device *dev,
		else
			val = 1;
		break;
	case 8:
		val = header->ips_status;
		break;
	default:
		return -EINVAL;
	}
@@ -88,6 +91,7 @@ static SENSOR_DEVICE_ATTR(occ_mem_throttle, 0444, occ_sysfs_show, NULL, 4);
static SENSOR_DEVICE_ATTR(occ_quick_pwr_drop, 0444, occ_sysfs_show, NULL, 5);
static SENSOR_DEVICE_ATTR(occ_state, 0444, occ_sysfs_show, NULL, 6);
static SENSOR_DEVICE_ATTR(occs_present, 0444, occ_sysfs_show, NULL, 7);
static SENSOR_DEVICE_ATTR(occ_ips_status, 0444, occ_sysfs_show, NULL, 8);
static DEVICE_ATTR_RO(occ_error);

static struct attribute *occ_attributes[] = {
@@ -99,6 +103,7 @@ static struct attribute *occ_attributes[] = {
	&sensor_dev_attr_occ_quick_pwr_drop.dev_attr.attr,
	&sensor_dev_attr_occ_state.dev_attr.attr,
	&sensor_dev_attr_occs_present.dev_attr.attr,
	&sensor_dev_attr_occ_ips_status.dev_attr.attr,
	&dev_attr_occ_error.attr,
	NULL
};
@@ -162,6 +167,11 @@ void occ_sysfs_poll_done(struct occ *occ)
		sysfs_notify(&occ->bus_dev->kobj, NULL, name);
	}

	if (header->ips_status != occ->prev_ips_status) {
		name = sensor_dev_attr_occ_ips_status.dev_attr.attr.name;
		sysfs_notify(&occ->bus_dev->kobj, NULL, name);
	}

	if (occ->error && occ->error != occ->prev_error) {
		name = dev_attr_occ_error.attr.name;
		sysfs_notify(&occ->bus_dev->kobj, NULL, name);
@@ -174,6 +184,7 @@ void occ_sysfs_poll_done(struct occ *occ)
	occ->prev_stat = header->status;
	occ->prev_ext_stat = header->ext_status;
	occ->prev_occs_present = header->occs_present;
	occ->prev_ips_status = header->ips_status;
}

int occ_setup_sysfs(struct occ *occ)