[alsa-devel] [PATCH] ASoC: Reintroduce do_spi_write()
There is an unfortunate difference in return values between spi_write() and i2c_master_send() so we need an adaptor function to translate.
Reported-by: Lars-Peter Clausen lars@metafoo.de Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com --- sound/soc/soc-cache.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 04861c4..dee86fc 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -20,6 +20,20 @@
#include <trace/events/asoc.h>
+#ifdef CONFIG_SPI_MASTER +static int do_spi_write(void *control, const char *data, int len) +{ + struct spi_device *spi = control; + int ret; + + ret = spi_write(spi, data, len); + if (ret < 0) + return ret; + + return len; +} +#endif + static int do_hw_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value, const void *data, int len) { @@ -409,7 +423,7 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
case SND_SOC_SPI: #ifdef CONFIG_SPI_MASTER - codec->hw_write = (hw_write_t)spi_write; + codec->hw_write = do_spi_write; #endif
codec->control_data = container_of(codec->dev,
Currently there are two places in the snd_soc_cache code where the function to write to the hardware is determined by looking at the control_type. One lookup is done when the cache is initialized the other is done in snd_soc_hw_bulk_write_raw. This requires, that when the spi or i2c write function is changed, that both places are updated. To avoid missing one of them use the codec's hw_write callback in snd_soc_hw_bulk_write_raw instead of looking at the control_type.
Also this allows to use other bus types to do raw writes instead of limiting it to spi and i2c.
Signed-off-by: Lars-Peter Clausen lars@metafoo.de --- sound/soc/soc-cache.c | 16 +--------------- 1 files changed, 1 insertions(+), 15 deletions(-)
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 06b7b81..fb34d65 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -308,21 +308,7 @@ static int snd_soc_hw_bulk_write_raw(struct snd_soc_codec *codec, unsigned int r && reg < codec->driver->reg_cache_size) return -EINVAL;
- switch (codec->control_type) { -#if defined(CONFIG_I2C) || (defined(CONFIG_I2C_MODULE) && defined(MODULE)) - case SND_SOC_I2C: - ret = i2c_master_send(codec->control_data, data, len); - break; -#endif -#if defined(CONFIG_SPI_MASTER) - case SND_SOC_SPI: - ret = spi_write(codec->control_data, data, len); - break; -#endif - default: - BUG(); - } - + ret = codec->hw_write(codec, data, len); if (ret == len) return 0; if (ret < 0)
On Wed, May 11, 2011 at 12:05:14PM -0700, Lars-Peter Clausen wrote:
Currently there are two places in the snd_soc_cache code where the function to write to the hardware is determined by looking at the control_type. One lookup is done when the cache is initialized the other is done in snd_soc_hw_bulk_write_raw. This requires, that when the spi or i2c write function is changed, that both places are updated. To avoid missing one of them use the codec's hw_write callback in snd_soc_hw_bulk_write_raw instead of looking at the control_type.
Also this allows to use other bus types to do raw writes instead of limiting it to spi and i2c.
You're missing the bigger picture here where the raw bulk write doesn't work at all at the minute as it doesn't include the register. Dimitris said he was going to fix this, I suspect this will collide with that more important fix.
Please do also bear in mind my previous feedback about fixing the line lengths and general formatting in your commit logs. It's rather hard to read the above.
On Wed, 2011-05-11 at 19:25 +0200, Mark Brown wrote:
There is an unfortunate difference in return values between spi_write() and i2c_master_send() so we need an adaptor function to translate.
Reported-by: Lars-Peter Clausen lars@metafoo.de Signed-off-by: Mark Brown broonie@opensource.wolfsonmicro.com
sound/soc/soc-cache.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index 04861c4..dee86fc 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c @@ -20,6 +20,20 @@
#include <trace/events/asoc.h>
+#ifdef CONFIG_SPI_MASTER +static int do_spi_write(void *control, const char *data, int len) +{
- struct spi_device *spi = control;
- int ret;
- ret = spi_write(spi, data, len);
- if (ret < 0)
return ret;
- return len;
+} +#endif
static int do_hw_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value, const void *data, int len) { @@ -409,7 +423,7 @@ int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
case SND_SOC_SPI: #ifdef CONFIG_SPI_MASTER
codec->hw_write = (hw_write_t)spi_write;
codec->hw_write = do_spi_write;
#endif
codec->control_data = container_of(codec->dev,
Acked-by: Liam Girdwood lrg@ti.com
participants (3)
-
Lars-Peter Clausen
-
Liam Girdwood
-
Mark Brown