Lines Matching refs:wm8962

99 	struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \
102 regcache_mark_dirty(wm8962->regmap); \
1446 static int wm8962_reset(struct wm8962_priv *wm8962) in wm8962_reset() argument
1450 ret = regmap_write(wm8962->regmap, WM8962_SOFTWARE_RESET, 0x6243); in wm8962_reset()
1454 return regmap_write(wm8962->regmap, WM8962_PLL_SOFTWARE_RESET, 0); in wm8962_reset()
1483 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_dsp2_write_config() local
1485 return regcache_sync_region(wm8962->regmap, in wm8962_dsp2_write_config()
1514 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_dsp2_start() local
1520 wm8962_dsp2_set_enable(codec, wm8962->dsp2_ena); in wm8962_dsp2_start()
1557 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_dsp2_ena_get() local
1559 ucontrol->value.integer.value[0] = !!(wm8962->dsp2_ena & 1 << shift); in wm8962_dsp2_ena_get()
1569 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_dsp2_ena_put() local
1570 int old = wm8962->dsp2_ena; in wm8962_dsp2_ena_put()
1575 mutex_lock(&wm8962->dsp2_ena_lock); in wm8962_dsp2_ena_put()
1578 wm8962->dsp2_ena |= 1 << shift; in wm8962_dsp2_ena_put()
1580 wm8962->dsp2_ena &= ~(1 << shift); in wm8962_dsp2_ena_put()
1582 if (wm8962->dsp2_ena == old) in wm8962_dsp2_ena_put()
1588 if (wm8962->dsp2_ena) in wm8962_dsp2_ena_put()
1589 wm8962_dsp2_set_enable(codec, wm8962->dsp2_ena); in wm8962_dsp2_ena_put()
1595 mutex_unlock(&wm8962->dsp2_ena_lock); in wm8962_dsp2_ena_put()
1997 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in dsp2_event() local
2001 if (wm8962->dsp2_ena) in dsp2_event()
2006 if (wm8962->dsp2_ena) in dsp2_event()
2362 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_add_widgets() local
2363 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_add_widgets()
2411 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_configure_bclk() local
2417 if (!wm8962->sysclk_rate) { in wm8962_configure_bclk()
2422 if (!wm8962->bclk || !wm8962->lrclk) { in wm8962_configure_bclk()
2428 if (sysclk_rates[i] == wm8962->sysclk_rate / wm8962->lrclk) { in wm8962_configure_bclk()
2436 wm8962->sysclk_rate / wm8962->lrclk); in wm8962_configure_bclk()
2467 dspclk = wm8962->sysclk_rate; in wm8962_configure_bclk()
2470 dspclk = wm8962->sysclk_rate / 2; in wm8962_configure_bclk()
2473 dspclk = wm8962->sysclk_rate / 4; in wm8962_configure_bclk()
2477 dspclk = wm8962->sysclk; in wm8962_configure_bclk()
2480 dev_dbg(codec->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk); in wm8962_configure_bclk()
2487 if (dspclk / bclk_divs[i] == wm8962->bclk) { in wm8962_configure_bclk()
2489 bclk_divs[i], wm8962->bclk); in wm8962_configure_bclk()
2496 dspclk / wm8962->bclk); in wm8962_configure_bclk()
2500 aif2 |= wm8962->bclk / wm8962->lrclk; in wm8962_configure_bclk()
2502 wm8962->bclk / wm8962->lrclk, wm8962->lrclk); in wm8962_configure_bclk()
2567 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_hw_params() local
2572 wm8962->bclk = snd_soc_params_to_bclk(params); in wm8962_hw_params()
2574 wm8962->bclk *= 2; in wm8962_hw_params()
2576 wm8962->lrclk = params_rate(params); in wm8962_hw_params()
2579 if (sr_vals[i].rate == wm8962->lrclk) { in wm8962_hw_params()
2585 dev_err(codec->dev, "Unsupported rate %dHz\n", wm8962->lrclk); in wm8962_hw_params()
2589 if (wm8962->lrclk % 8000 == 0) in wm8962_hw_params()
2615 wm8962->bclk, wm8962->lrclk); in wm8962_hw_params()
2627 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_set_dai_sysclk() local
2632 wm8962->sysclk = WM8962_SYSCLK_MCLK; in wm8962_set_dai_sysclk()
2636 wm8962->sysclk = WM8962_SYSCLK_FLL; in wm8962_set_dai_sysclk()
2646 wm8962->sysclk_rate = freq; in wm8962_set_dai_sysclk()
2822 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_set_fll() local
2829 if (source == wm8962->fll_src && Fref == wm8962->fll_fref && in wm8962_set_fll()
2830 Fout == wm8962->fll_fout) in wm8962_set_fll()
2836 wm8962->fll_fref = 0; in wm8962_set_fll()
2837 wm8962->fll_fout = 0; in wm8962_set_fll()
2890 reinit_completion(&wm8962->fll_lock); in wm8962_set_fll()
2907 if (wm8962->irq) in wm8962_set_fll()
2912 timeout = wait_for_completion_timeout(&wm8962->fll_lock, in wm8962_set_fll()
2915 if (timeout == 0 && wm8962->irq) { in wm8962_set_fll()
2923 wm8962->fll_fref = Fref; in wm8962_set_fll()
2924 wm8962->fll_fout = Fout; in wm8962_set_fll()
2925 wm8962->fll_src = source; in wm8962_set_fll()
2987 struct wm8962_priv *wm8962 = container_of(work, in wm8962_mic_work() local
2990 struct snd_soc_codec *codec = wm8962->codec; in wm8962_mic_work()
3007 snd_soc_jack_report(wm8962->jack, status, in wm8962_mic_work()
3018 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_irq() local
3029 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2_MASK, in wm8962_irq()
3038 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, &active); in wm8962_irq()
3053 ret = regmap_write(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, active); in wm8962_irq()
3059 complete(&wm8962->fll_lock); in wm8962_irq()
3068 ret = regmap_read(wm8962->regmap, in wm8962_irq()
3096 &wm8962->mic_work, in wm8962_irq()
3120 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_mic_detect() local
3124 wm8962->jack = jack; in wm8962_mic_detect()
3139 snd_soc_jack_report(wm8962->jack, 0, in wm8962_mic_detect()
3164 struct wm8962_priv *wm8962 = in wm8962_beep_work() local
3166 struct snd_soc_codec *codec = wm8962->codec; in wm8962_beep_work()
3172 if (wm8962->beep_rate) { in wm8962_beep_work()
3174 if (abs(wm8962->beep_rate - beep_rates[i]) < in wm8962_beep_work()
3175 abs(wm8962->beep_rate - beep_rates[best])) in wm8962_beep_work()
3180 beep_rates[best], wm8962->beep_rate); in wm8962_beep_work()
3203 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_beep_event() local
3218 wm8962->beep_rate = hz; in wm8962_beep_event()
3219 schedule_work(&wm8962->beep_work); in wm8962_beep_event()
3227 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_beep_set() local
3235 input_event(wm8962->beep, EV_SND, SND_TONE, time); in wm8962_beep_set()
3244 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_init_beep() local
3247 wm8962->beep = devm_input_allocate_device(codec->dev); in wm8962_init_beep()
3248 if (!wm8962->beep) { in wm8962_init_beep()
3253 INIT_WORK(&wm8962->beep_work, wm8962_beep_work); in wm8962_init_beep()
3254 wm8962->beep_rate = 0; in wm8962_init_beep()
3256 wm8962->beep->name = "WM8962 Beep Generator"; in wm8962_init_beep()
3257 wm8962->beep->phys = dev_name(codec->dev); in wm8962_init_beep()
3258 wm8962->beep->id.bustype = BUS_I2C; in wm8962_init_beep()
3260 wm8962->beep->evbit[0] = BIT_MASK(EV_SND); in wm8962_init_beep()
3261 wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); in wm8962_init_beep()
3262 wm8962->beep->event = wm8962_beep_event; in wm8962_init_beep()
3263 wm8962->beep->dev.parent = codec->dev; in wm8962_init_beep()
3264 input_set_drvdata(wm8962->beep, codec); in wm8962_init_beep()
3266 ret = input_register_device(wm8962->beep); in wm8962_init_beep()
3268 wm8962->beep = NULL; in wm8962_init_beep()
3281 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_free_beep() local
3284 cancel_work_sync(&wm8962->beep_work); in wm8962_free_beep()
3285 wm8962->beep = NULL; in wm8962_free_beep()
3290 static void wm8962_set_gpio_mode(struct wm8962_priv *wm8962, int gpio) in wm8962_set_gpio_mode() argument
3311 regmap_update_bits(wm8962->regmap, WM8962_ANALOGUE_CLOCKING1, in wm8962_set_gpio_mode()
3323 struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); in wm8962_gpio_request() local
3339 wm8962_set_gpio_mode(wm8962, offset + 1); in wm8962_gpio_request()
3346 struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); in wm8962_gpio_set() local
3347 struct snd_soc_codec *codec = wm8962->codec; in wm8962_gpio_set()
3356 struct wm8962_priv *wm8962 = gpio_to_wm8962(chip); in wm8962_gpio_direction_out() local
3357 struct snd_soc_codec *codec = wm8962->codec; in wm8962_gpio_direction_out()
3382 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_init_gpio() local
3383 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_init_gpio()
3386 wm8962->gpio_chip = wm8962_template_chip; in wm8962_init_gpio()
3387 wm8962->gpio_chip.ngpio = WM8962_MAX_GPIO; in wm8962_init_gpio()
3388 wm8962->gpio_chip.dev = codec->dev; in wm8962_init_gpio()
3391 wm8962->gpio_chip.base = pdata->gpio_base; in wm8962_init_gpio()
3393 wm8962->gpio_chip.base = -1; in wm8962_init_gpio()
3395 ret = gpiochip_add(&wm8962->gpio_chip); in wm8962_init_gpio()
3402 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_free_gpio() local
3404 gpiochip_remove(&wm8962->gpio_chip); in wm8962_free_gpio()
3419 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_probe() local
3423 wm8962->codec = codec; in wm8962_probe()
3425 wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0; in wm8962_probe()
3426 wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1; in wm8962_probe()
3427 wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2; in wm8962_probe()
3428 wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3; in wm8962_probe()
3429 wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4; in wm8962_probe()
3430 wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5; in wm8962_probe()
3431 wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6; in wm8962_probe()
3432 wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7; in wm8962_probe()
3435 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) { in wm8962_probe()
3436 ret = regulator_register_notifier(wm8962->supplies[i].consumer, in wm8962_probe()
3437 &wm8962->disable_nb[i]); in wm8962_probe()
3478 struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); in wm8962_remove() local
3481 cancel_delayed_work_sync(&wm8962->mic_work); in wm8962_remove()
3485 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) in wm8962_remove()
3486 regulator_unregister_notifier(wm8962->supplies[i].consumer, in wm8962_remove()
3487 &wm8962->disable_nb[i]); in wm8962_remove()
3553 struct wm8962_priv *wm8962; in wm8962_i2c_probe() local
3557 wm8962 = devm_kzalloc(&i2c->dev, sizeof(*wm8962), GFP_KERNEL); in wm8962_i2c_probe()
3558 if (wm8962 == NULL) in wm8962_i2c_probe()
3561 mutex_init(&wm8962->dsp2_ena_lock); in wm8962_i2c_probe()
3563 i2c_set_clientdata(i2c, wm8962); in wm8962_i2c_probe()
3565 INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); in wm8962_i2c_probe()
3566 init_completion(&wm8962->fll_lock); in wm8962_i2c_probe()
3567 wm8962->irq = i2c->irq; in wm8962_i2c_probe()
3571 memcpy(&wm8962->pdata, pdata, sizeof(struct wm8962_pdata)); in wm8962_i2c_probe()
3573 ret = wm8962_set_pdata_from_of(i2c, &wm8962->pdata); in wm8962_i2c_probe()
3579 if (IS_ERR(wm8962->pdata.mclk)) { in wm8962_i2c_probe()
3581 if (PTR_ERR(wm8962->pdata.mclk) == -EPROBE_DEFER) in wm8962_i2c_probe()
3583 wm8962->pdata.mclk = NULL; in wm8962_i2c_probe()
3586 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) in wm8962_i2c_probe()
3587 wm8962->supplies[i].supply = wm8962_supply_names[i]; in wm8962_i2c_probe()
3589 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3590 wm8962->supplies); in wm8962_i2c_probe()
3596 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3597 wm8962->supplies); in wm8962_i2c_probe()
3603 wm8962->regmap = devm_regmap_init_i2c(i2c, &wm8962_regmap); in wm8962_i2c_probe()
3604 if (IS_ERR(wm8962->regmap)) { in wm8962_i2c_probe()
3605 ret = PTR_ERR(wm8962->regmap); in wm8962_i2c_probe()
3615 regcache_cache_bypass(wm8962->regmap, true); in wm8962_i2c_probe()
3617 ret = regmap_read(wm8962->regmap, WM8962_SOFTWARE_RESET, &reg); in wm8962_i2c_probe()
3629 ret = regmap_read(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, &reg); in wm8962_i2c_probe()
3641 regcache_cache_bypass(wm8962->regmap, false); in wm8962_i2c_probe()
3643 ret = wm8962_reset(wm8962); in wm8962_i2c_probe()
3652 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3656 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3660 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_i2c_probe()
3665 for (i = 0; i < ARRAY_SIZE(wm8962->pdata.gpio_init); i++) in wm8962_i2c_probe()
3666 if (wm8962->pdata.gpio_init[i]) { in wm8962_i2c_probe()
3667 wm8962_set_gpio_mode(wm8962, i + 1); in wm8962_i2c_probe()
3668 regmap_write(wm8962->regmap, 0x200 + i, in wm8962_i2c_probe()
3669 wm8962->pdata.gpio_init[i] & 0xffff); in wm8962_i2c_probe()
3674 if (wm8962->pdata.spk_mono) in wm8962_i2c_probe()
3675 regmap_update_bits(wm8962->regmap, WM8962_CLASS_D_CONTROL_2, in wm8962_i2c_probe()
3680 if (wm8962->pdata.mic_cfg) in wm8962_i2c_probe()
3681 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3686 wm8962->pdata.mic_cfg); in wm8962_i2c_probe()
3689 regmap_update_bits(wm8962->regmap, WM8962_LEFT_INPUT_VOLUME, in wm8962_i2c_probe()
3691 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, in wm8962_i2c_probe()
3693 regmap_update_bits(wm8962->regmap, WM8962_LEFT_ADC_VOLUME, in wm8962_i2c_probe()
3695 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_ADC_VOLUME, in wm8962_i2c_probe()
3697 regmap_update_bits(wm8962->regmap, WM8962_LEFT_DAC_VOLUME, in wm8962_i2c_probe()
3699 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_DAC_VOLUME, in wm8962_i2c_probe()
3701 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTL_VOLUME, in wm8962_i2c_probe()
3703 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTR_VOLUME, in wm8962_i2c_probe()
3705 regmap_update_bits(wm8962->regmap, WM8962_HPOUTL_VOLUME, in wm8962_i2c_probe()
3707 regmap_update_bits(wm8962->regmap, WM8962_HPOUTR_VOLUME, in wm8962_i2c_probe()
3711 regmap_update_bits(wm8962->regmap, WM8962_EQ1, in wm8962_i2c_probe()
3715 regmap_update_bits(wm8962->regmap, WM8962_IRQ_DEBOUNCE, in wm8962_i2c_probe()
3720 if (wm8962->pdata.in4_dc_measure) { in wm8962_i2c_probe()
3721 ret = regmap_register_patch(wm8962->regmap, in wm8962_i2c_probe()
3730 if (wm8962->irq) { in wm8962_i2c_probe()
3731 if (wm8962->pdata.irq_active_low) { in wm8962_i2c_probe()
3739 regmap_update_bits(wm8962->regmap, WM8962_INTERRUPT_CONTROL, in wm8962_i2c_probe()
3742 ret = devm_request_threaded_irq(&i2c->dev, wm8962->irq, NULL, in wm8962_i2c_probe()
3748 wm8962->irq, ret); in wm8962_i2c_probe()
3749 wm8962->irq = 0; in wm8962_i2c_probe()
3753 regmap_update_bits(wm8962->regmap, in wm8962_i2c_probe()
3769 regcache_cache_only(wm8962->regmap, true); in wm8962_i2c_probe()
3772 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3777 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3791 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_resume() local
3794 ret = clk_prepare_enable(wm8962->pdata.mclk); in wm8962_runtime_resume()
3800 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_resume()
3801 wm8962->supplies); in wm8962_runtime_resume()
3808 regcache_cache_only(wm8962->regmap, false); in wm8962_runtime_resume()
3810 wm8962_reset(wm8962); in wm8962_runtime_resume()
3815 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3819 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3823 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_runtime_resume()
3827 regcache_sync(wm8962->regmap); in wm8962_runtime_resume()
3829 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_resume()
3834 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_resume()
3845 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_suspend() local
3847 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_suspend()
3850 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_suspend()
3854 regcache_cache_only(wm8962->regmap, true); in wm8962_runtime_suspend()
3856 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_suspend()
3857 wm8962->supplies); in wm8962_runtime_suspend()
3859 clk_disable_unprepare(wm8962->pdata.mclk); in wm8962_runtime_suspend()