Lines Matching full:max98090

3  * max98090.c -- MAX98090 ALSA SoC Audio driver
22 #include <sound/max98090.h>
23 #include "max98090.h"
275 static int max98090_reset(struct max98090_priv *max98090) in max98090_reset() argument
280 ret = regmap_write(max98090->regmap, M98090_REG_SOFTWARE_RESET, in max98090_reset()
283 dev_err(max98090->component->dev, in max98090_reset()
351 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_get_enab_tlv() local
360 select = &(max98090->pa1en); in max98090_get_enab_tlv()
363 select = &(max98090->pa2en); in max98090_get_enab_tlv()
366 select = &(max98090->sidetone); in max98090_get_enab_tlv()
391 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_put_enab_tlv() local
403 select = &(max98090->pa1en); in max98090_put_enab_tlv()
406 select = &(max98090->pa2en); in max98090_put_enab_tlv()
409 select = &(max98090->sidetone); in max98090_put_enab_tlv()
737 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_micinput_event() local
748 max98090->pa1en = val - 1; /* Update for volatile */ in max98090_micinput_event()
750 max98090->pa2en = val - 1; /* Update for volatile */ in max98090_micinput_event()
758 val = max98090->pa1en + 1; in max98090_micinput_event()
760 val = max98090->pa2en + 1; in max98090_micinput_event()
784 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_shdn_event() local
787 max98090->shdn_pending = true; in max98090_shdn_event()
1438 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_add_widgets() local
1444 if (max98090->devtype == MAX98091) { in max98090_add_widgets()
1455 if (max98090->devtype == MAX98091) { in max98090_add_widgets()
1494 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_configure_bclk() local
1498 if (!max98090->sysclk) { in max98090_configure_bclk()
1503 if (!max98090->bclk || !max98090->lrclk) { in max98090_configure_bclk()
1516 if ((pclk_rates[i] == max98090->sysclk) && in max98090_configure_bclk()
1517 (lrclk_rates[i] == max98090->lrclk)) { in max98090_configure_bclk()
1533 if ((user_pclk_rates[i] == max98090->sysclk) && in max98090_configure_bclk()
1534 (user_lrclk_rates[i] == max98090->lrclk)) { in max98090_configure_bclk()
1572 ni = 65536ULL * (max98090->lrclk < 50000 ? 96ULL : 48ULL) in max98090_configure_bclk()
1573 * (unsigned long long int)max98090->lrclk; in max98090_configure_bclk()
1574 do_div(ni, (unsigned long long int)max98090->sysclk); in max98090_configure_bclk()
1586 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_dai_set_fmt() local
1590 max98090->dai_fmt = fmt; in max98090_dai_set_fmt()
1591 cdata = &max98090->dai[0]; in max98090_dai_set_fmt()
1607 max98090->master = false; in max98090_dai_set_fmt()
1611 if (max98090->tdm_slots == 4) { in max98090_dai_set_fmt()
1615 } else if (max98090->tdm_slots == 3) { in max98090_dai_set_fmt()
1624 max98090->master = true; in max98090_dai_set_fmt()
1668 * This accommodates an inverted logic in the MAX98090 chip in max98090_dai_set_fmt()
1681 regval = max98090->tdm_lslot << M98090_TDM_SLOTL_SHIFT | in max98090_dai_set_fmt()
1682 max98090->tdm_rslot << M98090_TDM_SLOTR_SHIFT | in max98090_dai_set_fmt()
1696 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_set_tdm_slot() local
1710 max98090->tdm_slots = slots; in max98090_set_tdm_slot()
1711 max98090->tdm_lslot = ffs(rx_mask) - 1; in max98090_set_tdm_slot()
1712 max98090->tdm_rslot = fls(rx_mask) - 1; in max98090_set_tdm_slot()
1720 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_set_bias_level() local
1735 if (IS_ERR(max98090->mclk)) in max98090_set_bias_level()
1739 clk_disable_unprepare(max98090->mclk); in max98090_set_bias_level()
1741 ret = clk_prepare_enable(max98090->mclk); in max98090_set_bias_level()
1749 ret = regcache_sync(max98090->regmap); in max98090_set_bias_level()
1762 regcache_mark_dirty(max98090->regmap); in max98090_set_bias_level()
1882 static int max98090_configure_dmic(struct max98090_priv *max98090, in max98090_configure_dmic() argument
1905 regmap_update_bits(max98090->regmap, M98090_REG_DIGITAL_MIC_ENABLE, in max98090_configure_dmic()
1909 regmap_update_bits(max98090->regmap, M98090_REG_DIGITAL_MIC_CONFIG, in max98090_configure_dmic()
1921 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_dai_startup() local
1922 unsigned int fmt = max98090->dai_fmt; in max98090_dai_startup()
1937 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_dai_hw_params() local
1940 cdata = &max98090->dai[0]; in max98090_dai_hw_params()
1941 max98090->bclk = snd_soc_params_to_bclk(params); in max98090_dai_hw_params()
1943 max98090->bclk *= 2; in max98090_dai_hw_params()
1945 max98090->lrclk = params_rate(params); in max98090_dai_hw_params()
1956 if (max98090->master) in max98090_dai_hw_params()
1959 cdata->rate = max98090->lrclk; in max98090_dai_hw_params()
1962 if (max98090->lrclk < 24000) in max98090_dai_hw_params()
1970 if (max98090->lrclk < 50000) in max98090_dai_hw_params()
1977 max98090_configure_dmic(max98090, max98090->dmic_freq, max98090->pclk, in max98090_dai_hw_params()
1978 max98090->lrclk); in max98090_dai_hw_params()
1990 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_dai_set_sysclk() local
1993 if (freq == max98090->sysclk) in max98090_dai_set_sysclk()
1996 if (!IS_ERR(max98090->mclk)) { in max98090_dai_set_sysclk()
1997 freq = clk_round_rate(max98090->mclk, freq); in max98090_dai_set_sysclk()
1998 clk_set_rate(max98090->mclk, freq); in max98090_dai_set_sysclk()
2009 max98090->pclk = freq; in max98090_dai_set_sysclk()
2013 max98090->pclk = freq >> 1; in max98090_dai_set_sysclk()
2017 max98090->pclk = freq >> 2; in max98090_dai_set_sysclk()
2023 max98090->sysclk = freq; in max98090_dai_set_sysclk()
2045 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_dai_trigger() local
2051 if (!max98090->master && snd_soc_dai_active(dai) == 1) in max98090_dai_trigger()
2053 &max98090->pll_det_enable_work, in max98090_dai_trigger()
2059 if (!max98090->master && snd_soc_dai_active(dai) == 1) in max98090_dai_trigger()
2060 schedule_work(&max98090->pll_det_disable_work); in max98090_dai_trigger()
2071 struct max98090_priv *max98090 = in max98090_pll_det_enable_work() local
2074 struct snd_soc_component *component = max98090->component; in max98090_pll_det_enable_work()
2083 regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &status); in max98090_pll_det_enable_work()
2089 regmap_read(max98090->regmap, M98090_REG_INTERRUPT_S, &mask); in max98090_pll_det_enable_work()
2093 &max98090->jack_work, in max98090_pll_det_enable_work()
2104 struct max98090_priv *max98090 = in max98090_pll_det_disable_work() local
2106 struct snd_soc_component *component = max98090->component; in max98090_pll_det_disable_work()
2108 cancel_delayed_work_sync(&max98090->pll_det_enable_work); in max98090_pll_det_disable_work()
2115 static void max98090_pll_work(struct max98090_priv *max98090) in max98090_pll_work() argument
2117 struct snd_soc_component *component = max98090->component; in max98090_pll_work()
2153 struct max98090_priv *max98090 = container_of(work, in max98090_jack_work() local
2156 struct snd_soc_component *component = max98090->component; in max98090_jack_work()
2161 if (max98090->jack_state == M98090_JACK_STATE_NO_HEADSET) { in max98090_jack_work()
2182 max98090->jack_state = M98090_JACK_STATE_NO_HEADSET; in max98090_jack_work()
2189 if (max98090->jack_state == in max98090_jack_work()
2211 max98090->jack_state = M98090_JACK_STATE_HEADPHONE; in max98090_jack_work()
2220 max98090->jack_state = M98090_JACK_STATE_HEADSET; in max98090_jack_work()
2231 snd_soc_jack_report(max98090->jack, status, in max98090_jack_work()
2237 struct max98090_priv *max98090 = data; in max98090_interrupt() local
2238 struct snd_soc_component *component = max98090->component; in max98090_interrupt()
2249 ret = regmap_read(max98090->regmap, M98090_REG_INTERRUPT_S, &mask); in max98090_interrupt()
2258 ret = regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &active); in max98090_interrupt()
2283 max98090_pll_work(max98090); in max98090_interrupt()
2292 &max98090->jack_work, in max98090_interrupt()
2306 * max98090_mic_detect - Enable microphone detection via the MAX98090 IRQ
2308 * @component: MAX98090 component
2311 * Enable microphone detection via IRQ on the MAX98090. If GPIOs are
2313 * data configuration is needed for MAX98090 and processor GPIOs should
2321 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_mic_detect() local
2325 max98090->jack = jack; in max98090_mic_detect()
2337 snd_soc_jack_report(max98090->jack, 0, in max98090_mic_detect()
2341 &max98090->jack_work, in max98090_mic_detect()
2383 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_probe() local
2392 max98090->mclk = devm_clk_get(component->dev, "mclk"); in max98090_probe()
2393 if (PTR_ERR(max98090->mclk) == -EPROBE_DEFER) in max98090_probe()
2396 max98090->component = component; in max98090_probe()
2399 max98090_reset(max98090); in max98090_probe()
2403 max98090->sysclk = (unsigned)-1; in max98090_probe()
2404 max98090->pclk = (unsigned)-1; in max98090_probe()
2405 max98090->master = false; in max98090_probe()
2407 cdata = &max98090->dai[0]; in max98090_probe()
2411 max98090->lin_state = 0; in max98090_probe()
2412 max98090->pa1en = 0; in max98090_probe()
2413 max98090->pa2en = 0; in max98090_probe()
2415 max98090->tdm_lslot = 0; in max98090_probe()
2416 max98090->tdm_rslot = 1; in max98090_probe()
2426 devtype = MAX98090; in max98090_probe()
2427 dev_info(component->dev, "MAX98090 REVID=0x%02x\n", ret); in max98090_probe()
2432 devtype = MAX98090; in max98090_probe()
2436 if (max98090->devtype != devtype) { in max98090_probe()
2438 max98090->devtype = devtype; in max98090_probe()
2441 max98090->jack_state = M98090_JACK_STATE_NO_HEADSET; in max98090_probe()
2443 INIT_DELAYED_WORK(&max98090->jack_work, max98090_jack_work); in max98090_probe()
2444 INIT_DELAYED_WORK(&max98090->pll_det_enable_work, in max98090_probe()
2446 INIT_WORK(&max98090->pll_det_disable_work, in max98090_probe()
2495 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_remove() local
2497 cancel_delayed_work_sync(&max98090->jack_work); in max98090_remove()
2498 cancel_delayed_work_sync(&max98090->pll_det_enable_work); in max98090_remove()
2499 cancel_work_sync(&max98090->pll_det_disable_work); in max98090_remove()
2500 max98090->component = NULL; in max98090_remove()
2506 struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); in max98090_seq_notifier() local
2508 if (max98090->shdn_pending) { in max98090_seq_notifier()
2514 max98090->shdn_pending = false; in max98090_seq_notifier()
2541 { "max98090", MAX98090 },
2549 struct max98090_priv *max98090; in max98090_i2c_probe() local
2554 max98090 = devm_kzalloc(&i2c->dev, sizeof(struct max98090_priv), in max98090_i2c_probe()
2556 if (max98090 == NULL) in max98090_i2c_probe()
2559 max98090->devtype = (uintptr_t)i2c_get_match_data(i2c); in max98090_i2c_probe()
2560 i2c_set_clientdata(i2c, max98090); in max98090_i2c_probe()
2561 max98090->pdata = i2c->dev.platform_data; in max98090_i2c_probe()
2564 &max98090->dmic_freq); in max98090_i2c_probe()
2566 max98090->dmic_freq = MAX98090_DEFAULT_DMIC_FREQ; in max98090_i2c_probe()
2568 max98090->regmap = devm_regmap_init_i2c(i2c, &max98090_regmap); in max98090_i2c_probe()
2569 if (IS_ERR(max98090->regmap)) { in max98090_i2c_probe()
2570 ret = PTR_ERR(max98090->regmap); in max98090_i2c_probe()
2577 "max98090_interrupt", max98090); in max98090_i2c_probe()
2593 struct max98090_priv *max98090 = dev_get_drvdata(&i2c->dev); in max98090_i2c_shutdown() local
2599 regmap_write(max98090->regmap, in max98090_i2c_shutdown()
2601 regmap_write(max98090->regmap, in max98090_i2c_shutdown()
2613 struct max98090_priv *max98090 = dev_get_drvdata(dev); in max98090_runtime_resume() local
2615 regcache_cache_only(max98090->regmap, false); in max98090_runtime_resume()
2617 max98090_reset(max98090); in max98090_runtime_resume()
2619 regcache_sync(max98090->regmap); in max98090_runtime_resume()
2626 struct max98090_priv *max98090 = dev_get_drvdata(dev); in max98090_runtime_suspend() local
2628 regcache_cache_only(max98090->regmap, true); in max98090_runtime_suspend()
2635 struct max98090_priv *max98090 = dev_get_drvdata(dev); in max98090_resume() local
2638 regcache_mark_dirty(max98090->regmap); in max98090_resume()
2640 max98090_reset(max98090); in max98090_resume()
2643 regmap_read(max98090->regmap, M98090_REG_DEVICE_STATUS, &status); in max98090_resume()
2645 regcache_sync(max98090->regmap); in max98090_resume()
2657 { .compatible = "maxim,max98090", },
2666 { "193C9890", MAX98090 },
2674 .name = "max98090",
2687 MODULE_DESCRIPTION("ALSA SoC MAX98090 driver");