>-----Original Message----- >From: uclinux-dist-devel-boun...@blackfin.uclinux.org >[mailto:uclinux-dist-devel-boun...@blackfin.uclinux.org] On >Behalf Of Scott Jiang >Sent: Thursday, August 11, 2011 4:27 PM >To: Greg Kroah-Hartman >Cc: uclinux-dist-de...@blackfin.uclinux.org; >alsa-de...@alsa-project.org; sta...@kernel.org >Subject: [uclinux-dist-devel] [alsa-devel][PATCH 3.0]ASoC: >ad193x: add spi_hw_read, fix sysclk and register definition > >asoc cache layer can't support this kind of spi registers, so >bypass cache and read regiters directly >
This patch is against stable kernel 3.0 only, the ASOC framework in kernel 3.1 and later are different. Sonic >Signed-off-by: Scott Jiang <scott.jiang.li...@gmail.com> >--- > sound/soc/blackfin/bf5xx-ad193x.c | 2 +- > sound/soc/codecs/ad193x.c | 8 ++++++-- > sound/soc/codecs/ad193x.h | 5 +++-- > sound/soc/soc-cache.c | 23 +++++++++++++++++++++++ > 4 files changed, 33 insertions(+), 5 deletions(-) > >diff --git a/sound/soc/blackfin/bf5xx-ad193x.c >b/sound/soc/blackfin/bf5xx-ad193x.c >index d40cf68..417200b 100644 >--- a/sound/soc/blackfin/bf5xx-ad193x.c >+++ b/sound/soc/blackfin/bf5xx-ad193x.c >@@ -56,7 +56,7 @@ static int bf5xx_ad193x_hw_params(struct >snd_pcm_substream *substream, > > switch (params_rate(params)) { > case 48000: >- clk = 12288000; >+ clk = 24576000; > break; > } > >diff --git a/sound/soc/codecs/ad193x.c >b/sound/soc/codecs/ad193x.c index 2374ca5..1447cc8 100644 >--- a/sound/soc/codecs/ad193x.c >+++ b/sound/soc/codecs/ad193x.c >@@ -307,7 +307,8 @@ static int ad193x_hw_params(struct >snd_pcm_substream *substream, > snd_soc_write(codec, AD193X_PLL_CLK_CTRL0, reg); > > reg = snd_soc_read(codec, AD193X_DAC_CTRL2); >- reg = (reg & (~AD193X_DAC_WORD_LEN_MASK)) | word_len; >+ reg = (reg & (~AD193X_DAC_WORD_LEN_MASK)) >+ | (word_len << AD193X_DAC_WORD_LEN_SHFT); > snd_soc_write(codec, AD193X_DAC_CTRL2, reg); > > reg = snd_soc_read(codec, AD193X_ADC_CTRL1); @@ -361,7 >+362,10 @@ static int ad193x_probe(struct snd_soc_codec *codec) > dev_err(codec->dev, "failed to set cache I/O: >%d\n", ret); > return ret; > } >- >+#if defined(CONFIG_SPI_MASTER) >+ /* asoc cache layer can't support this kind of spi >registers now */ >+ codec->cache_bypass = 1; >+#endif > /* default setting for ad193x */ > > /* unmute dac channels */ >diff --git a/sound/soc/codecs/ad193x.h >b/sound/soc/codecs/ad193x.h index 9747b54..cccc2e8 100644 >--- a/sound/soc/codecs/ad193x.h >+++ b/sound/soc/codecs/ad193x.h >@@ -34,7 +34,8 @@ > #define AD193X_DAC_LEFT_HIGH (1 << 3) > #define AD193X_DAC_BCLK_INV (1 << 7) > #define AD193X_DAC_CTRL2 0x804 >-#define AD193X_DAC_WORD_LEN_MASK 0xC >+#define AD193X_DAC_WORD_LEN_SHFT 3 >+#define AD193X_DAC_WORD_LEN_MASK 0x18 > #define AD193X_DAC_MASTER_MUTE 1 > #define AD193X_DAC_CHNL_MUTE 0x805 > #define AD193X_DACL1_MUTE 0 >@@ -63,7 +64,7 @@ > #define AD193X_ADC_CTRL1 0x80f > #define AD193X_ADC_SERFMT_MASK 0x60 > #define AD193X_ADC_SERFMT_STEREO (0 << 5) >-#define AD193X_ADC_SERFMT_TDM (1 << 2) >+#define AD193X_ADC_SERFMT_TDM (1 << 5) > #define AD193X_ADC_SERFMT_AUX (2 << 5) > #define AD193X_ADC_WORD_LEN_MASK 0x3 > #define AD193X_ADC_CTRL2 0x810 >diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c >index 039b953..d9e9682 100644 >--- a/sound/soc/soc-cache.c >+++ b/sound/soc/soc-cache.c >@@ -233,6 +233,25 @@ static unsigned int >snd_soc_16_8_read_i2c(struct snd_soc_codec *codec, #define >snd_soc_16_8_read_i2c NULL #endif > >+#if defined(CONFIG_SPI_MASTER) >+static unsigned int snd_soc_16_8_read_spi(struct snd_soc_codec *codec, >+ unsigned int r) >+{ >+ struct spi_device *spi = codec->control_data; >+ >+ const u16 reg = cpu_to_be16(r | 0x100); >+ u8 data; >+ int ret; >+ >+ ret = spi_write_then_read(spi, ®, 2, &data, 1); >+ if (ret < 0) >+ return 0; >+ return data; >+} >+#else >+#define snd_soc_16_8_read_spi NULL >+#endif >+ > static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec, > unsigned int reg) > { >@@ -337,6 +356,7 @@ static struct { > int (*write)(struct snd_soc_codec *codec, unsigned int, >unsigned int); > unsigned int (*read)(struct snd_soc_codec *, unsigned int); > unsigned int (*i2c_read)(struct snd_soc_codec *, unsigned int); >+ unsigned int (*spi_read)(struct snd_soc_codec *, unsigned int); > } io_types[] = { > { > .addr_bits = 4, .data_bits = 12, >@@ -360,6 +380,7 @@ static struct { > .addr_bits = 16, .data_bits = 8, > .write = snd_soc_16_8_write, .read = snd_soc_16_8_read, > .i2c_read = snd_soc_16_8_read_i2c, >+ .spi_read = snd_soc_16_8_read_spi, > }, > { > .addr_bits = 16, .data_bits = 16, >@@ -425,6 +446,8 @@ int snd_soc_codec_set_cache_io(struct >snd_soc_codec *codec, #ifdef CONFIG_SPI_MASTER > codec->hw_write = do_spi_write; > #endif >+ if (io_types[i].spi_read) >+ codec->hw_read = io_types[i].spi_read; > > codec->control_data = container_of(codec->dev, > struct spi_device, >-- >1.7.0.4 >_______________________________________________ >Uclinux-dist-devel mailing list >uclinux-dist-de...@blackfin.uclinux.org >https://blackfin.uclinux.org/mailman/listinfo/uclinux-dist-devel > > _______________________________________________ stable mailing list stable@linux.kernel.org http://linux.kernel.org/mailman/listinfo/stable