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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>

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;



[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux