diff options
| -rw-r--r-- | sound/oss/soundcard.c | 4 | ||||
| -rw-r--r-- | sound/pci/hda/hda_intel.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/max98088.c | 10 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8523.c | 9 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8741.c | 10 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8753.c | 226 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8904.c | 37 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8940.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8955.c | 31 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8960.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8962.c | 45 | ||||
| -rw-r--r-- | sound/soc/codecs/wm8971.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/wm9081.c | 1 | ||||
| -rw-r--r-- | sound/soc/codecs/wm9090.c | 18 |
14 files changed, 167 insertions, 228 deletions
diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c index 46c0d03dbecc..fcb14a099822 100644 --- a/sound/oss/soundcard.c +++ b/sound/oss/soundcard.c | |||
| @@ -87,7 +87,7 @@ int *load_mixer_volumes(char *name, int *levels, int present) | |||
| 87 | int i, n; | 87 | int i, n; |
| 88 | 88 | ||
| 89 | for (i = 0; i < num_mixer_volumes; i++) { | 89 | for (i = 0; i < num_mixer_volumes; i++) { |
| 90 | if (strcmp(name, mixer_vols[i].name) == 0) { | 90 | if (strncmp(name, mixer_vols[i].name, 32) == 0) { |
| 91 | if (present) | 91 | if (present) |
| 92 | mixer_vols[i].num = i; | 92 | mixer_vols[i].num = i; |
| 93 | return mixer_vols[i].levels; | 93 | return mixer_vols[i].levels; |
| @@ -99,7 +99,7 @@ int *load_mixer_volumes(char *name, int *levels, int present) | |||
| 99 | } | 99 | } |
| 100 | n = num_mixer_volumes++; | 100 | n = num_mixer_volumes++; |
| 101 | 101 | ||
| 102 | strcpy(mixer_vols[n].name, name); | 102 | strncpy(mixer_vols[n].name, name, 32); |
| 103 | 103 | ||
| 104 | if (present) | 104 | if (present) |
| 105 | mixer_vols[n].num = n; | 105 | mixer_vols[n].num = n; |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index b030c8eba21f..a1c4008af891 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -2300,6 +2300,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
| 2300 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), | 2300 | SND_PCI_QUIRK(0x1028, 0x01cc, "Dell D820", POS_FIX_LPIB), |
| 2301 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), | 2301 | SND_PCI_QUIRK(0x1028, 0x01de, "Dell Precision 390", POS_FIX_LPIB), |
| 2302 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), | 2302 | SND_PCI_QUIRK(0x1028, 0x01f6, "Dell Latitude 131L", POS_FIX_LPIB), |
| 2303 | SND_PCI_QUIRK(0x1028, 0x0470, "Dell Inspiron 1120", POS_FIX_LPIB), | ||
| 2303 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), | 2304 | SND_PCI_QUIRK(0x103c, 0x306d, "HP dv3", POS_FIX_LPIB), |
| 2304 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2305 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
| 2305 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), | 2306 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c index d63e28773eb1..6447dbb2f123 100644 --- a/sound/soc/codecs/max98088.c +++ b/sound/soc/codecs/max98088.c | |||
| @@ -40,7 +40,6 @@ struct max98088_cdata { | |||
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | struct max98088_priv { | 42 | struct max98088_priv { |
| 43 | u8 reg_cache[M98088_REG_CNT]; | ||
| 44 | enum max98088_type devtype; | 43 | enum max98088_type devtype; |
| 45 | void *control_data; | 44 | void *control_data; |
| 46 | struct max98088_pdata *pdata; | 45 | struct max98088_pdata *pdata; |
| @@ -1588,7 +1587,7 @@ static int max98088_dai2_set_fmt(struct snd_soc_dai *codec_dai, | |||
| 1588 | 1587 | ||
| 1589 | static void max98088_sync_cache(struct snd_soc_codec *codec) | 1588 | static void max98088_sync_cache(struct snd_soc_codec *codec) |
| 1590 | { | 1589 | { |
| 1591 | struct max98088_priv *max98088 = snd_soc_codec_get_drvdata(codec); | 1590 | u16 *reg_cache = codec->reg_cache; |
| 1592 | int i; | 1591 | int i; |
| 1593 | 1592 | ||
| 1594 | if (!codec->cache_sync) | 1593 | if (!codec->cache_sync) |
| @@ -1599,14 +1598,14 @@ static void max98088_sync_cache(struct snd_soc_codec *codec) | |||
| 1599 | /* write back cached values if they're writeable and | 1598 | /* write back cached values if they're writeable and |
| 1600 | * different from the hardware default. | 1599 | * different from the hardware default. |
| 1601 | */ | 1600 | */ |
| 1602 | for (i = 1; i < ARRAY_SIZE(max98088->reg_cache); i++) { | 1601 | for (i = 1; i < codec->driver->reg_cache_size; i++) { |
| 1603 | if (!max98088_access[i].writable) | 1602 | if (!max98088_access[i].writable) |
| 1604 | continue; | 1603 | continue; |
| 1605 | 1604 | ||
| 1606 | if (max98088->reg_cache[i] == max98088_reg[i]) | 1605 | if (reg_cache[i] == max98088_reg[i]) |
| 1607 | continue; | 1606 | continue; |
| 1608 | 1607 | ||
| 1609 | snd_soc_write(codec, i, max98088->reg_cache[i]); | 1608 | snd_soc_write(codec, i, reg_cache[i]); |
| 1610 | } | 1609 | } |
| 1611 | 1610 | ||
| 1612 | codec->cache_sync = 0; | 1611 | codec->cache_sync = 0; |
| @@ -1951,7 +1950,6 @@ static int max98088_probe(struct snd_soc_codec *codec) | |||
| 1951 | int ret = 0; | 1950 | int ret = 0; |
| 1952 | 1951 | ||
| 1953 | codec->cache_sync = 1; | 1952 | codec->cache_sync = 1; |
| 1954 | memcpy(codec->reg_cache, max98088_reg, sizeof(max98088_reg)); | ||
| 1955 | 1953 | ||
| 1956 | ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C); | 1954 | ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_I2C); |
| 1957 | if (ret != 0) { | 1955 | if (ret != 0) { |
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c index 9a433a5396cb..deca79ea2b4b 100644 --- a/sound/soc/codecs/wm8523.c +++ b/sound/soc/codecs/wm8523.c | |||
| @@ -41,7 +41,6 @@ static const char *wm8523_supply_names[WM8523_NUM_SUPPLIES] = { | |||
| 41 | /* codec private data */ | 41 | /* codec private data */ |
| 42 | struct wm8523_priv { | 42 | struct wm8523_priv { |
| 43 | enum snd_soc_control_type control_type; | 43 | enum snd_soc_control_type control_type; |
| 44 | u16 reg_cache[WM8523_REGISTER_COUNT]; | ||
| 45 | struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES]; | 44 | struct regulator_bulk_data supplies[WM8523_NUM_SUPPLIES]; |
| 46 | unsigned int sysclk; | 45 | unsigned int sysclk; |
| 47 | unsigned int rate_constraint_list[WM8523_NUM_RATES]; | 46 | unsigned int rate_constraint_list[WM8523_NUM_RATES]; |
| @@ -314,6 +313,7 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec, | |||
| 314 | enum snd_soc_bias_level level) | 313 | enum snd_soc_bias_level level) |
| 315 | { | 314 | { |
| 316 | struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); | 315 | struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); |
| 316 | u16 *reg_cache = codec->reg_cache; | ||
| 317 | int ret, i; | 317 | int ret, i; |
| 318 | 318 | ||
| 319 | switch (level) { | 319 | switch (level) { |
| @@ -344,7 +344,7 @@ static int wm8523_set_bias_level(struct snd_soc_codec *codec, | |||
| 344 | /* Sync back default/cached values */ | 344 | /* Sync back default/cached values */ |
| 345 | for (i = WM8523_AIF_CTRL1; | 345 | for (i = WM8523_AIF_CTRL1; |
| 346 | i < WM8523_MAX_REGISTER; i++) | 346 | i < WM8523_MAX_REGISTER; i++) |
| 347 | snd_soc_write(codec, i, wm8523->reg_cache[i]); | 347 | snd_soc_write(codec, i, reg_cache[i]); |
| 348 | 348 | ||
| 349 | 349 | ||
| 350 | msleep(100); | 350 | msleep(100); |
| @@ -414,6 +414,7 @@ static int wm8523_resume(struct snd_soc_codec *codec) | |||
| 414 | static int wm8523_probe(struct snd_soc_codec *codec) | 414 | static int wm8523_probe(struct snd_soc_codec *codec) |
| 415 | { | 415 | { |
| 416 | struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); | 416 | struct wm8523_priv *wm8523 = snd_soc_codec_get_drvdata(codec); |
| 417 | u16 *reg_cache = codec->reg_cache; | ||
| 417 | int ret, i; | 418 | int ret, i; |
| 418 | 419 | ||
| 419 | codec->hw_write = (hw_write_t)i2c_master_send; | 420 | codec->hw_write = (hw_write_t)i2c_master_send; |
| @@ -470,8 +471,8 @@ static int wm8523_probe(struct snd_soc_codec *codec) | |||
| 470 | } | 471 | } |
| 471 | 472 | ||
| 472 | /* Change some default settings - latch VU and enable ZC */ | 473 | /* Change some default settings - latch VU and enable ZC */ |
| 473 | wm8523->reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU; | 474 | reg_cache[WM8523_DAC_GAINR] |= WM8523_DACR_VU; |
| 474 | wm8523->reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC; | 475 | reg_cache[WM8523_DAC_CTRL3] |= WM8523_ZC; |
| 475 | 476 | ||
| 476 | wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 477 | wm8523_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 477 | 478 | ||
diff --git a/sound/soc/codecs/wm8741.c b/sound/soc/codecs/wm8741.c index 90e31e9aa6f7..aea60ef8aba7 100644 --- a/sound/soc/codecs/wm8741.c +++ b/sound/soc/codecs/wm8741.c | |||
| @@ -41,7 +41,6 @@ static const char *wm8741_supply_names[WM8741_NUM_SUPPLIES] = { | |||
| 41 | /* codec private data */ | 41 | /* codec private data */ |
| 42 | struct wm8741_priv { | 42 | struct wm8741_priv { |
| 43 | enum snd_soc_control_type control_type; | 43 | enum snd_soc_control_type control_type; |
| 44 | u16 reg_cache[WM8741_REGISTER_COUNT]; | ||
| 45 | struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; | 44 | struct regulator_bulk_data supplies[WM8741_NUM_SUPPLIES]; |
| 46 | unsigned int sysclk; | 45 | unsigned int sysclk; |
| 47 | struct snd_pcm_hw_constraint_list *sysclk_constraints; | 46 | struct snd_pcm_hw_constraint_list *sysclk_constraints; |
| @@ -422,6 +421,7 @@ static int wm8741_resume(struct snd_soc_codec *codec) | |||
| 422 | static int wm8741_probe(struct snd_soc_codec *codec) | 421 | static int wm8741_probe(struct snd_soc_codec *codec) |
| 423 | { | 422 | { |
| 424 | struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); | 423 | struct wm8741_priv *wm8741 = snd_soc_codec_get_drvdata(codec); |
| 424 | u16 *reg_cache = codec->reg_cache; | ||
| 425 | int ret = 0; | 425 | int ret = 0; |
| 426 | 426 | ||
| 427 | ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); | 427 | ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8741->control_type); |
| @@ -437,10 +437,10 @@ static int wm8741_probe(struct snd_soc_codec *codec) | |||
| 437 | } | 437 | } |
| 438 | 438 | ||
| 439 | /* Change some default settings - latch VU */ | 439 | /* Change some default settings - latch VU */ |
| 440 | wm8741->reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; | 440 | reg_cache[WM8741_DACLLSB_ATTENUATION] |= WM8741_UPDATELL; |
| 441 | wm8741->reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; | 441 | reg_cache[WM8741_DACLMSB_ATTENUATION] |= WM8741_UPDATELM; |
| 442 | wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; | 442 | reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERL; |
| 443 | wm8741->reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; | 443 | reg_cache[WM8741_DACRLSB_ATTENUATION] |= WM8741_UPDATERM; |
| 444 | 444 | ||
| 445 | snd_soc_add_controls(codec, wm8741_snd_controls, | 445 | snd_soc_add_controls(codec, wm8741_snd_controls, |
| 446 | ARRAY_SIZE(wm8741_snd_controls)); | 446 | ARRAY_SIZE(wm8741_snd_controls)); |
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index 8f679a13f2bc..87caae59e939 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c | |||
| @@ -65,22 +65,22 @@ static void wm8753_set_dai_mode(struct snd_soc_codec *codec, | |||
| 65 | * are using 2 wire for device control, so we cache them instead. | 65 | * are using 2 wire for device control, so we cache them instead. |
| 66 | */ | 66 | */ |
| 67 | static const u16 wm8753_reg[] = { | 67 | static const u16 wm8753_reg[] = { |
| 68 | 0x0008, 0x0000, 0x000a, 0x000a, | 68 | 0x0000, 0x0008, 0x0000, 0x000a, |
| 69 | 0x0033, 0x0000, 0x0007, 0x00ff, | 69 | 0x000a, 0x0033, 0x0000, 0x0007, |
| 70 | 0x00ff, 0x000f, 0x000f, 0x007b, | 70 | 0x00ff, 0x00ff, 0x000f, 0x000f, |
| 71 | 0x0000, 0x0032, 0x0000, 0x00c3, | 71 | 0x007b, 0x0000, 0x0032, 0x0000, |
| 72 | 0x00c3, 0x00c0, 0x0000, 0x0000, | 72 | 0x00c3, 0x00c3, 0x00c0, 0x0000, |
| 73 | 0x0000, 0x0000, 0x0000, 0x0000, | 73 | 0x0000, 0x0000, 0x0000, 0x0000, |
| 74 | 0x0000, 0x0000, 0x0000, 0x0000, | 74 | 0x0000, 0x0000, 0x0000, 0x0000, |
| 75 | 0x0000, 0x0000, 0x0000, 0x0055, | ||
| 76 | 0x0005, 0x0050, 0x0055, 0x0050, | ||
| 77 | 0x0055, 0x0050, 0x0055, 0x0079, | ||
| 78 | 0x0079, 0x0079, 0x0079, 0x0079, | ||
| 79 | 0x0000, 0x0000, 0x0000, 0x0000, | 75 | 0x0000, 0x0000, 0x0000, 0x0000, |
| 80 | 0x0097, 0x0097, 0x0000, 0x0004, | 76 | 0x0055, 0x0005, 0x0050, 0x0055, |
| 81 | 0x0000, 0x0083, 0x0024, 0x01ba, | 77 | 0x0050, 0x0055, 0x0050, 0x0055, |
| 82 | 0x0000, 0x0083, 0x0024, 0x01ba, | 78 | 0x0079, 0x0079, 0x0079, 0x0079, |
| 83 | 0x0000, 0x0000, 0x0000 | 79 | 0x0079, 0x0000, 0x0000, 0x0000, |
| 80 | 0x0000, 0x0097, 0x0097, 0x0000, | ||
| 81 | 0x0004, 0x0000, 0x0083, 0x0024, | ||
| 82 | 0x01ba, 0x0000, 0x0083, 0x0024, | ||
| 83 | 0x01ba, 0x0000, 0x0000, 0x0000 | ||
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | /* codec private data */ | 86 | /* codec private data */ |
| @@ -88,57 +88,10 @@ struct wm8753_priv { | |||
| 88 | enum snd_soc_control_type control_type; | 88 | enum snd_soc_control_type control_type; |
| 89 | unsigned int sysclk; | 89 | unsigned int sysclk; |
| 90 | unsigned int pcmclk; | 90 | unsigned int pcmclk; |
| 91 | u16 reg_cache[ARRAY_SIZE(wm8753_reg)]; | ||
| 92 | int dai_func; | 91 | int dai_func; |
| 93 | }; | 92 | }; |
| 94 | 93 | ||
| 95 | /* | 94 | #define wm8753_reset(c) snd_soc_write(c, WM8753_RESET, 0) |
| 96 | * read wm8753 register cache | ||
| 97 | */ | ||
| 98 | static inline unsigned int wm8753_read_reg_cache(struct snd_soc_codec *codec, | ||
| 99 | unsigned int reg) | ||
| 100 | { | ||
| 101 | u16 *cache = codec->reg_cache; | ||
| 102 | if (reg < 1 || reg >= (ARRAY_SIZE(wm8753_reg) + 1)) | ||
| 103 | return -1; | ||
| 104 | return cache[reg - 1]; | ||
| 105 | } | ||
| 106 | |||
| 107 | /* | ||
| 108 | * write wm8753 register cache | ||
| 109 | */ | ||
| 110 | static inline void wm8753_write_reg_cache(struct snd_soc_codec *codec, | ||
| 111 | unsigned int reg, unsigned int value) | ||
| 112 | { | ||
| 113 | u16 *cache = codec->reg_cache; | ||
| 114 | if (reg < 1 || reg >= (ARRAY_SIZE(wm8753_reg) + 1)) | ||
| 115 | return; | ||
| 116 | cache[reg - 1] = value; | ||
| 117 | } | ||
| 118 | |||
| 119 | /* | ||
| 120 | * write to the WM8753 register space | ||
| 121 | */ | ||
| 122 | static int wm8753_write(struct snd_soc_codec *codec, unsigned int reg, | ||
| 123 | unsigned int value) | ||
| 124 | { | ||
| 125 | u8 data[2]; | ||
| 126 | |||
| 127 | /* data is | ||
| 128 | * D15..D9 WM8753 register offset | ||
| 129 | * D8...D0 register data | ||
| 130 | */ | ||
| 131 | data[0] = (reg << 1) | ((value >> 8) & 0x0001); | ||
| 132 | data[1] = value & 0x00ff; | ||
| 133 | |||
| 134 | wm8753_write_reg_cache(codec, reg, value); | ||
| 135 | if (codec->hw_write(codec->control_data, data, 2) == 2) | ||
| 136 | return 0; | ||
| 137 | else | ||
| 138 | return -EIO; | ||
| 139 | } | ||
| 140 | |||
| 141 | #define wm8753_reset(c) wm8753_write(c, WM8753_RESET, 0) | ||
| 142 | 95 | ||
| 143 | /* | 96 | /* |
| 144 | * WM8753 Controls | 97 | * WM8753 Controls |
| @@ -218,7 +171,7 @@ static int wm8753_get_dai(struct snd_kcontrol *kcontrol, | |||
| 218 | struct snd_ctl_elem_value *ucontrol) | 171 | struct snd_ctl_elem_value *ucontrol) |
| 219 | { | 172 | { |
| 220 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 173 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 221 | int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL); | 174 | int mode = snd_soc_read(codec, WM8753_IOCTL); |
| 222 | 175 | ||
| 223 | ucontrol->value.integer.value[0] = (mode & 0xc) >> 2; | 176 | ucontrol->value.integer.value[0] = (mode & 0xc) >> 2; |
| 224 | return 0; | 177 | return 0; |
| @@ -228,7 +181,7 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol, | |||
| 228 | struct snd_ctl_elem_value *ucontrol) | 181 | struct snd_ctl_elem_value *ucontrol) |
| 229 | { | 182 | { |
| 230 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 183 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 231 | int mode = wm8753_read_reg_cache(codec, WM8753_IOCTL); | 184 | int mode = snd_soc_read(codec, WM8753_IOCTL); |
| 232 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); | 185 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); |
| 233 | 186 | ||
| 234 | if (((mode & 0xc) >> 2) == ucontrol->value.integer.value[0]) | 187 | if (((mode & 0xc) >> 2) == ucontrol->value.integer.value[0]) |
| @@ -738,17 +691,17 @@ static int wm8753_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, | |||
| 738 | if (pll_id == WM8753_PLL1) { | 691 | if (pll_id == WM8753_PLL1) { |
| 739 | offset = 0; | 692 | offset = 0; |
| 740 | enable = 0x10; | 693 | enable = 0x10; |
| 741 | reg = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xffef; | 694 | reg = snd_soc_read(codec, WM8753_CLOCK) & 0xffef; |
| 742 | } else { | 695 | } else { |
| 743 | offset = 4; | 696 | offset = 4; |
| 744 | enable = 0x8; | 697 | enable = 0x8; |
| 745 | reg = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfff7; | 698 | reg = snd_soc_read(codec, WM8753_CLOCK) & 0xfff7; |
| 746 | } | 699 | } |
| 747 | 700 | ||
| 748 | if (!freq_in || !freq_out) { | 701 | if (!freq_in || !freq_out) { |
| 749 | /* disable PLL */ | 702 | /* disable PLL */ |
| 750 | wm8753_write(codec, WM8753_PLL1CTL1 + offset, 0x0026); | 703 | snd_soc_write(codec, WM8753_PLL1CTL1 + offset, 0x0026); |
| 751 | wm8753_write(codec, WM8753_CLOCK, reg); | 704 | snd_soc_write(codec, WM8753_CLOCK, reg); |
| 752 | return 0; | 705 | return 0; |
| 753 | } else { | 706 | } else { |
| 754 | u16 value = 0; | 707 | u16 value = 0; |
| @@ -759,20 +712,20 @@ static int wm8753_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, | |||
| 759 | /* set up N and K PLL divisor ratios */ | 712 | /* set up N and K PLL divisor ratios */ |
| 760 | /* bits 8:5 = PLL_N, bits 3:0 = PLL_K[21:18] */ | 713 | /* bits 8:5 = PLL_N, bits 3:0 = PLL_K[21:18] */ |
| 761 | value = (pll_div.n << 5) + ((pll_div.k & 0x3c0000) >> 18); | 714 | value = (pll_div.n << 5) + ((pll_div.k & 0x3c0000) >> 18); |
| 762 | wm8753_write(codec, WM8753_PLL1CTL2 + offset, value); | 715 | snd_soc_write(codec, WM8753_PLL1CTL2 + offset, value); |
| 763 | 716 | ||
| 764 | /* bits 8:0 = PLL_K[17:9] */ | 717 | /* bits 8:0 = PLL_K[17:9] */ |
| 765 | value = (pll_div.k & 0x03fe00) >> 9; | 718 | value = (pll_div.k & 0x03fe00) >> 9; |
| 766 | wm8753_write(codec, WM8753_PLL1CTL3 + offset, value); | 719 | snd_soc_write(codec, WM8753_PLL1CTL3 + offset, value); |
| 767 | 720 | ||
| 768 | /* bits 8:0 = PLL_K[8:0] */ | 721 | /* bits 8:0 = PLL_K[8:0] */ |
| 769 | value = pll_div.k & 0x0001ff; | 722 | value = pll_div.k & 0x0001ff; |
| 770 | wm8753_write(codec, WM8753_PLL1CTL4 + offset, value); | 723 | snd_soc_write(codec, WM8753_PLL1CTL4 + offset, value); |
| 771 | 724 | ||
| 772 | /* set PLL as input and enable */ | 725 | /* set PLL as input and enable */ |
| 773 | wm8753_write(codec, WM8753_PLL1CTL1 + offset, 0x0027 | | 726 | snd_soc_write(codec, WM8753_PLL1CTL1 + offset, 0x0027 | |
| 774 | (pll_div.div2 << 3)); | 727 | (pll_div.div2 << 3)); |
| 775 | wm8753_write(codec, WM8753_CLOCK, reg | enable); | 728 | snd_soc_write(codec, WM8753_CLOCK, reg | enable); |
| 776 | } | 729 | } |
| 777 | return 0; | 730 | return 0; |
| 778 | } | 731 | } |
| @@ -879,7 +832,7 @@ static int wm8753_vdac_adc_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 879 | unsigned int fmt) | 832 | unsigned int fmt) |
| 880 | { | 833 | { |
| 881 | struct snd_soc_codec *codec = codec_dai->codec; | 834 | struct snd_soc_codec *codec = codec_dai->codec; |
| 882 | u16 voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x01ec; | 835 | u16 voice = snd_soc_read(codec, WM8753_PCM) & 0x01ec; |
| 883 | 836 | ||
| 884 | /* interface format */ | 837 | /* interface format */ |
| 885 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 838 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
| @@ -901,7 +854,7 @@ static int wm8753_vdac_adc_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 901 | return -EINVAL; | 854 | return -EINVAL; |
| 902 | } | 855 | } |
| 903 | 856 | ||
| 904 | wm8753_write(codec, WM8753_PCM, voice); | 857 | snd_soc_write(codec, WM8753_PCM, voice); |
| 905 | return 0; | 858 | return 0; |
| 906 | } | 859 | } |
| 907 | 860 | ||
| @@ -922,8 +875,8 @@ static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 922 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 875 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 923 | struct snd_soc_codec *codec = rtd->codec; | 876 | struct snd_soc_codec *codec = rtd->codec; |
| 924 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); | 877 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); |
| 925 | u16 voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x01f3; | 878 | u16 voice = snd_soc_read(codec, WM8753_PCM) & 0x01f3; |
| 926 | u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x017f; | 879 | u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x017f; |
| 927 | 880 | ||
| 928 | /* bit size */ | 881 | /* bit size */ |
| 929 | switch (params_format(params)) { | 882 | switch (params_format(params)) { |
| @@ -943,9 +896,9 @@ static int wm8753_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 943 | /* sample rate */ | 896 | /* sample rate */ |
| 944 | if (params_rate(params) * 384 == wm8753->pcmclk) | 897 | if (params_rate(params) * 384 == wm8753->pcmclk) |
| 945 | srate |= 0x80; | 898 | srate |= 0x80; |
| 946 | wm8753_write(codec, WM8753_SRATE1, srate); | 899 | snd_soc_write(codec, WM8753_SRATE1, srate); |
| 947 | 900 | ||
| 948 | wm8753_write(codec, WM8753_PCM, voice); | 901 | snd_soc_write(codec, WM8753_PCM, voice); |
| 949 | return 0; | 902 | return 0; |
| 950 | } | 903 | } |
| 951 | 904 | ||
| @@ -958,8 +911,8 @@ static int wm8753_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 958 | struct snd_soc_codec *codec = codec_dai->codec; | 911 | struct snd_soc_codec *codec = codec_dai->codec; |
| 959 | u16 voice, ioctl; | 912 | u16 voice, ioctl; |
| 960 | 913 | ||
| 961 | voice = wm8753_read_reg_cache(codec, WM8753_PCM) & 0x011f; | 914 | voice = snd_soc_read(codec, WM8753_PCM) & 0x011f; |
| 962 | ioctl = wm8753_read_reg_cache(codec, WM8753_IOCTL) & 0x015d; | 915 | ioctl = snd_soc_read(codec, WM8753_IOCTL) & 0x015d; |
| 963 | 916 | ||
| 964 | /* set master/slave audio interface */ | 917 | /* set master/slave audio interface */ |
| 965 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 918 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
| @@ -1013,8 +966,8 @@ static int wm8753_pcm_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1013 | return -EINVAL; | 966 | return -EINVAL; |
| 1014 | } | 967 | } |
| 1015 | 968 | ||
| 1016 | wm8753_write(codec, WM8753_PCM, voice); | 969 | snd_soc_write(codec, WM8753_PCM, voice); |
| 1017 | wm8753_write(codec, WM8753_IOCTL, ioctl); | 970 | snd_soc_write(codec, WM8753_IOCTL, ioctl); |
| 1018 | return 0; | 971 | return 0; |
| 1019 | } | 972 | } |
| 1020 | 973 | ||
| @@ -1026,16 +979,16 @@ static int wm8753_set_dai_clkdiv(struct snd_soc_dai *codec_dai, | |||
| 1026 | 979 | ||
| 1027 | switch (div_id) { | 980 | switch (div_id) { |
| 1028 | case WM8753_PCMDIV: | 981 | case WM8753_PCMDIV: |
| 1029 | reg = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0x003f; | 982 | reg = snd_soc_read(codec, WM8753_CLOCK) & 0x003f; |
| 1030 | wm8753_write(codec, WM8753_CLOCK, reg | div); | 983 | snd_soc_write(codec, WM8753_CLOCK, reg | div); |
| 1031 | break; | 984 | break; |
| 1032 | case WM8753_BCLKDIV: | 985 | case WM8753_BCLKDIV: |
| 1033 | reg = wm8753_read_reg_cache(codec, WM8753_SRATE2) & 0x01c7; | 986 | reg = snd_soc_read(codec, WM8753_SRATE2) & 0x01c7; |
| 1034 | wm8753_write(codec, WM8753_SRATE2, reg | div); | 987 | snd_soc_write(codec, WM8753_SRATE2, reg | div); |
| 1035 | break; | 988 | break; |
| 1036 | case WM8753_VXCLKDIV: | 989 | case WM8753_VXCLKDIV: |
| 1037 | reg = wm8753_read_reg_cache(codec, WM8753_SRATE2) & 0x003f; | 990 | reg = snd_soc_read(codec, WM8753_SRATE2) & 0x003f; |
| 1038 | wm8753_write(codec, WM8753_SRATE2, reg | div); | 991 | snd_soc_write(codec, WM8753_SRATE2, reg | div); |
| 1039 | break; | 992 | break; |
| 1040 | default: | 993 | default: |
| 1041 | return -EINVAL; | 994 | return -EINVAL; |
| @@ -1050,7 +1003,7 @@ static int wm8753_hdac_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1050 | unsigned int fmt) | 1003 | unsigned int fmt) |
| 1051 | { | 1004 | { |
| 1052 | struct snd_soc_codec *codec = codec_dai->codec; | 1005 | struct snd_soc_codec *codec = codec_dai->codec; |
| 1053 | u16 hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x01e0; | 1006 | u16 hifi = snd_soc_read(codec, WM8753_HIFI) & 0x01e0; |
| 1054 | 1007 | ||
| 1055 | /* interface format */ | 1008 | /* interface format */ |
| 1056 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 1009 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
| @@ -1072,7 +1025,7 @@ static int wm8753_hdac_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1072 | return -EINVAL; | 1025 | return -EINVAL; |
| 1073 | } | 1026 | } |
| 1074 | 1027 | ||
| 1075 | wm8753_write(codec, WM8753_HIFI, hifi); | 1028 | snd_soc_write(codec, WM8753_HIFI, hifi); |
| 1076 | return 0; | 1029 | return 0; |
| 1077 | } | 1030 | } |
| 1078 | 1031 | ||
| @@ -1085,8 +1038,8 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1085 | struct snd_soc_codec *codec = codec_dai->codec; | 1038 | struct snd_soc_codec *codec = codec_dai->codec; |
| 1086 | u16 ioctl, hifi; | 1039 | u16 ioctl, hifi; |
| 1087 | 1040 | ||
| 1088 | hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x011f; | 1041 | hifi = snd_soc_read(codec, WM8753_HIFI) & 0x011f; |
| 1089 | ioctl = wm8753_read_reg_cache(codec, WM8753_IOCTL) & 0x00ae; | 1042 | ioctl = snd_soc_read(codec, WM8753_IOCTL) & 0x00ae; |
| 1090 | 1043 | ||
| 1091 | /* set master/slave audio interface */ | 1044 | /* set master/slave audio interface */ |
| 1092 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { | 1045 | switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { |
| @@ -1140,8 +1093,8 @@ static int wm8753_i2s_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1140 | return -EINVAL; | 1093 | return -EINVAL; |
| 1141 | } | 1094 | } |
| 1142 | 1095 | ||
| 1143 | wm8753_write(codec, WM8753_HIFI, hifi); | 1096 | snd_soc_write(codec, WM8753_HIFI, hifi); |
| 1144 | wm8753_write(codec, WM8753_IOCTL, ioctl); | 1097 | snd_soc_write(codec, WM8753_IOCTL, ioctl); |
| 1145 | return 0; | 1098 | return 0; |
| 1146 | } | 1099 | } |
| 1147 | 1100 | ||
| @@ -1162,8 +1115,8 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 1162 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 1115 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 1163 | struct snd_soc_codec *codec = rtd->codec; | 1116 | struct snd_soc_codec *codec = rtd->codec; |
| 1164 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); | 1117 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); |
| 1165 | u16 srate = wm8753_read_reg_cache(codec, WM8753_SRATE1) & 0x01c0; | 1118 | u16 srate = snd_soc_read(codec, WM8753_SRATE1) & 0x01c0; |
| 1166 | u16 hifi = wm8753_read_reg_cache(codec, WM8753_HIFI) & 0x01f3; | 1119 | u16 hifi = snd_soc_read(codec, WM8753_HIFI) & 0x01f3; |
| 1167 | int coeff; | 1120 | int coeff; |
| 1168 | 1121 | ||
| 1169 | /* is digital filter coefficient valid ? */ | 1122 | /* is digital filter coefficient valid ? */ |
| @@ -1172,7 +1125,7 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 1172 | printk(KERN_ERR "wm8753 invalid MCLK or rate\n"); | 1125 | printk(KERN_ERR "wm8753 invalid MCLK or rate\n"); |
| 1173 | return coeff; | 1126 | return coeff; |
| 1174 | } | 1127 | } |
| 1175 | wm8753_write(codec, WM8753_SRATE1, srate | (coeff_div[coeff].sr << 1) | | 1128 | snd_soc_write(codec, WM8753_SRATE1, srate | (coeff_div[coeff].sr << 1) | |
| 1176 | coeff_div[coeff].usb); | 1129 | coeff_div[coeff].usb); |
| 1177 | 1130 | ||
| 1178 | /* bit size */ | 1131 | /* bit size */ |
| @@ -1190,7 +1143,7 @@ static int wm8753_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 1190 | break; | 1143 | break; |
| 1191 | } | 1144 | } |
| 1192 | 1145 | ||
| 1193 | wm8753_write(codec, WM8753_HIFI, hifi); | 1146 | snd_soc_write(codec, WM8753_HIFI, hifi); |
| 1194 | return 0; | 1147 | return 0; |
| 1195 | } | 1148 | } |
| 1196 | 1149 | ||
| @@ -1201,8 +1154,8 @@ static int wm8753_mode1v_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1201 | u16 clock; | 1154 | u16 clock; |
| 1202 | 1155 | ||
| 1203 | /* set clk source as pcmclk */ | 1156 | /* set clk source as pcmclk */ |
| 1204 | clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb; | 1157 | clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb; |
| 1205 | wm8753_write(codec, WM8753_CLOCK, clock); | 1158 | snd_soc_write(codec, WM8753_CLOCK, clock); |
| 1206 | 1159 | ||
| 1207 | if (wm8753_vdac_adc_set_dai_fmt(codec_dai, fmt) < 0) | 1160 | if (wm8753_vdac_adc_set_dai_fmt(codec_dai, fmt) < 0) |
| 1208 | return -EINVAL; | 1161 | return -EINVAL; |
| @@ -1224,8 +1177,8 @@ static int wm8753_mode2_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1224 | u16 clock; | 1177 | u16 clock; |
| 1225 | 1178 | ||
| 1226 | /* set clk source as pcmclk */ | 1179 | /* set clk source as pcmclk */ |
| 1227 | clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb; | 1180 | clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb; |
| 1228 | wm8753_write(codec, WM8753_CLOCK, clock); | 1181 | snd_soc_write(codec, WM8753_CLOCK, clock); |
| 1229 | 1182 | ||
| 1230 | if (wm8753_vdac_adc_set_dai_fmt(codec_dai, fmt) < 0) | 1183 | if (wm8753_vdac_adc_set_dai_fmt(codec_dai, fmt) < 0) |
| 1231 | return -EINVAL; | 1184 | return -EINVAL; |
| @@ -1239,8 +1192,8 @@ static int wm8753_mode3_4_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1239 | u16 clock; | 1192 | u16 clock; |
| 1240 | 1193 | ||
| 1241 | /* set clk source as mclk */ | 1194 | /* set clk source as mclk */ |
| 1242 | clock = wm8753_read_reg_cache(codec, WM8753_CLOCK) & 0xfffb; | 1195 | clock = snd_soc_read(codec, WM8753_CLOCK) & 0xfffb; |
| 1243 | wm8753_write(codec, WM8753_CLOCK, clock | 0x4); | 1196 | snd_soc_write(codec, WM8753_CLOCK, clock | 0x4); |
| 1244 | 1197 | ||
| 1245 | if (wm8753_hdac_set_dai_fmt(codec_dai, fmt) < 0) | 1198 | if (wm8753_hdac_set_dai_fmt(codec_dai, fmt) < 0) |
| 1246 | return -EINVAL; | 1199 | return -EINVAL; |
| @@ -1252,19 +1205,19 @@ static int wm8753_mode3_4_set_dai_fmt(struct snd_soc_dai *codec_dai, | |||
| 1252 | static int wm8753_mute(struct snd_soc_dai *dai, int mute) | 1205 | static int wm8753_mute(struct snd_soc_dai *dai, int mute) |
| 1253 | { | 1206 | { |
| 1254 | struct snd_soc_codec *codec = dai->codec; | 1207 | struct snd_soc_codec *codec = dai->codec; |
| 1255 | u16 mute_reg = wm8753_read_reg_cache(codec, WM8753_DAC) & 0xfff7; | 1208 | u16 mute_reg = snd_soc_read(codec, WM8753_DAC) & 0xfff7; |
| 1256 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); | 1209 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); |
| 1257 | 1210 | ||
| 1258 | /* the digital mute covers the HiFi and Voice DAC's on the WM8753. | 1211 | /* the digital mute covers the HiFi and Voice DAC's on the WM8753. |
| 1259 | * make sure we check if they are not both active when we mute */ | 1212 | * make sure we check if they are not both active when we mute */ |
| 1260 | if (mute && wm8753->dai_func == 1) { | 1213 | if (mute && wm8753->dai_func == 1) { |
| 1261 | if (!codec->active) | 1214 | if (!codec->active) |
| 1262 | wm8753_write(codec, WM8753_DAC, mute_reg | 0x8); | 1215 | snd_soc_write(codec, WM8753_DAC, mute_reg | 0x8); |
| 1263 | } else { | 1216 | } else { |
| 1264 | if (mute) | 1217 | if (mute) |
| 1265 | wm8753_write(codec, WM8753_DAC, mute_reg | 0x8); | 1218 | snd_soc_write(codec, WM8753_DAC, mute_reg | 0x8); |
| 1266 | else | 1219 | else |
| 1267 | wm8753_write(codec, WM8753_DAC, mute_reg); | 1220 | snd_soc_write(codec, WM8753_DAC, mute_reg); |
| 1268 | } | 1221 | } |
| 1269 | 1222 | ||
| 1270 | return 0; | 1223 | return 0; |
| @@ -1273,23 +1226,23 @@ static int wm8753_mute(struct snd_soc_dai *dai, int mute) | |||
| 1273 | static int wm8753_set_bias_level(struct snd_soc_codec *codec, | 1226 | static int wm8753_set_bias_level(struct snd_soc_codec *codec, |
| 1274 | enum snd_soc_bias_level level) | 1227 | enum snd_soc_bias_level level) |
| 1275 | { | 1228 | { |
| 1276 | u16 pwr_reg = wm8753_read_reg_cache(codec, WM8753_PWR1) & 0xfe3e; | 1229 | u16 pwr_reg = snd_soc_read(codec, WM8753_PWR1) & 0xfe3e; |
| 1277 | 1230 | ||
| 1278 | switch (level) { | 1231 | switch (level) { |
| 1279 | case SND_SOC_BIAS_ON: | 1232 | case SND_SOC_BIAS_ON: |
| 1280 | /* set vmid to 50k and unmute dac */ | 1233 | /* set vmid to 50k and unmute dac */ |
| 1281 | wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x00c0); | 1234 | snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x00c0); |
| 1282 | break; | 1235 | break; |
| 1283 | case SND_SOC_BIAS_PREPARE: | 1236 | case SND_SOC_BIAS_PREPARE: |
| 1284 | /* set vmid to 5k for quick power up */ | 1237 | /* set vmid to 5k for quick power up */ |
| 1285 | wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x01c1); | 1238 | snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x01c1); |
| 1286 | break; | 1239 | break; |
| 1287 | case SND_SOC_BIAS_STANDBY: | 1240 | case SND_SOC_BIAS_STANDBY: |
| 1288 | /* mute dac and set vmid to 500k, enable VREF */ | 1241 | /* mute dac and set vmid to 500k, enable VREF */ |
| 1289 | wm8753_write(codec, WM8753_PWR1, pwr_reg | 0x0141); | 1242 | snd_soc_write(codec, WM8753_PWR1, pwr_reg | 0x0141); |
| 1290 | break; | 1243 | break; |
| 1291 | case SND_SOC_BIAS_OFF: | 1244 | case SND_SOC_BIAS_OFF: |
| 1292 | wm8753_write(codec, WM8753_PWR1, 0x0001); | 1245 | snd_soc_write(codec, WM8753_PWR1, 0x0001); |
| 1293 | break; | 1246 | break; |
| 1294 | } | 1247 | } |
| 1295 | codec->bias_level = level; | 1248 | codec->bias_level = level; |
| @@ -1477,7 +1430,7 @@ static void wm8753_set_dai_mode(struct snd_soc_codec *codec, | |||
| 1477 | else | 1430 | else |
| 1478 | dai->driver = &wm8753_all_dai[(wm8753->dai_func << 1) + 1]; | 1431 | dai->driver = &wm8753_all_dai[(wm8753->dai_func << 1) + 1]; |
| 1479 | } | 1432 | } |
| 1480 | wm8753_write(codec, WM8753_IOCTL, wm8753->dai_func); | 1433 | snd_soc_write(codec, WM8753_IOCTL, wm8753->dai_func); |
| 1481 | } | 1434 | } |
| 1482 | 1435 | ||
| 1483 | static void wm8753_work(struct work_struct *work) | 1436 | static void wm8753_work(struct work_struct *work) |
| @@ -1495,22 +1448,19 @@ static int wm8753_suspend(struct snd_soc_codec *codec, pm_message_t state) | |||
| 1495 | 1448 | ||
| 1496 | static int wm8753_resume(struct snd_soc_codec *codec) | 1449 | static int wm8753_resume(struct snd_soc_codec *codec) |
| 1497 | { | 1450 | { |
| 1451 | u16 *reg_cache = codec->reg_cache; | ||
| 1498 | int i; | 1452 | int i; |
| 1499 | u8 data[2]; | ||
| 1500 | u16 *cache = codec->reg_cache; | ||
| 1501 | 1453 | ||
| 1502 | /* Sync reg_cache with the hardware */ | 1454 | /* Sync reg_cache with the hardware */ |
| 1503 | for (i = 0; i < ARRAY_SIZE(wm8753_reg); i++) { | 1455 | for (i = 1; i < ARRAY_SIZE(wm8753_reg); i++) { |
| 1504 | if (i + 1 == WM8753_RESET) | 1456 | if (i == WM8753_RESET) |
| 1505 | continue; | 1457 | continue; |
| 1506 | 1458 | ||
| 1507 | /* No point in writing hardware default values back */ | 1459 | /* No point in writing hardware default values back */ |
| 1508 | if (cache[i] == wm8753_reg[i]) | 1460 | if (reg_cache[i] == wm8753_reg[i]) |
| 1509 | continue; | 1461 | continue; |
| 1510 | 1462 | ||
| 1511 | data[0] = ((i + 1) << 1) | ((cache[i] >> 8) & 0x0001); | 1463 | snd_soc_write(codec, i, reg_cache[i]); |
| 1512 | data[1] = cache[i] & 0x00ff; | ||
| 1513 | codec->hw_write(codec->control_data, data, 2); | ||
| 1514 | } | 1464 | } |
| 1515 | 1465 | ||
| 1516 | wm8753_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 1466 | wm8753_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| @@ -1548,7 +1498,7 @@ static int run_delayed_work(struct delayed_work *dwork) | |||
| 1548 | static int wm8753_probe(struct snd_soc_codec *codec) | 1498 | static int wm8753_probe(struct snd_soc_codec *codec) |
| 1549 | { | 1499 | { |
| 1550 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); | 1500 | struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec); |
| 1551 | int ret = 0, reg; | 1501 | int ret; |
| 1552 | 1502 | ||
| 1553 | INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); | 1503 | INIT_DELAYED_WORK(&codec->delayed_work, wm8753_work); |
| 1554 | 1504 | ||
| @@ -1573,26 +1523,16 @@ static int wm8753_probe(struct snd_soc_codec *codec) | |||
| 1573 | msecs_to_jiffies(caps_charge)); | 1523 | msecs_to_jiffies(caps_charge)); |
| 1574 | 1524 | ||
| 1575 | /* set the update bits */ | 1525 | /* set the update bits */ |
| 1576 | reg = wm8753_read_reg_cache(codec, WM8753_LDAC); | 1526 | snd_soc_update_bits(codec, WM8753_LDAC, 0x0100, 0x0100); |
| 1577 | wm8753_write(codec, WM8753_LDAC, reg | 0x0100); | 1527 | snd_soc_update_bits(codec, WM8753_RDAC, 0x0100, 0x0100); |
| 1578 | reg = wm8753_read_reg_cache(codec, WM8753_RDAC); | 1528 | snd_soc_update_bits(codec, WM8753_LDAC, 0x0100, 0x0100); |
| 1579 | wm8753_write(codec, WM8753_RDAC, reg | 0x0100); | 1529 | snd_soc_update_bits(codec, WM8753_RDAC, 0x0100, 0x0100); |
| 1580 | reg = wm8753_read_reg_cache(codec, WM8753_LADC); | 1530 | snd_soc_update_bits(codec, WM8753_LOUT1V, 0x0100, 0x0100); |
| 1581 | wm8753_write(codec, WM8753_LADC, reg | 0x0100); | 1531 | snd_soc_update_bits(codec, WM8753_ROUT1V, 0x0100, 0x0100); |
| 1582 | reg = wm8753_read_reg_cache(codec, WM8753_RADC); | 1532 | snd_soc_update_bits(codec, WM8753_LOUT2V, 0x0100, 0x0100); |
| 1583 | wm8753_write(codec, WM8753_RADC, reg | 0x0100); | 1533 | snd_soc_update_bits(codec, WM8753_ROUT2V, 0x0100, 0x0100); |
| 1584 | reg = wm8753_read_reg_cache(codec, WM8753_LOUT1V); | 1534 | snd_soc_update_bits(codec, WM8753_LINVOL, 0x0100, 0x0100); |
| 1585 | wm8753_write(codec, WM8753_LOUT1V, reg | 0x0100); | 1535 | snd_soc_update_bits(codec, WM8753_RINVOL, 0x0100, 0x0100); |
| 1586 | reg = wm8753_read_reg_cache(codec, WM8753_ROUT1V); | ||
| 1587 | wm8753_write(codec, WM8753_ROUT1V, reg | 0x0100); | ||
| 1588 | reg = wm8753_read_reg_cache(codec, WM8753_LOUT2V); | ||
| 1589 | wm8753_write(codec, WM8753_LOUT2V, reg | 0x0100); | ||
| 1590 | reg = wm8753_read_reg_cache(codec, WM8753_ROUT2V); | ||
| 1591 | wm8753_write(codec, WM8753_ROUT2V, reg | 0x0100); | ||
| 1592 | reg = wm8753_read_reg_cache(codec, WM8753_LINVOL); | ||
| 1593 | wm8753_write(codec, WM8753_LINVOL, reg | 0x0100); | ||
| 1594 | reg = wm8753_read_reg_cache(codec, WM8753_RINVOL); | ||
| 1595 | wm8753_write(codec, WM8753_RINVOL, reg | 0x0100); | ||
| 1596 | 1536 | ||
| 1597 | snd_soc_add_controls(codec, wm8753_snd_controls, | 1537 | snd_soc_add_controls(codec, wm8753_snd_controls, |
| 1598 | ARRAY_SIZE(wm8753_snd_controls)); | 1538 | ARRAY_SIZE(wm8753_snd_controls)); |
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 9001cc48ba13..1ec12eff0620 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c | |||
| @@ -50,8 +50,6 @@ static const char *wm8904_supply_names[WM8904_NUM_SUPPLIES] = { | |||
| 50 | /* codec private data */ | 50 | /* codec private data */ |
| 51 | struct wm8904_priv { | 51 | struct wm8904_priv { |
| 52 | 52 | ||
| 53 | u16 reg_cache[WM8904_MAX_REGISTER + 1]; | ||
| 54 | |||
| 55 | enum wm8904_type devtype; | 53 | enum wm8904_type devtype; |
| 56 | void *control_data; | 54 | void *control_data; |
| 57 | 55 | ||
| @@ -2094,7 +2092,7 @@ static int wm8904_digital_mute(struct snd_soc_dai *codec_dai, int mute) | |||
| 2094 | 2092 | ||
| 2095 | static void wm8904_sync_cache(struct snd_soc_codec *codec) | 2093 | static void wm8904_sync_cache(struct snd_soc_codec *codec) |
| 2096 | { | 2094 | { |
| 2097 | struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); | 2095 | u16 *reg_cache = codec->reg_cache; |
| 2098 | int i; | 2096 | int i; |
| 2099 | 2097 | ||
| 2100 | if (!codec->cache_sync) | 2098 | if (!codec->cache_sync) |
| @@ -2105,14 +2103,14 @@ static void wm8904_sync_cache(struct snd_soc_codec *codec) | |||
| 2105 | /* Sync back cached values if they're different from the | 2103 | /* Sync back cached values if they're different from the |
| 2106 | * hardware default. | 2104 | * hardware default. |
| 2107 | */ | 2105 | */ |
| 2108 | for (i = 1; i < ARRAY_SIZE(wm8904->reg_cache); i++) { | 2106 | for (i = 1; i < codec->driver->reg_cache_size; i++) { |
| 2109 | if (!wm8904_access[i].writable) | 2107 | if (!wm8904_access[i].writable) |
| 2110 | continue; | 2108 | continue; |
| 2111 | 2109 | ||
| 2112 | if (wm8904->reg_cache[i] == wm8904_reg[i]) | 2110 | if (reg_cache[i] == wm8904_reg[i]) |
| 2113 | continue; | 2111 | continue; |
| 2114 | 2112 | ||
| 2115 | snd_soc_write(codec, i, wm8904->reg_cache[i]); | 2113 | snd_soc_write(codec, i, reg_cache[i]); |
| 2116 | } | 2114 | } |
| 2117 | 2115 | ||
| 2118 | codec->cache_sync = 0; | 2116 | codec->cache_sync = 0; |
| @@ -2371,6 +2369,7 @@ static int wm8904_probe(struct snd_soc_codec *codec) | |||
| 2371 | { | 2369 | { |
| 2372 | struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); | 2370 | struct wm8904_priv *wm8904 = snd_soc_codec_get_drvdata(codec); |
| 2373 | struct wm8904_pdata *pdata = wm8904->pdata; | 2371 | struct wm8904_pdata *pdata = wm8904->pdata; |
| 2372 | u16 *reg_cache = codec->reg_cache; | ||
| 2374 | int ret, i; | 2373 | int ret, i; |
| 2375 | 2374 | ||
| 2376 | codec->cache_sync = 1; | 2375 | codec->cache_sync = 1; |
| @@ -2437,19 +2436,19 @@ static int wm8904_probe(struct snd_soc_codec *codec) | |||
| 2437 | } | 2436 | } |
| 2438 | 2437 | ||
| 2439 | /* Change some default settings - latch VU and enable ZC */ | 2438 | /* Change some default settings - latch VU and enable ZC */ |
| 2440 | wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_LEFT] |= WM8904_ADC_VU; | 2439 | reg_cache[WM8904_ADC_DIGITAL_VOLUME_LEFT] |= WM8904_ADC_VU; |
| 2441 | wm8904->reg_cache[WM8904_ADC_DIGITAL_VOLUME_RIGHT] |= WM8904_ADC_VU; | 2440 | reg_cache[WM8904_ADC_DIGITAL_VOLUME_RIGHT] |= WM8904_ADC_VU; |
| 2442 | wm8904->reg_cache[WM8904_DAC_DIGITAL_VOLUME_LEFT] |= WM8904_DAC_VU; | 2441 | reg_cache[WM8904_DAC_DIGITAL_VOLUME_LEFT] |= WM8904_DAC_VU; |
| 2443 | wm8904->reg_cache[WM8904_DAC_DIGITAL_VOLUME_RIGHT] |= WM8904_DAC_VU; | 2442 | reg_cache[WM8904_DAC_DIGITAL_VOLUME_RIGHT] |= WM8904_DAC_VU; |
| 2444 | wm8904->reg_cache[WM8904_ANALOGUE_OUT1_LEFT] |= WM8904_HPOUT_VU | | 2443 | reg_cache[WM8904_ANALOGUE_OUT1_LEFT] |= WM8904_HPOUT_VU | |
| 2445 | WM8904_HPOUTLZC; | 2444 | WM8904_HPOUTLZC; |
| 2446 | wm8904->reg_cache[WM8904_ANALOGUE_OUT1_RIGHT] |= WM8904_HPOUT_VU | | 2445 | reg_cache[WM8904_ANALOGUE_OUT1_RIGHT] |= WM8904_HPOUT_VU | |
| 2447 | WM8904_HPOUTRZC; | 2446 | WM8904_HPOUTRZC; |
| 2448 | wm8904->reg_cache[WM8904_ANALOGUE_OUT2_LEFT] |= WM8904_LINEOUT_VU | | 2447 | reg_cache[WM8904_ANALOGUE_OUT2_LEFT] |= WM8904_LINEOUT_VU | |
| 2449 | WM8904_LINEOUTLZC; | 2448 | WM8904_LINEOUTLZC; |
| 2450 | wm8904->reg_cache[WM8904_ANALOGUE_OUT2_RIGHT] |= WM8904_LINEOUT_VU | | 2449 | reg_cache[WM8904_ANALOGUE_OUT2_RIGHT] |= WM8904_LINEOUT_VU | |
| 2451 | WM8904_LINEOUTRZC; | 2450 | WM8904_LINEOUTRZC; |
| 2452 | wm8904->reg_cache[WM8904_CLOCK_RATES_0] &= ~WM8904_SR_MODE; | 2451 | reg_cache[WM8904_CLOCK_RATES_0] &= ~WM8904_SR_MODE; |
| 2453 | 2452 | ||
| 2454 | /* Apply configuration from the platform data. */ | 2453 | /* Apply configuration from the platform data. */ |
| 2455 | if (wm8904->pdata) { | 2454 | if (wm8904->pdata) { |
| @@ -2457,23 +2456,23 @@ static int wm8904_probe(struct snd_soc_codec *codec) | |||
| 2457 | if (!pdata->gpio_cfg[i]) | 2456 | if (!pdata->gpio_cfg[i]) |
| 2458 | continue; | 2457 | continue; |
| 2459 | 2458 | ||
| 2460 | wm8904->reg_cache[WM8904_GPIO_CONTROL_1 + i] | 2459 | reg_cache[WM8904_GPIO_CONTROL_1 + i] |
| 2461 | = pdata->gpio_cfg[i] & 0xffff; | 2460 | = pdata->gpio_cfg[i] & 0xffff; |
| 2462 | } | 2461 | } |
| 2463 | 2462 | ||
| 2464 | /* Zero is the default value for these anyway */ | 2463 | /* Zero is the default value for these anyway */ |
| 2465 | for (i = 0; i < WM8904_MIC_REGS; i++) | 2464 | for (i = 0; i < WM8904_MIC_REGS; i++) |
| 2466 | wm8904->reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i] | 2465 | reg_cache[WM8904_MIC_BIAS_CONTROL_0 + i] |
| 2467 | = pdata->mic_cfg[i]; | 2466 | = pdata->mic_cfg[i]; |
| 2468 | } | 2467 | } |
| 2469 | 2468 | ||
| 2470 | /* Set Class W by default - this will be managed by the Class | 2469 | /* Set Class W by default - this will be managed by the Class |
| 2471 | * G widget at runtime where bypass paths are available. | 2470 | * G widget at runtime where bypass paths are available. |
| 2472 | */ | 2471 | */ |
| 2473 | wm8904->reg_cache[WM8904_CLASS_W_0] |= WM8904_CP_DYN_PWR; | 2472 | reg_cache[WM8904_CLASS_W_0] |= WM8904_CP_DYN_PWR; |
| 2474 | 2473 | ||
| 2475 | /* Use normal bias source */ | 2474 | /* Use normal bias source */ |
| 2476 | wm8904->reg_cache[WM8904_BIAS_CONTROL_0] &= ~WM8904_POBCTRL; | 2475 | reg_cache[WM8904_BIAS_CONTROL_0] &= ~WM8904_POBCTRL; |
| 2477 | 2476 | ||
| 2478 | wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 2477 | wm8904_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 2479 | 2478 | ||
diff --git a/sound/soc/codecs/wm8940.c b/sound/soc/codecs/wm8940.c index 2cb16f895c46..23086e2c976a 100644 --- a/sound/soc/codecs/wm8940.c +++ b/sound/soc/codecs/wm8940.c | |||
| @@ -768,6 +768,7 @@ static __devinit int wm8940_i2c_probe(struct i2c_client *i2c, | |||
| 768 | 768 | ||
| 769 | i2c_set_clientdata(i2c, wm8940); | 769 | i2c_set_clientdata(i2c, wm8940); |
| 770 | wm8940->control_data = i2c; | 770 | wm8940->control_data = i2c; |
| 771 | wm8940->control_type = SND_SOC_I2C; | ||
| 771 | 772 | ||
| 772 | ret = snd_soc_register_codec(&i2c->dev, | 773 | ret = snd_soc_register_codec(&i2c->dev, |
| 773 | &soc_codec_dev_wm8940, &wm8940_dai, 1); | 774 | &soc_codec_dev_wm8940, &wm8940_dai, 1); |
diff --git a/sound/soc/codecs/wm8955.c b/sound/soc/codecs/wm8955.c index 9cbab8e1de01..2ac35b0be86a 100644 --- a/sound/soc/codecs/wm8955.c +++ b/sound/soc/codecs/wm8955.c | |||
| @@ -42,8 +42,6 @@ static const char *wm8955_supply_names[WM8955_NUM_SUPPLIES] = { | |||
| 42 | struct wm8955_priv { | 42 | struct wm8955_priv { |
| 43 | enum snd_soc_control_type control_type; | 43 | enum snd_soc_control_type control_type; |
| 44 | 44 | ||
| 45 | u16 reg_cache[WM8955_MAX_REGISTER + 1]; | ||
| 46 | |||
| 47 | unsigned int mclk_rate; | 45 | unsigned int mclk_rate; |
| 48 | 46 | ||
| 49 | int deemph; | 47 | int deemph; |
| @@ -768,6 +766,7 @@ static int wm8955_set_bias_level(struct snd_soc_codec *codec, | |||
| 768 | enum snd_soc_bias_level level) | 766 | enum snd_soc_bias_level level) |
| 769 | { | 767 | { |
| 770 | struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); | 768 | struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); |
| 769 | u16 *reg_cache = codec->reg_cache; | ||
| 771 | int ret, i; | 770 | int ret, i; |
| 772 | 771 | ||
| 773 | switch (level) { | 772 | switch (level) { |
| @@ -800,14 +799,14 @@ static int wm8955_set_bias_level(struct snd_soc_codec *codec, | |||
| 800 | /* Sync back cached values if they're | 799 | /* Sync back cached values if they're |
| 801 | * different from the hardware default. | 800 | * different from the hardware default. |
| 802 | */ | 801 | */ |
| 803 | for (i = 0; i < ARRAY_SIZE(wm8955->reg_cache); i++) { | 802 | for (i = 0; i < codec->driver->reg_cache_size; i++) { |
| 804 | if (i == WM8955_RESET) | 803 | if (i == WM8955_RESET) |
| 805 | continue; | 804 | continue; |
| 806 | 805 | ||
| 807 | if (wm8955->reg_cache[i] == wm8955_reg[i]) | 806 | if (reg_cache[i] == wm8955_reg[i]) |
| 808 | continue; | 807 | continue; |
| 809 | 808 | ||
| 810 | snd_soc_write(codec, i, wm8955->reg_cache[i]); | 809 | snd_soc_write(codec, i, reg_cache[i]); |
| 811 | } | 810 | } |
| 812 | 811 | ||
| 813 | /* Enable VREF and VMID */ | 812 | /* Enable VREF and VMID */ |
| @@ -902,6 +901,7 @@ static int wm8955_probe(struct snd_soc_codec *codec) | |||
| 902 | { | 901 | { |
| 903 | struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); | 902 | struct wm8955_priv *wm8955 = snd_soc_codec_get_drvdata(codec); |
| 904 | struct wm8955_pdata *pdata = dev_get_platdata(codec->dev); | 903 | struct wm8955_pdata *pdata = dev_get_platdata(codec->dev); |
| 904 | u16 *reg_cache = codec->reg_cache; | ||
| 905 | int ret, i; | 905 | int ret, i; |
| 906 | 906 | ||
| 907 | ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type); | 907 | ret = snd_soc_codec_set_cache_io(codec, 7, 9, wm8955->control_type); |
| @@ -934,25 +934,25 @@ static int wm8955_probe(struct snd_soc_codec *codec) | |||
| 934 | } | 934 | } |
| 935 | 935 | ||
| 936 | /* Change some default settings - latch VU and enable ZC */ | 936 | /* Change some default settings - latch VU and enable ZC */ |
| 937 | wm8955->reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU; | 937 | reg_cache[WM8955_LEFT_DAC_VOLUME] |= WM8955_LDVU; |
| 938 | wm8955->reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU; | 938 | reg_cache[WM8955_RIGHT_DAC_VOLUME] |= WM8955_RDVU; |
| 939 | wm8955->reg_cache[WM8955_LOUT1_VOLUME] |= WM8955_LO1VU | WM8955_LO1ZC; | 939 | reg_cache[WM8955_LOUT1_VOLUME] |= WM8955_LO1VU | WM8955_LO1ZC; |
| 940 | wm8955->reg_cache[WM8955_ROUT1_VOLUME] |= WM8955_RO1VU | WM8955_RO1ZC; | 940 | reg_cache[WM8955_ROUT1_VOLUME] |= WM8955_RO1VU | WM8955_RO1ZC; |
| 941 | wm8955->reg_cache[WM8955_LOUT2_VOLUME] |= WM8955_LO2VU | WM8955_LO2ZC; | 941 | reg_cache[WM8955_LOUT2_VOLUME] |= WM8955_LO2VU | WM8955_LO2ZC; |
| 942 | wm8955->reg_cache[WM8955_ROUT2_VOLUME] |= WM8955_RO2VU | WM8955_RO2ZC; | 942 | reg_cache[WM8955_ROUT2_VOLUME] |= WM8955_RO2VU | WM8955_RO2ZC; |
| 943 | wm8955->reg_cache[WM8955_MONOOUT_VOLUME] |= WM8955_MOZC; | 943 | reg_cache[WM8955_MONOOUT_VOLUME] |= WM8955_MOZC; |
| 944 | 944 | ||
| 945 | /* Also enable adaptive bass boost by default */ | 945 | /* Also enable adaptive bass boost by default */ |
| 946 | wm8955->reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB; | 946 | reg_cache[WM8955_BASS_CONTROL] |= WM8955_BB; |
| 947 | 947 | ||
| 948 | /* Set platform data values */ | 948 | /* Set platform data values */ |
| 949 | if (pdata) { | 949 | if (pdata) { |
| 950 | if (pdata->out2_speaker) | 950 | if (pdata->out2_speaker) |
| 951 | wm8955->reg_cache[WM8955_ADDITIONAL_CONTROL_2] | 951 | reg_cache[WM8955_ADDITIONAL_CONTROL_2] |
| 952 | |= WM8955_ROUT2INV; | 952 | |= WM8955_ROUT2INV; |
| 953 | 953 | ||
| 954 | if (pdata->monoin_diff) | 954 | if (pdata->monoin_diff) |
| 955 | wm8955->reg_cache[WM8955_MONO_OUT_MIX_1] | 955 | reg_cache[WM8955_MONO_OUT_MIX_1] |
| 956 | |= WM8955_DMEN; | 956 | |= WM8955_DMEN; |
| 957 | } | 957 | } |
| 958 | 958 | ||
| @@ -1003,6 +1003,7 @@ static __devinit int wm8955_i2c_probe(struct i2c_client *i2c, | |||
| 1003 | return -ENOMEM; | 1003 | return -ENOMEM; |
| 1004 | 1004 | ||
| 1005 | i2c_set_clientdata(i2c, wm8955); | 1005 | i2c_set_clientdata(i2c, wm8955); |
| 1006 | wm8955->control_type = SND_SOC_I2C; | ||
| 1006 | 1007 | ||
| 1007 | ret = snd_soc_register_codec(&i2c->dev, | 1008 | ret = snd_soc_register_codec(&i2c->dev, |
| 1008 | &soc_codec_dev_wm8955, &wm8955_dai, 1); | 1009 | &soc_codec_dev_wm8955, &wm8955_dai, 1); |
diff --git a/sound/soc/codecs/wm8960.c b/sound/soc/codecs/wm8960.c index 21986c42272f..ff6ff2f529d2 100644 --- a/sound/soc/codecs/wm8960.c +++ b/sound/soc/codecs/wm8960.c | |||
| @@ -1013,6 +1013,7 @@ static __devinit int wm8960_i2c_probe(struct i2c_client *i2c, | |||
| 1013 | return -ENOMEM; | 1013 | return -ENOMEM; |
| 1014 | 1014 | ||
| 1015 | i2c_set_clientdata(i2c, wm8960); | 1015 | i2c_set_clientdata(i2c, wm8960); |
| 1016 | wm8960->control_type = SND_SOC_I2C; | ||
| 1016 | wm8960->control_data = i2c; | 1017 | wm8960->control_data = i2c; |
| 1017 | 1018 | ||
| 1018 | ret = snd_soc_register_codec(&i2c->dev, | 1019 | ret = snd_soc_register_codec(&i2c->dev, |
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 1304ca91a11c..7c421cc837bd 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -52,8 +52,6 @@ static const char *wm8962_supply_names[WM8962_NUM_SUPPLIES] = { | |||
| 52 | struct wm8962_priv { | 52 | struct wm8962_priv { |
| 53 | struct snd_soc_codec *codec; | 53 | struct snd_soc_codec *codec; |
| 54 | 54 | ||
| 55 | u16 reg_cache[WM8962_MAX_REGISTER + 1]; | ||
| 56 | |||
| 57 | int sysclk; | 55 | int sysclk; |
| 58 | int sysclk_rate; | 56 | int sysclk_rate; |
| 59 | 57 | ||
| @@ -1991,8 +1989,7 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | |||
| 1991 | struct snd_ctl_elem_value *ucontrol) | 1989 | struct snd_ctl_elem_value *ucontrol) |
| 1992 | { | 1990 | { |
| 1993 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 1991 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 1994 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 1992 | u16 *reg_cache = codec->reg_cache; |
| 1995 | u16 *reg_cache = wm8962->reg_cache; | ||
| 1996 | int ret; | 1993 | int ret; |
| 1997 | 1994 | ||
| 1998 | /* Apply the update (if any) */ | 1995 | /* Apply the update (if any) */ |
| @@ -2020,8 +2017,7 @@ static int wm8962_put_spk_sw(struct snd_kcontrol *kcontrol, | |||
| 2020 | struct snd_ctl_elem_value *ucontrol) | 2017 | struct snd_ctl_elem_value *ucontrol) |
| 2021 | { | 2018 | { |
| 2022 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 2019 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 2023 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 2020 | u16 *reg_cache = codec->reg_cache; |
| 2024 | u16 *reg_cache = wm8962->reg_cache; | ||
| 2025 | int ret; | 2021 | int ret; |
| 2026 | 2022 | ||
| 2027 | /* Apply the update (if any) */ | 2023 | /* Apply the update (if any) */ |
| @@ -2329,8 +2325,7 @@ static int out_pga_event(struct snd_soc_dapm_widget *w, | |||
| 2329 | struct snd_kcontrol *kcontrol, int event) | 2325 | struct snd_kcontrol *kcontrol, int event) |
| 2330 | { | 2326 | { |
| 2331 | struct snd_soc_codec *codec = w->codec; | 2327 | struct snd_soc_codec *codec = w->codec; |
| 2332 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 2328 | u16 *reg_cache = codec->reg_cache; |
| 2333 | u16 *reg_cache = wm8962->reg_cache; | ||
| 2334 | int reg; | 2329 | int reg; |
| 2335 | 2330 | ||
| 2336 | switch (w->shift) { | 2331 | switch (w->shift) { |
| @@ -2719,7 +2714,7 @@ static int wm8962_add_widgets(struct snd_soc_codec *codec) | |||
| 2719 | 2714 | ||
| 2720 | static void wm8962_sync_cache(struct snd_soc_codec *codec) | 2715 | static void wm8962_sync_cache(struct snd_soc_codec *codec) |
| 2721 | { | 2716 | { |
| 2722 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 2717 | u16 *reg_cache = codec->reg_cache; |
| 2723 | int i; | 2718 | int i; |
| 2724 | 2719 | ||
| 2725 | if (!codec->cache_sync) | 2720 | if (!codec->cache_sync) |
| @@ -2732,13 +2727,13 @@ static void wm8962_sync_cache(struct snd_soc_codec *codec) | |||
| 2732 | /* Sync back cached values if they're different from the | 2727 | /* Sync back cached values if they're different from the |
| 2733 | * hardware default. | 2728 | * hardware default. |
| 2734 | */ | 2729 | */ |
| 2735 | for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) { | 2730 | for (i = 1; i < codec->driver->reg_cache_size; i++) { |
| 2736 | if (i == WM8962_SOFTWARE_RESET) | 2731 | if (i == WM8962_SOFTWARE_RESET) |
| 2737 | continue; | 2732 | continue; |
| 2738 | if (wm8962->reg_cache[i] == wm8962_reg[i]) | 2733 | if (reg_cache[i] == wm8962_reg[i]) |
| 2739 | continue; | 2734 | continue; |
| 2740 | 2735 | ||
| 2741 | snd_soc_write(codec, i, wm8962->reg_cache[i]); | 2736 | snd_soc_write(codec, i, reg_cache[i]); |
| 2742 | } | 2737 | } |
| 2743 | 2738 | ||
| 2744 | codec->cache_sync = 0; | 2739 | codec->cache_sync = 0; |
| @@ -3406,12 +3401,11 @@ EXPORT_SYMBOL_GPL(wm8962_mic_detect); | |||
| 3406 | #ifdef CONFIG_PM | 3401 | #ifdef CONFIG_PM |
| 3407 | static int wm8962_resume(struct snd_soc_codec *codec) | 3402 | static int wm8962_resume(struct snd_soc_codec *codec) |
| 3408 | { | 3403 | { |
| 3409 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | ||
| 3410 | u16 *reg_cache = codec->reg_cache; | 3404 | u16 *reg_cache = codec->reg_cache; |
| 3411 | int i; | 3405 | int i; |
| 3412 | 3406 | ||
| 3413 | /* Restore the registers */ | 3407 | /* Restore the registers */ |
| 3414 | for (i = 1; i < ARRAY_SIZE(wm8962->reg_cache); i++) { | 3408 | for (i = 1; i < codec->driver->reg_cache_size; i++) { |
| 3415 | switch (i) { | 3409 | switch (i) { |
| 3416 | case WM8962_SOFTWARE_RESET: | 3410 | case WM8962_SOFTWARE_RESET: |
| 3417 | continue; | 3411 | continue; |
| @@ -3705,6 +3699,7 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 3705 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); | 3699 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); |
| 3706 | struct i2c_client *i2c = container_of(codec->dev, struct i2c_client, | 3700 | struct i2c_client *i2c = container_of(codec->dev, struct i2c_client, |
| 3707 | dev); | 3701 | dev); |
| 3702 | u16 *reg_cache = codec->reg_cache; | ||
| 3708 | int i, trigger, irq_pol; | 3703 | int i, trigger, irq_pol; |
| 3709 | 3704 | ||
| 3710 | wm8962->codec = codec; | 3705 | wm8962->codec = codec; |
| @@ -3804,7 +3799,7 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 3804 | 3799 | ||
| 3805 | /* Put the speakers into mono mode? */ | 3800 | /* Put the speakers into mono mode? */ |
| 3806 | if (pdata->spk_mono) | 3801 | if (pdata->spk_mono) |
| 3807 | wm8962->reg_cache[WM8962_CLASS_D_CONTROL_2] | 3802 | reg_cache[WM8962_CLASS_D_CONTROL_2] |
| 3808 | |= WM8962_SPK_MONO; | 3803 | |= WM8962_SPK_MONO; |
| 3809 | 3804 | ||
| 3810 | /* Micbias setup, detection enable and detection | 3805 | /* Micbias setup, detection enable and detection |
| @@ -3819,16 +3814,16 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 3819 | } | 3814 | } |
| 3820 | 3815 | ||
| 3821 | /* Latch volume update bits */ | 3816 | /* Latch volume update bits */ |
| 3822 | wm8962->reg_cache[WM8962_LEFT_INPUT_VOLUME] |= WM8962_IN_VU; | 3817 | reg_cache[WM8962_LEFT_INPUT_VOLUME] |= WM8962_IN_VU; |
| 3823 | wm8962->reg_cache[WM8962_RIGHT_INPUT_VOLUME] |= WM8962_IN_VU; | 3818 | reg_cache[WM8962_RIGHT_INPUT_VOLUME] |= WM8962_IN_VU; |
| 3824 | wm8962->reg_cache[WM8962_LEFT_ADC_VOLUME] |= WM8962_ADC_VU; | 3819 | reg_cache[WM8962_LEFT_ADC_VOLUME] |= WM8962_ADC_VU; |
| 3825 | wm8962->reg_cache[WM8962_RIGHT_ADC_VOLUME] |= WM8962_ADC_VU; | 3820 | reg_cache[WM8962_RIGHT_ADC_VOLUME] |= WM8962_ADC_VU; |
| 3826 | wm8962->reg_cache[WM8962_LEFT_DAC_VOLUME] |= WM8962_DAC_VU; | 3821 | reg_cache[WM8962_LEFT_DAC_VOLUME] |= WM8962_DAC_VU; |
| 3827 | wm8962->reg_cache[WM8962_RIGHT_DAC_VOLUME] |= WM8962_DAC_VU; | 3822 | reg_cache[WM8962_RIGHT_DAC_VOLUME] |= WM8962_DAC_VU; |
| 3828 | wm8962->reg_cache[WM8962_SPKOUTL_VOLUME] |= WM8962_SPKOUT_VU; | 3823 | reg_cache[WM8962_SPKOUTL_VOLUME] |= WM8962_SPKOUT_VU; |
| 3829 | wm8962->reg_cache[WM8962_SPKOUTR_VOLUME] |= WM8962_SPKOUT_VU; | 3824 | reg_cache[WM8962_SPKOUTR_VOLUME] |= WM8962_SPKOUT_VU; |
| 3830 | wm8962->reg_cache[WM8962_HPOUTL_VOLUME] |= WM8962_HPOUT_VU; | 3825 | reg_cache[WM8962_HPOUTL_VOLUME] |= WM8962_HPOUT_VU; |
| 3831 | wm8962->reg_cache[WM8962_HPOUTR_VOLUME] |= WM8962_HPOUT_VU; | 3826 | reg_cache[WM8962_HPOUTR_VOLUME] |= WM8962_HPOUT_VU; |
| 3832 | 3827 | ||
| 3833 | wm8962_add_widgets(codec); | 3828 | wm8962_add_widgets(codec); |
| 3834 | 3829 | ||
diff --git a/sound/soc/codecs/wm8971.c b/sound/soc/codecs/wm8971.c index 63f6dbf5d070..9f18db6e167c 100644 --- a/sound/soc/codecs/wm8971.c +++ b/sound/soc/codecs/wm8971.c | |||
| @@ -718,6 +718,7 @@ static __devinit int wm8971_i2c_probe(struct i2c_client *i2c, | |||
| 718 | if (wm8971 == NULL) | 718 | if (wm8971 == NULL) |
| 719 | return -ENOMEM; | 719 | return -ENOMEM; |
| 720 | 720 | ||
| 721 | wm8971->control_type = SND_SOC_I2C; | ||
| 721 | i2c_set_clientdata(i2c, wm8971); | 722 | i2c_set_clientdata(i2c, wm8971); |
| 722 | 723 | ||
| 723 | ret = snd_soc_register_codec(&i2c->dev, | 724 | ret = snd_soc_register_codec(&i2c->dev, |
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c index ecc7c37180c7..a486670966bd 100644 --- a/sound/soc/codecs/wm9081.c +++ b/sound/soc/codecs/wm9081.c | |||
| @@ -1335,6 +1335,7 @@ static __devinit int wm9081_i2c_probe(struct i2c_client *i2c, | |||
| 1335 | return -ENOMEM; | 1335 | return -ENOMEM; |
| 1336 | 1336 | ||
| 1337 | i2c_set_clientdata(i2c, wm9081); | 1337 | i2c_set_clientdata(i2c, wm9081); |
| 1338 | wm9081->control_type = SND_SOC_I2C; | ||
| 1338 | wm9081->control_data = i2c; | 1339 | wm9081->control_data = i2c; |
| 1339 | 1340 | ||
| 1340 | ret = snd_soc_register_codec(&i2c->dev, | 1341 | ret = snd_soc_register_codec(&i2c->dev, |
diff --git a/sound/soc/codecs/wm9090.c b/sound/soc/codecs/wm9090.c index 99c046ba46bb..6e5f64f627cb 100644 --- a/sound/soc/codecs/wm9090.c +++ b/sound/soc/codecs/wm9090.c | |||
| @@ -141,7 +141,6 @@ static const u16 wm9090_reg_defaults[] = { | |||
| 141 | /* This struct is used to save the context */ | 141 | /* This struct is used to save the context */ |
| 142 | struct wm9090_priv { | 142 | struct wm9090_priv { |
| 143 | struct mutex mutex; | 143 | struct mutex mutex; |
| 144 | u16 reg_cache[WM9090_MAX_REGISTER + 1]; | ||
| 145 | struct wm9090_platform_data pdata; | 144 | struct wm9090_platform_data pdata; |
| 146 | void *control_data; | 145 | void *control_data; |
| 147 | }; | 146 | }; |
| @@ -552,6 +551,7 @@ static int wm9090_set_bias_level(struct snd_soc_codec *codec, | |||
| 552 | static int wm9090_probe(struct snd_soc_codec *codec) | 551 | static int wm9090_probe(struct snd_soc_codec *codec) |
| 553 | { | 552 | { |
| 554 | struct wm9090_priv *wm9090 = snd_soc_codec_get_drvdata(codec); | 553 | struct wm9090_priv *wm9090 = snd_soc_codec_get_drvdata(codec); |
| 554 | u16 *reg_cache = codec->reg_cache; | ||
| 555 | int ret; | 555 | int ret; |
| 556 | 556 | ||
| 557 | codec->control_data = wm9090->control_data; | 557 | codec->control_data = wm9090->control_data; |
| @@ -576,22 +576,22 @@ static int wm9090_probe(struct snd_soc_codec *codec) | |||
| 576 | /* Configure some defaults; they will be written out when we | 576 | /* Configure some defaults; they will be written out when we |
| 577 | * bring the bias up. | 577 | * bring the bias up. |
| 578 | */ | 578 | */ |
| 579 | wm9090->reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU | 579 | reg_cache[WM9090_IN1_LINE_INPUT_A_VOLUME] |= WM9090_IN1_VU |
| 580 | | WM9090_IN1A_ZC; | 580 | | WM9090_IN1A_ZC; |
| 581 | wm9090->reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU | 581 | reg_cache[WM9090_IN1_LINE_INPUT_B_VOLUME] |= WM9090_IN1_VU |
| 582 | | WM9090_IN1B_ZC; | 582 | | WM9090_IN1B_ZC; |
| 583 | wm9090->reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU | 583 | reg_cache[WM9090_IN2_LINE_INPUT_A_VOLUME] |= WM9090_IN2_VU |
| 584 | | WM9090_IN2A_ZC; | 584 | | WM9090_IN2A_ZC; |
| 585 | wm9090->reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU | 585 | reg_cache[WM9090_IN2_LINE_INPUT_B_VOLUME] |= WM9090_IN2_VU |
| 586 | | WM9090_IN2B_ZC; | 586 | | WM9090_IN2B_ZC; |
| 587 | wm9090->reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |= | 587 | reg_cache[WM9090_SPEAKER_VOLUME_LEFT] |= |
| 588 | WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC; | 588 | WM9090_SPKOUT_VU | WM9090_SPKOUTL_ZC; |
| 589 | wm9090->reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |= | 589 | reg_cache[WM9090_LEFT_OUTPUT_VOLUME] |= |
| 590 | WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC; | 590 | WM9090_HPOUT1_VU | WM9090_HPOUT1L_ZC; |
| 591 | wm9090->reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |= | 591 | reg_cache[WM9090_RIGHT_OUTPUT_VOLUME] |= |
| 592 | WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC; | 592 | WM9090_HPOUT1_VU | WM9090_HPOUT1R_ZC; |
| 593 | 593 | ||
| 594 | wm9090->reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA; | 594 | reg_cache[WM9090_CLOCKING_1] |= WM9090_TOCLK_ENA; |
| 595 | 595 | ||
| 596 | wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY); | 596 | wm9090_set_bias_level(codec, SND_SOC_BIAS_STANDBY); |
| 597 | 597 | ||
