[alsa-devel] [PATCH v2 4/5] ASoC: add spi hw read function for 16 addr 8 data mode
Barry Song
21cnbao at gmail.com
Mon Aug 15 04:46:17 CEST 2011
2011/8/13 Scott Jiang <scott.jiang.linux at gmail.com>:
> some spi registers are 7bits global address + 1 bit r/w + 8 bits
> register address. soc cache layer can't support this kind well.
> so let codec driver read registers directly.
i don't think your this document has any relationship with your patch.
it is just making confusion.
And who is the user of your this new API?
>
> Signed-off-by: Scott Jiang <scott.jiang.linux at gmail.com>
> ---
> sound/soc/soc-io.c | 23 +++++++++++++++++++++++
> 1 files changed, 23 insertions(+), 0 deletions(-)
>
> diff --git a/sound/soc/soc-io.c b/sound/soc/soc-io.c
> index cca490c..a62f7dd 100644
> --- a/sound/soc/soc-io.c
> +++ b/sound/soc/soc-io.c
> @@ -205,6 +205,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 int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> @@ -295,6 +314,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,
> @@ -318,6 +338,7 @@ static struct {
> .addr_bits = 16, .data_bits = 8,
> .write = snd_soc_16_8_write,
> .i2c_read = snd_soc_16_8_read_i2c,
> + .spi_read = snd_soc_16_8_read_spi,
> },
> {
> .addr_bits = 16, .data_bits = 16,
> @@ -383,6 +404,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
>
>
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
More information about the Alsa-devel
mailing list