Commit b336ad59 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'hwmon-for-v5.19-rc5' of...

Merge tag 'hwmon-for-v5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon fixes from Guenter Roeck:

 - Fix error handling in ibmaem driver initialization

 - Fix bad data reported by occ driver after setting power cap

 - Fix typos in pmbus/ucd9200 driver comments

* tag 'hwmon-for-v5.19-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
  hwmon: (ibmaem) don't call platform_device_del() if platform_device_add() fails
  hwmon: (pmbus/ucd9200) fix typos in comments
  hwmon: (occ) Prevent power cap command overwriting poll response
parents d0f67adb d0e51022
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -550,7 +550,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)


	res = platform_device_add(data->pdev);
	res = platform_device_add(data->pdev);
	if (res)
	if (res)
		goto ipmi_err;
		goto dev_add_err;


	platform_set_drvdata(data->pdev, data);
	platform_set_drvdata(data->pdev, data);


@@ -598,7 +598,9 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
	ipmi_destroy_user(data->ipmi.user);
	ipmi_destroy_user(data->ipmi.user);
ipmi_err:
ipmi_err:
	platform_set_drvdata(data->pdev, NULL);
	platform_set_drvdata(data->pdev, NULL);
	platform_device_unregister(data->pdev);
	platform_device_del(data->pdev);
dev_add_err:
	platform_device_put(data->pdev);
dev_err:
dev_err:
	ida_free(&aem_ida, data->id);
	ida_free(&aem_ida, data->id);
id_err:
id_err:
@@ -690,7 +692,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,


	res = platform_device_add(data->pdev);
	res = platform_device_add(data->pdev);
	if (res)
	if (res)
		goto ipmi_err;
		goto dev_add_err;


	platform_set_drvdata(data->pdev, data);
	platform_set_drvdata(data->pdev, data);


@@ -738,7 +740,9 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
	ipmi_destroy_user(data->ipmi.user);
	ipmi_destroy_user(data->ipmi.user);
ipmi_err:
ipmi_err:
	platform_set_drvdata(data->pdev, NULL);
	platform_set_drvdata(data->pdev, NULL);
	platform_device_unregister(data->pdev);
	platform_device_del(data->pdev);
dev_add_err:
	platform_device_put(data->pdev);
dev_err:
dev_err:
	ida_free(&aem_ida, data->id);
	ida_free(&aem_ida, data->id);
id_err:
id_err:
+3 −2
Original line number Original line Diff line number Diff line
@@ -145,7 +145,7 @@ static int occ_poll(struct occ *occ)
	cmd[6] = 0;			/* checksum lsb */
	cmd[6] = 0;			/* checksum lsb */


	/* mutex should already be locked if necessary */
	/* mutex should already be locked if necessary */
	rc = occ->send_cmd(occ, cmd, sizeof(cmd));
	rc = occ->send_cmd(occ, cmd, sizeof(cmd), &occ->resp, sizeof(occ->resp));
	if (rc) {
	if (rc) {
		occ->last_error = rc;
		occ->last_error = rc;
		if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD)
		if (occ->error_count++ > OCC_ERROR_COUNT_THRESHOLD)
@@ -182,6 +182,7 @@ static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap)
{
{
	int rc;
	int rc;
	u8 cmd[8];
	u8 cmd[8];
	u8 resp[8];
	__be16 user_power_cap_be = cpu_to_be16(user_power_cap);
	__be16 user_power_cap_be = cpu_to_be16(user_power_cap);


	cmd[0] = 0;	/* sequence number */
	cmd[0] = 0;	/* sequence number */
@@ -198,7 +199,7 @@ static int occ_set_user_power_cap(struct occ *occ, u16 user_power_cap)
	if (rc)
	if (rc)
		return rc;
		return rc;


	rc = occ->send_cmd(occ, cmd, sizeof(cmd));
	rc = occ->send_cmd(occ, cmd, sizeof(cmd), resp, sizeof(resp));


	mutex_unlock(&occ->lock);
	mutex_unlock(&occ->lock);


+2 −1
Original line number Original line Diff line number Diff line
@@ -96,7 +96,8 @@ struct occ {


	int powr_sample_time_us;	/* average power sample time */
	int powr_sample_time_us;	/* average power sample time */
	u8 poll_cmd_data;		/* to perform OCC poll command */
	u8 poll_cmd_data;		/* to perform OCC poll command */
	int (*send_cmd)(struct occ *occ, u8 *cmd, size_t len);
	int (*send_cmd)(struct occ *occ, u8 *cmd, size_t len, void *resp,
			size_t resp_len);


	unsigned long next_update;
	unsigned long next_update;
	struct mutex lock;		/* lock OCC access */
	struct mutex lock;		/* lock OCC access */
+7 −6
Original line number Original line Diff line number Diff line
@@ -111,7 +111,8 @@ static int p8_i2c_occ_putscom_be(struct i2c_client *client, u32 address,
				      be32_to_cpu(data1));
				      be32_to_cpu(data1));
}
}


static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len,
			       void *resp, size_t resp_len)
{
{
	int i, rc;
	int i, rc;
	unsigned long start;
	unsigned long start;
@@ -120,7 +121,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
	const long wait_time = msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
	const long wait_time = msecs_to_jiffies(OCC_CMD_IN_PRG_WAIT_MS);
	struct p8_i2c_occ *ctx = to_p8_i2c_occ(occ);
	struct p8_i2c_occ *ctx = to_p8_i2c_occ(occ);
	struct i2c_client *client = ctx->client;
	struct i2c_client *client = ctx->client;
	struct occ_response *resp = &occ->resp;
	struct occ_response *or = (struct occ_response *)resp;


	start = jiffies;
	start = jiffies;


@@ -151,7 +152,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
			return rc;
			return rc;


		/* wait for OCC */
		/* wait for OCC */
		if (resp->return_status == OCC_RESP_CMD_IN_PRG) {
		if (or->return_status == OCC_RESP_CMD_IN_PRG) {
			rc = -EALREADY;
			rc = -EALREADY;


			if (time_after(jiffies, start + timeout))
			if (time_after(jiffies, start + timeout))
@@ -163,7 +164,7 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
	} while (rc);
	} while (rc);


	/* check the OCC response */
	/* check the OCC response */
	switch (resp->return_status) {
	switch (or->return_status) {
	case OCC_RESP_CMD_IN_PRG:
	case OCC_RESP_CMD_IN_PRG:
		rc = -ETIMEDOUT;
		rc = -ETIMEDOUT;
		break;
		break;
@@ -192,8 +193,8 @@ static int p8_i2c_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
	if (rc < 0)
	if (rc < 0)
		return rc;
		return rc;


	data_length = get_unaligned_be16(&resp->data_length);
	data_length = get_unaligned_be16(&or->data_length);
	if (data_length > OCC_RESP_DATA_BYTES)
	if ((data_length + 7) > resp_len)
		return -EMSGSIZE;
		return -EMSGSIZE;


	/* fetch the rest of the response data */
	/* fetch the rest of the response data */
+3 −4
Original line number Original line Diff line number Diff line
@@ -78,11 +78,10 @@ static bool p9_sbe_occ_save_ffdc(struct p9_sbe_occ *ctx, const void *resp,
	return notify;
	return notify;
}
}


static int p9_sbe_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
static int p9_sbe_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len,
			       void *resp, size_t resp_len)
{
{
	struct occ_response *resp = &occ->resp;
	struct p9_sbe_occ *ctx = to_p9_sbe_occ(occ);
	struct p9_sbe_occ *ctx = to_p9_sbe_occ(occ);
	size_t resp_len = sizeof(*resp);
	int rc;
	int rc;


	rc = fsi_occ_submit(ctx->sbe, cmd, len, resp, &resp_len);
	rc = fsi_occ_submit(ctx->sbe, cmd, len, resp, &resp_len);
@@ -96,7 +95,7 @@ static int p9_sbe_occ_send_cmd(struct occ *occ, u8 *cmd, size_t len)
		return rc;
		return rc;
	}
	}


	switch (resp->return_status) {
	switch (((struct occ_response *)resp)->return_status) {
	case OCC_RESP_CMD_IN_PRG:
	case OCC_RESP_CMD_IN_PRG:
		rc = -ETIMEDOUT;
		rc = -ETIMEDOUT;
		break;
		break;
Loading