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: Anatol Pomozov <anatol.pomozov@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
80fff6bf65
commit
40eb90a18e
@ -27,6 +27,12 @@ Optional properties:
|
|||||||
Boolean. Indicate MIC1/2 input and LOUT1/2/3 outputs are differential,
|
Boolean. Indicate MIC1/2 input and LOUT1/2/3 outputs are differential,
|
||||||
rather than single-ended.
|
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):
|
Pins on the device (for linking into audio routes):
|
||||||
|
|
||||||
* IN1P
|
* IN1P
|
||||||
@ -56,4 +62,5 @@ rt5677 {
|
|||||||
realtek,pow-ldo2-gpio =
|
realtek,pow-ldo2-gpio =
|
||||||
<&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
|
<&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
|
||||||
realtek,in1-differential = "true";
|
realtek,in1-differential = "true";
|
||||||
|
realtek,gpio-config = /bits/ 8 <0 0 0 0 0 2>; /* pull up GPIO6 */
|
||||||
};
|
};
|
||||||
|
@ -27,6 +27,9 @@ struct rt5677_platform_data {
|
|||||||
bool lout3_diff;
|
bool lout3_diff;
|
||||||
/* DMIC2 clock source selection */
|
/* DMIC2 clock source selection */
|
||||||
enum rt5677_dmic2_clk dmic2_clk_pin;
|
enum rt5677_dmic2_clk dmic2_clk_pin;
|
||||||
|
|
||||||
|
/* configures GPIO, 0 - floating, 1 - pulldown, 2 - pullup */
|
||||||
|
u8 gpio_config[6];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -3309,6 +3309,38 @@ static int rt5677_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
|
|||||||
return 0;
|
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 = {
|
static struct gpio_chip rt5677_template_chip = {
|
||||||
.label = "rt5677",
|
.label = "rt5677",
|
||||||
.owner = THIS_MODULE,
|
.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)
|
static int rt5677_probe(struct snd_soc_codec *codec)
|
||||||
{
|
{
|
||||||
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
struct rt5677_priv *rt5677 = snd_soc_codec_get_drvdata(codec);
|
||||||
|
int i;
|
||||||
|
|
||||||
rt5677->codec = codec;
|
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_DIG_MISC, 0x0020);
|
||||||
regmap_write(rt5677->regmap, RT5677_PWR_DSP2, 0x0c00);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3590,6 +3626,9 @@ static int rt5677_parse_dt(struct rt5677_priv *rt5677, struct device_node *np)
|
|||||||
(rt5677->pow_ldo2 != -ENOENT))
|
(rt5677->pow_ldo2 != -ENOENT))
|
||||||
return rt5677->pow_ldo2;
|
return rt5677->pow_ldo2;
|
||||||
|
|
||||||
|
of_property_read_u8_array(np, "realtek,gpio-config",
|
||||||
|
rt5677->pdata.gpio_config, RT5677_GPIO_NUM);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user