• Home
  • Raw
  • Download

Lines Matching +full:spkr +full:- +full:short +full:- +full:circuit

2  * wm8996.c - WM8996 audio codec interface
4 * Copyright 2011-2 Wolfson Microelectronics PLC.
112 regcache_mark_dirty(wm8996->regmap); \
303 static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 150, 0);
304 static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
305 static const DECLARE_TLV_DB_SCALE(out_digital_tlv, -1200, 150, 0);
306 static const DECLARE_TLV_DB_SCALE(out_tlv, -900, 75, 0);
307 static const DECLARE_TLV_DB_SCALE(spk_tlv, -900, 150, 0);
308 static const DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
309 static const DECLARE_TLV_DB_SCALE(threedstereo_tlv, -1600, 183, 1);
341 struct wm8996_pdata *pdata = &wm8996->pdata; in wm8996_set_retune_mobile()
344 if (!wm8996->num_retune_mobile_texts) in wm8996_set_retune_mobile()
370 cfg = wm8996->retune_mobile_cfg[block]; in wm8996_set_retune_mobile()
373 for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { in wm8996_set_retune_mobile()
374 if (strcmp(pdata->retune_mobile_cfgs[i].name, in wm8996_set_retune_mobile()
375 wm8996->retune_mobile_texts[cfg]) == 0 && in wm8996_set_retune_mobile()
376 abs(pdata->retune_mobile_cfgs[i].rate in wm8996_set_retune_mobile()
377 - wm8996->rx_rate[iface]) < best_val) { in wm8996_set_retune_mobile()
379 best_val = abs(pdata->retune_mobile_cfgs[i].rate in wm8996_set_retune_mobile()
380 - wm8996->rx_rate[iface]); in wm8996_set_retune_mobile()
384 dev_dbg(component->dev, "ReTune Mobile %d %s/%dHz for %dHz sample rate\n", in wm8996_set_retune_mobile()
386 pdata->retune_mobile_cfgs[best].name, in wm8996_set_retune_mobile()
387 pdata->retune_mobile_cfgs[best].rate, in wm8996_set_retune_mobile()
388 wm8996->rx_rate[iface]); in wm8996_set_retune_mobile()
396 for (i = 0; i < ARRAY_SIZE(pdata->retune_mobile_cfgs[best].regs); i++) in wm8996_set_retune_mobile()
398 pdata->retune_mobile_cfgs[best].regs[i]); in wm8996_set_retune_mobile()
410 return -EINVAL; in wm8996_get_retune_mobile_block()
418 struct wm8996_pdata *pdata = &wm8996->pdata; in wm8996_put_retune_mobile_enum()
419 int block = wm8996_get_retune_mobile_block(kcontrol->id.name); in wm8996_put_retune_mobile_enum()
420 int value = ucontrol->value.enumerated.item[0]; in wm8996_put_retune_mobile_enum()
425 if (value >= pdata->num_retune_mobile_cfgs) in wm8996_put_retune_mobile_enum()
426 return -EINVAL; in wm8996_put_retune_mobile_enum()
428 wm8996->retune_mobile_cfg[block] = value; in wm8996_put_retune_mobile_enum()
440 int block = wm8996_get_retune_mobile_block(kcontrol->id.name); in wm8996_get_retune_mobile_enum()
444 ucontrol->value.enumerated.item[0] = wm8996->retune_mobile_cfg[block]; in wm8996_get_retune_mobile_enum()
460 SOC_ENUM("Sidetone HPF Cut-off", sidetone_hpf),
582 wm8996->bg_ena++; in wm8996_bg_enable()
583 if (wm8996->bg_ena == 1) { in wm8996_bg_enable()
594 wm8996->bg_ena--; in wm8996_bg_disable()
595 if (!wm8996->bg_ena) in wm8996_bg_disable()
603 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in bg_event()
615 ret = -EINVAL; in bg_event()
638 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rmv_short_event()
644 wm8996->hpout_pending &= ~w->shift; in rmv_short_event()
647 wm8996->hpout_pending |= w->shift; in rmv_short_event()
651 return -EINVAL; in rmv_short_event()
659 struct i2c_client *i2c = to_i2c_client(component->dev); in wait_for_dc_servo()
668 if (i2c->irq) { in wait_for_dc_servo()
669 timeout = wait_for_completion_timeout(&wm8996->dcs_done, in wait_for_dc_servo()
672 dev_err(component->dev, "DC servo timed out\n"); in wait_for_dc_servo()
676 timeout--; in wait_for_dc_servo()
680 dev_dbg(component->dev, "DC servo state: %x\n", ret); in wait_for_dc_servo()
684 dev_err(component->dev, "DC servo timed out for %x\n", mask); in wait_for_dc_servo()
686 dev_dbg(component->dev, "DC servo complete for %x\n", mask); in wait_for_dc_servo()
696 if (wm8996->dcs_pending) { in wm8996_seq_notifier()
697 dev_dbg(component->dev, "Starting DC servo for %x\n", in wm8996_seq_notifier()
698 wm8996->dcs_pending); in wm8996_seq_notifier()
701 wait_for_dc_servo(component, wm8996->dcs_pending in wm8996_seq_notifier()
704 wm8996->dcs_pending = 0; in wm8996_seq_notifier()
707 if (wm8996->hpout_pending != wm8996->hpout_ena) { in wm8996_seq_notifier()
708 dev_dbg(component->dev, "Applying RMV_SHORTs %x->%x\n", in wm8996_seq_notifier()
709 wm8996->hpout_ena, wm8996->hpout_pending); in wm8996_seq_notifier()
713 if (wm8996->hpout_pending & HPOUT1L) { in wm8996_seq_notifier()
722 if (wm8996->hpout_pending & HPOUT1R) { in wm8996_seq_notifier()
735 if (wm8996->hpout_pending & HPOUT2L) { in wm8996_seq_notifier()
744 if (wm8996->hpout_pending & HPOUT2R) { in wm8996_seq_notifier()
755 wm8996->hpout_ena = wm8996->hpout_pending; in wm8996_seq_notifier()
762 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in dcs_start()
767 wm8996->dcs_pending |= 1 << w->shift; in dcs_start()
771 return -EINVAL; in dcs_start()
807 SOC_DAPM_ENUM("SPKR", spkr_enum);
1031 SND_SOC_DAPM_MUX("SPKR", SND_SOC_NOPM, 0, 0, &spkr_mux),
1033 SND_SOC_DAPM_PGA("SPKR PGA", WM8996_RIGHT_PDM_SPEAKER, 4, 0, NULL, 0),
1288 { "SPKR", "DAC1L", "DAC1L" },
1289 { "SPKR", "DAC1R", "DAC1R" },
1290 { "SPKR", "DAC2L", "DAC2L" },
1291 { "SPKR", "DAC2R", "DAC2R" },
1294 { "SPKR PGA", NULL, "SPKR" },
1297 { "SPKDAT", NULL, "SPKR PGA" },
1543 if (wm8996->sysclk < 64000) in wm8996_update_bclk()
1556 bclk_rate = wm8996->bclk_rate[aif]; in wm8996_update_bclk()
1561 cur_val = (wm8996->sysclk / bclk_divs[i]) - bclk_rate; in wm8996_update_bclk()
1566 bclk_rate = wm8996->sysclk / bclk_divs[best]; in wm8996_update_bclk()
1567 dev_dbg(component->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", in wm8996_update_bclk()
1594 ret = regulator_bulk_enable(ARRAY_SIZE(wm8996->supplies), in wm8996_set_bias_level()
1595 wm8996->supplies); in wm8996_set_bias_level()
1597 dev_err(component->dev, in wm8996_set_bias_level()
1603 if (wm8996->pdata.ldo_ena >= 0) { in wm8996_set_bias_level()
1604 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, in wm8996_set_bias_level()
1609 regcache_cache_only(wm8996->regmap, false); in wm8996_set_bias_level()
1610 regcache_sync(wm8996->regmap); in wm8996_set_bias_level()
1621 regcache_cache_only(wm8996->regmap, true); in wm8996_set_bias_level()
1622 if (wm8996->pdata.ldo_ena >= 0) { in wm8996_set_bias_level()
1623 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); in wm8996_set_bias_level()
1624 regcache_cache_only(wm8996->regmap, true); in wm8996_set_bias_level()
1626 regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), in wm8996_set_bias_level()
1627 wm8996->supplies); in wm8996_set_bias_level()
1636 struct snd_soc_component *component = dai->component; in wm8996_set_fmt()
1643 switch (dai->id) { in wm8996_set_fmt()
1657 WARN(1, "Invalid dai id %d\n", dai->id); in wm8996_set_fmt()
1658 return -EINVAL; in wm8996_set_fmt()
1694 return -EINVAL; in wm8996_set_fmt()
1710 return -EINVAL; in wm8996_set_fmt()
1737 struct snd_soc_component *component = dai->component; in wm8996_hw_params()
1745 switch (dai->id) { in wm8996_hw_params()
1747 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || in wm8996_hw_params()
1758 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || in wm8996_hw_params()
1769 WARN(1, "Invalid dai id %d\n", dai->id); in wm8996_hw_params()
1770 return -EINVAL; in wm8996_hw_params()
1775 dev_err(component->dev, "Unsupported BCLK rate: %d\n", bclk_rate); in wm8996_hw_params()
1779 wm8996->bclk_rate[dai->id] = bclk_rate; in wm8996_hw_params()
1780 wm8996->rx_rate[dai->id] = params_rate(params); in wm8996_hw_params()
1790 if (abs(dsp_divs[i] - params_rate(params)) < in wm8996_hw_params()
1791 abs(dsp_divs[best] - params_rate(params))) in wm8996_hw_params()
1799 dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", in wm8996_hw_params()
1817 struct snd_soc_component *component = dai->component; in wm8996_set_sysclk()
1825 if (freq == wm8996->sysclk && clk_id == wm8996->sysclk_src) in wm8996_set_sysclk()
1835 wm8996->sysclk = freq; in wm8996_set_sysclk()
1839 wm8996->sysclk = freq; in wm8996_set_sysclk()
1843 wm8996->sysclk = freq; in wm8996_set_sysclk()
1847 dev_err(component->dev, "Unsupported clock source %d\n", clk_id); in wm8996_set_sysclk()
1848 return -EINVAL; in wm8996_set_sysclk()
1851 switch (wm8996->sysclk) { in wm8996_set_sysclk()
1860 wm8996->sysclk /= 2; in wm8996_set_sysclk()
1873 dev_warn(component->dev, "Unsupported clock rate %dHz\n", in wm8996_set_sysclk()
1874 wm8996->sysclk); in wm8996_set_sysclk()
1875 return -EINVAL; in wm8996_set_sysclk()
1889 wm8996->sysclk_src = clk_id; in wm8996_set_sysclk()
1928 fll_div->fll_refclk_div = 0; in fll_factors()
1931 fll_div->fll_refclk_div++; in fll_factors()
1936 return -EINVAL; in fll_factors()
1946 fll_div->fll_loop_gain = 5; in fll_factors()
1948 fll_div->fll_loop_gain = 0; in fll_factors()
1951 fll_div->fll_ref_freq = 0; in fll_factors()
1953 fll_div->fll_ref_freq = 1; in fll_factors()
1955 /* Fvco should be 90-100MHz; don't check the upper bound */ in fll_factors()
1962 return -EINVAL; in fll_factors()
1966 fll_div->fll_outdiv = div - 1; in fll_factors()
1973 fll_div->fll_fratio = fll_fratios[i].fll_fratio; in fll_factors()
1980 return -EINVAL; in fll_factors()
1983 fll_div->n = target / (fratio * Fref); in fll_factors()
1986 fll_div->theta = 0; in fll_factors()
1987 fll_div->lambda = 0; in fll_factors()
1991 fll_div->theta = (target - (fll_div->n * fratio * Fref)) in fll_factors()
1993 fll_div->lambda = (fratio * Fref) / gcd_fll; in fll_factors()
1997 fll_div->n, fll_div->theta, fll_div->lambda); in fll_factors()
1999 fll_div->fll_fratio, fll_div->fll_outdiv, in fll_factors()
2000 fll_div->fll_refclk_div); in fll_factors()
2009 struct i2c_client *i2c = to_i2c_client(component->dev); in wm8996_set_fll()
2015 if (source == wm8996->fll_src && Fref == wm8996->fll_fref && in wm8996_set_fll()
2016 Fout == wm8996->fll_fout) in wm8996_set_fll()
2020 dev_dbg(component->dev, "FLL disabled\n"); in wm8996_set_fll()
2022 wm8996->fll_fref = 0; in wm8996_set_fll()
2023 wm8996->fll_fout = 0; in wm8996_set_fll()
2051 dev_err(component->dev, "Unknown FLL source %d\n", ret); in wm8996_set_fll()
2052 return -EINVAL; in wm8996_set_fll()
2090 try_wait_for_completion(&wm8996->fll_lock); in wm8996_set_fll()
2095 /* The FLL supports live reconfiguration - kick that in case we were in wm8996_set_fll()
2109 if (i2c->irq) in wm8996_set_fll()
2116 time_left = wait_for_completion_timeout(&wm8996->fll_lock, in wm8996_set_fll()
2119 WARN_ON(!i2c->irq); in wm8996_set_fll()
2129 dev_err(component->dev, "Timed out waiting for FLL\n"); in wm8996_set_fll()
2130 ret = -ETIMEDOUT; in wm8996_set_fll()
2133 dev_dbg(component->dev, "FLL configured for %dHz->%dHz\n", Fref, Fout); in wm8996_set_fll()
2135 wm8996->fll_fref = Fref; in wm8996_set_fll()
2136 wm8996->fll_fout = Fout; in wm8996_set_fll()
2137 wm8996->fll_src = source; in wm8996_set_fll()
2147 regmap_update_bits(wm8996->regmap, WM8996_GPIO_1 + offset, in wm8996_gpio_set()
2159 return regmap_update_bits(wm8996->regmap, WM8996_GPIO_1 + offset, in wm8996_gpio_direction_out()
2170 ret = regmap_read(wm8996->regmap, WM8996_GPIO_1 + offset, &reg); in wm8996_gpio_get()
2181 return regmap_update_bits(wm8996->regmap, WM8996_GPIO_1 + offset, in wm8996_gpio_direction_in()
2201 wm8996->gpio_chip = wm8996_template_chip; in wm8996_init_gpio()
2202 wm8996->gpio_chip.ngpio = 5; in wm8996_init_gpio()
2203 wm8996->gpio_chip.parent = wm8996->dev; in wm8996_init_gpio()
2205 if (wm8996->pdata.gpio_base) in wm8996_init_gpio()
2206 wm8996->gpio_chip.base = wm8996->pdata.gpio_base; in wm8996_init_gpio()
2208 wm8996->gpio_chip.base = -1; in wm8996_init_gpio()
2210 ret = gpiochip_add_data(&wm8996->gpio_chip, wm8996); in wm8996_init_gpio()
2212 dev_err(wm8996->dev, "Failed to add GPIOs: %d\n", ret); in wm8996_init_gpio()
2217 gpiochip_remove(&wm8996->gpio_chip); in wm8996_free_gpio()
2230 * wm8996_detect - Enable default WM8996 jack detection
2236 * This will detect headset, headphone and short circuit button and
2246 wm8996->jack = jack; in wm8996_detect()
2247 wm8996->detecting = true; in wm8996_detect()
2248 wm8996->polarity_cb = polarity_cb; in wm8996_detect()
2249 wm8996->jack_flips = 0; in wm8996_detect()
2251 if (wm8996->polarity_cb) in wm8996_detect()
2252 wm8996->polarity_cb(component, 0); in wm8996_detect()
2268 /* We start off just enabling microphone detection - even a in wm8996_detect()
2300 dev_err(component->dev, "Failed to read HPDET status\n"); in wm8996_hpdet_irq()
2305 dev_err(component->dev, "Got HPDET IRQ but HPDET is busy\n"); in wm8996_hpdet_irq()
2311 dev_dbg(component->dev, "HPDET measured %d ohms\n", val); in wm8996_hpdet_irq()
2322 if (wm8996->jack_mic) in wm8996_hpdet_irq()
2325 snd_soc_jack_report(wm8996->jack, report, in wm8996_hpdet_irq()
2328 wm8996->detecting = false; in wm8996_hpdet_irq()
2330 /* If the output isn't running re-clamp it */ in wm8996_hpdet_irq()
2374 dev_dbg(component->dev, "Headphone detected\n"); in wm8996_report_headphone()
2392 dev_dbg(component->dev, "Microphone event: %x\n", val); in wm8996_micd()
2395 dev_warn(component->dev, "Microphone detection state invalid\n"); in wm8996_micd()
2401 dev_dbg(component->dev, "Jack removal detected\n"); in wm8996_micd()
2402 wm8996->jack_mic = false; in wm8996_micd()
2403 wm8996->detecting = true; in wm8996_micd()
2404 wm8996->jack_flips = 0; in wm8996_micd()
2405 snd_soc_jack_report(wm8996->jack, 0, in wm8996_micd()
2422 if (wm8996->detecting) { in wm8996_micd()
2423 dev_dbg(component->dev, "Microphone detected\n"); in wm8996_micd()
2424 wm8996->jack_mic = true; in wm8996_micd()
2435 dev_dbg(component->dev, "Mic button up\n"); in wm8996_micd()
2436 snd_soc_jack_report(wm8996->jack, 0, SND_JACK_BTN_0); in wm8996_micd()
2448 if (wm8996->detecting && (val & 0x3f0)) { in wm8996_micd()
2449 wm8996->jack_flips++; in wm8996_micd()
2451 if (wm8996->jack_flips > 1) { in wm8996_micd()
2463 if (wm8996->polarity_cb) in wm8996_micd()
2464 wm8996->polarity_cb(component, in wm8996_micd()
2467 dev_dbg(component->dev, "Set microphone polarity to %d\n", in wm8996_micd()
2477 if (wm8996->jack_mic) { in wm8996_micd()
2478 dev_dbg(component->dev, "Mic button detected\n"); in wm8996_micd()
2479 snd_soc_jack_report(wm8996->jack, SND_JACK_BTN_0, in wm8996_micd()
2481 } else if (wm8996->detecting) { in wm8996_micd()
2495 dev_err(component->dev, "Failed to read IRQ status: %d\n", in wm8996_irq()
2507 dev_dbg(component->dev, "DC servo IRQ\n"); in wm8996_irq()
2508 complete(&wm8996->dcs_done); in wm8996_irq()
2512 dev_err(component->dev, "Digital core FIFO error\n"); in wm8996_irq()
2515 dev_dbg(component->dev, "FLL locked\n"); in wm8996_irq()
2516 complete(&wm8996->fll_lock); in wm8996_irq()
2545 struct wm8996_pdata *pdata = &wm8996->pdata; in wm8996_retune_mobile_pdata()
2549 wm8996->retune_mobile_enum, in wm8996_retune_mobile_pdata()
2553 wm8996->retune_mobile_enum, in wm8996_retune_mobile_pdata()
2564 wm8996->num_retune_mobile_texts = 0; in wm8996_retune_mobile_pdata()
2565 wm8996->retune_mobile_texts = NULL; in wm8996_retune_mobile_pdata()
2566 for (i = 0; i < pdata->num_retune_mobile_cfgs; i++) { in wm8996_retune_mobile_pdata()
2567 for (j = 0; j < wm8996->num_retune_mobile_texts; j++) { in wm8996_retune_mobile_pdata()
2568 if (strcmp(pdata->retune_mobile_cfgs[i].name, in wm8996_retune_mobile_pdata()
2569 wm8996->retune_mobile_texts[j]) == 0) in wm8996_retune_mobile_pdata()
2573 if (j != wm8996->num_retune_mobile_texts) in wm8996_retune_mobile_pdata()
2577 t = krealloc(wm8996->retune_mobile_texts, in wm8996_retune_mobile_pdata()
2579 (wm8996->num_retune_mobile_texts + 1), in wm8996_retune_mobile_pdata()
2585 t[wm8996->num_retune_mobile_texts] = in wm8996_retune_mobile_pdata()
2586 pdata->retune_mobile_cfgs[i].name; in wm8996_retune_mobile_pdata()
2589 wm8996->num_retune_mobile_texts++; in wm8996_retune_mobile_pdata()
2590 wm8996->retune_mobile_texts = t; in wm8996_retune_mobile_pdata()
2593 dev_dbg(component->dev, "Allocated %d unique ReTune Mobile names\n", in wm8996_retune_mobile_pdata()
2594 wm8996->num_retune_mobile_texts); in wm8996_retune_mobile_pdata()
2596 wm8996->retune_mobile_enum.items = wm8996->num_retune_mobile_texts; in wm8996_retune_mobile_pdata()
2597 wm8996->retune_mobile_enum.texts = wm8996->retune_mobile_texts; in wm8996_retune_mobile_pdata()
2601 dev_err(component->dev, in wm8996_retune_mobile_pdata()
2621 struct i2c_client *i2c = to_i2c_client(component->dev); in wm8996_probe()
2624 wm8996->component = component; in wm8996_probe()
2626 init_completion(&wm8996->dcs_done); in wm8996_probe()
2627 init_completion(&wm8996->fll_lock); in wm8996_probe()
2629 if (wm8996->pdata.num_retune_mobile_cfgs) in wm8996_probe()
2635 if (i2c->irq) { in wm8996_probe()
2636 if (wm8996->pdata.irq_flags) in wm8996_probe()
2637 irq_flags = wm8996->pdata.irq_flags; in wm8996_probe()
2644 ret = request_threaded_irq(i2c->irq, NULL, in wm8996_probe()
2648 ret = request_threaded_irq(i2c->irq, NULL, wm8996_irq, in wm8996_probe()
2665 dev_err(component->dev, "Failed to request IRQ: %d\n", in wm8996_probe()
2676 struct i2c_client *i2c = to_i2c_client(component->dev); in wm8996_remove()
2681 if (i2c->irq) in wm8996_remove()
2682 free_irq(i2c->irq, component); in wm8996_remove()
2718 .name = "wm8996-aif1",
2738 .name = "wm8996-aif2",
2766 wm8996 = devm_kzalloc(&i2c->dev, sizeof(struct wm8996_priv), in wm8996_i2c_probe()
2769 return -ENOMEM; in wm8996_i2c_probe()
2772 wm8996->dev = &i2c->dev; in wm8996_i2c_probe()
2774 if (dev_get_platdata(&i2c->dev)) in wm8996_i2c_probe()
2775 memcpy(&wm8996->pdata, dev_get_platdata(&i2c->dev), in wm8996_i2c_probe()
2776 sizeof(wm8996->pdata)); in wm8996_i2c_probe()
2778 if (wm8996->pdata.ldo_ena > 0) { in wm8996_i2c_probe()
2779 ret = gpio_request_one(wm8996->pdata.ldo_ena, in wm8996_i2c_probe()
2782 dev_err(&i2c->dev, "Failed to request GPIO %d: %d\n", in wm8996_i2c_probe()
2783 wm8996->pdata.ldo_ena, ret); in wm8996_i2c_probe()
2788 for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) in wm8996_i2c_probe()
2789 wm8996->supplies[i].supply = wm8996_supply_names[i]; in wm8996_i2c_probe()
2791 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8996->supplies), in wm8996_i2c_probe()
2792 wm8996->supplies); in wm8996_i2c_probe()
2794 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); in wm8996_i2c_probe()
2798 wm8996->disable_nb[0].notifier_call = wm8996_regulator_event_0; in wm8996_i2c_probe()
2799 wm8996->disable_nb[1].notifier_call = wm8996_regulator_event_1; in wm8996_i2c_probe()
2800 wm8996->disable_nb[2].notifier_call = wm8996_regulator_event_2; in wm8996_i2c_probe()
2803 for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) { in wm8996_i2c_probe()
2804 ret = regulator_register_notifier(wm8996->supplies[i].consumer, in wm8996_i2c_probe()
2805 &wm8996->disable_nb[i]); in wm8996_i2c_probe()
2807 dev_err(&i2c->dev, in wm8996_i2c_probe()
2813 ret = regulator_bulk_enable(ARRAY_SIZE(wm8996->supplies), in wm8996_i2c_probe()
2814 wm8996->supplies); in wm8996_i2c_probe()
2816 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); in wm8996_i2c_probe()
2820 if (wm8996->pdata.ldo_ena > 0) { in wm8996_i2c_probe()
2821 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 1); in wm8996_i2c_probe()
2825 wm8996->regmap = devm_regmap_init_i2c(i2c, &wm8996_regmap); in wm8996_i2c_probe()
2826 if (IS_ERR(wm8996->regmap)) { in wm8996_i2c_probe()
2827 ret = PTR_ERR(wm8996->regmap); in wm8996_i2c_probe()
2828 dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret); in wm8996_i2c_probe()
2832 ret = regmap_read(wm8996->regmap, WM8996_SOFTWARE_RESET, &reg); in wm8996_i2c_probe()
2834 dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret); in wm8996_i2c_probe()
2838 dev_err(&i2c->dev, "Device is not a WM8996, ID %x\n", reg); in wm8996_i2c_probe()
2839 ret = -EINVAL; in wm8996_i2c_probe()
2843 ret = regmap_read(wm8996->regmap, WM8996_CHIP_REVISION, &reg); in wm8996_i2c_probe()
2845 dev_err(&i2c->dev, "Failed to read device revision: %d\n", in wm8996_i2c_probe()
2850 dev_info(&i2c->dev, "revision %c\n", in wm8996_i2c_probe()
2853 if (wm8996->pdata.ldo_ena > 0) { in wm8996_i2c_probe()
2854 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); in wm8996_i2c_probe()
2855 regcache_cache_only(wm8996->regmap, true); in wm8996_i2c_probe()
2857 ret = regmap_write(wm8996->regmap, WM8996_SOFTWARE_RESET, in wm8996_i2c_probe()
2860 dev_err(&i2c->dev, "Failed to issue reset: %d\n", ret); in wm8996_i2c_probe()
2865 regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); in wm8996_i2c_probe()
2868 regmap_update_bits(wm8996->regmap, WM8996_LINE_INPUT_CONTROL, in wm8996_i2c_probe()
2870 wm8996->pdata.inl_mode << WM8996_INL_MODE_SHIFT | in wm8996_i2c_probe()
2871 wm8996->pdata.inr_mode); in wm8996_i2c_probe()
2873 for (i = 0; i < ARRAY_SIZE(wm8996->pdata.gpio_default); i++) { in wm8996_i2c_probe()
2874 if (!wm8996->pdata.gpio_default[i]) in wm8996_i2c_probe()
2877 regmap_write(wm8996->regmap, WM8996_GPIO_1 + i, in wm8996_i2c_probe()
2878 wm8996->pdata.gpio_default[i] & 0xffff); in wm8996_i2c_probe()
2881 if (wm8996->pdata.spkmute_seq) in wm8996_i2c_probe()
2882 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2886 wm8996->pdata.spkmute_seq); in wm8996_i2c_probe()
2888 regmap_update_bits(wm8996->regmap, WM8996_ACCESSORY_DETECT_MODE_2, in wm8996_i2c_probe()
2890 WM8996_MICD_SRC, wm8996->pdata.micdet_def); in wm8996_i2c_probe()
2893 regmap_update_bits(wm8996->regmap, WM8996_LEFT_LINE_INPUT_VOLUME, in wm8996_i2c_probe()
2895 regmap_update_bits(wm8996->regmap, WM8996_RIGHT_LINE_INPUT_VOLUME, in wm8996_i2c_probe()
2898 regmap_update_bits(wm8996->regmap, WM8996_DAC1_LEFT_VOLUME, in wm8996_i2c_probe()
2900 regmap_update_bits(wm8996->regmap, WM8996_DAC1_RIGHT_VOLUME, in wm8996_i2c_probe()
2902 regmap_update_bits(wm8996->regmap, WM8996_DAC2_LEFT_VOLUME, in wm8996_i2c_probe()
2904 regmap_update_bits(wm8996->regmap, WM8996_DAC2_RIGHT_VOLUME, in wm8996_i2c_probe()
2907 regmap_update_bits(wm8996->regmap, WM8996_OUTPUT1_LEFT_VOLUME, in wm8996_i2c_probe()
2909 regmap_update_bits(wm8996->regmap, WM8996_OUTPUT1_RIGHT_VOLUME, in wm8996_i2c_probe()
2911 regmap_update_bits(wm8996->regmap, WM8996_OUTPUT2_LEFT_VOLUME, in wm8996_i2c_probe()
2913 regmap_update_bits(wm8996->regmap, WM8996_OUTPUT2_RIGHT_VOLUME, in wm8996_i2c_probe()
2916 regmap_update_bits(wm8996->regmap, WM8996_DSP1_TX_LEFT_VOLUME, in wm8996_i2c_probe()
2918 regmap_update_bits(wm8996->regmap, WM8996_DSP1_TX_RIGHT_VOLUME, in wm8996_i2c_probe()
2920 regmap_update_bits(wm8996->regmap, WM8996_DSP2_TX_LEFT_VOLUME, in wm8996_i2c_probe()
2922 regmap_update_bits(wm8996->regmap, WM8996_DSP2_TX_RIGHT_VOLUME, in wm8996_i2c_probe()
2925 regmap_update_bits(wm8996->regmap, WM8996_DSP1_RX_LEFT_VOLUME, in wm8996_i2c_probe()
2927 regmap_update_bits(wm8996->regmap, WM8996_DSP1_RX_RIGHT_VOLUME, in wm8996_i2c_probe()
2929 regmap_update_bits(wm8996->regmap, WM8996_DSP2_RX_LEFT_VOLUME, in wm8996_i2c_probe()
2931 regmap_update_bits(wm8996->regmap, WM8996_DSP2_RX_RIGHT_VOLUME, in wm8996_i2c_probe()
2937 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2942 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2947 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2952 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2957 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2962 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2968 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2973 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2979 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2984 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2989 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2994 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
2999 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
3004 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
3010 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
3015 regmap_update_bits(wm8996->regmap, in wm8996_i2c_probe()
3024 ret = regmap_read(wm8996->regmap, WM8996_GPIO_1, &reg); in wm8996_i2c_probe()
3026 dev_err(&i2c->dev, "Failed to read GPIO1: %d\n", ret); in wm8996_i2c_probe()
3031 regmap_update_bits(wm8996->regmap, WM8996_AIF1_TX_LRCLK_2, in wm8996_i2c_probe()
3035 ret = regmap_read(wm8996->regmap, WM8996_GPIO_2, &reg); in wm8996_i2c_probe()
3037 dev_err(&i2c->dev, "Failed to read GPIO2: %d\n", ret); in wm8996_i2c_probe()
3042 regmap_update_bits(wm8996->regmap, WM8996_AIF2_TX_LRCLK_2, in wm8996_i2c_probe()
3048 ret = devm_snd_soc_register_component(&i2c->dev, in wm8996_i2c_probe()
3060 if (wm8996->pdata.ldo_ena > 0) in wm8996_i2c_probe()
3061 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); in wm8996_i2c_probe()
3062 regulator_bulk_disable(ARRAY_SIZE(wm8996->supplies), wm8996->supplies); in wm8996_i2c_probe()
3064 if (wm8996->pdata.ldo_ena > 0) in wm8996_i2c_probe()
3065 gpio_free(wm8996->pdata.ldo_ena); in wm8996_i2c_probe()
3077 if (wm8996->pdata.ldo_ena > 0) { in wm8996_i2c_remove()
3078 gpio_set_value_cansleep(wm8996->pdata.ldo_ena, 0); in wm8996_i2c_remove()
3079 gpio_free(wm8996->pdata.ldo_ena); in wm8996_i2c_remove()
3081 for (i = 0; i < ARRAY_SIZE(wm8996->supplies); i++) in wm8996_i2c_remove()
3082 regulator_unregister_notifier(wm8996->supplies[i].consumer, in wm8996_i2c_remove()
3083 &wm8996->disable_nb[i]); in wm8996_i2c_remove()