Lines Matching refs:wm8962

95 	struct wm8962_priv *wm8962 = container_of(nb, struct wm8962_priv, \
98 regcache_mark_dirty(wm8962->regmap); \
1439 static int wm8962_reset(struct wm8962_priv *wm8962) in wm8962_reset() argument
1443 ret = regmap_write(wm8962->regmap, WM8962_SOFTWARE_RESET, 0x6243); in wm8962_reset()
1447 return regmap_write(wm8962->regmap, WM8962_PLL_SOFTWARE_RESET, 0); in wm8962_reset()
1474 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_dsp2_write_config() local
1476 return regcache_sync_region(wm8962->regmap, in wm8962_dsp2_write_config()
1505 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_dsp2_start() local
1511 wm8962_dsp2_set_enable(component, wm8962->dsp2_ena); in wm8962_dsp2_start()
1548 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_dsp2_ena_get() local
1550 ucontrol->value.integer.value[0] = !!(wm8962->dsp2_ena & 1 << shift); in wm8962_dsp2_ena_get()
1560 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_dsp2_ena_put() local
1561 int old = wm8962->dsp2_ena; in wm8962_dsp2_ena_put()
1566 mutex_lock(&wm8962->dsp2_ena_lock); in wm8962_dsp2_ena_put()
1569 wm8962->dsp2_ena |= 1 << shift; in wm8962_dsp2_ena_put()
1571 wm8962->dsp2_ena &= ~(1 << shift); in wm8962_dsp2_ena_put()
1573 if (wm8962->dsp2_ena == old) in wm8962_dsp2_ena_put()
1579 if (wm8962->dsp2_ena) in wm8962_dsp2_ena_put()
1580 wm8962_dsp2_set_enable(component, wm8962->dsp2_ena); in wm8962_dsp2_ena_put()
1586 mutex_unlock(&wm8962->dsp2_ena_lock); in wm8962_dsp2_ena_put()
2034 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in dsp2_event() local
2038 if (wm8962->dsp2_ena) in dsp2_event()
2043 if (wm8962->dsp2_ena) in dsp2_event()
2414 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_add_widgets() local
2415 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_add_widgets()
2463 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_configure_bclk() local
2470 if (!wm8962->sysclk_rate) { in wm8962_configure_bclk()
2475 if (!wm8962->bclk || !wm8962->lrclk) { in wm8962_configure_bclk()
2481 if (sysclk_rates[i] == wm8962->sysclk_rate / wm8962->lrclk) { in wm8962_configure_bclk()
2489 wm8962->sysclk_rate / wm8962->lrclk); in wm8962_configure_bclk()
2528 dspclk = wm8962->sysclk_rate; in wm8962_configure_bclk()
2531 dspclk = wm8962->sysclk_rate / 2; in wm8962_configure_bclk()
2534 dspclk = wm8962->sysclk_rate / 4; in wm8962_configure_bclk()
2538 dspclk = wm8962->sysclk_rate; in wm8962_configure_bclk()
2541 dev_dbg(component->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk); in wm8962_configure_bclk()
2550 diff = (dspclk / bclk_divs[i]) - wm8962->bclk; in wm8962_configure_bclk()
2558 wm8962->bclk = dspclk / bclk_divs[best]; in wm8962_configure_bclk()
2561 bclk_divs[best], wm8962->bclk); in wm8962_configure_bclk()
2563 aif2 |= wm8962->bclk / wm8962->lrclk; in wm8962_configure_bclk()
2565 wm8962->bclk / wm8962->lrclk, wm8962->lrclk); in wm8962_configure_bclk()
2626 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_hw_params() local
2631 wm8962->bclk = snd_soc_params_to_bclk(params); in wm8962_hw_params()
2633 wm8962->bclk *= 2; in wm8962_hw_params()
2635 wm8962->lrclk = params_rate(params); in wm8962_hw_params()
2638 if (sr_vals[i].rate == wm8962->lrclk) { in wm8962_hw_params()
2644 dev_err(component->dev, "Unsupported rate %dHz\n", wm8962->lrclk); in wm8962_hw_params()
2648 if (wm8962->lrclk % 8000 == 0) in wm8962_hw_params()
2674 wm8962->bclk, wm8962->lrclk); in wm8962_hw_params()
2686 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_set_dai_sysclk() local
2691 wm8962->sysclk = WM8962_SYSCLK_MCLK; in wm8962_set_dai_sysclk()
2695 wm8962->sysclk = WM8962_SYSCLK_FLL; in wm8962_set_dai_sysclk()
2705 wm8962->sysclk_rate = freq; in wm8962_set_dai_sysclk()
2882 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_set_fll() local
2889 if (source == wm8962->fll_src && Fref == wm8962->fll_fref && in wm8962_set_fll()
2890 Fout == wm8962->fll_fout) in wm8962_set_fll()
2896 wm8962->fll_fref = 0; in wm8962_set_fll()
2897 wm8962->fll_fout = 0; in wm8962_set_fll()
2950 reinit_completion(&wm8962->fll_lock); in wm8962_set_fll()
2967 if (wm8962->irq) in wm8962_set_fll()
2972 timeout = wait_for_completion_timeout(&wm8962->fll_lock, in wm8962_set_fll()
2975 if (timeout == 0 && wm8962->irq) { in wm8962_set_fll()
2983 wm8962->fll_fref = Fref; in wm8962_set_fll()
2984 wm8962->fll_fout = Fout; in wm8962_set_fll()
2985 wm8962->fll_src = source; in wm8962_set_fll()
3049 struct wm8962_priv *wm8962 = container_of(work, in wm8962_mic_work() local
3052 struct snd_soc_component *component = wm8962->component; in wm8962_mic_work()
3069 snd_soc_jack_report(wm8962->jack, status, in wm8962_mic_work()
3080 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_irq() local
3091 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2_MASK, in wm8962_irq()
3100 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, &active); in wm8962_irq()
3115 ret = regmap_write(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, active); in wm8962_irq()
3121 complete(&wm8962->fll_lock); in wm8962_irq()
3130 ret = regmap_read(wm8962->regmap, in wm8962_irq()
3158 &wm8962->mic_work, in wm8962_irq()
3182 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_mic_detect() local
3186 wm8962->jack = jack; in wm8962_mic_detect()
3201 snd_soc_jack_report(wm8962->jack, 0, in wm8962_mic_detect()
3226 struct wm8962_priv *wm8962 = in wm8962_beep_work() local
3228 struct snd_soc_component *component = wm8962->component; in wm8962_beep_work()
3234 if (wm8962->beep_rate) { in wm8962_beep_work()
3236 if (abs(wm8962->beep_rate - beep_rates[i]) < in wm8962_beep_work()
3237 abs(wm8962->beep_rate - beep_rates[best])) in wm8962_beep_work()
3242 beep_rates[best], wm8962->beep_rate); in wm8962_beep_work()
3265 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_beep_event() local
3281 wm8962->beep_rate = hz; in wm8962_beep_event()
3282 schedule_work(&wm8962->beep_work); in wm8962_beep_event()
3289 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in beep_store() local
3297 input_event(wm8962->beep, EV_SND, SND_TONE, time); in beep_store()
3306 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_init_beep() local
3309 wm8962->beep = devm_input_allocate_device(component->dev); in wm8962_init_beep()
3310 if (!wm8962->beep) { in wm8962_init_beep()
3315 INIT_WORK(&wm8962->beep_work, wm8962_beep_work); in wm8962_init_beep()
3316 wm8962->beep_rate = 0; in wm8962_init_beep()
3318 wm8962->beep->name = "WM8962 Beep Generator"; in wm8962_init_beep()
3319 wm8962->beep->phys = dev_name(component->dev); in wm8962_init_beep()
3320 wm8962->beep->id.bustype = BUS_I2C; in wm8962_init_beep()
3322 wm8962->beep->evbit[0] = BIT_MASK(EV_SND); in wm8962_init_beep()
3323 wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); in wm8962_init_beep()
3324 wm8962->beep->event = wm8962_beep_event; in wm8962_init_beep()
3325 wm8962->beep->dev.parent = component->dev; in wm8962_init_beep()
3326 input_set_drvdata(wm8962->beep, component); in wm8962_init_beep()
3328 ret = input_register_device(wm8962->beep); in wm8962_init_beep()
3330 wm8962->beep = NULL; in wm8962_init_beep()
3343 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_free_beep() local
3346 cancel_work_sync(&wm8962->beep_work); in wm8962_free_beep()
3347 wm8962->beep = NULL; in wm8962_free_beep()
3352 static void wm8962_set_gpio_mode(struct wm8962_priv *wm8962, int gpio) in wm8962_set_gpio_mode() argument
3373 regmap_update_bits(wm8962->regmap, WM8962_ANALOGUE_CLOCKING1, in wm8962_set_gpio_mode()
3380 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_request() local
3396 wm8962_set_gpio_mode(wm8962, offset + 1); in wm8962_gpio_request()
3403 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_set() local
3404 struct snd_soc_component *component = wm8962->component; in wm8962_gpio_set()
3413 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_direction_out() local
3414 struct snd_soc_component *component = wm8962->component; in wm8962_gpio_direction_out()
3439 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_init_gpio() local
3440 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_init_gpio()
3443 wm8962->gpio_chip = wm8962_template_chip; in wm8962_init_gpio()
3444 wm8962->gpio_chip.ngpio = WM8962_MAX_GPIO; in wm8962_init_gpio()
3445 wm8962->gpio_chip.parent = component->dev; in wm8962_init_gpio()
3448 wm8962->gpio_chip.base = pdata->gpio_base; in wm8962_init_gpio()
3450 wm8962->gpio_chip.base = -1; in wm8962_init_gpio()
3452 ret = gpiochip_add_data(&wm8962->gpio_chip, wm8962); in wm8962_init_gpio()
3459 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_free_gpio() local
3461 gpiochip_remove(&wm8962->gpio_chip); in wm8962_free_gpio()
3477 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_probe() local
3481 wm8962->component = component; in wm8962_probe()
3483 wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0; in wm8962_probe()
3484 wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1; in wm8962_probe()
3485 wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2; in wm8962_probe()
3486 wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3; in wm8962_probe()
3487 wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4; in wm8962_probe()
3488 wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5; in wm8962_probe()
3489 wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6; in wm8962_probe()
3490 wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7; in wm8962_probe()
3493 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) { in wm8962_probe()
3495 wm8962->supplies[i].consumer, in wm8962_probe()
3496 &wm8962->disable_nb[i]); in wm8962_probe()
3543 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_remove() local
3545 cancel_delayed_work_sync(&wm8962->mic_work); in wm8962_remove()
3611 struct wm8962_priv *wm8962; in wm8962_i2c_probe() local
3615 wm8962 = devm_kzalloc(&i2c->dev, sizeof(*wm8962), GFP_KERNEL); in wm8962_i2c_probe()
3616 if (wm8962 == NULL) in wm8962_i2c_probe()
3619 mutex_init(&wm8962->dsp2_ena_lock); in wm8962_i2c_probe()
3621 i2c_set_clientdata(i2c, wm8962); in wm8962_i2c_probe()
3623 INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); in wm8962_i2c_probe()
3624 init_completion(&wm8962->fll_lock); in wm8962_i2c_probe()
3625 wm8962->irq = i2c->irq; in wm8962_i2c_probe()
3629 memcpy(&wm8962->pdata, pdata, sizeof(struct wm8962_pdata)); in wm8962_i2c_probe()
3631 ret = wm8962_set_pdata_from_of(i2c, &wm8962->pdata); in wm8962_i2c_probe()
3636 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) in wm8962_i2c_probe()
3637 wm8962->supplies[i].supply = wm8962_supply_names[i]; in wm8962_i2c_probe()
3639 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3640 wm8962->supplies); in wm8962_i2c_probe()
3646 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3647 wm8962->supplies); in wm8962_i2c_probe()
3653 wm8962->regmap = devm_regmap_init_i2c(i2c, &wm8962_regmap); in wm8962_i2c_probe()
3654 if (IS_ERR(wm8962->regmap)) { in wm8962_i2c_probe()
3655 ret = PTR_ERR(wm8962->regmap); in wm8962_i2c_probe()
3665 regcache_cache_bypass(wm8962->regmap, true); in wm8962_i2c_probe()
3667 ret = regmap_read(wm8962->regmap, WM8962_SOFTWARE_RESET, &reg); in wm8962_i2c_probe()
3679 ret = regmap_read(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, &reg); in wm8962_i2c_probe()
3691 regcache_cache_bypass(wm8962->regmap, false); in wm8962_i2c_probe()
3693 ret = wm8962_reset(wm8962); in wm8962_i2c_probe()
3702 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3706 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3710 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_i2c_probe()
3715 for (i = 0; i < ARRAY_SIZE(wm8962->pdata.gpio_init); i++) in wm8962_i2c_probe()
3716 if (wm8962->pdata.gpio_init[i]) { in wm8962_i2c_probe()
3717 wm8962_set_gpio_mode(wm8962, i + 1); in wm8962_i2c_probe()
3718 regmap_write(wm8962->regmap, 0x200 + i, in wm8962_i2c_probe()
3719 wm8962->pdata.gpio_init[i] & 0xffff); in wm8962_i2c_probe()
3724 if (wm8962->pdata.spk_mono) in wm8962_i2c_probe()
3725 regmap_update_bits(wm8962->regmap, WM8962_CLASS_D_CONTROL_2, in wm8962_i2c_probe()
3730 if (wm8962->pdata.mic_cfg) in wm8962_i2c_probe()
3731 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3736 wm8962->pdata.mic_cfg); in wm8962_i2c_probe()
3739 regmap_update_bits(wm8962->regmap, WM8962_LEFT_INPUT_VOLUME, in wm8962_i2c_probe()
3741 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, in wm8962_i2c_probe()
3743 regmap_update_bits(wm8962->regmap, WM8962_LEFT_ADC_VOLUME, in wm8962_i2c_probe()
3745 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_ADC_VOLUME, in wm8962_i2c_probe()
3747 regmap_update_bits(wm8962->regmap, WM8962_LEFT_DAC_VOLUME, in wm8962_i2c_probe()
3749 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_DAC_VOLUME, in wm8962_i2c_probe()
3751 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTL_VOLUME, in wm8962_i2c_probe()
3753 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTR_VOLUME, in wm8962_i2c_probe()
3755 regmap_update_bits(wm8962->regmap, WM8962_HPOUTL_VOLUME, in wm8962_i2c_probe()
3757 regmap_update_bits(wm8962->regmap, WM8962_HPOUTR_VOLUME, in wm8962_i2c_probe()
3761 regmap_update_bits(wm8962->regmap, WM8962_EQ1, in wm8962_i2c_probe()
3765 regmap_update_bits(wm8962->regmap, WM8962_IRQ_DEBOUNCE, in wm8962_i2c_probe()
3770 if (wm8962->pdata.in4_dc_measure) { in wm8962_i2c_probe()
3771 ret = regmap_register_patch(wm8962->regmap, in wm8962_i2c_probe()
3780 if (wm8962->irq) { in wm8962_i2c_probe()
3781 if (wm8962->pdata.irq_active_low) { in wm8962_i2c_probe()
3789 regmap_update_bits(wm8962->regmap, WM8962_INTERRUPT_CONTROL, in wm8962_i2c_probe()
3792 ret = devm_request_threaded_irq(&i2c->dev, wm8962->irq, NULL, in wm8962_i2c_probe()
3798 wm8962->irq, ret); in wm8962_i2c_probe()
3799 wm8962->irq = 0; in wm8962_i2c_probe()
3803 regmap_update_bits(wm8962->regmap, in wm8962_i2c_probe()
3819 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3821 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3824 regcache_cache_only(wm8962->regmap, true); in wm8962_i2c_probe()
3827 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3834 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3847 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_resume() local
3850 ret = clk_prepare_enable(wm8962->pdata.mclk); in wm8962_runtime_resume()
3856 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_resume()
3857 wm8962->supplies); in wm8962_runtime_resume()
3863 regcache_cache_only(wm8962->regmap, false); in wm8962_runtime_resume()
3865 wm8962_reset(wm8962); in wm8962_runtime_resume()
3867 regcache_mark_dirty(wm8962->regmap); in wm8962_runtime_resume()
3872 regmap_write_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3876 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3880 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_runtime_resume()
3884 regcache_sync(wm8962->regmap); in wm8962_runtime_resume()
3886 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_resume()
3891 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_resume()
3900 clk_disable_unprepare(wm8962->pdata.mclk); in wm8962_runtime_resume()
3906 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_suspend() local
3908 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_suspend()
3911 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_suspend()
3915 regcache_cache_only(wm8962->regmap, true); in wm8962_runtime_suspend()
3917 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_suspend()
3918 wm8962->supplies); in wm8962_runtime_suspend()
3920 clk_disable_unprepare(wm8962->pdata.mclk); in wm8962_runtime_suspend()