Re: [PATCH 2/4] ASoC: codecs: lpass-rx-macro: Keep static regmap_config as const

From: Dmitry Baryshkov
Date: Fri Jun 28 2024 - 04:35:36 EST


On Thu, Jun 27, 2024 at 05:23:44PM GMT, Krzysztof Kozlowski wrote:
> The driver has static 'struct regmap_config', which is then customized
> depending on device version. This works fine, because there should not
> be two devices in a system simultaneously and even less likely that such
> two devices would have different versions, thus different regmap config.
> However code is cleaner and more obvious when static data in the driver
> is also const - it serves as a template.
>
> Mark the 'struct regmap_config' as const and duplicate it in the probe()
> with devm_kmemdup to allow customizing per detected device variant.
>
> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@xxxxxxxxxx>
> ---
> sound/soc/codecs/lpass-rx-macro.c | 17 +++++++++++++----
> 1 file changed, 13 insertions(+), 4 deletions(-)

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@xxxxxxxxxx>

>
> diff --git a/sound/soc/codecs/lpass-rx-macro.c b/sound/soc/codecs/lpass-rx-macro.c
> index 59fe76b13cdb..3d8149665439 100644
> --- a/sound/soc/codecs/lpass-rx-macro.c
> +++ b/sound/soc/codecs/lpass-rx-macro.c
> @@ -1662,7 +1662,7 @@ static bool rx_is_readable_register(struct device *dev, unsigned int reg)
> return rx_is_rw_register(dev, reg);
> }
>
> -static struct regmap_config rx_regmap_config = {
> +static const struct regmap_config rx_regmap_config = {
> .name = "rx_macro",
> .reg_bits = 16,
> .val_bits = 32, /* 8 but with 32 bit read/write */
> @@ -3765,6 +3765,7 @@ static const struct snd_soc_component_driver rx_macro_component_drv = {
> static int rx_macro_probe(struct platform_device *pdev)
> {
> struct reg_default *reg_defaults;
> + struct regmap_config *reg_config;
> struct device *dev = &pdev->dev;
> kernel_ulong_t flags;
> struct rx_macro *rx;
> @@ -3851,14 +3852,22 @@ static int rx_macro_probe(struct platform_device *pdev)
> goto err;
> }
>
> - rx_regmap_config.reg_defaults = reg_defaults;
> - rx_regmap_config.num_reg_defaults = def_count;
> + reg_config = devm_kmemdup(dev, &rx_regmap_config, sizeof(*reg_config),
> + GFP_KERNEL);
> + if (!reg_config) {
> + ret = -ENOMEM;
> + goto err;
> + }
>
> - rx->regmap = devm_regmap_init_mmio(dev, base, &rx_regmap_config);
> + reg_config->reg_defaults = reg_defaults;
> + reg_config->num_reg_defaults = def_count;
> +
> + rx->regmap = devm_regmap_init_mmio(dev, base, reg_config);
> if (IS_ERR(rx->regmap)) {
> ret = PTR_ERR(rx->regmap);
> goto err;
> }
> + devm_kfree(dev, reg_config);
> devm_kfree(dev, reg_defaults);

Seeing devm_kfree in the non-error path makes me feel strange. Maybe
it's one of the rare occasions when I can say that __free is suitable
here.

>
> dev_set_drvdata(dev, rx);
>
> --
> 2.43.0
>

--
With best wishes
Dmitry