ak4642 driver is used for ak4642/ak4643. So, reading real register value is better than using constant value.
Signed-off-by: Kuninori Morimoto kuninori.morimoto.gx@renesas.com --- sound/soc/codecs/ak4642.c | 50 +++++++++++++++----------------------------- 1 files changed, 17 insertions(+), 33 deletions(-)
diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 8d56811..9a6157f 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -106,25 +106,19 @@ struct snd_soc_codec_device soc_codec_dev_ak4642; /* codec private data */ struct ak4642_priv { struct snd_soc_codec codec; + u8 reg_cache[AK4642_CACHEREGNUM]; };
static struct snd_soc_codec *ak4642_codec;
-/* - * ak4642 register cache - */ -static const u16 ak4642_reg[AK4642_CACHEREGNUM] = { - 0x0000, 0x0000, 0x0001, 0x0000, - 0x0002, 0x0000, 0x0000, 0x0000, - 0x00e1, 0x00e1, 0x0018, 0x0000, - 0x00e1, 0x0018, 0x0011, 0x0008, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, -}; +static void ak4642_fill_cache(struct snd_soc_codec *codec) +{ + int i; + u8 *cache = codec->reg_cache; + + for (i = 0; i < AK4642_CACHEREGNUM; i++) + i2c_master_recv(codec->control_data, cache + i, 1); +}
/* * read ak4642 register cache @@ -132,7 +126,7 @@ static const u16 ak4642_reg[AK4642_CACHEREGNUM] = { static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec, unsigned int reg) { - u16 *cache = codec->reg_cache; + u8 *cache = codec->reg_cache; if (reg >= AK4642_CACHEREGNUM) return -1; return cache[reg]; @@ -144,7 +138,7 @@ static inline unsigned int ak4642_read_reg_cache(struct snd_soc_codec *codec, static inline void ak4642_write_reg_cache(struct snd_soc_codec *codec, u16 reg, unsigned int value) { - u16 *cache = codec->reg_cache; + u8 *cache = codec->reg_cache; if (reg >= AK4642_CACHEREGNUM) return;
@@ -175,7 +169,7 @@ static int ak4642_write(struct snd_soc_codec *codec, unsigned int reg,
static int ak4642_sync(struct snd_soc_codec *codec) { - u16 *cache = codec->reg_cache; + u8 *cache = codec->reg_cache; int i, r = 0;
for (i = 0; i < AK4642_CACHEREGNUM; i++) @@ -432,12 +426,9 @@ static int ak4642_init(struct ak4642_priv *ak4642) codec->dai = &ak4642_dai; codec->num_dai = 1; codec->hw_write = (hw_write_t)i2c_master_send; - codec->reg_cache_size = ARRAY_SIZE(ak4642_reg); - codec->reg_cache = kmemdup(ak4642_reg, - sizeof(ak4642_reg), GFP_KERNEL); - - if (!codec->reg_cache) - return -ENOMEM; + codec->reg_cache_size = AK4642_CACHEREGNUM; + codec->reg_cache = ak4642->reg_cache; + ak4642_fill_cache(codec);
ak4642_dai.dev = codec->dev; ak4642_codec = codec; @@ -445,23 +436,17 @@ static int ak4642_init(struct ak4642_priv *ak4642) ret = snd_soc_register_codec(codec); if (ret) { dev_err(codec->dev, "Failed to register codec: %d\n", ret); - goto reg_cache_err; + return ret; }
ret = snd_soc_register_dai(&ak4642_dai); if (ret) { dev_err(codec->dev, "Failed to register DAI: %d\n", ret); snd_soc_unregister_codec(codec); - goto reg_cache_err; + return ret; }
return ret; - -reg_cache_err: - kfree(codec->reg_cache); - codec->reg_cache = NULL; - - return ret; }
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) @@ -495,7 +480,6 @@ static int ak4642_i2c_remove(struct i2c_client *client)
snd_soc_unregister_dai(&ak4642_dai); snd_soc_unregister_codec(&ak4642->codec); - kfree(ak4642->codec.reg_cache); kfree(ak4642); ak4642_codec = NULL;