diff mbox series

[v2,2/3] ASoC: cs4265: Fix the reset_gpio polarity

Message ID 20211229114457.4101989-2-festevam@gmail.com (mailing list archive)
State New, archived
Headers show
Series [v2,1/3] ASoC: cs4265: Fix part number ID error message | expand

Commit Message

Fabio Estevam Dec. 29, 2021, 11:44 a.m. UTC
From: Fabio Estevam <festevam@denx.de>

Currently, the reset_gpio polarity handling is done backwards.

The gpiod API takes the logic value of the GPIO, not the physical one.

As per the CS4265 datasheet:

"When RESET is low, the CS4265 enters a low-power mode and all
internal states are reset"

If a devicetree describes reset_gpio as active-low, the correct behaviour
would be to retrieve the GPIO and put in its active state (GPIOD_OUT_HIGH)
and then move it to its inactive state so that it can be operational
(logic level 0).

Fix it accordingly.

Fixes: fb6f806967f6 ("ASoC: Add support for the CS4265 CODEC")
Signed-off-by: Fabio Estevam <festevam@denx.de>
---
Changes since v1:
- Newly introduced patch.

 sound/soc/codecs/cs4265.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Charles Keepax Dec. 29, 2021, 11:53 a.m. UTC | #1
On Wed, Dec 29, 2021 at 08:44:56AM -0300, Fabio Estevam wrote:
> From: Fabio Estevam <festevam@denx.de>
> 
> Currently, the reset_gpio polarity handling is done backwards.
> 
> The gpiod API takes the logic value of the GPIO, not the physical one.
> 
> As per the CS4265 datasheet:
> 
> "When RESET is low, the CS4265 enters a low-power mode and all
> internal states are reset"
> 
> If a devicetree describes reset_gpio as active-low, the correct behaviour
> would be to retrieve the GPIO and put in its active state (GPIOD_OUT_HIGH)
> and then move it to its inactive state so that it can be operational
> (logic level 0).
> 
> Fix it accordingly.
> 
> Fixes: fb6f806967f6 ("ASoC: Add support for the CS4265 CODEC")
> Signed-off-by: Fabio Estevam <festevam@denx.de>
> ---
> Changes since v1:
> - Newly introduced patch.
> 
>  sound/soc/codecs/cs4265.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c
> index b89002189a2b..294fa7ac16cb 100644
> --- a/sound/soc/codecs/cs4265.c
> +++ b/sound/soc/codecs/cs4265.c
> @@ -590,13 +590,13 @@ static int cs4265_i2c_probe(struct i2c_client *i2c_client,
>  	}
>  
>  	cs4265->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
> -		"reset", GPIOD_OUT_LOW);
> +		"reset", GPIOD_OUT_HIGH);
>  	if (IS_ERR(cs4265->reset_gpio))
>  		return PTR_ERR(cs4265->reset_gpio);
>  
>  	if (cs4265->reset_gpio) {
>  		mdelay(1);
> -		gpiod_set_value_cansleep(cs4265->reset_gpio, 1);
> +		gpiod_set_value_cansleep(cs4265->reset_gpio, 0);

Hmm... I might defer to Mark on this one. I totally agree your
new code is more correct, however, I would have a slight worry
about existing device trees not correctly specifying the GPIO. As
in if existing systems had been specifying the GPIO correctly
they are presumably currently broken. But I am not sure what the
obvious solution would be, and I don't really have a good feel
for how widely used this part is.

Thanks,
Charles
Fabio Estevam Dec. 29, 2021, 12:04 p.m. UTC | #2
Hi Charles,

On Wed, Dec 29, 2021 at 8:54 AM Charles Keepax
<ckeepax@opensource.cirrus.com> wrote:

> Hmm... I might defer to Mark on this one. I totally agree your
> new code is more correct, however, I would have a slight worry
> about existing device trees not correctly specifying the GPIO. As
> in if existing systems had been specifying the GPIO correctly
> they are presumably currently broken. But I am not sure what the
> obvious solution would be, and I don't really have a good feel
> for how widely used this part is.

I could not find a single user of the cs4265 in linux-next.

The board I have does not connect a GPIO to the CS4264 reset line, so
I am not affected by it.

Cheers
Mark Brown Dec. 29, 2021, 12:43 p.m. UTC | #3
On Wed, Dec 29, 2021 at 09:04:19AM -0300, Fabio Estevam wrote:

> I could not find a single user of the cs4265 in linux-next.

> The board I have does not connect a GPIO to the CS4264 reset line, so
> I am not affected by it.

There might be more out of tree users of course - there's no requirement
for people to upstream their DTs.  Probably better to play it safe.
Fabio Estevam Dec. 29, 2021, 1:11 p.m. UTC | #4
Hi Mark,

On Wed, Dec 29, 2021 at 9:43 AM Mark Brown <broonie@kernel.org> wrote:

> There might be more out of tree users of course - there's no requirement
> for people to upstream their DTs.  Probably better to play it safe.

If someone correctly describes the gpio_reset as active-low, then the
driver will not work.

If there is any out-of-tree user of the gpio_reset property, they are
passing the incorrect polarity in the device tree
and things are working by pure luck. (wrong polarity in dts + wrong
polarity handling in the driver = working state)

Ok, if this can't be fixed, then let's drop patches 2 and 3, which is
unfortunate.
Charles Keepax Dec. 29, 2021, 1:30 p.m. UTC | #5
On Wed, Dec 29, 2021 at 10:11:57AM -0300, Fabio Estevam wrote:
> On Wed, Dec 29, 2021 at 9:43 AM Mark Brown <broonie@kernel.org> wrote:
> 
> > There might be more out of tree users of course - there's no requirement
> > for people to upstream their DTs.  Probably better to play it safe.
> 
> If someone correctly describes the gpio_reset as active-low, then the
> driver will not work.
> 
> If there is any out-of-tree user of the gpio_reset property, they are
> passing the incorrect polarity in the device tree
> and things are working by pure luck. (wrong polarity in dts + wrong
> polarity handling in the driver = working state)

Yeah a fair bit of this sort of thing kinda happened in the early
gpiod conversion, and it is indeed a bit sad.

> 
> Ok, if this can't be fixed, then let's drop patches 2 and 3, which is
> unfortunate.

I think we can still keep patch 3 here, still valuable to put the
device back into reset, even if we are using the backwards reset.

Thanks,
Charles
Mark Brown Jan. 4, 2022, 5:56 p.m. UTC | #6
On Wed, Dec 29, 2021 at 10:11:57AM -0300, Fabio Estevam wrote:
> On Wed, Dec 29, 2021 at 9:43 AM Mark Brown <broonie@kernel.org> wrote:

> > There might be more out of tree users of course - there's no requirement
> > for people to upstream their DTs.  Probably better to play it safe.

> If someone correctly describes the gpio_reset as active-low, then the
> driver will not work.

> If there is any out-of-tree user of the gpio_reset property, they are
> passing the incorrect polarity in the device tree
> and things are working by pure luck. (wrong polarity in dts + wrong
> polarity handling in the driver = working state)

To be honest I think the transparent polarity handling in the GPIO
bindings was a mistake, it's caused no end of problems especially with
signals like this which are active low - it's a nasty gotcha for
conversion to descriptors.

> Ok, if this can't be fixed, then let's drop patches 2 and 3, which is
> unfortunate.

Why drop patch 3?
diff mbox series

Patch

diff --git a/sound/soc/codecs/cs4265.c b/sound/soc/codecs/cs4265.c
index b89002189a2b..294fa7ac16cb 100644
--- a/sound/soc/codecs/cs4265.c
+++ b/sound/soc/codecs/cs4265.c
@@ -590,13 +590,13 @@  static int cs4265_i2c_probe(struct i2c_client *i2c_client,
 	}
 
 	cs4265->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
-		"reset", GPIOD_OUT_LOW);
+		"reset", GPIOD_OUT_HIGH);
 	if (IS_ERR(cs4265->reset_gpio))
 		return PTR_ERR(cs4265->reset_gpio);
 
 	if (cs4265->reset_gpio) {
 		mdelay(1);
-		gpiod_set_value_cansleep(cs4265->reset_gpio, 1);
+		gpiod_set_value_cansleep(cs4265->reset_gpio, 0);
 	}
 
 	i2c_set_clientdata(i2c_client, cs4265);