Lines Matching +full:spi +full:- +full:mux

2  * wm8995.c  --  WM8995 ALSA SoC Audio driver
22 #include <linux/spi/spi.h>
29 #include <sound/soc-dapm.h>
403 regcache_mark_dirty(wm8995->regmap); \
417 static const DECLARE_TLV_DB_SCALE(digital_tlv, -7200, 75, 1);
418 static const DECLARE_TLV_DB_SCALE(in1lr_pga_tlv, -1650, 150, 0);
420 static const DECLARE_TLV_DB_SCALE(sidetone_tlv, -3600, 150, 0);
423 "Differential", "Single-ended IN1LN", "Single-ended IN1LP"
430 "Differential", "Single-ended IN1RN", "Single-ended IN1RP"
498 dev_dbg(codec->dev, "Class W source AIF2DAC\n"); in wm8995_update_class_w()
502 dev_dbg(codec->dev, "Class W source AIF1DAC2\n"); in wm8995_update_class_w()
506 dev_dbg(codec->dev, "Class W source AIF1DAC1\n"); in wm8995_update_class_w()
510 dev_dbg(codec->dev, "DAC mixer setting: %x\n", reg); in wm8995_update_class_w()
517 dev_dbg(codec->dev, "Left and right DAC mixers different\n"); in wm8995_update_class_w()
522 dev_dbg(codec->dev, "Class W enabled\n"); in wm8995_update_class_w()
528 dev_dbg(codec->dev, "Class W disabled\n"); in wm8995_update_class_w()
540 reg = snd_soc_read(source->codec, WM8995_CLOCKING_1); in check_clk_sys()
546 return !strcmp(source->name, clk); in check_clk_sys()
553 struct snd_soc_dapm_widget *w = wlist->widgets[0]; in wm8995_put_class_w()
557 codec = w->codec; in wm8995_put_class_w()
569 codec = w->codec; in hp_supply_event()
602 dev_dbg(codec->dev, "%s: reg = %#x, val = %#x, mask = %#x\n", in dc_servo_cmd()
606 while (timeout--) { in dc_servo_cmd()
613 dev_err(codec->dev, "Timed out waiting for DC Servo\n"); in dc_servo_cmd()
622 codec = w->codec; in hp_event()
693 switch (wm8995->sysclk[aif]) { in configure_aif_clock()
695 rate = wm8995->mclk[0]; in configure_aif_clock()
699 rate = wm8995->mclk[1]; in configure_aif_clock()
703 rate = wm8995->fll[0].out; in configure_aif_clock()
707 rate = wm8995->fll[1].out; in configure_aif_clock()
710 return -EINVAL; in configure_aif_clock()
717 dev_dbg(codec->dev, "Dividing AIF%d clock to %dHz\n", in configure_aif_clock()
721 wm8995->aifclk[aif] = rate; in configure_aif_clock()
748 if (wm8995->aifclk[0] == wm8995->aifclk[1]) in configure_clock()
751 if (wm8995->aifclk[0] < wm8995->aifclk[1]) in configure_clock()
761 snd_soc_dapm_sync(&codec->dapm); in configure_clock()
771 codec = w->codec; in clk_sys_event()
793 SOC_DAPM_ENUM("Left Sidetone Mux", sidetone1_enum);
799 SOC_DAPM_ENUM("Right Sidetone Mux", sidetone2_enum);
896 SOC_DAPM_ENUM_VIRT("ADCL Mux", adc_enum);
899 SOC_DAPM_ENUM_VIRT("ADCR Mux", adc_enum);
959 SND_SOC_DAPM_VIRT_MUX("ADCL Mux", SND_SOC_NOPM, 1, 0,
961 SND_SOC_DAPM_VIRT_MUX("ADCR Mux", SND_SOC_NOPM, 0, 0,
1081 { "ADCL Mux", "ADC", "ADCL" },
1082 { "ADCL Mux", "DMIC", "DMIC1L" },
1083 { "ADCR Mux", "ADC", "ADCR" },
1084 { "ADCR Mux", "DMIC", "DMIC1R" },
1088 { "AIF1ADC1L Mixer", "ADC/DMIC Switch", "ADCL Mux" },
1091 { "AIF1ADC1R Mixer", "ADC/DMIC Switch", "ADCR Mux" },
1438 struct snd_soc_codec *codec = dai->codec; in wm8995_aif_mute()
1441 switch (dai->id) { in wm8995_aif_mute()
1449 return -EINVAL; in wm8995_aif_mute()
1463 codec = dai->codec; in wm8995_set_dai_fmt()
1473 dev_err(dai->dev, "Unknown master/slave configuration\n"); in wm8995_set_dai_fmt()
1474 return -EINVAL; in wm8995_set_dai_fmt()
1493 dev_err(dai->dev, "Unknown dai format\n"); in wm8995_set_dai_fmt()
1494 return -EINVAL; in wm8995_set_dai_fmt()
1508 return -EINVAL; in wm8995_set_dai_fmt()
1528 return -EINVAL; in wm8995_set_dai_fmt()
1532 return -EINVAL; in wm8995_set_dai_fmt()
1550 -1 /* reserved */,
1573 codec = dai->codec; in wm8995_hw_params()
1576 switch (dai->id) { in wm8995_hw_params()
1581 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK /* || in wm8995_hw_params()
1582 wm8995->lrclk_shared[0] */) { in wm8995_hw_params()
1586 dev_dbg(codec->dev, "AIF1 using split LRCLK\n"); in wm8995_hw_params()
1593 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK /* || in wm8995_hw_params()
1594 wm8995->lrclk_shared[1] */) { in wm8995_hw_params()
1598 dev_dbg(codec->dev, "AIF2 using split LRCLK\n"); in wm8995_hw_params()
1602 return -EINVAL; in wm8995_hw_params()
1623 dev_err(dai->dev, "Unsupported word length %u\n", in wm8995_hw_params()
1625 return -EINVAL; in wm8995_hw_params()
1633 dev_err(dai->dev, "Sample rate %d is not supported\n", in wm8995_hw_params()
1635 return -EINVAL; in wm8995_hw_params()
1639 dev_dbg(dai->dev, "Sample rate is %dHz\n", srs[i]); in wm8995_hw_params()
1640 dev_dbg(dai->dev, "AIF%dCLK is %dHz, target BCLK %dHz\n", in wm8995_hw_params()
1641 dai->id + 1, wm8995->aifclk[dai->id], bclk_rate); in wm8995_hw_params()
1646 - wm8995->aifclk[dai->id]); in wm8995_hw_params()
1649 - wm8995->aifclk[dai->id]); in wm8995_hw_params()
1657 dev_dbg(dai->dev, "Selected AIF%dCLK/fs = %d\n", in wm8995_hw_params()
1658 dai->id + 1, fs_ratios[best]); in wm8995_hw_params()
1669 cur_val = (wm8995->aifclk[dai->id] * 10 / bclk_divs[i]) - bclk_rate; in wm8995_hw_params()
1676 bclk_rate = wm8995->aifclk[dai->id] * 10 / bclk_divs[best]; in wm8995_hw_params()
1677 dev_dbg(dai->dev, "Using BCLK_DIV %d for actual BCLK %dHz\n", in wm8995_hw_params()
1681 dev_dbg(dai->dev, "Using LRCLK rate %d for actual LRCLK %dHz\n", in wm8995_hw_params()
1698 struct snd_soc_codec *codec = codec_dai->codec; in wm8995_set_tristate()
1701 switch (codec_dai->id) { in wm8995_set_tristate()
1715 return -EINVAL; in wm8995_set_tristate()
1747 fll->clk_ref_div = 0; in wm8995_get_fll_config()
1749 fll->clk_ref_div++; in wm8995_get_fll_config()
1752 if (fll->clk_ref_div > 3) in wm8995_get_fll_config()
1753 return -EINVAL; in wm8995_get_fll_config()
1755 pr_debug("CLK_REF_DIV=%d, Fref=%dHz\n", fll->clk_ref_div, freq_in); in wm8995_get_fll_config()
1758 fll->outdiv = 3; in wm8995_get_fll_config()
1759 while (freq_out * (fll->outdiv + 1) < 90000000) { in wm8995_get_fll_config()
1760 fll->outdiv++; in wm8995_get_fll_config()
1761 if (fll->outdiv > 63) in wm8995_get_fll_config()
1762 return -EINVAL; in wm8995_get_fll_config()
1764 freq_out *= fll->outdiv + 1; in wm8995_get_fll_config()
1765 pr_debug("OUTDIV=%d, Fvco=%dHz\n", fll->outdiv, freq_out); in wm8995_get_fll_config()
1768 fll->fll_fratio = 0; in wm8995_get_fll_config()
1770 fll->fll_fratio = 1; in wm8995_get_fll_config()
1773 fll->fll_fratio = 2; in wm8995_get_fll_config()
1776 fll->fll_fratio = 3; in wm8995_get_fll_config()
1779 fll->fll_fratio = 4; in wm8995_get_fll_config()
1782 pr_debug("FLL_FRATIO=%d, Fref=%dHz\n", fll->fll_fratio, freq_in); in wm8995_get_fll_config()
1787 fll->n = Ndiv; in wm8995_get_fll_config()
1791 /* Calculate fractional part - scale up so we can round. */ in wm8995_get_fll_config()
1802 fll->k = K / 10; in wm8995_get_fll_config()
1804 pr_debug("N=%x K=%x\n", fll->n, fll->k); in wm8995_get_fll_config()
1819 codec = dai->codec; in wm8995_set_fll()
1838 return -EINVAL; in wm8995_set_fll()
1845 return -EINVAL; in wm8995_set_fll()
1853 return -EINVAL; in wm8995_set_fll()
1857 if (wm8995->fll[id].src == src && in wm8995_set_fll()
1858 wm8995->fll[id].in == freq_in && wm8995->fll[id].out == freq_out) in wm8995_set_fll()
1861 /* If we're stopping the FLL redo the old config - no in wm8995_set_fll()
1868 ret = wm8995_get_fll_config(&fll, wm8995->fll[id].in, in wm8995_set_fll()
1869 wm8995->fll[id].out); in wm8995_set_fll()
1899 (src - 1)); in wm8995_set_fll()
1905 wm8995->fll[id].in = freq_in; in wm8995_set_fll()
1906 wm8995->fll[id].out = freq_out; in wm8995_set_fll()
1907 wm8995->fll[id].src = src; in wm8995_set_fll()
1926 codec = dai->codec; in wm8995_set_dai_sysclk()
1929 switch (dai->id) { in wm8995_set_dai_sysclk()
1935 return -EINVAL; in wm8995_set_dai_sysclk()
1940 wm8995->sysclk[dai->id] = WM8995_SYSCLK_MCLK1; in wm8995_set_dai_sysclk()
1941 wm8995->mclk[0] = freq; in wm8995_set_dai_sysclk()
1942 dev_dbg(dai->dev, "AIF%d using MCLK1 at %uHz\n", in wm8995_set_dai_sysclk()
1943 dai->id + 1, freq); in wm8995_set_dai_sysclk()
1946 wm8995->sysclk[dai->id] = WM8995_SYSCLK_MCLK1; in wm8995_set_dai_sysclk()
1947 wm8995->mclk[1] = freq; in wm8995_set_dai_sysclk()
1948 dev_dbg(dai->dev, "AIF%d using MCLK2 at %uHz\n", in wm8995_set_dai_sysclk()
1949 dai->id + 1, freq); in wm8995_set_dai_sysclk()
1952 wm8995->sysclk[dai->id] = WM8995_SYSCLK_FLL1; in wm8995_set_dai_sysclk()
1953 dev_dbg(dai->dev, "AIF%d using FLL1\n", dai->id + 1); in wm8995_set_dai_sysclk()
1956 wm8995->sysclk[dai->id] = WM8995_SYSCLK_FLL2; in wm8995_set_dai_sysclk()
1957 dev_dbg(dai->dev, "AIF%d using FLL2\n", dai->id + 1); in wm8995_set_dai_sysclk()
1961 dev_err(dai->dev, "Unknown clock source %d\n", clk_id); in wm8995_set_dai_sysclk()
1962 return -EINVAL; in wm8995_set_dai_sysclk()
1982 if (codec->dapm.bias_level == SND_SOC_BIAS_OFF) { in wm8995_set_bias_level()
1983 ret = regulator_bulk_enable(ARRAY_SIZE(wm8995->supplies), in wm8995_set_bias_level()
1984 wm8995->supplies); in wm8995_set_bias_level()
1988 ret = regcache_sync(wm8995->regmap); in wm8995_set_bias_level()
1990 dev_err(codec->dev, in wm8995_set_bias_level()
2002 regulator_bulk_disable(ARRAY_SIZE(wm8995->supplies), in wm8995_set_bias_level()
2003 wm8995->supplies); in wm8995_set_bias_level()
2007 codec->dapm.bias_level = level; in wm8995_set_bias_level()
2036 for (i = 0; i < ARRAY_SIZE(wm8995->supplies); ++i) in wm8995_remove()
2037 regulator_unregister_notifier(wm8995->supplies[i].consumer, in wm8995_remove()
2038 &wm8995->disable_nb[i]); in wm8995_remove()
2040 regulator_bulk_free(ARRAY_SIZE(wm8995->supplies), wm8995->supplies); in wm8995_remove()
2050 codec->dapm.idle_bias_off = 1; in wm8995_probe()
2052 wm8995->codec = codec; in wm8995_probe()
2054 codec->control_data = wm8995->regmap; in wm8995_probe()
2057 dev_err(codec->dev, "Failed to set cache i/o: %d\n", ret); in wm8995_probe()
2061 for (i = 0; i < ARRAY_SIZE(wm8995->supplies); i++) in wm8995_probe()
2062 wm8995->supplies[i].supply = wm8995_supply_names[i]; in wm8995_probe()
2064 ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(wm8995->supplies), in wm8995_probe()
2065 wm8995->supplies); in wm8995_probe()
2067 dev_err(codec->dev, "Failed to request supplies: %d\n", ret); in wm8995_probe()
2071 wm8995->disable_nb[0].notifier_call = wm8995_regulator_event_0; in wm8995_probe()
2072 wm8995->disable_nb[1].notifier_call = wm8995_regulator_event_1; in wm8995_probe()
2073 wm8995->disable_nb[2].notifier_call = wm8995_regulator_event_2; in wm8995_probe()
2074 wm8995->disable_nb[3].notifier_call = wm8995_regulator_event_3; in wm8995_probe()
2075 wm8995->disable_nb[4].notifier_call = wm8995_regulator_event_4; in wm8995_probe()
2076 wm8995->disable_nb[5].notifier_call = wm8995_regulator_event_5; in wm8995_probe()
2077 wm8995->disable_nb[6].notifier_call = wm8995_regulator_event_6; in wm8995_probe()
2078 wm8995->disable_nb[7].notifier_call = wm8995_regulator_event_7; in wm8995_probe()
2081 for (i = 0; i < ARRAY_SIZE(wm8995->supplies); i++) { in wm8995_probe()
2082 ret = regulator_register_notifier(wm8995->supplies[i].consumer, in wm8995_probe()
2083 &wm8995->disable_nb[i]); in wm8995_probe()
2085 dev_err(codec->dev, in wm8995_probe()
2091 ret = regulator_bulk_enable(ARRAY_SIZE(wm8995->supplies), in wm8995_probe()
2092 wm8995->supplies); in wm8995_probe()
2094 dev_err(codec->dev, "Failed to enable supplies: %d\n", ret); in wm8995_probe()
2100 dev_err(codec->dev, "Failed to read device ID: %d\n", ret); in wm8995_probe()
2105 dev_err(codec->dev, "Invalid device ID: %#x\n", ret); in wm8995_probe()
2106 ret = -EINVAL; in wm8995_probe()
2112 dev_err(codec->dev, "Failed to issue reset: %d\n", ret); in wm8995_probe()
2142 snd_soc_dapm_new_controls(&codec->dapm, wm8995_dapm_widgets, in wm8995_probe()
2144 snd_soc_dapm_add_routes(&codec->dapm, wm8995_intercon, in wm8995_probe()
2150 regulator_bulk_disable(ARRAY_SIZE(wm8995->supplies), wm8995->supplies); in wm8995_probe()
2152 regulator_bulk_free(ARRAY_SIZE(wm8995->supplies), wm8995->supplies); in wm8995_probe()
2183 .name = "wm8995-aif1",
2201 .name = "wm8995-aif2",
2219 .name = "wm8995-aif3",
2259 static int __devinit wm8995_spi_probe(struct spi_device *spi) in wm8995_spi_probe() argument
2266 return -ENOMEM; in wm8995_spi_probe()
2268 spi_set_drvdata(spi, wm8995); in wm8995_spi_probe()
2270 wm8995->regmap = regmap_init_spi(spi, &wm8995_regmap); in wm8995_spi_probe()
2271 if (IS_ERR(wm8995->regmap)) { in wm8995_spi_probe()
2272 ret = PTR_ERR(wm8995->regmap); in wm8995_spi_probe()
2273 dev_err(&spi->dev, "Failed to register regmap: %d\n", ret); in wm8995_spi_probe()
2277 ret = snd_soc_register_codec(&spi->dev, in wm8995_spi_probe()
2286 regmap_exit(wm8995->regmap); in wm8995_spi_probe()
2293 static int __devexit wm8995_spi_remove(struct spi_device *spi) in wm8995_spi_remove() argument
2295 struct wm8995_priv *wm8995 = spi_get_drvdata(spi); in wm8995_spi_remove()
2296 snd_soc_unregister_codec(&spi->dev); in wm8995_spi_remove()
2297 regmap_exit(wm8995->regmap); in wm8995_spi_remove()
2321 return -ENOMEM; in wm8995_i2c_probe()
2325 wm8995->regmap = regmap_init_i2c(i2c, &wm8995_regmap); in wm8995_i2c_probe()
2326 if (IS_ERR(wm8995->regmap)) { in wm8995_i2c_probe()
2327 ret = PTR_ERR(wm8995->regmap); in wm8995_i2c_probe()
2328 dev_err(&i2c->dev, "Failed to register regmap: %d\n", ret); in wm8995_i2c_probe()
2332 ret = snd_soc_register_codec(&i2c->dev, in wm8995_i2c_probe()
2336 dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret); in wm8995_i2c_probe()
2343 regmap_exit(wm8995->regmap); in wm8995_i2c_probe()
2354 snd_soc_unregister_codec(&client->dev); in wm8995_i2c_remove()
2355 regmap_exit(wm8995->regmap); in wm8995_i2c_remove()
2392 printk(KERN_ERR "Failed to register wm8995 SPI driver: %d\n", in wm8995_modinit()