OSDN Git Service

iio: ad74413r: wire up support for drive-strength-microamp property
authorRasmus Villemoes <linux@rasmusvillemoes.dk>
Mon, 6 Mar 2023 09:43:01 +0000 (10:43 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 12 Mar 2023 15:47:57 +0000 (15:47 +0000)
Use the value specified in the channel configuration node to populate
the DIN_SINK field of the DIN_CONFIGx register.

Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Link: https://lore.kernel.org/r/20230306094301.1357543-3-linux@rasmusvillemoes.dk
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/addac/ad74413r.c

index f32c8c2..4395758 100644 (file)
@@ -39,6 +39,7 @@ struct ad74413r_chip_info {
 
 struct ad74413r_channel_config {
        u32             func;
+       u32             drive_strength;
        bool            gpo_comparator;
        bool            initialized;
 };
@@ -111,6 +112,7 @@ struct ad74413r_state {
 #define AD74413R_REG_DIN_CONFIG_X(x)   (0x09 + (x))
 #define AD74413R_DIN_DEBOUNCE_MASK     GENMASK(4, 0)
 #define AD74413R_DIN_DEBOUNCE_LEN      BIT(5)
+#define AD74413R_DIN_SINK_MASK         GENMASK(9, 6)
 
 #define AD74413R_REG_DAC_CODE_X(x)     (0x16 + (x))
 #define AD74413R_DAC_CODE_MAX          GENMASK(12, 0)
@@ -261,6 +263,18 @@ static int ad74413r_set_comp_debounce(struct ad74413r_state *st,
                                  val);
 }
 
+static int ad74413r_set_comp_drive_strength(struct ad74413r_state *st,
+                                           unsigned int offset,
+                                           unsigned int strength)
+{
+       strength = min(strength, 1800U);
+
+       return regmap_update_bits(st->regmap, AD74413R_REG_DIN_CONFIG_X(offset),
+                                 AD74413R_DIN_SINK_MASK,
+                                 FIELD_PREP(AD74413R_DIN_SINK_MASK, strength / 120));
+}
+
+
 static void ad74413r_gpio_set(struct gpio_chip *chip,
                              unsigned int offset, int val)
 {
@@ -1190,6 +1204,9 @@ static int ad74413r_parse_channel_config(struct iio_dev *indio_dev,
        config->gpo_comparator = fwnode_property_read_bool(channel_node,
                "adi,gpo-comparator");
 
+       fwnode_property_read_u32(channel_node, "drive-strength-microamp",
+                                &config->drive_strength);
+
        if (!config->gpo_comparator)
                st->num_gpo_gpios++;
 
@@ -1269,6 +1286,7 @@ static int ad74413r_setup_gpios(struct ad74413r_state *st)
        unsigned int gpo_gpio_i = 0;
        unsigned int i;
        u8 gpo_config;
+       u32 strength;
        int ret;
 
        for (i = 0; i < AD74413R_CHANNEL_MAX; i++) {
@@ -1285,6 +1303,11 @@ static int ad74413r_setup_gpios(struct ad74413r_state *st)
                    config->func == CH_FUNC_DIGITAL_INPUT_LOOP_POWER)
                        st->comp_gpio_offsets[comp_gpio_i++] = i;
 
+               strength = config->drive_strength;
+               ret = ad74413r_set_comp_drive_strength(st, i, strength);
+               if (ret)
+                       return ret;
+
                ret = ad74413r_set_gpo_config(st, i, gpo_config);
                if (ret)
                        return ret;