diff mbox series

[2/3] hwmon: axi-fan-control: handle irqs in natural order

Message ID 20210811114853.159298-3-nuno.sa@analog.com (mailing list archive)
State Accepted
Headers show
Series AXI FAN new features and improvements | expand

Commit Message

Nuno Sa Aug. 11, 2021, 11:48 a.m. UTC
The core will now start out of reset at boot as soon as clocking is
available. Hence, by the time we unmask the interrupts we already might
have some of them set. Thus, it's important to handle them in the
natural order the core generates them. Otherwise, we could process
'ADI_IRQ_SRC_PWM_CHANGED' before 'ADI_IRQ_SRC_TEMP_INCREASE' and
erroneously set 'update_tacho_params' to true.

Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/hwmon/axi-fan-control.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

Comments

Guenter Roeck Aug. 12, 2021, 4:38 a.m. UTC | #1
On Wed, Aug 11, 2021 at 01:48:52PM +0200, Nuno Sá wrote:
> The core will now start out of reset at boot as soon as clocking is
> available. Hence, by the time we unmask the interrupts we already might
> have some of them set. Thus, it's important to handle them in the
> natural order the core generates them. Otherwise, we could process
> 'ADI_IRQ_SRC_PWM_CHANGED' before 'ADI_IRQ_SRC_TEMP_INCREASE' and
> erroneously set 'update_tacho_params' to true.
> 
> Signed-off-by: Nuno Sá <nuno.sa@analog.com>

Applied.

Thanks,
Guenter

> ---
>  drivers/hwmon/axi-fan-control.c | 30 +++++++++++++++---------------
>  1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/hwmon/axi-fan-control.c b/drivers/hwmon/axi-fan-control.c
> index 901d1588234d..c898ad121dc7 100644
> --- a/drivers/hwmon/axi-fan-control.c
> +++ b/drivers/hwmon/axi-fan-control.c
> @@ -283,18 +283,9 @@ static irqreturn_t axi_fan_control_irq_handler(int irq, void *data)
>  	u32 irq_pending = axi_ioread(ADI_REG_IRQ_PENDING, ctl);
>  	u32 clear_mask;
>  
> -	if (irq_pending & ADI_IRQ_SRC_NEW_MEASUR) {
> -		if (ctl->update_tacho_params) {
> -			u32 new_tach = axi_ioread(ADI_REG_TACH_MEASUR, ctl);
> -
> -			/* get 25% tolerance */
> -			u32 tach_tol = DIV_ROUND_CLOSEST(new_tach * 25, 100);
> -			/* set new tacho parameters */
> -			axi_iowrite(new_tach, ADI_REG_TACH_PERIOD, ctl);
> -			axi_iowrite(tach_tol, ADI_REG_TACH_TOLERANCE, ctl);
> -			ctl->update_tacho_params = false;
> -		}
> -	}
> +	if (irq_pending & ADI_IRQ_SRC_TEMP_INCREASE)
> +		/* hardware requested a new pwm */
> +		ctl->hw_pwm_req = true;
>  
>  	if (irq_pending & ADI_IRQ_SRC_PWM_CHANGED) {
>  		/*
> @@ -310,9 +301,18 @@ static irqreturn_t axi_fan_control_irq_handler(int irq, void *data)
>  		}
>  	}
>  
> -	if (irq_pending & ADI_IRQ_SRC_TEMP_INCREASE)
> -		/* hardware requested a new pwm */
> -		ctl->hw_pwm_req = true;
> +	if (irq_pending & ADI_IRQ_SRC_NEW_MEASUR) {
> +		if (ctl->update_tacho_params) {
> +			u32 new_tach = axi_ioread(ADI_REG_TACH_MEASUR, ctl);
> +			/* get 25% tolerance */
> +			u32 tach_tol = DIV_ROUND_CLOSEST(new_tach * 25, 100);
> +
> +			/* set new tacho parameters */
> +			axi_iowrite(new_tach, ADI_REG_TACH_PERIOD, ctl);
> +			axi_iowrite(tach_tol, ADI_REG_TACH_TOLERANCE, ctl);
> +			ctl->update_tacho_params = false;
> +		}
> +	}
>  
>  	if (irq_pending & ADI_IRQ_SRC_TACH_ERR)
>  		ctl->fan_fault = 1;
diff mbox series

Patch

diff --git a/drivers/hwmon/axi-fan-control.c b/drivers/hwmon/axi-fan-control.c
index 901d1588234d..c898ad121dc7 100644
--- a/drivers/hwmon/axi-fan-control.c
+++ b/drivers/hwmon/axi-fan-control.c
@@ -283,18 +283,9 @@  static irqreturn_t axi_fan_control_irq_handler(int irq, void *data)
 	u32 irq_pending = axi_ioread(ADI_REG_IRQ_PENDING, ctl);
 	u32 clear_mask;
 
-	if (irq_pending & ADI_IRQ_SRC_NEW_MEASUR) {
-		if (ctl->update_tacho_params) {
-			u32 new_tach = axi_ioread(ADI_REG_TACH_MEASUR, ctl);
-
-			/* get 25% tolerance */
-			u32 tach_tol = DIV_ROUND_CLOSEST(new_tach * 25, 100);
-			/* set new tacho parameters */
-			axi_iowrite(new_tach, ADI_REG_TACH_PERIOD, ctl);
-			axi_iowrite(tach_tol, ADI_REG_TACH_TOLERANCE, ctl);
-			ctl->update_tacho_params = false;
-		}
-	}
+	if (irq_pending & ADI_IRQ_SRC_TEMP_INCREASE)
+		/* hardware requested a new pwm */
+		ctl->hw_pwm_req = true;
 
 	if (irq_pending & ADI_IRQ_SRC_PWM_CHANGED) {
 		/*
@@ -310,9 +301,18 @@  static irqreturn_t axi_fan_control_irq_handler(int irq, void *data)
 		}
 	}
 
-	if (irq_pending & ADI_IRQ_SRC_TEMP_INCREASE)
-		/* hardware requested a new pwm */
-		ctl->hw_pwm_req = true;
+	if (irq_pending & ADI_IRQ_SRC_NEW_MEASUR) {
+		if (ctl->update_tacho_params) {
+			u32 new_tach = axi_ioread(ADI_REG_TACH_MEASUR, ctl);
+			/* get 25% tolerance */
+			u32 tach_tol = DIV_ROUND_CLOSEST(new_tach * 25, 100);
+
+			/* set new tacho parameters */
+			axi_iowrite(new_tach, ADI_REG_TACH_PERIOD, ctl);
+			axi_iowrite(tach_tol, ADI_REG_TACH_TOLERANCE, ctl);
+			ctl->update_tacho_params = false;
+		}
+	}
 
 	if (irq_pending & ADI_IRQ_SRC_TACH_ERR)
 		ctl->fan_fault = 1;