Re: hwmon: (aspeed-pwm-tacho) Enable both edge measurement.

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

 



On Tue, May 30, 2017 at 01:27:39PM -0700, Patrick Venture wrote:
> The aspeed-pwm-tacho controller supports measuring the fan tach by using
> leading, falling, or both edges.  This change allows the driver to
> support either of the three configurations and will appropriately modify
> the returned tach data.
> 
> I tested this and found the number returned matched what I expected.
> 
> Signed-off-by: Patrick Venture <venture@xxxxxxxxxx>
> ---
>  drivers/hwmon/aspeed-pwm-tacho.c | 24 +++++++++++++++++++++---
>  1 file changed, 21 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/hwmon/aspeed-pwm-tacho.c b/drivers/hwmon/aspeed-pwm-tacho.c
> index 48403a2115be..f288928b5e8a 100644
> --- a/drivers/hwmon/aspeed-pwm-tacho.c
> +++ b/drivers/hwmon/aspeed-pwm-tacho.c
> @@ -145,11 +145,20 @@
>  
>  #define PWM_MAX 255
>  
> +#define BOTH_EDGES 0x02 /* 10b */
> +
>  #define M_PWM_DIV_H 0x00
>  #define M_PWM_DIV_L 0x05
>  #define M_PWM_PERIOD 0x5F
>  #define M_TACH_CLK_DIV 0x00
> -#define M_TACH_MODE 0x00
> +/*
> + * 5:4 Type N fan tach mode selection bit:
> + * 00: falling
> + * 01: rising
> + * 10: both
> + * 11: reserved.
> + */
> +#define M_TACH_MODE 0x10

That seems wrong. The above is a bit mask, this is an already shifted
value.

>  #define M_TACH_UNIT 0x1000

... and this one seems wrong too, since it is passed to
aspeed_set_tacho_type_values() which shifts it left by 16 bit.

>  #define INIT_FAN_CTRL 0xFF
>  
> @@ -162,6 +171,7 @@ struct aspeed_pwm_tacho_data {
>  	u8 type_pwm_clock_division_h[3];
>  	u8 type_pwm_clock_division_l[3];
>  	u8 type_fan_tach_clock_division[3];
> +	u8 type_fan_tach_mode[3];
>  	u16 type_fan_tach_unit[3];
>  	u8 pwm_port_type[8];
>  	u8 pwm_port_fan_ctrl[8];
> @@ -498,7 +508,7 @@ static u32 aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
>  				      u8 fan_tach_ch)
>  {
>  	u32 raw_data, tach_div, clk_source, sec, val;
> -	u8 fan_tach_ch_source, type;
> +	u8 fan_tach_ch_source, type, mode, both;
>  
>  	regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0);
>  	regmap_write(priv->regmap, ASPEED_PTCR_TRIGGER, 0x1 << fan_tach_ch);
> @@ -512,7 +522,14 @@ static u32 aspeed_get_fan_tach_ch_rpm(struct aspeed_pwm_tacho_data *priv,
>  	regmap_read(priv->regmap, ASPEED_PTCR_RESULT, &val);
>  	raw_data = val & RESULT_VALUE_MASK;
>  	tach_div = priv->type_fan_tach_clock_division[type];
> -	tach_div = 0x4 << (tach_div * 2);
> +	/*
> +	 * We need the mode to determine if the raw_data is double (from
> +	 * counting both edges).
> +	 */
> +	mode = priv->type_fan_tach_mode[type];
> +	both = (mode & BOTH_EDGES) ? 1 : 0;

BOTH_EDGES is 0x02. Mode is 0x10. ???

> +
> +	tach_div = (0x4 << both) << (tach_div * 2);
>  	clk_source = priv->clk_freq;
>  
>  	if (raw_data == 0)
> @@ -696,6 +713,7 @@ static void aspeed_create_type(struct aspeed_pwm_tacho_data *priv)
>  	aspeed_set_tacho_type_enable(priv->regmap, TYPEM, true);
>  	priv->type_fan_tach_clock_division[TYPEM] = M_TACH_CLK_DIV;
>  	priv->type_fan_tach_unit[TYPEM] = M_TACH_UNIT;
> +	priv->type_fan_tach_mode[TYPEM] = M_TACH_MODE;

type_fan_tach_mode[] is always M_TACH_MODE or 0x10, and BOTH_EDGES (0x02)
is never set.

What am I missing here ? Not sure what you are trying to accomplish.
Even if the bit mask is corrected, what is the benefit of changing
the mode ?

Guenter

>  	aspeed_set_tacho_type_values(priv->regmap, TYPEM, M_TACH_MODE,
>  				     M_TACH_UNIT, M_TACH_CLK_DIV);
>  }
--
To unsubscribe from this list: send the line "unsubscribe linux-hwmon" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[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