diff mbox series

[v2] ASoC: tas5805m: fix pdn polarity

Message ID 20220309135649.195277-1-john@metanate.com
State Superseded
Headers show
Series [v2] ASoC: tas5805m: fix pdn polarity | expand

Commit Message

John Keeping March 9, 2022, 1:56 p.m. UTC
The binding defines the GPIO as "pdn-gpios" so when the GPIO is active
the expectation is that the power down signal is asserted and this is
how all other drivers using this GPIO name interpret the value.

But the tas5805m driver inverts the sense from the normal expectation so
when the powerdown GPIO is logically asserted the chip is running.

This is a new driver that is not yet in a released kernel and has no
in-tree users of the binding so fix the sense of the GPIO so that
logically asserted means that the device is powered down.

Rename the variable to match so that the compiler will catch any places
that should have been updated but have been missed.

Fixes: ec45268467f4 ("ASoC: add support for TAS5805M digital amplifier")
Signed-off-by: John Keeping <john@metanate.com>
---
v2:
- Rewrite commit message to make it more obvious that this is a change
  to the interpretation of the GPIO in the binding

 sound/soc/codecs/tas5805m.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

Comments

Mark Brown March 11, 2022, 12:03 p.m. UTC | #1
On Thu, Mar 10, 2022 at 08:09:42PM +0000, John Keeping wrote:
> On Wed, Mar 09, 2022 at 09:55:40PM +0000, Mark Brown wrote:

> > Sure, I still think it would be good to update the binding document to
> > clarify things as part of your patch - the binding currently just has it
> > as the "pdn" pin not the /pdn pin or anything.

> I've been thinking about this but I can't really think what to say.
> tas571x's binding says:

> 	GPIO specifier for the TAS571x's active low powerdown line

> Is that the sort of wording you have in mind?

Something along those lines, probably also mention something about the
flag.  If the DT has to specify the polarity for things to work
(basically, if it's not active high) then that should be in the binding.

> To me it seems like a general principle that the GPIO_ACTIVE_{HIGH,LOW}
> flags should be used to indicate how the pin works so that the driver
> consistently uses logical levels regardless of how the hardware is
> wired.

Every layer that introduces an inversion is a source of confusion - if
the physical signal needs to be set low but the code in the driver sets
the signal high that's a surprise for people, and generally if the user
needs to specify that the polarity is inverted every time they bind the
device that's a gotcha people won't tend to expect.

> Maybe this just means I'm approaching this "down" from the software
> abstraction more than "up" from the hardware.

Think about it more as being about making it easier to follow what the
physical state of the GPIO is.
diff mbox series

Patch

diff --git a/sound/soc/codecs/tas5805m.c b/sound/soc/codecs/tas5805m.c
index fa0e81ec875a..12146a860ef8 100644
--- a/sound/soc/codecs/tas5805m.c
+++ b/sound/soc/codecs/tas5805m.c
@@ -155,7 +155,7 @@  static const uint32_t tas5805m_volume[] = {
 
 struct tas5805m_priv {
 	struct regulator		*pvdd;
-	struct gpio_desc		*gpio_pdn_n;
+	struct gpio_desc		*gpio_pdn;
 
 	uint8_t				*dsp_cfg_data;
 	int				dsp_cfg_len;
@@ -444,11 +444,11 @@  static int tas5805m_i2c_probe(struct i2c_client *i2c)
 
 	dev_set_drvdata(dev, tas5805m);
 	tas5805m->regmap = regmap;
-	tas5805m->gpio_pdn_n = devm_gpiod_get(dev, "pdn", GPIOD_OUT_LOW);
-	if (IS_ERR(tas5805m->gpio_pdn_n)) {
+	tas5805m->gpio_pdn = devm_gpiod_get(dev, "pdn", GPIOD_OUT_HIGH);
+	if (IS_ERR(tas5805m->gpio_pdn)) {
 		dev_err(dev, "error requesting PDN gpio: %ld\n",
-			PTR_ERR(tas5805m->gpio_pdn_n));
-		return PTR_ERR(tas5805m->gpio_pdn_n);
+			PTR_ERR(tas5805m->gpio_pdn));
+		return PTR_ERR(tas5805m->gpio_pdn);
 	}
 
 	/* This configuration must be generated by PPC3. The file loaded
@@ -505,7 +505,7 @@  static int tas5805m_i2c_probe(struct i2c_client *i2c)
 	}
 
 	usleep_range(100000, 150000);
-	gpiod_set_value(tas5805m->gpio_pdn_n, 1);
+	gpiod_set_value(tas5805m->gpio_pdn, 0);
 	usleep_range(10000, 15000);
 
 	/* Don't register through devm. We need to be able to unregister
@@ -515,7 +515,7 @@  static int tas5805m_i2c_probe(struct i2c_client *i2c)
 					 &tas5805m_dai, 1);
 	if (ret < 0) {
 		dev_err(dev, "unable to register codec: %d\n", ret);
-		gpiod_set_value(tas5805m->gpio_pdn_n, 0);
+		gpiod_set_value(tas5805m->gpio_pdn, 1);
 		regulator_disable(tas5805m->pvdd);
 		return ret;
 	}
@@ -529,7 +529,7 @@  static int tas5805m_i2c_remove(struct i2c_client *i2c)
 	struct tas5805m_priv *tas5805m = dev_get_drvdata(dev);
 
 	snd_soc_unregister_component(dev);
-	gpiod_set_value(tas5805m->gpio_pdn_n, 0);
+	gpiod_set_value(tas5805m->gpio_pdn, 1);
 	usleep_range(10000, 15000);
 	regulator_disable(tas5805m->pvdd);
 	return 0;