• Home
  • Raw
  • Download

Lines Matching +full:dmic1 +full:- +full:clk +full:- +full:pin

1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs53l30.c -- CS53l30 ALSA Soc Audio driver
11 #include <linux/clk.h>
35 struct clk *mclk;
166 static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0);
167 static DECLARE_TLV_DB_SCALE(dig_tlv, -9600, 100, 1);
171 "DMIC1 On AB In",
172 "DMIC1 On A In",
173 "DMIC1 On B In",
177 "DMIC1 Off ADC1 Off",
245 * TB - Time base
264 "-64dB/-34dB", "-66dB/-36dB", "-70dB/-40dB", "-73dB/-43dB",
265 "-76dB/-46dB", "-82dB/-52dB", "-58dB", "-64dB",
292 SOC_SINGLE("Digital Soft-Ramp Switch", CS53L30_SFT_RAMP,
400 SND_SOC_DAPM_ADC("DMIC1", NULL, CS53L30_ADCDMIC1_CTL1,
423 {"DMIC1", NULL, "IN1_DMIC1"},
424 {"Input Mux 1", "DMIC1_SEL", "DMIC1"},
529 return -EINVAL; in cs53l30_get_mclkx_coeff()
542 return -EINVAL; in cs53l30_get_mclk_coeff()
548 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_sysclk()
552 /* MCLKX -> MCLK */ in cs53l30_set_sysclk()
560 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_sysclk()
564 priv->mclk_rate = mclk_rate; in cs53l30_set_sysclk()
571 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_dai_fmt()
581 return -EINVAL; in cs53l30_set_dai_fmt()
587 /* Set TDM_PDN to turn off TDM mode -- Reset default */ in cs53l30_set_dai_fmt()
593 * with SHIFT_LEFT = 1 combination as Figure 4-13 shows in in cs53l30_set_dai_fmt()
599 return -EINVAL; in cs53l30_set_dai_fmt()
612 regmap_update_bits(priv->regmap, CS53L30_ASPCFG_CTL, in cs53l30_set_dai_fmt()
615 regmap_update_bits(priv->regmap, CS53L30_ASP_CTL1, in cs53l30_set_dai_fmt()
625 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_pcm_hw_params()
629 /* MCLK -> srate */ in cs53l30_pcm_hw_params()
630 mclk_coeff = cs53l30_get_mclk_coeff(priv->mclk_rate, srate); in cs53l30_pcm_hw_params()
632 return -EINVAL; in cs53l30_pcm_hw_params()
634 regmap_update_bits(priv->regmap, CS53L30_INT_SR_CTL, in cs53l30_pcm_hw_params()
638 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_pcm_hw_params()
642 regmap_update_bits(priv->regmap, CS53L30_ASPCFG_CTL, in cs53l30_pcm_hw_params()
661 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) in cs53l30_set_bias_level()
662 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
666 if (dapm->bias_level == SND_SOC_BIAS_OFF) { in cs53l30_set_bias_level()
667 ret = clk_prepare_enable(priv->mclk); in cs53l30_set_bias_level()
669 dev_err(component->dev, in cs53l30_set_bias_level()
673 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_bias_level()
675 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
679 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
685 regmap_update_bits(priv->regmap, CS53L30_INT_MASK, in cs53l30_set_bias_level()
694 regmap_read(priv->regmap, CS53L30_SFT_RAMP, &reg); in cs53l30_set_bias_level()
700 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
706 regmap_read(priv->regmap, CS53L30_IS, &reg); in cs53l30_set_bias_level()
710 regmap_read(priv->regmap, CS53L30_IS, &reg); in cs53l30_set_bias_level()
715 regmap_read(priv->regmap, CS53L30_IS, &reg); in cs53l30_set_bias_level()
721 regmap_update_bits(priv->regmap, CS53L30_INT_MASK, in cs53l30_set_bias_level()
723 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_bias_level()
726 clk_disable_unprepare(priv->mclk); in cs53l30_set_bias_level()
735 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_tristate()
738 return regmap_update_bits(priv->regmap, CS53L30_ASP_CTL1, in cs53l30_set_tristate()
754 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs53l30_pcm_startup()
769 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_dai_tdm_slot()
776 dev_err(dai->dev, "rx masks must not be 0\n"); in cs53l30_set_dai_tdm_slot()
777 return -EINVAL; in cs53l30_set_dai_tdm_slot()
782 dev_err(dai->dev, "invalid slot number or slot width\n"); in cs53l30_set_dai_tdm_slot()
783 return -EINVAL; in cs53l30_set_dai_tdm_slot()
787 dev_err(dai->dev, "slot width must count in byte\n"); in cs53l30_set_dai_tdm_slot()
788 return -EINVAL; in cs53l30_set_dai_tdm_slot()
800 tx_enable |= (u64)((u64)(1 << slot_step) - 1) << (u64)loc[i]; in cs53l30_set_dai_tdm_slot()
807 dev_err(dai->dev, "rx_mask exceeds max slot number: %d\n", in cs53l30_set_dai_tdm_slot()
809 return -EINVAL; in cs53l30_set_dai_tdm_slot()
813 slot_next = loc[i - 1] + slot_step - 1; in cs53l30_set_dai_tdm_slot()
815 dev_err(dai->dev, "slot selection out of bounds: %u\n", in cs53l30_set_dai_tdm_slot()
817 return -EINVAL; in cs53l30_set_dai_tdm_slot()
821 regmap_update_bits(priv->regmap, CS53L30_ASP_TDMTX_CTL(i), in cs53l30_set_dai_tdm_slot()
823 dev_dbg(dai->dev, "loc[%d]=%x\n", i, loc[i]); in cs53l30_set_dai_tdm_slot()
827 regmap_write(priv->regmap, CS53L30_ASP_TDMTX_ENx(i), in cs53l30_set_dai_tdm_slot()
830 dev_dbg(dai->dev, "en_reg=%x, tx_enable=%llx\n", in cs53l30_set_dai_tdm_slot()
839 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_mute_stream()
841 gpiod_set_value_cansleep(priv->mute_gpio, mute); in cs53l30_mute_stream()
846 /* SNDRV_PCM_RATE_KNOT -> 12000, 24000 Hz, limit with constraint list */
880 if (priv->use_sdout2) in cs53l30_component_probe()
920 const struct device_node *np = client->dev.of_node; in cs53l30_i2c_probe()
921 struct device *dev = &client->dev; in cs53l30_i2c_probe()
930 return -ENOMEM; in cs53l30_i2c_probe()
932 for (i = 0; i < ARRAY_SIZE(cs53l30->supplies); i++) in cs53l30_i2c_probe()
933 cs53l30->supplies[i].supply = cs53l30_supply_names[i]; in cs53l30_i2c_probe()
935 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
936 cs53l30->supplies); in cs53l30_i2c_probe()
942 ret = regulator_bulk_enable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
943 cs53l30->supplies); in cs53l30_i2c_probe()
950 cs53l30->reset_gpio = devm_gpiod_get_optional(dev, "reset", in cs53l30_i2c_probe()
952 if (IS_ERR(cs53l30->reset_gpio)) { in cs53l30_i2c_probe()
953 ret = PTR_ERR(cs53l30->reset_gpio); in cs53l30_i2c_probe()
957 gpiod_set_value_cansleep(cs53l30->reset_gpio, 1); in cs53l30_i2c_probe()
961 cs53l30->mclk_rate = 0; in cs53l30_i2c_probe()
963 cs53l30->regmap = devm_regmap_init_i2c(client, &cs53l30_regmap); in cs53l30_i2c_probe()
964 if (IS_ERR(cs53l30->regmap)) { in cs53l30_i2c_probe()
965 ret = PTR_ERR(cs53l30->regmap); in cs53l30_i2c_probe()
971 ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_AB, &reg); in cs53l30_i2c_probe()
974 ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_CD, &reg); in cs53l30_i2c_probe()
977 ret = regmap_read(cs53l30->regmap, CS53L30_DEVID_E, &reg); in cs53l30_i2c_probe()
981 ret = -ENODEV; in cs53l30_i2c_probe()
987 ret = regmap_read(cs53l30->regmap, CS53L30_REVID, &reg); in cs53l30_i2c_probe()
994 cs53l30->mclk = devm_clk_get(dev, "mclk"); in cs53l30_i2c_probe()
995 if (IS_ERR(cs53l30->mclk)) { in cs53l30_i2c_probe()
996 if (PTR_ERR(cs53l30->mclk) != -ENOENT) { in cs53l30_i2c_probe()
997 ret = PTR_ERR(cs53l30->mclk); in cs53l30_i2c_probe()
1001 cs53l30->mclk = NULL; in cs53l30_i2c_probe()
1005 cs53l30->mute_gpio = devm_gpiod_get_optional(dev, "mute", in cs53l30_i2c_probe()
1007 if (IS_ERR(cs53l30->mute_gpio)) { in cs53l30_i2c_probe()
1008 ret = PTR_ERR(cs53l30->mute_gpio); in cs53l30_i2c_probe()
1012 if (cs53l30->mute_gpio) { in cs53l30_i2c_probe()
1013 /* Enable MUTE controls via MUTE pin */ in cs53l30_i2c_probe()
1014 regmap_write(cs53l30->regmap, CS53L30_MUTEP_CTL1, in cs53l30_i2c_probe()
1016 /* Flip the polarity of MUTE pin */ in cs53l30_i2c_probe()
1017 if (gpiod_is_active_low(cs53l30->mute_gpio)) in cs53l30_i2c_probe()
1018 regmap_update_bits(cs53l30->regmap, CS53L30_MUTEP_CTL2, in cs53l30_i2c_probe()
1022 if (!of_property_read_u8(np, "cirrus,micbias-lvl", &val)) in cs53l30_i2c_probe()
1023 regmap_update_bits(cs53l30->regmap, CS53L30_MICBIAS_CTL, in cs53l30_i2c_probe()
1026 if (of_property_read_bool(np, "cirrus,use-sdout2")) in cs53l30_i2c_probe()
1027 cs53l30->use_sdout2 = true; in cs53l30_i2c_probe()
1040 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
1041 cs53l30->supplies); in cs53l30_i2c_probe()
1050 gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); in cs53l30_i2c_remove()
1052 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_remove()
1053 cs53l30->supplies); in cs53l30_i2c_remove()
1063 regcache_cache_only(cs53l30->regmap, true); in cs53l30_runtime_suspend()
1066 gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); in cs53l30_runtime_suspend()
1068 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_runtime_suspend()
1069 cs53l30->supplies); in cs53l30_runtime_suspend()
1079 ret = regulator_bulk_enable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_runtime_resume()
1080 cs53l30->supplies); in cs53l30_runtime_resume()
1086 gpiod_set_value_cansleep(cs53l30->reset_gpio, 1); in cs53l30_runtime_resume()
1088 regcache_cache_only(cs53l30->regmap, false); in cs53l30_runtime_resume()
1089 ret = regcache_sync(cs53l30->regmap); in cs53l30_runtime_resume()