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()
2401 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_add_widgets() local
2402 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_add_widgets()
2450 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_configure_bclk() local
2456 if (!wm8962->sysclk_rate) { in wm8962_configure_bclk()
2461 if (!wm8962->bclk || !wm8962->lrclk) { in wm8962_configure_bclk()
2467 if (sysclk_rates[i] == wm8962->sysclk_rate / wm8962->lrclk) { in wm8962_configure_bclk()
2475 wm8962->sysclk_rate / wm8962->lrclk); in wm8962_configure_bclk()
2514 dspclk = wm8962->sysclk_rate; in wm8962_configure_bclk()
2517 dspclk = wm8962->sysclk_rate / 2; in wm8962_configure_bclk()
2520 dspclk = wm8962->sysclk_rate / 4; in wm8962_configure_bclk()
2524 dspclk = wm8962->sysclk_rate; in wm8962_configure_bclk()
2527 dev_dbg(component->dev, "DSPCLK is %dHz, BCLK %d\n", dspclk, wm8962->bclk); in wm8962_configure_bclk()
2534 if (dspclk / bclk_divs[i] == wm8962->bclk) { in wm8962_configure_bclk()
2536 bclk_divs[i], wm8962->bclk); in wm8962_configure_bclk()
2543 dspclk / wm8962->bclk); in wm8962_configure_bclk()
2547 aif2 |= wm8962->bclk / wm8962->lrclk; in wm8962_configure_bclk()
2549 wm8962->bclk / wm8962->lrclk, wm8962->lrclk); in wm8962_configure_bclk()
2610 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_hw_params() local
2615 wm8962->bclk = snd_soc_params_to_bclk(params); in wm8962_hw_params()
2617 wm8962->bclk *= 2; in wm8962_hw_params()
2619 wm8962->lrclk = params_rate(params); in wm8962_hw_params()
2622 if (sr_vals[i].rate == wm8962->lrclk) { in wm8962_hw_params()
2628 dev_err(component->dev, "Unsupported rate %dHz\n", wm8962->lrclk); in wm8962_hw_params()
2632 if (wm8962->lrclk % 8000 == 0) in wm8962_hw_params()
2658 wm8962->bclk, wm8962->lrclk); in wm8962_hw_params()
2670 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_set_dai_sysclk() local
2675 wm8962->sysclk = WM8962_SYSCLK_MCLK; in wm8962_set_dai_sysclk()
2679 wm8962->sysclk = WM8962_SYSCLK_FLL; in wm8962_set_dai_sysclk()
2689 wm8962->sysclk_rate = freq; in wm8962_set_dai_sysclk()
2866 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_set_fll() local
2873 if (source == wm8962->fll_src && Fref == wm8962->fll_fref && in wm8962_set_fll()
2874 Fout == wm8962->fll_fout) in wm8962_set_fll()
2880 wm8962->fll_fref = 0; in wm8962_set_fll()
2881 wm8962->fll_fout = 0; in wm8962_set_fll()
2934 reinit_completion(&wm8962->fll_lock); in wm8962_set_fll()
2952 if (wm8962->irq) in wm8962_set_fll()
2957 timeout = wait_for_completion_timeout(&wm8962->fll_lock, in wm8962_set_fll()
2960 if (timeout == 0 && wm8962->irq) { in wm8962_set_fll()
2968 wm8962->fll_fref = Fref; in wm8962_set_fll()
2969 wm8962->fll_fout = Fout; in wm8962_set_fll()
2970 wm8962->fll_src = source; in wm8962_set_fll()
3034 struct wm8962_priv *wm8962 = container_of(work, in wm8962_mic_work() local
3037 struct snd_soc_component *component = wm8962->component; in wm8962_mic_work()
3054 snd_soc_jack_report(wm8962->jack, status, in wm8962_mic_work()
3065 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_irq() local
3077 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2_MASK, in wm8962_irq()
3086 ret = regmap_read(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, &active); in wm8962_irq()
3101 ret = regmap_write(wm8962->regmap, WM8962_INTERRUPT_STATUS_2, active); in wm8962_irq()
3107 complete(&wm8962->fll_lock); in wm8962_irq()
3116 ret = regmap_read(wm8962->regmap, in wm8962_irq()
3144 &wm8962->mic_work, in wm8962_irq()
3168 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_mic_detect() local
3172 wm8962->jack = jack; in wm8962_mic_detect()
3187 snd_soc_jack_report(wm8962->jack, 0, in wm8962_mic_detect()
3212 struct wm8962_priv *wm8962 = in wm8962_beep_work() local
3214 struct snd_soc_component *component = wm8962->component; in wm8962_beep_work()
3220 if (wm8962->beep_rate) { in wm8962_beep_work()
3222 if (abs(wm8962->beep_rate - beep_rates[i]) < in wm8962_beep_work()
3223 abs(wm8962->beep_rate - beep_rates[best])) in wm8962_beep_work()
3228 beep_rates[best], wm8962->beep_rate); in wm8962_beep_work()
3251 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_beep_event() local
3266 wm8962->beep_rate = hz; in wm8962_beep_event()
3267 schedule_work(&wm8962->beep_work); in wm8962_beep_event()
3275 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_beep_set() local
3283 input_event(wm8962->beep, EV_SND, SND_TONE, time); in wm8962_beep_set()
3292 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_init_beep() local
3295 wm8962->beep = devm_input_allocate_device(component->dev); in wm8962_init_beep()
3296 if (!wm8962->beep) { in wm8962_init_beep()
3301 INIT_WORK(&wm8962->beep_work, wm8962_beep_work); in wm8962_init_beep()
3302 wm8962->beep_rate = 0; in wm8962_init_beep()
3304 wm8962->beep->name = "WM8962 Beep Generator"; in wm8962_init_beep()
3305 wm8962->beep->phys = dev_name(component->dev); in wm8962_init_beep()
3306 wm8962->beep->id.bustype = BUS_I2C; in wm8962_init_beep()
3308 wm8962->beep->evbit[0] = BIT_MASK(EV_SND); in wm8962_init_beep()
3309 wm8962->beep->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE); in wm8962_init_beep()
3310 wm8962->beep->event = wm8962_beep_event; in wm8962_init_beep()
3311 wm8962->beep->dev.parent = component->dev; in wm8962_init_beep()
3312 input_set_drvdata(wm8962->beep, component); in wm8962_init_beep()
3314 ret = input_register_device(wm8962->beep); in wm8962_init_beep()
3316 wm8962->beep = NULL; in wm8962_init_beep()
3329 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_free_beep() local
3332 cancel_work_sync(&wm8962->beep_work); in wm8962_free_beep()
3333 wm8962->beep = NULL; in wm8962_free_beep()
3338 static void wm8962_set_gpio_mode(struct wm8962_priv *wm8962, int gpio) in wm8962_set_gpio_mode() argument
3359 regmap_update_bits(wm8962->regmap, WM8962_ANALOGUE_CLOCKING1, in wm8962_set_gpio_mode()
3366 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_request() local
3382 wm8962_set_gpio_mode(wm8962, offset + 1); in wm8962_gpio_request()
3389 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_set() local
3390 struct snd_soc_component *component = wm8962->component; in wm8962_gpio_set()
3399 struct wm8962_priv *wm8962 = gpiochip_get_data(chip); in wm8962_gpio_direction_out() local
3400 struct snd_soc_component *component = wm8962->component; in wm8962_gpio_direction_out()
3425 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_init_gpio() local
3426 struct wm8962_pdata *pdata = &wm8962->pdata; in wm8962_init_gpio()
3429 wm8962->gpio_chip = wm8962_template_chip; in wm8962_init_gpio()
3430 wm8962->gpio_chip.ngpio = WM8962_MAX_GPIO; in wm8962_init_gpio()
3431 wm8962->gpio_chip.parent = component->dev; in wm8962_init_gpio()
3434 wm8962->gpio_chip.base = pdata->gpio_base; in wm8962_init_gpio()
3436 wm8962->gpio_chip.base = -1; in wm8962_init_gpio()
3438 ret = gpiochip_add_data(&wm8962->gpio_chip, wm8962); in wm8962_init_gpio()
3445 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_free_gpio() local
3447 gpiochip_remove(&wm8962->gpio_chip); in wm8962_free_gpio()
3463 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_probe() local
3467 wm8962->component = component; in wm8962_probe()
3469 wm8962->disable_nb[0].notifier_call = wm8962_regulator_event_0; in wm8962_probe()
3470 wm8962->disable_nb[1].notifier_call = wm8962_regulator_event_1; in wm8962_probe()
3471 wm8962->disable_nb[2].notifier_call = wm8962_regulator_event_2; in wm8962_probe()
3472 wm8962->disable_nb[3].notifier_call = wm8962_regulator_event_3; in wm8962_probe()
3473 wm8962->disable_nb[4].notifier_call = wm8962_regulator_event_4; in wm8962_probe()
3474 wm8962->disable_nb[5].notifier_call = wm8962_regulator_event_5; in wm8962_probe()
3475 wm8962->disable_nb[6].notifier_call = wm8962_regulator_event_6; in wm8962_probe()
3476 wm8962->disable_nb[7].notifier_call = wm8962_regulator_event_7; in wm8962_probe()
3479 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) { in wm8962_probe()
3481 wm8962->supplies[i].consumer, in wm8962_probe()
3482 &wm8962->disable_nb[i]); in wm8962_probe()
3529 struct wm8962_priv *wm8962 = snd_soc_component_get_drvdata(component); in wm8962_remove() local
3531 cancel_delayed_work_sync(&wm8962->mic_work); in wm8962_remove()
3600 struct wm8962_priv *wm8962; in wm8962_i2c_probe() local
3604 wm8962 = devm_kzalloc(&i2c->dev, sizeof(*wm8962), GFP_KERNEL); in wm8962_i2c_probe()
3605 if (wm8962 == NULL) in wm8962_i2c_probe()
3608 mutex_init(&wm8962->dsp2_ena_lock); in wm8962_i2c_probe()
3610 i2c_set_clientdata(i2c, wm8962); in wm8962_i2c_probe()
3612 INIT_DELAYED_WORK(&wm8962->mic_work, wm8962_mic_work); in wm8962_i2c_probe()
3613 init_completion(&wm8962->fll_lock); in wm8962_i2c_probe()
3614 wm8962->irq = i2c->irq; in wm8962_i2c_probe()
3618 memcpy(&wm8962->pdata, pdata, sizeof(struct wm8962_pdata)); in wm8962_i2c_probe()
3620 ret = wm8962_set_pdata_from_of(i2c, &wm8962->pdata); in wm8962_i2c_probe()
3626 if (IS_ERR(wm8962->pdata.mclk)) { in wm8962_i2c_probe()
3628 if (PTR_ERR(wm8962->pdata.mclk) == -EPROBE_DEFER) in wm8962_i2c_probe()
3630 wm8962->pdata.mclk = NULL; in wm8962_i2c_probe()
3633 for (i = 0; i < ARRAY_SIZE(wm8962->supplies); i++) in wm8962_i2c_probe()
3634 wm8962->supplies[i].supply = wm8962_supply_names[i]; in wm8962_i2c_probe()
3636 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3637 wm8962->supplies); in wm8962_i2c_probe()
3643 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_i2c_probe()
3644 wm8962->supplies); in wm8962_i2c_probe()
3650 wm8962->regmap = devm_regmap_init_i2c(i2c, &wm8962_regmap); in wm8962_i2c_probe()
3651 if (IS_ERR(wm8962->regmap)) { in wm8962_i2c_probe()
3652 ret = PTR_ERR(wm8962->regmap); in wm8962_i2c_probe()
3662 regcache_cache_bypass(wm8962->regmap, true); in wm8962_i2c_probe()
3664 ret = regmap_read(wm8962->regmap, WM8962_SOFTWARE_RESET, ®); in wm8962_i2c_probe()
3676 ret = regmap_read(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, ®); in wm8962_i2c_probe()
3688 regcache_cache_bypass(wm8962->regmap, false); in wm8962_i2c_probe()
3690 ret = wm8962_reset(wm8962); in wm8962_i2c_probe()
3699 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3703 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_i2c_probe()
3707 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_i2c_probe()
3712 for (i = 0; i < ARRAY_SIZE(wm8962->pdata.gpio_init); i++) in wm8962_i2c_probe()
3713 if (wm8962->pdata.gpio_init[i]) { in wm8962_i2c_probe()
3714 wm8962_set_gpio_mode(wm8962, i + 1); in wm8962_i2c_probe()
3715 regmap_write(wm8962->regmap, 0x200 + i, in wm8962_i2c_probe()
3716 wm8962->pdata.gpio_init[i] & 0xffff); in wm8962_i2c_probe()
3721 if (wm8962->pdata.spk_mono) in wm8962_i2c_probe()
3722 regmap_update_bits(wm8962->regmap, WM8962_CLASS_D_CONTROL_2, in wm8962_i2c_probe()
3727 if (wm8962->pdata.mic_cfg) in wm8962_i2c_probe()
3728 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3733 wm8962->pdata.mic_cfg); in wm8962_i2c_probe()
3736 regmap_update_bits(wm8962->regmap, WM8962_LEFT_INPUT_VOLUME, in wm8962_i2c_probe()
3738 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_INPUT_VOLUME, in wm8962_i2c_probe()
3740 regmap_update_bits(wm8962->regmap, WM8962_LEFT_ADC_VOLUME, in wm8962_i2c_probe()
3742 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_ADC_VOLUME, in wm8962_i2c_probe()
3744 regmap_update_bits(wm8962->regmap, WM8962_LEFT_DAC_VOLUME, in wm8962_i2c_probe()
3746 regmap_update_bits(wm8962->regmap, WM8962_RIGHT_DAC_VOLUME, in wm8962_i2c_probe()
3748 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTL_VOLUME, in wm8962_i2c_probe()
3750 regmap_update_bits(wm8962->regmap, WM8962_SPKOUTR_VOLUME, in wm8962_i2c_probe()
3752 regmap_update_bits(wm8962->regmap, WM8962_HPOUTL_VOLUME, in wm8962_i2c_probe()
3754 regmap_update_bits(wm8962->regmap, WM8962_HPOUTR_VOLUME, in wm8962_i2c_probe()
3758 regmap_update_bits(wm8962->regmap, WM8962_EQ1, in wm8962_i2c_probe()
3762 regmap_update_bits(wm8962->regmap, WM8962_IRQ_DEBOUNCE, in wm8962_i2c_probe()
3767 if (wm8962->pdata.in4_dc_measure) { in wm8962_i2c_probe()
3768 ret = regmap_register_patch(wm8962->regmap, in wm8962_i2c_probe()
3777 if (wm8962->irq) { in wm8962_i2c_probe()
3778 if (wm8962->pdata.irq_active_low) { in wm8962_i2c_probe()
3786 regmap_update_bits(wm8962->regmap, WM8962_INTERRUPT_CONTROL, in wm8962_i2c_probe()
3789 ret = devm_request_threaded_irq(&i2c->dev, wm8962->irq, NULL, in wm8962_i2c_probe()
3795 wm8962->irq, ret); in wm8962_i2c_probe()
3796 wm8962->irq = 0; in wm8962_i2c_probe()
3800 regmap_update_bits(wm8962->regmap, in wm8962_i2c_probe()
3816 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3818 regmap_update_bits(wm8962->regmap, WM8962_ADDITIONAL_CONTROL_4, in wm8962_i2c_probe()
3821 regcache_cache_only(wm8962->regmap, true); in wm8962_i2c_probe()
3824 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3831 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), wm8962->supplies); in wm8962_i2c_probe()
3845 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_resume() local
3848 ret = clk_prepare_enable(wm8962->pdata.mclk); in wm8962_runtime_resume()
3854 ret = regulator_bulk_enable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_resume()
3855 wm8962->supplies); in wm8962_runtime_resume()
3861 regcache_cache_only(wm8962->regmap, false); in wm8962_runtime_resume()
3863 wm8962_reset(wm8962); in wm8962_runtime_resume()
3865 regcache_mark_dirty(wm8962->regmap); in wm8962_runtime_resume()
3870 regmap_write_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3874 regmap_update_bits(wm8962->regmap, WM8962_CLOCKING2, in wm8962_runtime_resume()
3878 regmap_update_bits(wm8962->regmap, WM8962_PLL2, in wm8962_runtime_resume()
3882 regcache_sync(wm8962->regmap); in wm8962_runtime_resume()
3884 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_resume()
3889 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_resume()
3898 clk_disable_unprepare(wm8962->pdata.mclk); in wm8962_runtime_resume()
3904 struct wm8962_priv *wm8962 = dev_get_drvdata(dev); in wm8962_runtime_suspend() local
3906 regmap_update_bits(wm8962->regmap, WM8962_PWR_MGMT_1, in wm8962_runtime_suspend()
3909 regmap_update_bits(wm8962->regmap, WM8962_ANTI_POP, in wm8962_runtime_suspend()
3913 regcache_cache_only(wm8962->regmap, true); in wm8962_runtime_suspend()
3915 regulator_bulk_disable(ARRAY_SIZE(wm8962->supplies), in wm8962_runtime_suspend()
3916 wm8962->supplies); in wm8962_runtime_suspend()
3918 clk_disable_unprepare(wm8962->pdata.mclk); in wm8962_runtime_suspend()