Hi Jacob On Fri, Feb 5, 2016 at 6:24 PM, Michael Trimarchi <michael@xxxxxxxxxxxxxxxxxxxx> wrote: > > Signed-off-by: Michael Trimarchi <michael@xxxxxxxxxxxxxxxxxxxx> > --- > Not get time to retest > Can you confirm that it works for you? Michael > Changes v3 -> v2: > - rebase after i2c support > > Changes v1 -> v2: > - Use switch for support new variants > - sort the compatible list > > sound/soc/codecs/pcm179x-i2c.c | 6 ---- > sound/soc/codecs/pcm179x-spi.c | 6 ---- > sound/soc/codecs/pcm179x.c | 62 ++++++++++++++++++++++++++++++++++++++++-- > sound/soc/codecs/pcm179x.h | 9 ++++-- > 4 files changed, 66 insertions(+), 17 deletions(-) > > diff --git a/sound/soc/codecs/pcm179x-i2c.c b/sound/soc/codecs/pcm179x-i2c.c > index 4118106..609f07f 100644 > --- a/sound/soc/codecs/pcm179x-i2c.c > +++ b/sound/soc/codecs/pcm179x-i2c.c > @@ -44,12 +44,6 @@ static int pcm179x_i2c_remove(struct i2c_client *client) > return pcm179x_common_exit(&client->dev); > } > > -static const struct of_device_id pcm179x_of_match[] = { > - { .compatible = "ti,pcm1792a", }, > - { } > -}; > -MODULE_DEVICE_TABLE(of, pcm179x_of_match); > - > static const struct i2c_device_id pcm179x_i2c_ids[] = { > { "pcm179x", 0 }, > { } > diff --git a/sound/soc/codecs/pcm179x-spi.c b/sound/soc/codecs/pcm179x-spi.c > index da924d4..6ae0e4d 100644 > --- a/sound/soc/codecs/pcm179x-spi.c > +++ b/sound/soc/codecs/pcm179x-spi.c > @@ -43,12 +43,6 @@ static int pcm179x_spi_remove(struct spi_device *spi) > return pcm179x_common_exit(&spi->dev); > } > > -static const struct of_device_id pcm179x_of_match[] = { > - { .compatible = "ti,pcm1792a", }, > - { } > -}; > -MODULE_DEVICE_TABLE(of, pcm179x_of_match); > - > static const struct spi_device_id pcm179x_spi_ids[] = { > { "pcm179x", 0 }, > { }, > diff --git a/sound/soc/codecs/pcm179x.c b/sound/soc/codecs/pcm179x.c > index 06a6657..73c80d3 100644 > --- a/sound/soc/codecs/pcm179x.c > +++ b/sound/soc/codecs/pcm179x.c > @@ -20,6 +20,8 @@ > #include <linux/slab.h> > #include <linux/kernel.h> > #include <linux/device.h> > +#include <linux/of.h> > +#include <linux/of_device.h> > > #include <sound/core.h> > #include <sound/pcm.h> > @@ -72,8 +74,31 @@ struct pcm179x_private { > struct regmap *regmap; > unsigned int format; > unsigned int rate; > +#define PCM1795 1 > + unsigned int codec_model; > }; > > +static int pcm179x_startup(struct snd_pcm_substream *substream, > + struct snd_soc_dai *dai) > +{ > + struct snd_soc_codec *codec = dai->codec; > + struct pcm179x_private *priv = snd_soc_codec_get_drvdata(codec); > + u64 formats = PCM1792A_FORMATS; > + > + switch (priv->codec_model) { > + case PCM1795: > + formats = PCM1795_FORMATS; > + break; > + default: > + break; > + } > + > + snd_pcm_hw_constraint_mask64(substream->runtime, > + SNDRV_PCM_HW_PARAM_FORMAT, formats); > + > + return 0; > +} > + > static int pcm179x_set_dai_fmt(struct snd_soc_dai *codec_dai, > unsigned int format) > { > @@ -112,8 +137,10 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream, > switch (priv->format & SND_SOC_DAIFMT_FORMAT_MASK) { > case SND_SOC_DAIFMT_RIGHT_J: > switch (params_width(params)) { > - case 24: > case 32: > + val = 1; > + break; > + case 24: > val = 2; > break; > case 16: > @@ -125,8 +152,10 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream, > break; > case SND_SOC_DAIFMT_I2S: > switch (params_width(params)) { > - case 24: > case 32: > + val = 4; > + break; > + case 24: > val = 5; > break; > case 16: > @@ -152,6 +181,7 @@ static int pcm179x_hw_params(struct snd_pcm_substream *substream, > } > > static const struct snd_soc_dai_ops pcm179x_dai_ops = { > + .startup = pcm179x_startup, > .set_fmt = pcm179x_set_dai_fmt, > .hw_params = pcm179x_hw_params, > .digital_mute = pcm179x_digital_mute, > @@ -190,7 +220,7 @@ static struct snd_soc_dai_driver pcm179x_dai = { > .rates = SNDRV_PCM_RATE_CONTINUOUS, > .rate_min = 10000, > .rate_max = 200000, > - .formats = PCM1792A_FORMATS, }, > + .formats = PCM179X_FORMATS, }, > .ops = &pcm179x_dai_ops, > }; > > @@ -214,15 +244,41 @@ static struct snd_soc_codec_driver soc_codec_dev_pcm179x = { > .num_dapm_routes = ARRAY_SIZE(pcm179x_dapm_routes), > }; > > +static const unsigned int codec_model = PCM1795; > + > +const struct of_device_id pcm179x_of_match[] = { > + { .compatible = "ti,pcm1792a", }, > + { .compatible = "ti,pcm1795", > + .data = &codec_model, > + }, > + { .compatible = "ti,pcm1796", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, pcm179x_of_match); > +EXPORT_SYMBOL_GPL(pcm179x_of_match); > + > int pcm179x_common_init(struct device *dev, struct regmap *regmap) > { > struct pcm179x_private *pcm179x; > + struct device_node *np = dev->of_node; > + const unsigned int *codec_model = NULL; > > pcm179x = devm_kzalloc(dev, sizeof(struct pcm179x_private), > GFP_KERNEL); > if (!pcm179x) > return -ENOMEM; > > + if (np) { > + const struct of_device_id *of_id; > + > + of_id = of_match_device(pcm179x_of_match, dev); > + if (of_id) > + codec_model = of_id->data; > + } > + > + if (codec_model) > + pcm179x->codec_model = *codec_model; > + > pcm179x->regmap = regmap; > dev_set_drvdata(dev, pcm179x); > > diff --git a/sound/soc/codecs/pcm179x.h b/sound/soc/codecs/pcm179x.h > index 11e3312..4c00047 100644 > --- a/sound/soc/codecs/pcm179x.h > +++ b/sound/soc/codecs/pcm179x.h > @@ -17,10 +17,15 @@ > #ifndef __PCM179X_H__ > #define __PCM179X_H__ > > -#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \ > - SNDRV_PCM_FMTBIT_S16_LE) > +#define PCM179X_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE | \ > + SNDRV_PCM_FMTBIT_S16_LE) > + > +#define PCM1792A_FORMATS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE) > + > +#define PCM1795_FORMATS (SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S24_LE) > > extern const struct regmap_config pcm179x_regmap_config; > +extern const struct of_device_id pcm179x_of_match[]; > > int pcm179x_common_init(struct device *dev, struct regmap *regmap); > int pcm179x_common_exit(struct device *dev); > -- > 2.7.0 > > -- > | Michael Nazzareno Trimarchi Amarula Solutions BV | > | COO - Founder Cruquiuskade 47 | > | +31(0)851119172 Amsterdam 1018 AM NL | > | [`as] http://www.amarulasolutions.com | -- | Michael Nazzareno Trimarchi Amarula Solutions BV | | COO - Founder Cruquiuskade 47 | | +31(0)851119172 Amsterdam 1018 AM NL | | [`as] http://www.amarulasolutions.com | -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html