[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, &reg, 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