Lines Matching full:wm8960
3 * wm8960.c -- WM8960 ALSA SoC Audio driver
24 #include <sound/wm8960.h>
26 #include "wm8960.h"
52 * wm8960 register cache
53 * We can't read the WM8960 register space when we are
170 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_deemph() local
176 if (wm8960->deemph) { in wm8960_set_deemph()
179 if (abs(deemph_settings[i] - wm8960->lrclk) < in wm8960_set_deemph()
180 abs(deemph_settings[best] - wm8960->lrclk)) in wm8960_set_deemph()
199 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_get_deemph() local
201 ucontrol->value.integer.value[0] = wm8960->deemph; in wm8960_get_deemph()
209 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_put_deemph() local
215 wm8960->deemph = deemph; in wm8960_put_deemph()
472 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_add_widgets() local
473 struct wm8960_data *pdata = &wm8960->pdata; in wm8960_add_widgets()
508 wm8960->lout1 = w; in wm8960_add_widgets()
510 wm8960->rout1 = w; in wm8960_add_widgets()
512 wm8960->out3 = w; in wm8960_add_widgets()
611 * @wm8960: codec private data
623 int wm8960_configure_sysclk(struct wm8960_priv *wm8960, int mclk, in wm8960_configure_sysclk() argument
633 bclk = wm8960->bclk; in wm8960_configure_sysclk()
634 lrclk = wm8960->lrclk; in wm8960_configure_sysclk()
688 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_configure_pll() local
693 bclk = wm8960->bclk; in wm8960_configure_pll()
694 lrclk = wm8960->lrclk; in wm8960_configure_pll()
739 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_configure_clocking() local
749 * compatible issue, just add '!wm8960->sysclk' condition in in wm8960_configure_clocking()
752 if (!(iface1 & (1 << 6)) && !wm8960->sysclk) { in wm8960_configure_clocking()
758 if (wm8960->clk_id != WM8960_SYSCLK_MCLK && !wm8960->freq_in) { in wm8960_configure_clocking()
763 freq_in = wm8960->freq_in; in wm8960_configure_clocking()
770 if (wm8960->clk_id == WM8960_SYSCLK_AUTO) { in wm8960_configure_clocking()
774 } else if (wm8960->sysclk) { in wm8960_configure_clocking()
775 freq_out = wm8960->sysclk; in wm8960_configure_clocking()
781 if (wm8960->clk_id != WM8960_SYSCLK_PLL) { in wm8960_configure_clocking()
782 ret = wm8960_configure_sysclk(wm8960, freq_out, &i, &j, &k); in wm8960_configure_clocking()
785 } else if (wm8960->clk_id != WM8960_SYSCLK_AUTO) { in wm8960_configure_clocking()
817 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_hw_params() local
822 wm8960->bclk = snd_soc_params_to_bclk(params); in wm8960_hw_params()
824 wm8960->bclk *= 2; in wm8960_hw_params()
849 wm8960->lrclk = params_rate(params); in wm8960_hw_params()
864 wm8960->is_stream_in_use[tx] = true; in wm8960_hw_params()
866 if (!wm8960->is_stream_in_use[!tx]) in wm8960_hw_params()
876 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_hw_free() local
879 wm8960->is_stream_in_use[tx] = false; in wm8960_hw_free()
898 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_bias_level_out3() local
909 if (!IS_ERR(wm8960->mclk)) { in wm8960_set_bias_level_out3()
910 ret = clk_prepare_enable(wm8960->mclk); in wm8960_set_bias_level_out3()
932 if (wm8960->clk_id == WM8960_SYSCLK_AUTO && (pm2 & 0x1)) in wm8960_set_bias_level_out3()
935 if (!IS_ERR(wm8960->mclk)) in wm8960_set_bias_level_out3()
936 clk_disable_unprepare(wm8960->mclk); in wm8960_set_bias_level_out3()
947 regcache_sync(wm8960->regmap); in wm8960_set_bias_level_out3()
988 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_bias_level_capless() local
1008 if (wm8960->lout1 && wm8960->lout1->power) in wm8960_set_bias_level_capless()
1010 if (wm8960->rout1 && wm8960->rout1->power) in wm8960_set_bias_level_capless()
1012 if (wm8960->out3 && wm8960->out3->power) in wm8960_set_bias_level_capless()
1032 if (!IS_ERR(wm8960->mclk)) { in wm8960_set_bias_level_capless()
1033 ret = clk_prepare_enable(wm8960->mclk); in wm8960_set_bias_level_capless()
1053 if (wm8960->clk_id == WM8960_SYSCLK_AUTO && (pm2 & 0x1)) in wm8960_set_bias_level_capless()
1056 if (!IS_ERR(wm8960->mclk)) in wm8960_set_bias_level_capless()
1057 clk_disable_unprepare(wm8960->mclk); in wm8960_set_bias_level_capless()
1072 regcache_sync(wm8960->regmap); in wm8960_set_bias_level_capless()
1146 pr_debug("WM8960 PLL: setting %dHz->%dHz\n", source, target); in pll_factors()
1160 pr_err("WM8960 PLL: Unsupported N=%d\n", Ndiv); in pll_factors()
1181 pr_debug("WM8960 PLL: N=%x K=%x pre_div=%d\n", in pll_factors()
1233 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_dai_pll() local
1235 wm8960->freq_in = freq_in; in wm8960_set_dai_pll()
1280 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_bias_level() local
1282 return wm8960->set_bias_level(component, level); in wm8960_set_bias_level()
1289 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_set_dai_sysclk() local
1306 wm8960->sysclk = freq; in wm8960_set_dai_sysclk()
1307 wm8960->clk_id = clk_id; in wm8960_set_dai_sysclk()
1330 .name = "wm8960-hifi",
1349 struct wm8960_priv *wm8960 = snd_soc_component_get_drvdata(component); in wm8960_probe() local
1350 struct wm8960_data *pdata = &wm8960->pdata; in wm8960_probe()
1353 wm8960->set_bias_level = wm8960_set_bias_level_capless; in wm8960_probe()
1355 wm8960->set_bias_level = wm8960_set_bias_level_out3; in wm8960_probe()
1408 struct wm8960_priv *wm8960; in wm8960_i2c_probe() local
1411 wm8960 = devm_kzalloc(&i2c->dev, sizeof(struct wm8960_priv), in wm8960_i2c_probe()
1413 if (wm8960 == NULL) in wm8960_i2c_probe()
1416 wm8960->mclk = devm_clk_get(&i2c->dev, "mclk"); in wm8960_i2c_probe()
1417 if (IS_ERR(wm8960->mclk)) { in wm8960_i2c_probe()
1418 if (PTR_ERR(wm8960->mclk) == -EPROBE_DEFER) in wm8960_i2c_probe()
1422 wm8960->regmap = devm_regmap_init_i2c(i2c, &wm8960_regmap); in wm8960_i2c_probe()
1423 if (IS_ERR(wm8960->regmap)) in wm8960_i2c_probe()
1424 return PTR_ERR(wm8960->regmap); in wm8960_i2c_probe()
1427 memcpy(&wm8960->pdata, pdata, sizeof(struct wm8960_data)); in wm8960_i2c_probe()
1429 wm8960_set_pdata_from_of(i2c, &wm8960->pdata); in wm8960_i2c_probe()
1431 ret = wm8960_reset(wm8960->regmap); in wm8960_i2c_probe()
1437 if (wm8960->pdata.shared_lrclk) { in wm8960_i2c_probe()
1438 ret = regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2, in wm8960_i2c_probe()
1448 regmap_update_bits(wm8960->regmap, WM8960_LINVOL, 0x100, 0x100); in wm8960_i2c_probe()
1449 regmap_update_bits(wm8960->regmap, WM8960_RINVOL, 0x100, 0x100); in wm8960_i2c_probe()
1450 regmap_update_bits(wm8960->regmap, WM8960_LADC, 0x100, 0x100); in wm8960_i2c_probe()
1451 regmap_update_bits(wm8960->regmap, WM8960_RADC, 0x100, 0x100); in wm8960_i2c_probe()
1452 regmap_update_bits(wm8960->regmap, WM8960_LDAC, 0x100, 0x100); in wm8960_i2c_probe()
1453 regmap_update_bits(wm8960->regmap, WM8960_RDAC, 0x100, 0x100); in wm8960_i2c_probe()
1454 regmap_update_bits(wm8960->regmap, WM8960_LOUT1, 0x100, 0x100); in wm8960_i2c_probe()
1455 regmap_update_bits(wm8960->regmap, WM8960_ROUT1, 0x100, 0x100); in wm8960_i2c_probe()
1456 regmap_update_bits(wm8960->regmap, WM8960_LOUT2, 0x100, 0x100); in wm8960_i2c_probe()
1457 regmap_update_bits(wm8960->regmap, WM8960_ROUT2, 0x100, 0x100); in wm8960_i2c_probe()
1460 regmap_update_bits(wm8960->regmap, WM8960_IFACE2, 1 << 6, in wm8960_i2c_probe()
1461 wm8960->pdata.gpio_cfg[0] << 6); in wm8960_i2c_probe()
1462 regmap_update_bits(wm8960->regmap, WM8960_ADDCTL4, 0xF << 4, in wm8960_i2c_probe()
1463 wm8960->pdata.gpio_cfg[1] << 4); in wm8960_i2c_probe()
1466 regmap_update_bits(wm8960->regmap, WM8960_ADDCTL4, 3 << 2, in wm8960_i2c_probe()
1467 wm8960->pdata.hp_cfg[0] << 2); in wm8960_i2c_probe()
1468 regmap_update_bits(wm8960->regmap, WM8960_ADDCTL2, 3 << 5, in wm8960_i2c_probe()
1469 wm8960->pdata.hp_cfg[1] << 5); in wm8960_i2c_probe()
1470 regmap_update_bits(wm8960->regmap, WM8960_ADDCTL1, 3, in wm8960_i2c_probe()
1471 wm8960->pdata.hp_cfg[2]); in wm8960_i2c_probe()
1473 i2c_set_clientdata(i2c, wm8960); in wm8960_i2c_probe()
1487 { "wm8960", 0 },
1493 { .compatible = "wlf,wm8960", },
1500 .name = "wm8960",
1510 MODULE_DESCRIPTION("ASoC WM8960 driver");