diff options
author | Chris Packham <chris.packham@alliedtelesis.co.nz> | 2020-02-27 09:46:42 +0100 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2020-03-09 04:35:48 +0100 |
commit | 86da28eed4fbc64dfdc386337f6cbac36c9c1ed2 (patch) | |
tree | d456e32a696fda4bc1862664779e677072bb10ad /drivers/hwmon | |
parent | hwmon: (adt7475) Add attenuator bypass support (diff) | |
download | linux-86da28eed4fbc64dfdc386337f6cbac36c9c1ed2.tar.xz linux-86da28eed4fbc64dfdc386337f6cbac36c9c1ed2.zip |
hwmon: (adt7475) Add support for inverting pwm output
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>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/adt7475.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c index 79e50e6aa94e..054080443b47 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_warn(&client->dev, "Error configuring pwm polarity\n"); + /* Start monitoring */ switch (chip) { case adt7475: |