From: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Liam Girdwood <lrg@slimlogic.co.uk>
Subject: Re: [PATCH 1/4] ASoC: clean up cache read/write functions
Date: Mon, 20 Dec 2010 17:23:22 +0000 [thread overview]
Message-ID: <1292865802.29185.24.camel@dplaptop.localdomain> (raw)
In-Reply-To: <s5h1v5czb5m.wl%tiwai@suse.de>
On Mon, 2010-12-20 at 17:01 +0100, Takashi Iwai wrote:
> Use common helper functions for standard read/write functions of each
> data type.
>
> Signed-off-by: Takashi Iwai <tiwai@suse.de>
> ---
> sound/soc/soc-cache.c | 251 ++++++++++---------------------------------------
> 1 files changed, 49 insertions(+), 202 deletions(-)
>
> diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c
> index 0e17b40..374b06a 100644
> --- a/sound/soc/soc-cache.c
> +++ b/sound/soc/soc-cache.c
> @@ -18,19 +18,44 @@
> #include <linux/bitmap.h>
> #include <linux/rbtree.h>
>
> -static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
> - unsigned int reg)
> +static int do_hw_write(struct snd_soc_codec *codec, unsigned int reg,
> + unsigned int value, void *data, unsigned int size)
> +{
> + int ret;
> +
> + if (!snd_soc_codec_volatile_register(codec, reg) &&
> + reg < codec->driver->reg_cache_size) {
> + ret = snd_soc_cache_write(codec, reg, value);
> + if (ret < 0)
> + return -1;
> + }
> +
> + if (codec->cache_only) {
> + codec->cache_sync = 1;
> + return 0;
> + }
> +
> + ret = codec->hw_write(codec->control_data, data, size);
> + if (ret == size)
> + return 0;
> + if (ret < 0)
> + return ret;
> + else
> + return -EIO;
> +}
> +
> +static unsigned int do_hw_read(struct snd_soc_codec *codec, unsigned int reg)
> {
> int ret;
> unsigned int val;
>
> if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> + snd_soc_codec_volatile_register(codec, reg)) {
> + if (codec->cache_only)
> + return -1;
>
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> + BUG_ON(!codec->hw_read);
> + return codec->hw_read(codec, reg);
> }
>
> ret = snd_soc_cache_read(codec, reg, &val);
> @@ -39,34 +64,21 @@ static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
> return val;
> }
>
> +static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
> + unsigned int reg)
> +{
> + return do_hw_read(codec, reg);
> +}
> +
> static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[2];
> - int ret;
>
> data[0] = (reg << 4) | ((value >> 8) & 0x000f);
> data[1] = value & 0x00ff;
>
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - ret = codec->hw_write(codec->control_data, data, 2);
> - if (ret == 2)
> - return 0;
> - if (ret < 0)
> - return ret;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 2);
> }
>
> #if defined(CONFIG_SPI_MASTER)
> @@ -102,52 +114,18 @@ static int snd_soc_4_12_spi_write(void *control_data, const char *data,
> static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
> unsigned int reg)
> {
> - int ret;
> - unsigned int val;
> -
> - if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> -
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> - }
> -
> - ret = snd_soc_cache_read(codec, reg, &val);
> - if (ret < 0)
> - return -1;
> - return val;
> + return do_hw_read(codec, reg);
> }
>
> static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[2];
> - int ret;
>
> data[0] = (reg << 1) | ((value >> 8) & 0x0001);
> data[1] = value & 0x00ff;
>
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - ret = codec->hw_write(codec->control_data, data, 2);
> - if (ret == 2)
> - return 0;
> - if (ret < 0)
> - return ret;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 2);
> }
>
> #if defined(CONFIG_SPI_MASTER)
> @@ -184,50 +162,19 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[2];
> - int ret;
>
> reg &= 0xff;
> data[0] = reg;
> data[1] = value & 0xff;
>
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - if (codec->hw_write(codec->control_data, data, 2) == 2)
> - return 0;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 2);
> }
>
> static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
> unsigned int reg)
> {
> - int ret;
> - unsigned int val;
> -
> reg &= 0xff;
> - if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> -
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> - }
> -
> - ret = snd_soc_cache_read(codec, reg, &val);
> - if (ret < 0)
> - return -1;
> - return val;
> + return do_hw_read(codec, reg);
> }
>
> #if defined(CONFIG_SPI_MASTER)
> @@ -264,49 +211,18 @@ static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[3];
> - int ret;
>
> data[0] = reg;
> data[1] = (value >> 8) & 0xff;
> data[2] = value & 0xff;
>
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - if (codec->hw_write(codec->control_data, data, 3) == 3)
> - return 0;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 3);
> }
>
> static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
> unsigned int reg)
> {
> - int ret;
> - unsigned int val;
> -
> - if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> -
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> - }
> -
> - ret = snd_soc_cache_read(codec, reg, &val);
> - if (ret < 0)
> - return -1;
> - return val;
> + return do_hw_read(codec, reg);
> }
>
> #if defined(CONFIG_SPI_MASTER)
> @@ -445,55 +361,21 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec,
> static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
> unsigned int reg)
> {
> - int ret;
> - unsigned int val;
> -
> reg &= 0xff;
> - if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> -
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> - }
> -
> - ret = snd_soc_cache_read(codec, reg, &val);
> - if (ret < 0)
> - return -1;
> - return val;
> + return do_hw_read(codec, reg);
> }
>
> static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[3];
> - int ret;
>
> data[0] = (reg >> 8) & 0xff;
> data[1] = reg & 0xff;
> data[2] = value;
>
> reg &= 0xff;
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - ret = codec->hw_write(codec->control_data, data, 3);
> - if (ret == 3)
> - return 0;
> - if (ret < 0)
> - return ret;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 3);
> }
>
> #if defined(CONFIG_SPI_MASTER)
> @@ -564,55 +446,20 @@ static unsigned int snd_soc_16_16_read_i2c(struct snd_soc_codec *codec,
> static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec,
> unsigned int reg)
> {
> - int ret;
> - unsigned int val;
> -
> - if (reg >= codec->driver->reg_cache_size ||
> - snd_soc_codec_volatile_register(codec, reg)) {
> - if (codec->cache_only)
> - return -1;
> -
> - BUG_ON(!codec->hw_read);
> - return codec->hw_read(codec, reg);
> - }
> -
> - ret = snd_soc_cache_read(codec, reg, &val);
> - if (ret < 0)
> - return -1;
> -
> - return val;
> + return do_hw_read(codec, reg);
> }
>
> static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg,
> unsigned int value)
> {
> u8 data[4];
> - int ret;
>
> data[0] = (reg >> 8) & 0xff;
> data[1] = reg & 0xff;
> data[2] = (value >> 8) & 0xff;
> data[3] = value & 0xff;
>
> - if (!snd_soc_codec_volatile_register(codec, reg) &&
> - reg < codec->driver->reg_cache_size) {
> - ret = snd_soc_cache_write(codec, reg, value);
> - if (ret < 0)
> - return -1;
> - }
> -
> - if (codec->cache_only) {
> - codec->cache_sync = 1;
> - return 0;
> - }
> -
> - ret = codec->hw_write(codec->control_data, data, 4);
> - if (ret == 4)
> - return 0;
> - if (ret < 0)
> - return ret;
> - else
> - return -EIO;
> + return do_hw_write(codec, reg, value, data, 4);
> }
>
> #if defined(CONFIG_SPI_MASTER)
All
Acked-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
next prev parent reply other threads:[~2010-12-20 17:22 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-20 14:50 ASoC cache code (looking toward 2.6.38 merge window) Takashi Iwai
2010-12-20 15:27 ` Mark Brown
2010-12-20 15:56 ` Takashi Iwai
2010-12-20 16:01 ` [PATCH 1/4] ASoC: clean up cache read/write functions Takashi Iwai
2010-12-20 16:01 ` [PATCH 2/4] ASoC: clean up spi " Takashi Iwai
2010-12-20 16:02 ` [PATCH 3/4] ASoC: clean up i2c cache read / write functions Takashi Iwai
2010-12-20 16:05 ` [PATCH 4/4] ASoC: clean up cache accesser Takashi Iwai
2010-12-20 16:27 ` Dimitris Papastamos
2010-12-20 16:47 ` Takashi Iwai
2010-12-20 16:54 ` Mark Brown
2010-12-20 17:09 ` Dimitris Papastamos
2010-12-20 17:22 ` Takashi Iwai
2010-12-20 17:04 ` Dimitris Papastamos
2010-12-20 16:42 ` Mark Brown
2010-12-20 16:57 ` Takashi Iwai
2010-12-20 17:20 ` [PATCH 4/4] ASoC: Factor out cache_ops implementations Takashi Iwai
2010-12-20 17:29 ` [PATCH 2/4] ASoC: clean up spi cache read/write functions Mark Brown
2010-12-20 17:23 ` Dimitris Papastamos [this message]
2010-12-20 17:24 ` [PATCH 1/4] ASoC: clean up " Mark Brown
2010-12-20 17:32 ` Takashi Iwai
2010-12-20 16:34 ` ASoC cache code (looking toward 2.6.38 merge window) Mark Brown
2010-12-20 16:51 ` Takashi Iwai
2010-12-20 16:58 ` Mark Brown
2010-12-20 16:59 ` Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1292865802.29185.24.camel@dplaptop.localdomain \
--to=dp@opensource.wolfsonmicro.com \
--cc=alsa-devel@alsa-project.org \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=lrg@slimlogic.co.uk \
--cc=tiwai@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.