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>
36 struct clk *mclk;
167 static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0);
168 static DECLARE_TLV_DB_SCALE(dig_tlv, -9600, 100, 1);
172 "DMIC1 On AB In",
173 "DMIC1 On A In",
174 "DMIC1 On B In",
178 "DMIC1 Off ADC1 Off",
246 * TB - Time base
265 "-64dB/-34dB", "-66dB/-36dB", "-70dB/-40dB", "-73dB/-43dB",
266 "-76dB/-46dB", "-82dB/-52dB", "-58dB", "-64dB",
293 SOC_SINGLE("Digital Soft-Ramp Switch", CS53L30_SFT_RAMP,
401 SND_SOC_DAPM_ADC("DMIC1", NULL, CS53L30_ADCDMIC1_CTL1,
424 {"DMIC1", NULL, "IN1_DMIC1"},
425 {"Input Mux 1", "DMIC1_SEL", "DMIC1"},
530 return -EINVAL; in cs53l30_get_mclkx_coeff()
543 return -EINVAL; in cs53l30_get_mclk_coeff()
549 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_sysclk()
553 /* MCLKX -> MCLK */ in cs53l30_set_sysclk()
561 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_sysclk()
565 priv->mclk_rate = mclk_rate; in cs53l30_set_sysclk()
572 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_dai_fmt()
582 return -EINVAL; in cs53l30_set_dai_fmt()
588 /* Set TDM_PDN to turn off TDM mode -- Reset default */ in cs53l30_set_dai_fmt()
594 * with SHIFT_LEFT = 1 combination as Figure 4-13 shows in in cs53l30_set_dai_fmt()
600 return -EINVAL; in cs53l30_set_dai_fmt()
613 regmap_update_bits(priv->regmap, CS53L30_ASPCFG_CTL, in cs53l30_set_dai_fmt()
616 regmap_update_bits(priv->regmap, CS53L30_ASP_CTL1, in cs53l30_set_dai_fmt()
626 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_pcm_hw_params()
630 /* MCLK -> srate */ in cs53l30_pcm_hw_params()
631 mclk_coeff = cs53l30_get_mclk_coeff(priv->mclk_rate, srate); in cs53l30_pcm_hw_params()
633 return -EINVAL; in cs53l30_pcm_hw_params()
635 regmap_update_bits(priv->regmap, CS53L30_INT_SR_CTL, in cs53l30_pcm_hw_params()
639 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_pcm_hw_params()
643 regmap_update_bits(priv->regmap, CS53L30_ASPCFG_CTL, in cs53l30_pcm_hw_params()
662 if (dapm->bias_level == SND_SOC_BIAS_STANDBY) in cs53l30_set_bias_level()
663 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
667 if (dapm->bias_level == SND_SOC_BIAS_OFF) { in cs53l30_set_bias_level()
668 ret = clk_prepare_enable(priv->mclk); in cs53l30_set_bias_level()
670 dev_err(component->dev, in cs53l30_set_bias_level()
674 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_bias_level()
676 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
680 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
686 regmap_update_bits(priv->regmap, CS53L30_INT_MASK, in cs53l30_set_bias_level()
695 regmap_read(priv->regmap, CS53L30_SFT_RAMP, ®); in cs53l30_set_bias_level()
701 regmap_update_bits(priv->regmap, CS53L30_PWRCTL, in cs53l30_set_bias_level()
707 regmap_read(priv->regmap, CS53L30_IS, ®); in cs53l30_set_bias_level()
711 regmap_read(priv->regmap, CS53L30_IS, ®); in cs53l30_set_bias_level()
716 regmap_read(priv->regmap, CS53L30_IS, ®); in cs53l30_set_bias_level()
722 regmap_update_bits(priv->regmap, CS53L30_INT_MASK, in cs53l30_set_bias_level()
724 regmap_update_bits(priv->regmap, CS53L30_MCLKCTL, in cs53l30_set_bias_level()
727 clk_disable_unprepare(priv->mclk); in cs53l30_set_bias_level()
736 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_tristate()
739 return regmap_update_bits(priv->regmap, CS53L30_ASP_CTL1, in cs53l30_set_tristate()
755 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs53l30_pcm_startup()
770 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_set_dai_tdm_slot()
777 dev_err(dai->dev, "rx masks must not be 0\n"); in cs53l30_set_dai_tdm_slot()
778 return -EINVAL; in cs53l30_set_dai_tdm_slot()
783 dev_err(dai->dev, "invalid slot number or slot width\n"); in cs53l30_set_dai_tdm_slot()
784 return -EINVAL; in cs53l30_set_dai_tdm_slot()
788 dev_err(dai->dev, "slot width must count in byte\n"); in cs53l30_set_dai_tdm_slot()
789 return -EINVAL; in cs53l30_set_dai_tdm_slot()
801 tx_enable |= (u64)((u64)(1 << slot_step) - 1) << (u64)loc[i]; in cs53l30_set_dai_tdm_slot()
808 dev_err(dai->dev, "rx_mask exceeds max slot number: %d\n", in cs53l30_set_dai_tdm_slot()
810 return -EINVAL; in cs53l30_set_dai_tdm_slot()
814 slot_next = loc[i - 1] + slot_step - 1; in cs53l30_set_dai_tdm_slot()
816 dev_err(dai->dev, "slot selection out of bounds: %u\n", in cs53l30_set_dai_tdm_slot()
818 return -EINVAL; in cs53l30_set_dai_tdm_slot()
822 regmap_update_bits(priv->regmap, CS53L30_ASP_TDMTX_CTL(i), in cs53l30_set_dai_tdm_slot()
824 dev_dbg(dai->dev, "loc[%d]=%x\n", i, loc[i]); in cs53l30_set_dai_tdm_slot()
828 regmap_write(priv->regmap, CS53L30_ASP_TDMTX_ENx(i), in cs53l30_set_dai_tdm_slot()
831 dev_dbg(dai->dev, "en_reg=%x, tx_enable=%llx\n", in cs53l30_set_dai_tdm_slot()
840 struct cs53l30_private *priv = snd_soc_component_get_drvdata(dai->component); in cs53l30_mute_stream()
842 gpiod_set_value_cansleep(priv->mute_gpio, mute); in cs53l30_mute_stream()
847 /* SNDRV_PCM_RATE_KNOT -> 12000, 24000 Hz, limit with constraint list */
881 if (priv->use_sdout2) in cs53l30_component_probe()
922 const struct device_node *np = client->dev.of_node; in cs53l30_i2c_probe()
923 struct device *dev = &client->dev; in cs53l30_i2c_probe()
931 return -ENOMEM; in cs53l30_i2c_probe()
933 for (i = 0; i < ARRAY_SIZE(cs53l30->supplies); i++) in cs53l30_i2c_probe()
934 cs53l30->supplies[i].supply = cs53l30_supply_names[i]; in cs53l30_i2c_probe()
936 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
937 cs53l30->supplies); in cs53l30_i2c_probe()
943 ret = regulator_bulk_enable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
944 cs53l30->supplies); in cs53l30_i2c_probe()
951 cs53l30->reset_gpio = devm_gpiod_get_optional(dev, "reset", in cs53l30_i2c_probe()
953 if (IS_ERR(cs53l30->reset_gpio)) { in cs53l30_i2c_probe()
954 ret = PTR_ERR(cs53l30->reset_gpio); in cs53l30_i2c_probe()
958 gpiod_set_value_cansleep(cs53l30->reset_gpio, 1); in cs53l30_i2c_probe()
962 cs53l30->mclk_rate = 0; in cs53l30_i2c_probe()
964 cs53l30->regmap = devm_regmap_init_i2c(client, &cs53l30_regmap); in cs53l30_i2c_probe()
965 if (IS_ERR(cs53l30->regmap)) { in cs53l30_i2c_probe()
966 ret = PTR_ERR(cs53l30->regmap); in cs53l30_i2c_probe()
972 devid = cirrus_read_device_id(cs53l30->regmap, CS53L30_DEVID_AB); in cs53l30_i2c_probe()
980 ret = -ENODEV; in cs53l30_i2c_probe()
986 ret = regmap_read(cs53l30->regmap, CS53L30_REVID, ®); in cs53l30_i2c_probe()
993 cs53l30->mclk = devm_clk_get_optional(dev, "mclk"); in cs53l30_i2c_probe()
994 if (IS_ERR(cs53l30->mclk)) { in cs53l30_i2c_probe()
995 ret = PTR_ERR(cs53l30->mclk); in cs53l30_i2c_probe()
1000 cs53l30->mute_gpio = devm_gpiod_get_optional(dev, "mute", in cs53l30_i2c_probe()
1002 if (IS_ERR(cs53l30->mute_gpio)) { in cs53l30_i2c_probe()
1003 ret = PTR_ERR(cs53l30->mute_gpio); in cs53l30_i2c_probe()
1007 if (cs53l30->mute_gpio) { in cs53l30_i2c_probe()
1008 /* Enable MUTE controls via MUTE pin */ in cs53l30_i2c_probe()
1009 regmap_write(cs53l30->regmap, CS53L30_MUTEP_CTL1, in cs53l30_i2c_probe()
1011 /* Flip the polarity of MUTE pin */ in cs53l30_i2c_probe()
1012 if (gpiod_is_active_low(cs53l30->mute_gpio)) in cs53l30_i2c_probe()
1013 regmap_update_bits(cs53l30->regmap, CS53L30_MUTEP_CTL2, in cs53l30_i2c_probe()
1017 if (!of_property_read_u8(np, "cirrus,micbias-lvl", &val)) in cs53l30_i2c_probe()
1018 regmap_update_bits(cs53l30->regmap, CS53L30_MICBIAS_CTL, in cs53l30_i2c_probe()
1021 if (of_property_read_bool(np, "cirrus,use-sdout2")) in cs53l30_i2c_probe()
1022 cs53l30->use_sdout2 = true; in cs53l30_i2c_probe()
1035 gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); in cs53l30_i2c_probe()
1037 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_probe()
1038 cs53l30->supplies); in cs53l30_i2c_probe()
1047 gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); in cs53l30_i2c_remove()
1049 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_i2c_remove()
1050 cs53l30->supplies); in cs53l30_i2c_remove()
1058 regcache_cache_only(cs53l30->regmap, true); in cs53l30_runtime_suspend()
1061 gpiod_set_value_cansleep(cs53l30->reset_gpio, 0); in cs53l30_runtime_suspend()
1063 regulator_bulk_disable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_runtime_suspend()
1064 cs53l30->supplies); in cs53l30_runtime_suspend()
1074 ret = regulator_bulk_enable(ARRAY_SIZE(cs53l30->supplies), in cs53l30_runtime_resume()
1075 cs53l30->supplies); in cs53l30_runtime_resume()
1081 gpiod_set_value_cansleep(cs53l30->reset_gpio, 1); in cs53l30_runtime_resume()
1083 regcache_cache_only(cs53l30->regmap, false); in cs53l30_runtime_resume()
1084 ret = regcache_sync(cs53l30->regmap); in cs53l30_runtime_resume()