Commit 1168491e authored by Loic Prylli's avatar Loic Prylli Committed by Guenter Roeck
Browse files

hwmon: (aspeed-pwm-tacho) mutex for tach reading



the ASPEED_PTCR_RESULT Register can only hold the result for a
single fan input. Adding a mutex to protect the register until the
reading is done.

Signed-off-by: default avatarLoic Prylli <lprylli@netflix.com>
Signed-off-by: default avatarAlexander Hansen <alexander.hansen@9elements.com>
Fixes: 2d7a548a ("drivers: hwmon: Support for ASPEED PWM/Fan tach")
Link: https://lore.kernel.org/r/121d888762a1232ef403cf35230ccf7b3887083a.1699007401.git.alexander.hansen@9elements.com


Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
parent 54be6c6c
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -195,6 +195,8 @@ struct aspeed_pwm_tacho_data {
	u8 fan_tach_ch_source[MAX_ASPEED_FAN_TACH_CHANNELS];
	struct aspeed_cooling_device *cdev[8];
	const struct attribute_group *groups[3];
	/* protects access to shared ASPEED_PTCR_RESULT */
	struct mutex tach_lock;
};

enum type { TYPEM, TYPEN, TYPEO };
@@ -529,6 +531,8 @@ static int aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
	u8 fan_tach_ch_source, type, mode, both;
	int ret;

	mutex_lock(&priv->tach_lock);

	regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0);
	regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0x1 << fan_tach_ch);

@@ -546,6 +550,8 @@ static int aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
		ASPEED_RPM_STATUS_SLEEP_USEC,
		usec);

	mutex_unlock(&priv->tach_lock);

	/* return -ETIMEDOUT if we didn't get an answer. */
	if (ret)
		return ret;
@@ -915,6 +921,7 @@ static int aspeed_pwm_tacho_probe(struct platform_device *pdev)
	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;
	mutex_init(&priv->tach_lock);
	priv->regmap = devm_regmap_init(dev, NULL, (__force void *)regs,
			&aspeed_pwm_tacho_regmap_config);
	if (IS_ERR(priv->regmap))