[PATCH] ASoC: soc-component: improve error reporting for register access
Pierre-Louis Bossart
pierre-louis.bossart at linux.intel.com
Thu Oct 14 18:31:24 CEST 2021
On 10/14/21 11:13 AM, Srinivas Kandagatla wrote:
> Currently errors on register read/write/update are reported with
> an error code and the corresponding function but does not provide
> any details on the which register number did it actually fail.
>
> register number can give better clue and it should be easy to
> locate the code and fix.
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla at linaro.org>
> ---
>
> Personally I found this patch very useful while developing and debugging.
>
> Ex: below error
> "ASoC: error at soc_component_read_no_lock on soc at 0:codec: -16"
> did not provide much info except that it failed to read,
> but after this patch error message looks like:
> "ASoC: error at soc_component_read_no_lock on soc at 0:codec for register: [0x00003125] -16"
> which was easy to locate and fix.
LGTM
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
BTW while looking at the code, I started to wonder if it's intentional
that we cannot check any error code on component->driver->read(). We do
for the write and on regmap read, which suggests this API is problematic?
static unsigned int soc_component_read_no_lock(
struct snd_soc_component *component,
unsigned int reg)
{
int ret;
unsigned int val = 0;
if (component->regmap)
ret = regmap_read(component->regmap, reg, &val);
else if (component->driver->read) {
ret = 0;
val = component->driver->read(component, reg); <<< NO ERROR CHECKS?
}
else
ret = -EIO;
if (ret < 0)
return soc_component_ret(component, ret);
return val;
}
>
> sound/soc/soc-component.c | 26 ++++++++++++++++----------
> 1 file changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/sound/soc/soc-component.c b/sound/soc/soc-component.c
> index a08a897c5230..c76ff9c59dfb 100644
> --- a/sound/soc/soc-component.c
> +++ b/sound/soc/soc-component.c
> @@ -13,9 +13,10 @@
> #include <sound/soc.h>
> #include <linux/bitops.h>
>
> -#define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret)
> +#define soc_component_ret(dai, ret) _soc_component_ret(dai, __func__, ret, -1)
> +#define soc_component_ret_reg_rw(dai, ret, reg) _soc_component_ret(dai, __func__, ret, reg)
> static inline int _soc_component_ret(struct snd_soc_component *component,
> - const char *func, int ret)
> + const char *func, int ret, int reg)
> {
> /* Positive/Zero values are not errors */
> if (ret >= 0)
> @@ -27,9 +28,14 @@ static inline int _soc_component_ret(struct snd_soc_component *component,
> case -ENOTSUPP:
> break;
> default:
> - dev_err(component->dev,
> - "ASoC: error at %s on %s: %d\n",
> - func, component->name, ret);
> + if (reg == -1)
> + dev_err(component->dev,
> + "ASoC: error at %s on %s: %d\n",
> + func, component->name, ret);
> + else
> + dev_err(component->dev,
> + "ASoC: error at %s on %s for register: [0x%08x] %d\n",
> + func, component->name, reg, ret);
> }
>
> return ret;
> @@ -687,7 +693,7 @@ static unsigned int soc_component_read_no_lock(
> ret = -EIO;
>
> if (ret < 0)
> - return soc_component_ret(component, ret);
> + return soc_component_ret_reg_rw(component, ret, reg);
>
> return val;
> }
> @@ -723,7 +729,7 @@ static int soc_component_write_no_lock(
> else if (component->driver->write)
> ret = component->driver->write(component, reg, val);
>
> - return soc_component_ret(component, ret);
> + return soc_component_ret_reg_rw(component, ret, reg);
> }
>
> /**
> @@ -765,7 +771,7 @@ static int snd_soc_component_update_bits_legacy(
>
> mutex_unlock(&component->io_mutex);
>
> - return soc_component_ret(component, ret);
> + return soc_component_ret_reg_rw(component, ret, reg);
> }
>
> /**
> @@ -793,7 +799,7 @@ int snd_soc_component_update_bits(struct snd_soc_component *component,
> mask, val, &change);
>
> if (ret < 0)
> - return soc_component_ret(component, ret);
> + return soc_component_ret_reg_rw(component, ret, reg);
> return change;
> }
> EXPORT_SYMBOL_GPL(snd_soc_component_update_bits);
> @@ -829,7 +835,7 @@ int snd_soc_component_update_bits_async(struct snd_soc_component *component,
> mask, val, &change);
>
> if (ret < 0)
> - return soc_component_ret(component, ret);
> + return soc_component_ret_reg_rw(component, ret, reg);
> return change;
> }
> EXPORT_SYMBOL_GPL(snd_soc_component_update_bits_async);
>
More information about the Alsa-devel
mailing list