Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge remote-tracking branches 'asoc/topic/wm0010', 'asoc/topic/wm5100', 'asoc/topic/wm5110', 'asoc/topic/wm8004' and 'asoc/topic/wm8731' into asoc-next

+379 -57
+15 -1
drivers/mfd/wm5110-tables.c
··· 249 249 { 0x80, 0x0 }, 250 250 }; 251 251 252 + /* Add extra headphone write sequence locations */ 253 + static const struct reg_default wm5110_reve_patch[] = { 254 + { 0x80, 0x3 }, 255 + { 0x80, 0x3 }, 256 + { 0x4b, 0x138 }, 257 + { 0x4c, 0x13d }, 258 + { 0x80, 0x0 }, 259 + { 0x80, 0x0 }, 260 + }; 261 + 252 262 /* We use a function so we can use ARRAY_SIZE() */ 253 263 int wm5110_patch(struct arizona *arizona) 254 264 { ··· 276 266 wm5110_revd_patch, 277 267 ARRAY_SIZE(wm5110_revd_patch)); 278 268 default: 279 - return 0; 269 + return regmap_register_patch(arizona->regmap, 270 + wm5110_reve_patch, 271 + ARRAY_SIZE(wm5110_reve_patch)); 280 272 } 281 273 } 282 274 EXPORT_SYMBOL_GPL(wm5110_patch); ··· 688 676 { 0x00000032, 0x0100 }, /* R50 - PWM Drive 3 */ 689 677 { 0x00000040, 0x0000 }, /* R64 - Wake control */ 690 678 { 0x00000041, 0x0000 }, /* R65 - Sequence control */ 679 + { 0x00000042, 0x0000 }, /* R66 - Spare Triggers */ 691 680 { 0x00000061, 0x01FF }, /* R97 - Sample Rate Sequence Select 1 */ 692 681 { 0x00000062, 0x01FF }, /* R98 - Sample Rate Sequence Select 2 */ 693 682 { 0x00000063, 0x01FF }, /* R99 - Sample Rate Sequence Select 3 */ ··· 1729 1716 case ARIZONA_PWM_DRIVE_3: 1730 1717 case ARIZONA_WAKE_CONTROL: 1731 1718 case ARIZONA_SEQUENCE_CONTROL: 1719 + case ARIZONA_SPARE_TRIGGERS: 1732 1720 case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_1: 1733 1721 case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_2: 1734 1722 case ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_3:
+37
include/linux/mfd/arizona/registers.h
··· 39 39 #define ARIZONA_PWM_DRIVE_3 0x32 40 40 #define ARIZONA_WAKE_CONTROL 0x40 41 41 #define ARIZONA_SEQUENCE_CONTROL 0x41 42 + #define ARIZONA_SPARE_TRIGGERS 0x42 42 43 #define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_1 0x61 43 44 #define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_2 0x62 44 45 #define ARIZONA_SAMPLE_RATE_SEQUENCE_SELECT_3 0x63 ··· 1430 1429 #define ARIZONA_WSEQ_ENA_JD2_RISE_MASK 0x0001 /* WSEQ_ENA_JD2_RISE */ 1431 1430 #define ARIZONA_WSEQ_ENA_JD2_RISE_SHIFT 0 /* WSEQ_ENA_JD2_RISE */ 1432 1431 #define ARIZONA_WSEQ_ENA_JD2_RISE_WIDTH 1 /* WSEQ_ENA_JD2_RISE */ 1432 + 1433 + /* 1434 + * R66 (0x42) - Spare Triggers 1435 + */ 1436 + #define ARIZONA_WS_TRG8 0x0080 /* WS_TRG8 */ 1437 + #define ARIZONA_WS_TRG8_MASK 0x0080 /* WS_TRG8 */ 1438 + #define ARIZONA_WS_TRG8_SHIFT 7 /* WS_TRG8 */ 1439 + #define ARIZONA_WS_TRG8_WIDTH 1 /* WS_TRG8 */ 1440 + #define ARIZONA_WS_TRG7 0x0040 /* WS_TRG7 */ 1441 + #define ARIZONA_WS_TRG7_MASK 0x0040 /* WS_TRG7 */ 1442 + #define ARIZONA_WS_TRG7_SHIFT 6 /* WS_TRG7 */ 1443 + #define ARIZONA_WS_TRG7_WIDTH 1 /* WS_TRG7 */ 1444 + #define ARIZONA_WS_TRG6 0x0020 /* WS_TRG6 */ 1445 + #define ARIZONA_WS_TRG6_MASK 0x0020 /* WS_TRG6 */ 1446 + #define ARIZONA_WS_TRG6_SHIFT 5 /* WS_TRG6 */ 1447 + #define ARIZONA_WS_TRG6_WIDTH 1 /* WS_TRG6 */ 1448 + #define ARIZONA_WS_TRG5 0x0010 /* WS_TRG5 */ 1449 + #define ARIZONA_WS_TRG5_MASK 0x0010 /* WS_TRG5 */ 1450 + #define ARIZONA_WS_TRG5_SHIFT 4 /* WS_TRG5 */ 1451 + #define ARIZONA_WS_TRG5_WIDTH 1 /* WS_TRG5 */ 1452 + #define ARIZONA_WS_TRG4 0x0008 /* WS_TRG4 */ 1453 + #define ARIZONA_WS_TRG4_MASK 0x0008 /* WS_TRG4 */ 1454 + #define ARIZONA_WS_TRG4_SHIFT 3 /* WS_TRG4 */ 1455 + #define ARIZONA_WS_TRG4_WIDTH 1 /* WS_TRG4 */ 1456 + #define ARIZONA_WS_TRG3 0x0004 /* WS_TRG3 */ 1457 + #define ARIZONA_WS_TRG3_MASK 0x0004 /* WS_TRG3 */ 1458 + #define ARIZONA_WS_TRG3_SHIFT 2 /* WS_TRG3 */ 1459 + #define ARIZONA_WS_TRG3_WIDTH 1 /* WS_TRG3 */ 1460 + #define ARIZONA_WS_TRG2 0x0002 /* WS_TRG2 */ 1461 + #define ARIZONA_WS_TRG2_MASK 0x0002 /* WS_TRG2 */ 1462 + #define ARIZONA_WS_TRG2_SHIFT 1 /* WS_TRG2 */ 1463 + #define ARIZONA_WS_TRG2_WIDTH 1 /* WS_TRG2 */ 1464 + #define ARIZONA_WS_TRG1 0x0001 /* WS_TRG1 */ 1465 + #define ARIZONA_WS_TRG1_MASK 0x0001 /* WS_TRG1 */ 1466 + #define ARIZONA_WS_TRG1_SHIFT 0 /* WS_TRG1 */ 1467 + #define ARIZONA_WS_TRG1_WIDTH 1 /* WS_TRG1 */ 1433 1468 1434 1469 /* 1435 1470 * R97 (0x61) - Sample Rate Sequence Select 1
+1 -2
sound/soc/codecs/wm0010.c
··· 953 953 trigger = IRQF_TRIGGER_FALLING; 954 954 trigger |= IRQF_ONESHOT; 955 955 956 - ret = request_threaded_irq(irq, NULL, wm0010_irq, trigger | IRQF_ONESHOT, 956 + ret = request_threaded_irq(irq, NULL, wm0010_irq, trigger, 957 957 "wm0010", wm0010); 958 958 if (ret) { 959 959 dev_err(wm0010->dev, "Failed to request IRQ %d: %d\n", ··· 1003 1003 static struct spi_driver wm0010_spi_driver = { 1004 1004 .driver = { 1005 1005 .name = "wm0010", 1006 - .bus = &spi_bus_type, 1007 1006 .owner = THIS_MODULE, 1008 1007 }, 1009 1008 .probe = wm0010_spi_probe,
+2 -4
sound/soc/codecs/wm5100.c
··· 2570 2570 2571 2571 if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) 2572 2572 ret = request_threaded_irq(i2c->irq, NULL, 2573 - wm5100_edge_irq, 2574 - irq_flags | IRQF_ONESHOT, 2573 + wm5100_edge_irq, irq_flags, 2575 2574 "wm5100", wm5100); 2576 2575 else 2577 2576 ret = request_threaded_irq(i2c->irq, NULL, wm5100_irq, 2578 - irq_flags | IRQF_ONESHOT, 2579 - "wm5100", 2577 + irq_flags, "wm5100", 2580 2578 wm5100); 2581 2579 2582 2580 if (ret != 0) {
+276 -9
sound/soc/codecs/wm5110.c
··· 131 131 { 0x33fb, 0xfe00 }, 132 132 }; 133 133 134 + static const struct reg_default wm5110_sysclk_reve_patch[] = { 135 + { 0x3270, 0xE410 }, 136 + { 0x3271, 0x3078 }, 137 + { 0x3272, 0xE410 }, 138 + { 0x3273, 0x3070 }, 139 + { 0x3274, 0xE410 }, 140 + { 0x3275, 0x3066 }, 141 + { 0x3276, 0xE410 }, 142 + { 0x3277, 0x3056 }, 143 + { 0x327A, 0xE414 }, 144 + { 0x327B, 0x3078 }, 145 + { 0x327C, 0xE414 }, 146 + { 0x327D, 0x3070 }, 147 + { 0x327E, 0xE414 }, 148 + { 0x327F, 0x3066 }, 149 + { 0x3280, 0xE414 }, 150 + { 0x3281, 0x3056 }, 151 + }; 152 + 134 153 static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w, 135 154 struct snd_kcontrol *kcontrol, int event) 136 155 { ··· 165 146 patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch); 166 147 break; 167 148 default: 168 - return 0; 149 + patch = wm5110_sysclk_reve_patch; 150 + patch_size = ARRAY_SIZE(wm5110_sysclk_reve_patch); 151 + break; 169 152 } 170 153 171 154 switch (event) { ··· 183 162 } 184 163 185 164 return 0; 165 + } 166 + 167 + static const struct reg_sequence wm5110_no_dre_left_enable[] = { 168 + { 0x3024, 0xE410 }, 169 + { 0x3025, 0x0056 }, 170 + { 0x301B, 0x0224 }, 171 + { 0x301F, 0x4263 }, 172 + { 0x3021, 0x5291 }, 173 + { 0x3030, 0xE410 }, 174 + { 0x3031, 0x3066 }, 175 + { 0x3032, 0xE410 }, 176 + { 0x3033, 0x3070 }, 177 + { 0x3034, 0xE410 }, 178 + { 0x3035, 0x3078 }, 179 + { 0x3036, 0xE410 }, 180 + { 0x3037, 0x3080 }, 181 + { 0x3038, 0xE410 }, 182 + { 0x3039, 0x3080 }, 183 + }; 184 + 185 + static const struct reg_sequence wm5110_dre_left_enable[] = { 186 + { 0x3024, 0x0231 }, 187 + { 0x3025, 0x0B00 }, 188 + { 0x301B, 0x0227 }, 189 + { 0x301F, 0x4266 }, 190 + { 0x3021, 0x5294 }, 191 + { 0x3030, 0xE231 }, 192 + { 0x3031, 0x0266 }, 193 + { 0x3032, 0x8231 }, 194 + { 0x3033, 0x4B15 }, 195 + { 0x3034, 0x8231 }, 196 + { 0x3035, 0x0B15 }, 197 + { 0x3036, 0xE231 }, 198 + { 0x3037, 0x5294 }, 199 + { 0x3038, 0x0231 }, 200 + { 0x3039, 0x0B00 }, 201 + }; 202 + 203 + static const struct reg_sequence wm5110_no_dre_right_enable[] = { 204 + { 0x3074, 0xE414 }, 205 + { 0x3075, 0x0056 }, 206 + { 0x306B, 0x0224 }, 207 + { 0x306F, 0x4263 }, 208 + { 0x3071, 0x5291 }, 209 + { 0x3080, 0xE414 }, 210 + { 0x3081, 0x3066 }, 211 + { 0x3082, 0xE414 }, 212 + { 0x3083, 0x3070 }, 213 + { 0x3084, 0xE414 }, 214 + { 0x3085, 0x3078 }, 215 + { 0x3086, 0xE414 }, 216 + { 0x3087, 0x3080 }, 217 + { 0x3088, 0xE414 }, 218 + { 0x3089, 0x3080 }, 219 + }; 220 + 221 + static const struct reg_sequence wm5110_dre_right_enable[] = { 222 + { 0x3074, 0x0231 }, 223 + { 0x3075, 0x0B00 }, 224 + { 0x306B, 0x0227 }, 225 + { 0x306F, 0x4266 }, 226 + { 0x3071, 0x5294 }, 227 + { 0x3080, 0xE231 }, 228 + { 0x3081, 0x0266 }, 229 + { 0x3082, 0x8231 }, 230 + { 0x3083, 0x4B17 }, 231 + { 0x3084, 0x8231 }, 232 + { 0x3085, 0x0B17 }, 233 + { 0x3086, 0xE231 }, 234 + { 0x3087, 0x5294 }, 235 + { 0x3088, 0x0231 }, 236 + { 0x3089, 0x0B00 }, 237 + }; 238 + 239 + static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w) 240 + { 241 + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 242 + struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); 243 + struct arizona *arizona = priv->arizona; 244 + unsigned int val = snd_soc_read(codec, ARIZONA_DRE_ENABLE); 245 + const struct reg_sequence *wseq; 246 + int nregs; 247 + 248 + switch (w->shift) { 249 + case ARIZONA_OUT1L_ENA_SHIFT: 250 + if (val & ARIZONA_DRE1L_ENA_MASK) { 251 + wseq = wm5110_dre_left_enable; 252 + nregs = ARRAY_SIZE(wm5110_dre_left_enable); 253 + } else { 254 + wseq = wm5110_no_dre_left_enable; 255 + nregs = ARRAY_SIZE(wm5110_no_dre_left_enable); 256 + priv->out_up_delay += 10; 257 + } 258 + break; 259 + case ARIZONA_OUT1R_ENA_SHIFT: 260 + if (val & ARIZONA_DRE1R_ENA_MASK) { 261 + wseq = wm5110_dre_right_enable; 262 + nregs = ARRAY_SIZE(wm5110_dre_right_enable); 263 + } else { 264 + wseq = wm5110_no_dre_right_enable; 265 + nregs = ARRAY_SIZE(wm5110_no_dre_right_enable); 266 + priv->out_up_delay += 10; 267 + } 268 + break; 269 + default: 270 + return 0; 271 + } 272 + 273 + return regmap_multi_reg_write(arizona->regmap, wseq, nregs); 274 + } 275 + 276 + static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w) 277 + { 278 + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 279 + struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); 280 + unsigned int val = snd_soc_read(codec, ARIZONA_DRE_ENABLE); 281 + 282 + switch (w->shift) { 283 + case ARIZONA_OUT1L_ENA_SHIFT: 284 + if (!(val & ARIZONA_DRE1L_ENA_MASK)) { 285 + snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, 286 + ARIZONA_WS_TRG1, ARIZONA_WS_TRG1); 287 + snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, 288 + ARIZONA_WS_TRG1, 0); 289 + priv->out_down_delay += 27; 290 + } 291 + break; 292 + case ARIZONA_OUT1R_ENA_SHIFT: 293 + if (!(val & ARIZONA_DRE1R_ENA_MASK)) { 294 + snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, 295 + ARIZONA_WS_TRG2, ARIZONA_WS_TRG2); 296 + snd_soc_update_bits(codec, ARIZONA_SPARE_TRIGGERS, 297 + ARIZONA_WS_TRG2, 0); 298 + priv->out_down_delay += 27; 299 + } 300 + break; 301 + default: 302 + break; 303 + } 304 + 305 + return 0; 306 + } 307 + 308 + static int wm5110_hp_ev(struct snd_soc_dapm_widget *w, 309 + struct snd_kcontrol *kcontrol, int event) 310 + { 311 + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 312 + struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); 313 + 314 + switch (priv->arizona->rev) { 315 + case 0 ... 3: 316 + break; 317 + default: 318 + switch (event) { 319 + case SND_SOC_DAPM_PRE_PMU: 320 + wm5110_hp_pre_enable(w); 321 + break; 322 + case SND_SOC_DAPM_PRE_PMD: 323 + wm5110_hp_pre_disable(w); 324 + break; 325 + default: 326 + break; 327 + } 328 + break; 329 + } 330 + 331 + return arizona_hp_ev(w, kcontrol, event); 332 + } 333 + 334 + static int wm5110_clear_pga_volume(struct arizona *arizona, int output) 335 + { 336 + struct reg_sequence clear_pga = { 337 + ARIZONA_OUTPUT_PATH_CONFIG_1L + output * 4, 0x80 338 + }; 339 + int ret; 340 + 341 + ret = regmap_multi_reg_write_bypassed(arizona->regmap, &clear_pga, 1); 342 + if (ret) 343 + dev_err(arizona->dev, "Failed to clear PGA (0x%x): %d\n", 344 + clear_pga.reg, ret); 345 + 346 + return ret; 347 + } 348 + 349 + static int wm5110_put_dre(struct snd_kcontrol *kcontrol, 350 + struct snd_ctl_elem_value *ucontrol) 351 + { 352 + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); 353 + struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 354 + struct arizona *arizona = dev_get_drvdata(codec->dev->parent); 355 + struct soc_mixer_control *mc = 356 + (struct soc_mixer_control *)kcontrol->private_value; 357 + unsigned int ena, dre; 358 + unsigned int mask = (0x1 << mc->shift) | (0x1 << mc->rshift); 359 + unsigned int lnew = (!!ucontrol->value.integer.value[0]) << mc->shift; 360 + unsigned int rnew = (!!ucontrol->value.integer.value[1]) << mc->rshift; 361 + unsigned int lold, rold; 362 + unsigned int lena, rena; 363 + int ret; 364 + 365 + snd_soc_dapm_mutex_lock(dapm); 366 + 367 + ret = regmap_read(arizona->regmap, ARIZONA_OUTPUT_ENABLES_1, &ena); 368 + if (ret) { 369 + dev_err(arizona->dev, "Failed to read output state: %d\n", ret); 370 + goto err; 371 + } 372 + ret = regmap_read(arizona->regmap, ARIZONA_DRE_ENABLE, &dre); 373 + if (ret) { 374 + dev_err(arizona->dev, "Failed to read DRE state: %d\n", ret); 375 + goto err; 376 + } 377 + 378 + lold = dre & (1 << mc->shift); 379 + rold = dre & (1 << mc->rshift); 380 + /* Enables are channel wise swapped from the DRE enables */ 381 + lena = ena & (1 << mc->rshift); 382 + rena = ena & (1 << mc->shift); 383 + 384 + if ((lena && lnew != lold) || (rena && rnew != rold)) { 385 + dev_err(arizona->dev, "Can't change DRE on active outputs\n"); 386 + ret = -EBUSY; 387 + goto err; 388 + } 389 + 390 + ret = regmap_update_bits(arizona->regmap, ARIZONA_DRE_ENABLE, 391 + mask, lnew | rnew); 392 + if (ret) { 393 + dev_err(arizona->dev, "Failed to set DRE: %d\n", ret); 394 + goto err; 395 + } 396 + 397 + /* Force reset of PGA volumes, if turning DRE off */ 398 + if (!lnew && lold) 399 + wm5110_clear_pga_volume(arizona, mc->shift); 400 + 401 + if (!rnew && rold) 402 + wm5110_clear_pga_volume(arizona, mc->rshift); 403 + 404 + err: 405 + snd_soc_dapm_mutex_unlock(dapm); 406 + 407 + return ret; 186 408 } 187 409 188 410 static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0); ··· 669 405 SOC_DOUBLE("SPKDAT2 Switch", ARIZONA_PDM_SPK2_CTRL_1, ARIZONA_SPK2L_MUTE_SHIFT, 670 406 ARIZONA_SPK2R_MUTE_SHIFT, 1, 1), 671 407 672 - SOC_DOUBLE("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE, 673 - ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0), 674 - SOC_DOUBLE("HPOUT2 DRE Switch", ARIZONA_DRE_ENABLE, 675 - ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0), 676 - SOC_DOUBLE("HPOUT3 DRE Switch", ARIZONA_DRE_ENABLE, 677 - ARIZONA_DRE3L_ENA_SHIFT, ARIZONA_DRE3R_ENA_SHIFT, 1, 0), 408 + SOC_DOUBLE_EXT("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE, 409 + ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0, 410 + snd_soc_get_volsw, wm5110_put_dre), 411 + SOC_DOUBLE_EXT("HPOUT2 DRE Switch", ARIZONA_DRE_ENABLE, 412 + ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0, 413 + snd_soc_get_volsw, wm5110_put_dre), 414 + SOC_DOUBLE_EXT("HPOUT3 DRE Switch", ARIZONA_DRE_ENABLE, 415 + ARIZONA_DRE3L_ENA_SHIFT, ARIZONA_DRE3R_ENA_SHIFT, 1, 0, 416 + snd_soc_get_volsw, wm5110_put_dre), 678 417 679 418 SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp), 680 419 SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp), ··· 1167 900 ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0), 1168 901 1169 902 SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, 1170 - ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, 903 + ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, wm5110_hp_ev, 1171 904 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | 1172 905 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), 1173 906 SND_SOC_DAPM_PGA_E("OUT1R", SND_SOC_NOPM, 1174 - ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, 907 + ARIZONA_OUT1R_ENA_SHIFT, 0, NULL, 0, wm5110_hp_ev, 1175 908 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD | 1176 909 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), 1177 910 SND_SOC_DAPM_PGA_E("OUT2L", ARIZONA_OUTPUT_ENABLES_1,
+47 -40
sound/soc/codecs/wm8731.c
··· 79 79 return reg == WM8731_RESET; 80 80 } 81 81 82 - static bool wm8731_writeable(struct device *dev, unsigned int reg) 83 - { 84 - return reg <= WM8731_RESET; 85 - } 86 - 87 - #define wm8731_reset(c) snd_soc_write(c, WM8731_RESET, 0) 82 + #define wm8731_reset(m) regmap_write(m, WM8731_RESET, 0) 88 83 89 84 static const char *wm8731_input_select[] = {"Line In", "Mic"}; 90 85 ··· 491 496 492 497 switch (level) { 493 498 case SND_SOC_BIAS_ON: 494 - if (wm8731->mclk) 495 - clk_prepare_enable(wm8731->mclk); 499 + if (wm8731->mclk) { 500 + ret = clk_prepare_enable(wm8731->mclk); 501 + if (ret) 502 + return ret; 503 + } 496 504 break; 497 505 case SND_SOC_BIAS_PREPARE: 498 506 break; ··· 569 571 .symmetric_rates = 1, 570 572 }; 571 573 572 - static int wm8731_probe(struct snd_soc_codec *codec) 574 + static int wm8731_request_supplies(struct device *dev, 575 + struct wm8731_priv *wm8731) 573 576 { 574 - struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); 575 577 int ret = 0, i; 576 578 577 579 for (i = 0; i < ARRAY_SIZE(wm8731->supplies); i++) 578 580 wm8731->supplies[i].supply = wm8731_supply_names[i]; 579 581 580 - ret = devm_regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8731->supplies), 582 + ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(wm8731->supplies), 581 583 wm8731->supplies); 582 584 if (ret != 0) { 583 - dev_err(codec->dev, "Failed to request supplies: %d\n", ret); 585 + dev_err(dev, "Failed to request supplies: %d\n", ret); 584 586 return ret; 585 587 } 586 588 587 589 ret = regulator_bulk_enable(ARRAY_SIZE(wm8731->supplies), 588 590 wm8731->supplies); 589 591 if (ret != 0) { 590 - dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); 592 + dev_err(dev, "Failed to enable supplies: %d\n", ret); 591 593 return ret; 592 594 } 593 595 594 - ret = wm8731_reset(codec); 596 + return 0; 597 + } 598 + 599 + static int wm8731_hw_init(struct device *dev, struct wm8731_priv *wm8731) 600 + { 601 + int ret = 0; 602 + 603 + ret = wm8731_reset(wm8731->regmap); 595 604 if (ret < 0) { 596 - dev_err(codec->dev, "Failed to issue reset: %d\n", ret); 605 + dev_err(dev, "Failed to issue reset: %d\n", ret); 597 606 goto err_regulator_enable; 598 607 } 599 608 600 - snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); 609 + /* Clear POWEROFF, keep everything else disabled */ 610 + regmap_write(wm8731->regmap, WM8731_PWR, 0x7f); 601 611 602 612 /* Latch the update bits */ 603 - snd_soc_update_bits(codec, WM8731_LOUT1V, 0x100, 0); 604 - snd_soc_update_bits(codec, WM8731_ROUT1V, 0x100, 0); 605 - snd_soc_update_bits(codec, WM8731_LINVOL, 0x100, 0); 606 - snd_soc_update_bits(codec, WM8731_RINVOL, 0x100, 0); 613 + regmap_update_bits(wm8731->regmap, WM8731_LOUT1V, 0x100, 0); 614 + regmap_update_bits(wm8731->regmap, WM8731_ROUT1V, 0x100, 0); 615 + regmap_update_bits(wm8731->regmap, WM8731_LINVOL, 0x100, 0); 616 + regmap_update_bits(wm8731->regmap, WM8731_RINVOL, 0x100, 0); 607 617 608 618 /* Disable bypass path by default */ 609 - snd_soc_update_bits(codec, WM8731_APANA, 0x8, 0); 619 + regmap_update_bits(wm8731->regmap, WM8731_APANA, 0x8, 0); 610 620 611 - /* Regulators will have been enabled by bias management */ 612 - regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); 613 - 614 - return 0; 621 + regcache_mark_dirty(wm8731->regmap); 615 622 616 623 err_regulator_enable: 624 + /* Regulators will be enabled by bias management */ 617 625 regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); 618 626 619 627 return ret; 620 628 } 621 629 622 - /* power down chip */ 623 - static int wm8731_remove(struct snd_soc_codec *codec) 624 - { 625 - struct wm8731_priv *wm8731 = snd_soc_codec_get_drvdata(codec); 626 - 627 - regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies); 628 - 629 - return 0; 630 - } 631 - 632 630 static struct snd_soc_codec_driver soc_codec_dev_wm8731 = { 633 - .probe = wm8731_probe, 634 - .remove = wm8731_remove, 635 631 .set_bias_level = wm8731_set_bias_level, 636 632 .suspend_bias_off = true, 637 633 ··· 650 658 651 659 .max_register = WM8731_RESET, 652 660 .volatile_reg = wm8731_volatile, 653 - .writeable_reg = wm8731_writeable, 654 661 655 662 .cache_type = REGCACHE_RBTREE, 656 663 .reg_defaults = wm8731_reg_defaults, ··· 681 690 682 691 mutex_init(&wm8731->lock); 683 692 693 + spi_set_drvdata(spi, wm8731); 694 + 695 + ret = wm8731_request_supplies(&spi->dev, wm8731); 696 + if (ret != 0) 697 + return ret; 698 + 684 699 wm8731->regmap = devm_regmap_init_spi(spi, &wm8731_regmap); 685 700 if (IS_ERR(wm8731->regmap)) { 686 701 ret = PTR_ERR(wm8731->regmap); ··· 695 698 return ret; 696 699 } 697 700 698 - spi_set_drvdata(spi, wm8731); 701 + ret = wm8731_hw_init(&spi->dev, wm8731); 702 + if (ret != 0) 703 + return ret; 699 704 700 705 ret = snd_soc_register_codec(&spi->dev, 701 706 &soc_codec_dev_wm8731, &wm8731_dai, 1); ··· 753 754 754 755 mutex_init(&wm8731->lock); 755 756 757 + i2c_set_clientdata(i2c, wm8731); 758 + 759 + ret = wm8731_request_supplies(&i2c->dev, wm8731); 760 + if (ret != 0) 761 + return ret; 762 + 756 763 wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); 757 764 if (IS_ERR(wm8731->regmap)) { 758 765 ret = PTR_ERR(wm8731->regmap); ··· 767 762 return ret; 768 763 } 769 764 770 - i2c_set_clientdata(i2c, wm8731); 765 + ret = wm8731_hw_init(&i2c->dev, wm8731); 766 + if (ret != 0) 767 + return ret; 771 768 772 769 ret = snd_soc_register_codec(&i2c->dev, 773 770 &soc_codec_dev_wm8731, &wm8731_dai, 1);
+1 -1
sound/soc/codecs/wm8804.c
··· 98 98 WM8804_REGULATOR_EVENT(1) 99 99 100 100 static const char *txsrc_text[] = { "S/PDIF RX", "AIF" }; 101 - static const SOC_ENUM_SINGLE_DECL(txsrc, WM8804_SPDTX4, 6, txsrc_text); 101 + static SOC_ENUM_SINGLE_DECL(txsrc, WM8804_SPDTX4, 6, txsrc_text); 102 102 103 103 static const struct snd_kcontrol_new wm8804_tx_source_mux[] = { 104 104 SOC_DAPM_ENUM_EXT("Input Source", txsrc,