Message ID | 1393921529-28985-2-git-send-email-Li.Xiubo@freescale.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Mark Brown |
Headers | show |
On 03/04/2014 09:25 AM, Xiubo Li wrote: > Add the default regmap I/O setting to snd_soc_register_codec() while > the CODEC is initialising, which will be called by CODEC driver device > probe(), and then we can make set_cache_io() go away entirely from each > CODEC ASoC probe. > > Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> > --- > include/sound/soc.h | 3 +++ > sound/soc/soc-core.c | 11 +++++++++++ > 2 files changed, 14 insertions(+) > > diff --git a/include/sound/soc.h b/include/sound/soc.h > index 4c4d7e1..94bc1c4 100644 > --- a/include/sound/soc.h > +++ b/include/sound/soc.h > @@ -749,6 +749,9 @@ struct snd_soc_codec_driver { > int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source, > unsigned int freq_in, unsigned int freq_out); > > + /* codec regmap */ > + struct regmap *regmap; > + Nope. The driver struct is globally shared between all device instances, the regmap struct is device instance specific. The proper way to solve this is to have a function like snd_soc_register_codec_with_io() which takes a pointer to the regmap struct.
> Subject: Re: [alsa-devel] [RFC][PATCH 1/3] ASoC: core: Move the default regmap > I/O setting to snd_soc_register_codec() > > On 03/04/2014 09:25 AM, Xiubo Li wrote: > > Add the default regmap I/O setting to snd_soc_register_codec() while > > the CODEC is initialising, which will be called by CODEC driver device > > probe(), and then we can make set_cache_io() go away entirely from each > > CODEC ASoC probe. > > > > Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> > > --- > > include/sound/soc.h | 3 +++ > > sound/soc/soc-core.c | 11 +++++++++++ > > 2 files changed, 14 insertions(+) > > > > diff --git a/include/sound/soc.h b/include/sound/soc.h > > index 4c4d7e1..94bc1c4 100644 > > --- a/include/sound/soc.h > > +++ b/include/sound/soc.h > > @@ -749,6 +749,9 @@ struct snd_soc_codec_driver { > > int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source, > > unsigned int freq_in, unsigned int freq_out); > > > > + /* codec regmap */ > > + struct regmap *regmap; > > + > > Nope. The driver struct is globally shared between all device instances, the > regmap struct is device instance specific. The proper way to solve this is > to have a function like snd_soc_register_codec_with_io() which takes a > pointer to the regmap struct. > @Lars Yes, this maybe a better choice, and I will think of it. Thanks very much, -- Best Regards, Xiubo
diff --git a/include/sound/soc.h b/include/sound/soc.h index 4c4d7e1..94bc1c4 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h @@ -749,6 +749,9 @@ struct snd_soc_codec_driver { int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source, unsigned int freq_in, unsigned int freq_out); + /* codec regmap */ + struct regmap *regmap; + /* codec IO */ unsigned int (*read)(struct snd_soc_codec *, unsigned int); int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index a14155b..0fb502f 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -4443,6 +4443,17 @@ int snd_soc_register_codec(struct device *dev, codec->num_dai = num_dai; mutex_init(&codec->mutex); + if (!codec->write && (codec_drv->regmap || + dev_get_regmap(codec->dev, NULL))) { + /* Set the default I/O up try regmap */ + ret = snd_soc_codec_set_cache_io(codec, codec_drv->regmap); + if (ret < 0 && ret != -ENOTSUPP) { + dev_err(codec->dev, + "Failed to set cache I/O: %d\n", ret); + goto fail_codec_name; + } + } + for (i = 0; i < num_dai; i++) { fixup_codec_formats(&dai_drv[i].playback); fixup_codec_formats(&dai_drv[i].capture);
Add the default regmap I/O setting to snd_soc_register_codec() while the CODEC is initialising, which will be called by CODEC driver device probe(), and then we can make set_cache_io() go away entirely from each CODEC ASoC probe. Signed-off-by: Xiubo Li <Li.Xiubo@freescale.com> --- include/sound/soc.h | 3 +++ sound/soc/soc-core.c | 11 +++++++++++ 2 files changed, 14 insertions(+)