[v5,5/5] hwmon: (adt7475) Add support for inverting pwm output
diff mbox series

Message ID 20200227084642.7057-6-chris.packham@alliedtelesis.co.nz
State Accepted
Headers show
Series
  • hwmon: (adt7475) attenuator bypass and pwm invert
Related show

Commit Message

Chris Packham Feb. 27, 2020, 8:46 a.m. UTC
Add a "adi,pwm-active-state" device-tree property to allow hardware
designs to use inverted logic on the PWM output.

Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
---

Notes:
    Changes in v5:
    - change to adi,pwm-active-state
    - uint32 array
    
    Changes in v4:
    - use vendor prefix for new property
    
    Changes in v3:
    - New

 drivers/hwmon/adt7475.c | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)

Comments

Guenter Roeck March 3, 2020, 9:08 p.m. UTC | #1
On Thu, Feb 27, 2020 at 09:46:42PM +1300, Chris Packham wrote:
> Add a "adi,pwm-active-state" device-tree property to allow hardware
> designs to use inverted logic on the PWM output.
> 
> Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>

Applied, with change described below. Please let me know if ignoring
the error is not what you wanted.

Thanks,
Guenter

> ---
> 
> Notes:
>     Changes in v5:
>     - change to adi,pwm-active-state
>     - uint32 array
>     
>     Changes in v4:
>     - use vendor prefix for new property
>     
>     Changes in v3:
>     - New
> 
>  drivers/hwmon/adt7475.c | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
> 
> diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
> index 3649b18359dc..142a4fec688b 100644
> --- a/drivers/hwmon/adt7475.c
> +++ b/drivers/hwmon/adt7475.c
> @@ -1509,6 +1509,36 @@ static int load_attenuators(const struct i2c_client *client, int chip,
>  	return 0;
>  }
>  
> +static int adt7475_set_pwm_polarity(struct i2c_client *client)
> +{
> +	u32 states[ADT7475_PWM_COUNT];
> +	int ret, i;
> +	u8 val;
> +
> +	ret = of_property_read_u32_array(client->dev.of_node,
> +					 "adi,pwm-active-state", states,
> +					 ARRAY_SIZE(states));
> +	if (ret)
> +		return ret;
> +
> +	for (i = 0; i < ADT7475_PWM_COUNT; i++) {
> +		ret = adt7475_read(PWM_CONFIG_REG(i));
> +		if (ret < 0)
> +			return ret;
> +		val = ret;
> +		if (states[i])
> +			val &= ~BIT(4);
> +		else
> +			val |= BIT(4);
> +
> +		ret = i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(i), val);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static int adt7475_probe(struct i2c_client *client,
>  			 const struct i2c_device_id *id)
>  {
> @@ -1617,6 +1647,10 @@ static int adt7475_probe(struct i2c_client *client,
>  	for (i = 0; i < ADT7475_PWM_COUNT; i++)
>  		adt7475_read_pwm(client, i);
>  
> +	ret = adt7475_set_pwm_polarity(client);
> +	if (ret && ret != -EINVAL)
> +		dev_err(&client->dev, "Error configuring pwm polarity\n");

		dev_err -> dev_warn

> +
>  	/* Start monitoring */
>  	switch (chip) {
>  	case adt7475:

Patch
diff mbox series

diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 3649b18359dc..142a4fec688b 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -1509,6 +1509,36 @@  static int load_attenuators(const struct i2c_client *client, int chip,
 	return 0;
 }
 
+static int adt7475_set_pwm_polarity(struct i2c_client *client)
+{
+	u32 states[ADT7475_PWM_COUNT];
+	int ret, i;
+	u8 val;
+
+	ret = of_property_read_u32_array(client->dev.of_node,
+					 "adi,pwm-active-state", states,
+					 ARRAY_SIZE(states));
+	if (ret)
+		return ret;
+
+	for (i = 0; i < ADT7475_PWM_COUNT; i++) {
+		ret = adt7475_read(PWM_CONFIG_REG(i));
+		if (ret < 0)
+			return ret;
+		val = ret;
+		if (states[i])
+			val &= ~BIT(4);
+		else
+			val |= BIT(4);
+
+		ret = i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(i), val);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+}
+
 static int adt7475_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
 {
@@ -1617,6 +1647,10 @@  static int adt7475_probe(struct i2c_client *client,
 	for (i = 0; i < ADT7475_PWM_COUNT; i++)
 		adt7475_read_pwm(client, i);
 
+	ret = adt7475_set_pwm_polarity(client);
+	if (ret && ret != -EINVAL)
+		dev_err(&client->dev, "Error configuring pwm polarity\n");
+
 	/* Start monitoring */
 	switch (chip) {
 	case adt7475: