[alsa-devel] [PATCH v2 1/3] ASoC: alc5632: Remove unrelevant registers and name the relevant
Signed-off-by: Leon Romanovsky leon@leon.nu --- sound/soc/codecs/alc5632.c | 161 +++++++++++++------------------------------ 1 files changed, 49 insertions(+), 112 deletions(-)
diff --git a/sound/soc/codecs/alc5632.c b/sound/soc/codecs/alc5632.c index 6bfbbc7..9660542 100644 --- a/sound/soc/codecs/alc5632.c +++ b/sound/soc/codecs/alc5632.c @@ -36,118 +36,55 @@ * ALC5632 register cache */ static struct reg_default alc5632_reg_defaults[] = { - { 0, 0x59B4 }, - { 1, 0x0000 }, - { 2, 0x8080 }, - { 3, 0x0000 }, - { 4, 0x8080 }, - { 5, 0x0000 }, - { 6, 0x8080 }, - { 7, 0x0000 }, - { 8, 0xC800 }, - { 9, 0x0000 }, - { 10, 0xE808 }, - { 11, 0x0000 }, - { 12, 0x1010 }, - { 13, 0x0000 }, - { 14, 0x0808 }, - { 15, 0x0000 }, - { 16, 0xEE0F }, - { 17, 0x0000 }, - { 18, 0xCBCB }, - { 19, 0x0000 }, - { 20, 0x7F7F }, - { 21, 0x0000 }, - { 22, 0x0000 }, - { 23, 0x0000 }, - { 24, 0xE010 }, - { 25, 0x0000 }, - { 26, 0x0000 }, - { 27, 0x0000 }, - { 28, 0x8008 }, - { 29, 0x0000 }, - { 30, 0x0000 }, - { 31, 0x0000 }, - { 32, 0x0000 }, - { 33, 0x0000 }, - { 34, 0x0000 }, - { 35, 0x0000 }, - { 36, 0x00C0 }, - { 37, 0x0000 }, - { 38, 0xEF00 }, - { 39, 0x0000 }, - { 40, 0x0000 }, - { 41, 0x0000 }, - { 42, 0x0000 }, - { 43, 0x0000 }, - { 44, 0x0000 }, - { 45, 0x0000 }, - { 46, 0x0000 }, - { 47, 0x0000 }, - { 48, 0x0000 }, - { 49, 0x0000 }, - { 50, 0x0000 }, - { 51, 0x0000 }, - { 52, 0x8000 }, - { 53, 0x0000 }, - { 54, 0x0000 }, - { 55, 0x0000 }, - { 56, 0x0000 }, - { 57, 0x0000 }, - { 58, 0x0000 }, - { 59, 0x0000 }, - { 60, 0x0000 }, - { 61, 0x0000 }, - { 62, 0x8000 }, - { 63, 0x0000 }, - { 64, 0x0C0A }, - { 65, 0x0000 }, - { 66, 0x0000 }, - { 67, 0x0000 }, - { 68, 0x0000 }, - { 69, 0x0000 }, - { 70, 0x0000 }, - { 71, 0x0000 }, - { 72, 0x0000 }, - { 73, 0x0000 }, - { 74, 0x0000 }, - { 75, 0x0000 }, - { 76, 0xBE3E }, - { 77, 0x0000 }, - { 78, 0xBE3E }, - { 79, 0x0000 }, - { 80, 0x0000 }, - { 81, 0x0000 }, - { 82, 0x0000 }, - { 83, 0x0000 }, - { 84, 0x803A }, - { 85, 0x0000 }, - { 86, 0x0000 }, - { 87, 0x0000 }, - { 88, 0x0000 }, - { 89, 0x0000 }, - { 90, 0x0009 }, - { 91, 0x0000 }, - { 92, 0x0000 }, - { 93, 0x0000 }, - { 94, 0x3000 }, - { 95, 0x0000 }, - { 96, 0x3075 }, - { 97, 0x0000 }, - { 98, 0x1010 }, - { 99, 0x0000 }, - { 100, 0x3110 }, - { 101, 0x0000 }, - { 102, 0x0000 }, - { 103, 0x0000 }, - { 104, 0x0553 }, - { 105, 0x0000 }, - { 106, 0x0000 }, - { 107, 0x0000 }, - { 108, 0x0000 }, - { 109, 0x0000 }, - { 110, 0x0000 }, - { 111, 0x0000 }, + { 0, 0x59B4 }, /* R0 - Reset */ + { 2, 0x8080 }, /* R2 - Speaker Output Volume */ + { 4, 0x8080 }, /* R4 - Headphone Output Volume */ + { 6, 0x8080 }, /* R6 - AUXOUT Volume */ + { 8, 0xC800 }, /* R8 - Phone Input */ + { 10, 0xE808 }, /* R10 - LINE_IN Volume */ + { 12, 0x1010 }, /* R12 - STEREO DAC Input Volume */ + { 14, 0x0808 }, /* R14 - MIC Input Volume */ + { 16, 0xEE0F }, /* R16 - Stereo DAC and MIC Routing Control */ + { 18, 0xCBCB }, /* R18 - ADC Record Gain */ + { 20, 0x7F7F }, /* R20 - ADC Record Mixer Control */ + { 24, 0xE010 }, /* R24 - Voice DAC Volume */ + { 28, 0x8008 }, /* R28 - Output Mixer Control */ + { 34, 0x0000 }, /* R34 - Microphone Control */ + { 36, 0x00C0 }, /* R36 - Codec Digital MIC/Digital Boost + Control */ + { 38, 0xEF00 }, /* R38 - Power Down Control/Status */ + { 46, 0x0000 }, /* R46 - Stereo DAC/Voice DAC/Stereo ADC + Function Select */ + { 52, 0x8000 }, /* R52 - Main Serial Data Port Control + (Stereo I2S) */ + { 54, 0x0000 }, /* R54 - Extend Serial Data Port Control + (VoDAC_I2S/PCM) */ + { 58, 0x0000 }, /* R58 - Power Management Addition 1 */ + { 60, 0x0000 }, /* R60 - Power Management Addition 2 */ + { 62, 0x8000 }, /* R62 - Power Management Addition 3 */ + { 64, 0x0C0A }, /* R64 - General Purpose Control Register 1 */ + { 66, 0x0000 }, /* R66 - General Purpose Control Register 2 */ + { 68, 0x0000 }, /* R68 - PLL1 Control */ + { 70, 0x0000 }, /* R70 - PLL2 Control */ + { 76, 0xBE3E }, /* R76 - GPIO Pin Configuration */ + { 78, 0xBE3E }, /* R78 - GPIO Pin Polarity */ + { 80, 0x0000 }, /* R80 - GPIO Pin Sticky */ + { 82, 0x0000 }, /* R82 - GPIO Pin Wake Up */ + { 84, 0x803A }, /* R84 - GPIO Pin Status */ + { 86, 0x0000 }, /* R86 - Pin Sharing */ + { 88, 0x0000 }, /* R88 - Over-Temp/Current Status */ + { 90, 0x0009 }, /* R90 - Soft Volume Control Setting */ + { 92, 0x0000 }, /* R92 - GPIO_Output Pin Control */ + { 94, 0x3000 }, /* R94 - MISC Control */ + { 96, 0x3075 }, /* R96 - Stereo DAC Clock Control_1 */ + { 98, 0x1010 }, /* R98 - Stereo DAC Clock Control_2 */ + { 100, 0x3110 }, /* R100 - VoDAC_PCM Clock Control_1 */ + { 104, 0x0553 }, /* R104 - Pseudo Stereo and Spatial Effect + Block Control */ + { 106, 0x0000 }, /* R106 - Private Register Address */ + { 108, 0x0000 }, /* R108 - Private Register Data */ + { 110, 0x0000 }, /* R110 - EQ Control and Status/ADC + HPF Control */ };
/* codec private data */
There are two undocumented registers in use in alc5632_i2c_probe function. It must be added to support future rewrite of this function to use regmap API completely.
Signed-off-by: Leon Romanovsky leon@leon.nu --- sound/soc/codecs/alc5632.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/sound/soc/codecs/alc5632.c b/sound/soc/codecs/alc5632.c index 9660542..be10228 100644 --- a/sound/soc/codecs/alc5632.c +++ b/sound/soc/codecs/alc5632.c @@ -104,6 +104,8 @@ static bool alc5632_volatile_register(struct device *dev, case ALC5632_OVER_CURR_STATUS: case ALC5632_HID_CTRL_DATA: case ALC5632_EQ_CTRL: + case ALC5632_VENDOR_ID1: + case ALC5632_VENDOR_ID2: return true;
default:
Signed-off-by: Leon Romanovsky leon@leon.nu --- sound/soc/codecs/alc5632.c | 67 +++++++++++++++++++------------------------ 1 files changed, 30 insertions(+), 37 deletions(-)
diff --git a/sound/soc/codecs/alc5632.c b/sound/soc/codecs/alc5632.c index be10228..c32eade 100644 --- a/sound/soc/codecs/alc5632.c +++ b/sound/soc/codecs/alc5632.c @@ -1053,48 +1053,14 @@ static __devinit int alc5632_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct alc5632_priv *alc5632; - int ret, vid1, vid2; - - vid1 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID1); - if (vid1 < 0) { - dev_err(&client->dev, "failed to read I2C\n"); - return -EIO; - } else { - dev_info(&client->dev, "got vid1: %x\n", vid1); - } - vid1 = ((vid1 & 0xff) << 8) | (vid1 >> 8); - - vid2 = i2c_smbus_read_word_data(client, ALC5632_VENDOR_ID2); - if (vid2 < 0) { - dev_err(&client->dev, "failed to read I2C\n"); - return -EIO; - } else { - dev_info(&client->dev, "got vid2: %x\n", vid2); - } - vid2 = (vid2 & 0xff); - - if ((vid1 != 0x10ec) || (vid2 != id->driver_data)) { - dev_err(&client->dev, "unknown or wrong codec\n"); - dev_err(&client->dev, "Expected %x:%lx, got %x:%x\n", - 0x10ec, id->driver_data, - vid1, vid2); - return -ENODEV; - } + int ret, ret1, ret2; + unsigned int vid1, vid2;
alc5632 = devm_kzalloc(&client->dev, sizeof(struct alc5632_priv), GFP_KERNEL); if (alc5632 == NULL) return -ENOMEM;
- alc5632->id = vid2; - switch (alc5632->id) { - case 0x5c: - alc5632_dai.name = "alc5632-hifi"; - break; - default: - return -EINVAL; - } - i2c_set_clientdata(client, alc5632);
alc5632->regmap = regmap_init_i2c(client, &alc5632_regmap); @@ -1104,6 +1070,24 @@ static __devinit int alc5632_i2c_probe(struct i2c_client *client, return ret; }
+ ret1 = regmap_read(alc5632->regmap, ALC5632_VENDOR_ID1, &vid1); + ret2 = regmap_read(alc5632->regmap, ALC5632_VENDOR_ID2, &vid2); + if (ret1 != 0 || ret2 != 0) { + dev_err(&client->dev, + "Failed to read chip ID: ret1=%d, ret2=%d\n", ret1, ret2); + regmap_exit(alc5632->regmap); + return -EIO; + } + + vid2 >>= 8; + + if ((vid1 != 0x10EC) || (vid2 != id->driver_data)) { + dev_err(&client->dev, + "Device is not a ALC5632: VID1=0x%x, VID2=0x%x\n", vid1, vid2); + regmap_exit(alc5632->regmap); + return -EINVAL; + } + ret = alc5632_reset(alc5632->regmap); if (ret < 0) { dev_err(&client->dev, "Failed to issue reset\n"); @@ -1111,7 +1095,16 @@ static __devinit int alc5632_i2c_probe(struct i2c_client *client, return ret; }
- ret = snd_soc_register_codec(&client->dev, + alc5632->id = vid2; + switch (alc5632->id) { + case 0x5c: + alc5632_dai.name = "alc5632-hifi"; + break; + default: + return -EINVAL; + } + + ret = snd_soc_register_codec(&client->dev, &soc_codec_device_alc5632, &alc5632_dai, 1);
if (ret < 0) {
On Thu, Nov 17, 2011 at 12:01:28PM +0200, Leon Romanovsky wrote:
Signed-off-by: Leon Romanovsky leon@leon.nu
Applied all three, thanks.
participants (2)
-
Leon Romanovsky
-
Mark Brown