hwmon: (adt7475) Add support for inverting pwm output
authorChris Packham <chris.packham@alliedtelesis.co.nz>
Thu, 27 Feb 2020 08:46:42 +0000 (21:46 +1300)
committerGuenter Roeck <linux@roeck-us.net>
Mon, 9 Mar 2020 03:35:48 +0000 (20:35 -0700)
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>
[groeck: dev_err -> dev_warn]
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/adt7475.c

index 79e50e6aa94eab83f8f39794360827d83e969355..054080443b477ec0147c58e527a8a8f07e816145 100644 (file)
@@ -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_warn(&client->dev, "Error configuring pwm polarity\n");
+
        /* Start monitoring */
        switch (chip) {
        case adt7475: