Commit 504eb485 authored by Rasmus Villemoes's avatar Rasmus Villemoes Committed by Jonathan Cameron
Browse files

iio: ad74413r: wire up support for drive-strength-microamp property



Use the value specified in the channel configuration node to populate
the DIN_SINK field of the DIN_CONFIGx register.

Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
Link: https://lore.kernel.org/r/20230306094301.1357543-3-linux@rasmusvillemoes.dk


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 954ea91f
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -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;