ASoC: codecs: ak4619: Add optional powerdown GPIO

Add optional device tree binding that enables operation of the 'PDN' pin
during initialization:

    codec@10 {
        compatible = "asahi-kasei,ak4619";
        reg = <0x10>;
        powerdown-gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;  // <--
        #sound-dai-cells = <0>;
    };

If defined, PDN is set high during driver probe, followed by a 10 ms
delay as required before first register access [1].

If no 'powerdown-gpios' is defined, the behaviour is unchanged.

[1] AK4619 datasheet, sec. 2 'Power-up/down Sequence', page 39

Signed-off-by: Alexander Koch <mail@alexanderkoch.net>
Link: https://patch.msgid.link/20260929090821.1476257-2-mail@alexanderkoch.net
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Alexander Koch 2026-09-29 11:08:20 +02:00 committed by Mark Brown
parent 72d3fcf802
commit f38638f518
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -152,6 +152,7 @@
struct ak4619_priv {
struct regmap *regmap;
struct snd_pcm_hw_constraint_list constraint;
struct gpio_desc *pdn_gpio;
int deemph_en;
unsigned int playback_rate;
unsigned int sysclk;
@ -875,10 +876,20 @@ static int ak4619_i2c_probe(struct i2c_client *i2c)
i2c_set_clientdata(i2c, ak4619);
ak4619->pdn_gpio = devm_gpiod_get_optional(dev, "powerdown",
GPIOD_OUT_LOW);
if (IS_ERR(ak4619->pdn_gpio))
return dev_err_probe(dev, PTR_ERR(ak4619->pdn_gpio),
"powerdown GPIO request failed\n");
if (ak4619->pdn_gpio)
msleep(10);
ak4619->regmap = devm_regmap_init_i2c(i2c, &ak4619_regmap_cfg);
if (IS_ERR(ak4619->regmap)) {
ret = PTR_ERR(ak4619->regmap);
dev_err(dev, "regmap_init() failed: %d\n", ret);
if (ak4619->pdn_gpio)
gpiod_set_value_cansleep(ak4619->pdn_gpio, 1);
return ret;
}
@ -887,6 +898,8 @@ static int ak4619_i2c_probe(struct i2c_client *i2c)
if (ret < 0) {
dev_err(dev, "Failed to register ak4619 component: %d\n",
ret);
if (ak4619->pdn_gpio)
gpiod_set_value_cansleep(ak4619->pdn_gpio, 1);
return ret;
}