Message ID | 20240527125608.2461300-2-spujar@nvidia.com |
---|---|
State | New |
Headers | show |
Series | Support Tegra I2S client format conversion | expand |
On Mon May 27, 2024 at 2:56 PM CEST, Sameer Pujar wrote: > From: Mohan Kumar <mkumard@nvidia.com> > > Split the simple_fixup_sample_fmt() into two functions by adding > one more function named simple_util_get_sample_fmt() to return > the sample format value. > > This is useful for drivers that wish to simply get the sample format > without setting the mask. > > Signed-off-by: Mohan Kumar <mkumard@nvidia.com> > Signed-off-by: Sameer Pujar <spujar@nvidia.com> > --- > include/sound/simple_card_utils.h | 2 ++ > sound/soc/generic/simple-card-utils.c | 26 ++++++++++++++++++++------ > 2 files changed, 22 insertions(+), 6 deletions(-) > > diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h > index ad67957b7b48..2c2279d082ec 100644 > --- a/include/sound/simple_card_utils.h > +++ b/include/sound/simple_card_utils.h > @@ -174,6 +174,8 @@ void simple_util_parse_convert(struct device_node *np, char *prefix, > struct simple_util_data *data); > bool simple_util_is_convert_required(const struct simple_util_data *data); > > +int simple_util_get_sample_fmt(struct simple_util_data *data); > + > int simple_util_parse_routing(struct snd_soc_card *card, > char *prefix); > int simple_util_parse_widgets(struct snd_soc_card *card, > diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c > index 81077d16d22f..f1f5a1c025fc 100644 > --- a/sound/soc/generic/simple-card-utils.c > +++ b/sound/soc/generic/simple-card-utils.c > @@ -13,12 +13,11 @@ > #include <sound/pcm_params.h> > #include <sound/simple_card_utils.h> > > -static void simple_fixup_sample_fmt(struct simple_util_data *data, > - struct snd_pcm_hw_params *params) > +int simple_util_get_sample_fmt(struct simple_util_data *data) > { > int i; > - struct snd_mask *mask = hw_param_mask(params, > - SNDRV_PCM_HW_PARAM_FORMAT); > + int val = -EINVAL; > + > struct { > char *fmt; > u32 val; > @@ -33,11 +32,26 @@ static void simple_fixup_sample_fmt(struct simple_util_data *data, > for (i = 0; i < ARRAY_SIZE(of_sample_fmt_table); i++) { > if (!strcmp(data->convert_sample_format, > of_sample_fmt_table[i].fmt)) { > - snd_mask_none(mask); > - snd_mask_set(mask, of_sample_fmt_table[i].val); > + val = of_sample_fmt_table[i].val; > break; > } > } > + return val; > +} > +EXPORT_SYMBOL_GPL(simple_util_get_sample_fmt); > + > +static void simple_fixup_sample_fmt(struct simple_util_data *data, > + struct snd_pcm_hw_params *params) > +{ > + int val; > + struct snd_mask *mask = hw_param_mask(params, > + SNDRV_PCM_HW_PARAM_FORMAT); > + > + val = simple_util_get_sample_fmt(data); > + if (val >= 0) { Maybe nothing that we need to worry about, but this could be potentially a problem if the snd_pcm_format_t ever outgrows the non-negative number space. snd_pcm_format_t is defined to be an int as well, so any very large number would wrap into a negative value and then would be considered an error in this check. Then again, if that ever were to happen, we'd likely get a compiler error for the snd_pcm_format_t overflowing, so we'd probably notice and rewrite at that point. So I suppose: Reviewed-by: Thierry Reding <treding@nvidia.com>
diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h index ad67957b7b48..2c2279d082ec 100644 --- a/include/sound/simple_card_utils.h +++ b/include/sound/simple_card_utils.h @@ -174,6 +174,8 @@ void simple_util_parse_convert(struct device_node *np, char *prefix, struct simple_util_data *data); bool simple_util_is_convert_required(const struct simple_util_data *data); +int simple_util_get_sample_fmt(struct simple_util_data *data); + int simple_util_parse_routing(struct snd_soc_card *card, char *prefix); int simple_util_parse_widgets(struct snd_soc_card *card, diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c index 81077d16d22f..f1f5a1c025fc 100644 --- a/sound/soc/generic/simple-card-utils.c +++ b/sound/soc/generic/simple-card-utils.c @@ -13,12 +13,11 @@ #include <sound/pcm_params.h> #include <sound/simple_card_utils.h> -static void simple_fixup_sample_fmt(struct simple_util_data *data, - struct snd_pcm_hw_params *params) +int simple_util_get_sample_fmt(struct simple_util_data *data) { int i; - struct snd_mask *mask = hw_param_mask(params, - SNDRV_PCM_HW_PARAM_FORMAT); + int val = -EINVAL; + struct { char *fmt; u32 val; @@ -33,11 +32,26 @@ static void simple_fixup_sample_fmt(struct simple_util_data *data, for (i = 0; i < ARRAY_SIZE(of_sample_fmt_table); i++) { if (!strcmp(data->convert_sample_format, of_sample_fmt_table[i].fmt)) { - snd_mask_none(mask); - snd_mask_set(mask, of_sample_fmt_table[i].val); + val = of_sample_fmt_table[i].val; break; } } + return val; +} +EXPORT_SYMBOL_GPL(simple_util_get_sample_fmt); + +static void simple_fixup_sample_fmt(struct simple_util_data *data, + struct snd_pcm_hw_params *params) +{ + int val; + struct snd_mask *mask = hw_param_mask(params, + SNDRV_PCM_HW_PARAM_FORMAT); + + val = simple_util_get_sample_fmt(data); + if (val >= 0) { + snd_mask_none(mask); + snd_mask_set(mask, val); + } } void simple_util_parse_convert(struct device_node *np,