Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 40eb90a1 authored by Anatol Pomozov's avatar Anatol Pomozov Committed by Mark Brown
Browse files

ASoC: rt5677: Add option to configure gpio as floating/pullup/pulldown



gpio_config is array of 6 elements that allows to set GPIO as
floating, pullup, pulldown.

Sponsored: Google ChromeOS
Signed-off-by: default avatarAnatol Pomozov <anatol.pomozov@gmail.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 80fff6bf
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -27,6 +27,12 @@ Optional properties:
  Boolean. Indicate MIC1/2 input and LOUT1/2/3 outputs are differential,
  rather than single-ended.

- realtek,gpio-config
  Array of six 8bit elements that configures GPIO.
    0 - floating (reset value)
    1 - pull down
    2 - pull up

Pins on the device (for linking into audio routes):

  * IN1P
@@ -56,4 +62,5 @@ rt5677 {
	realtek,pow-ldo2-gpio =
		<&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
	realtek,in1-differential = "true";
	realtek,gpio-config = /bits/ 8  <0 0 0 0 0 2>;   /* pull up GPIO6 */
};
+3 −0
Original line number Diff line number Diff line
@@ -27,6 +27,9 @@ struct rt5677_platform_data {
	bool lout3_diff;
	/* DMIC2 clock source selection */
	enum rt5677_dmic2_clk dmic2_clk_pin;

	/* configures GPIO, 0 - floating, 1 - pulldown, 2 - pullup */
	u8 gpio_config[6];
};

#endif
+39 −0
Original line number Diff line number Diff line
@@ -3309,6 +3309,38 @@ static int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
	return 0;
}

/** Configures the gpio as
 *   0 - floating
 *   1 - pull down
 *   2 - pull up
 */
static void rt5677_gpio_config(struct rt5677_priv *rt5677, unsigned offset,
		int value)
{
	int shift;

	switch (offset) {
	case RT5677_GPIO1 ... RT5677_GPIO2:
		shift = 2 * (1 - offset);
		regmap_update_bits(rt5677->regmap,
			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL2,
			0x3 << shift,
			(value & 0x3) << shift);
		break;

	case RT5677_GPIO3 ... RT5677_GPIO6:
		shift = 2 * (9 - offset);
		regmap_update_bits(rt5677->regmap,
			RT5677_PR_BASE + RT5677_DIG_IN_PIN_ST_CTRL3,
			0x3 << shift,
			(value & 0x3) << shift);
		break;

	default:
		break;
	}
}

static struct gpio_chip rt5677_template_chip = {
	.label			= "rt5677",
	.owner			= THIS_MODULE,
@@ -3353,6 +3385,7 @@ static void rt5677_free_gpio(struct i2c_client *i2c)
static int rt5677_probe(struct snd_soc_codec *codec)
{
	struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
	int i;

	rt5677->codec = codec;

@@ -3371,6 +3404,9 @@ static int rt5677_probe(struct snd_soc_codec *codec)
	regmap_write(rt5677->regmap, RT5677_DIG_MISC, 0x0020);
	regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x0c00);

	for (i = 0; i < RT5677_GPIO_NUM; i++)
		rt5677_gpio_config(rt5677, i, rt5677->pdata.gpio_config[i]);

	return 0;
}

@@ -3590,6 +3626,9 @@ static int rt5677_parse_dt(struct rt5677_priv *rt5677, struct device_node *np)
			(rt5677->pow_ldo2 != -ENOENT))
		return rt5677->pow_ldo2;

	of_property_read_u8_array(np, "realtek,gpio-config",
		rt5677->pdata.gpio_config, RT5677_GPIO_NUM);

	return 0;
}