Lines Matching +full:vmon +full:- +full:slot +full:- +full:no

1 // SPDX-License-Identifier: GPL-2.0-only
3 * cs35l34.c -- CS35l34 ALSA SoC audio driver
29 #include <sound/soc-dapm.h>
49 struct gpio_desc *reset_gpio; /* Active-low reset GPIO */
236 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l34_sdin_event()
242 if (priv->tdm_mode) in cs35l34_sdin_event()
243 regmap_update_bits(priv->regmap, CS35L34_PWRCTL3, in cs35l34_sdin_event()
246 ret = regmap_update_bits(priv->regmap, CS35L34_PWRCTL1, in cs35l34_sdin_event()
249 dev_err(component->dev, "Cannot set Power bits %d\n", ret); in cs35l34_sdin_event()
255 if (priv->tdm_mode) { in cs35l34_sdin_event()
256 regmap_update_bits(priv->regmap, CS35L34_PWRCTL3, in cs35l34_sdin_event()
259 ret = regmap_update_bits(priv->regmap, CS35L34_PWRCTL1, in cs35l34_sdin_event()
271 struct snd_soc_component *component = dai->component; in cs35l34_set_tdm_slot()
274 int slot, slot_num; in cs35l34_set_tdm_slot() local
277 return -EINVAL; in cs35l34_set_tdm_slot()
279 priv->tdm_mode = true; in cs35l34_set_tdm_slot()
280 /* scan rx_mask for aud slot */ in cs35l34_set_tdm_slot()
281 slot = ffs(rx_mask) - 1; in cs35l34_set_tdm_slot()
282 if (slot >= 0) in cs35l34_set_tdm_slot()
284 CS35L34_X_LOC, slot); in cs35l34_set_tdm_slot()
286 /* scan tx_mask: vmon(2 slots); imon (2 slots); vpmon (1 slot) in cs35l34_set_tdm_slot()
287 * vbstmon (1 slot) in cs35l34_set_tdm_slot()
289 slot = ffs(tx_mask) - 1; in cs35l34_set_tdm_slot()
301 while (slot >= 0) { in cs35l34_set_tdm_slot()
305 CS35L34_X_STATE | CS35L34_X_LOC, slot); in cs35l34_set_tdm_slot()
310 CS35L34_X_STATE | CS35L34_X_LOC, slot); in cs35l34_set_tdm_slot()
315 CS35L34_X_STATE | CS35L34_X_LOC, slot); in cs35l34_set_tdm_slot()
321 CS35L34_X_STATE | CS35L34_X_LOC, slot); in cs35l34_set_tdm_slot()
324 /* Enable the relevant tx slot */ in cs35l34_set_tdm_slot()
325 reg = CS35L34_TDM_TX_SLOT_EN_4 - (slot/8); in cs35l34_set_tdm_slot()
326 bit_pos = slot - ((slot / 8) * (8)); in cs35l34_set_tdm_slot()
330 tx_mask &= ~(1 << slot); in cs35l34_set_tdm_slot()
331 slot = ffs(tx_mask) - 1; in cs35l34_set_tdm_slot()
341 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l34_main_amp_event()
346 regmap_update_bits(priv->regmap, CS35L34_BST_CVTR_V_CTL, in cs35l34_main_amp_event()
347 CS35L34_BST_CVTL_MASK, priv->pdata.boost_vtge); in cs35l34_main_amp_event()
349 regmap_update_bits(priv->regmap, CS35L34_PROTECT_CTL, in cs35l34_main_amp_event()
353 regmap_update_bits(priv->regmap, CS35L34_BST_CVTR_V_CTL, in cs35l34_main_amp_event()
355 regmap_update_bits(priv->regmap, CS35L34_PROTECT_CTL, in cs35l34_main_amp_event()
365 static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10200, 50, 0);
381 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in cs35l34_mclk_event()
388 ret = regmap_read(priv->regmap, CS35L34_AMP_DIG_VOL_CTL, in cs35l34_mclk_event()
400 ret = regmap_read(priv->regmap, CS35L34_INT_STATUS_2, in cs35l34_mclk_event()
440 SND_SOC_DAPM_ADC("VMON ADC", NULL, CS35L34_PWRCTL2, 7, 1),
465 {"VMON ADC", NULL, "VSENSE"},
467 {"SDOUT", NULL, "VMON ADC"},
518 return -EINVAL; in cs35l34_get_mclk_coeff()
523 struct snd_soc_component *component = codec_dai->component; in cs35l34_set_dai_fmt()
528 regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL, in cs35l34_set_dai_fmt()
532 regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL, in cs35l34_set_dai_fmt()
536 return -EINVAL; in cs35l34_set_dai_fmt()
545 struct snd_soc_component *component = dai->component; in cs35l34_pcm_hw_params()
550 int coeff = cs35l34_get_mclk_coeff(priv->mclk_int, srate); in cs35l34_pcm_hw_params()
553 dev_err(component->dev, "ERROR: Invalid mclk %d and/or srate %d\n", in cs35l34_pcm_hw_params()
554 priv->mclk_int, srate); in cs35l34_pcm_hw_params()
558 ret = regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL, in cs35l34_pcm_hw_params()
561 dev_err(component->dev, "Failed to set clock state %d\n", ret); in cs35l34_pcm_hw_params()
580 snd_pcm_hw_constraint_list(substream->runtime, 0, in cs35l34_pcm_startup()
589 struct snd_soc_component *component = dai->component; in cs35l34_set_tristate()
603 struct snd_soc_component *component = dai->component; in cs35l34_dai_set_sysclk()
610 cs35l34->mclk_int = freq; in cs35l34_dai_set_sysclk()
614 cs35l34->mclk_int = freq; in cs35l34_dai_set_sysclk()
618 cs35l34->mclk_int = freq; in cs35l34_dai_set_sysclk()
622 cs35l34->mclk_int = freq / 2; in cs35l34_dai_set_sysclk()
626 cs35l34->mclk_int = freq / 2; in cs35l34_dai_set_sysclk()
630 cs35l34->mclk_int = freq / 2; in cs35l34_dai_set_sysclk()
633 dev_err(component->dev, "ERROR: Invalid Frequency %d\n", freq); in cs35l34_dai_set_sysclk()
634 cs35l34->mclk_int = 0; in cs35l34_dai_set_sysclk()
635 return -EINVAL; in cs35l34_dai_set_sysclk()
637 regmap_update_bits(cs35l34->regmap, CS35L34_MCLK_CTL, in cs35l34_dai_set_sysclk()
675 struct snd_soc_component *component = cs35l34->component; in cs35l34_boost_inductor()
679 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x24); in cs35l34_boost_inductor()
680 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x24); in cs35l34_boost_inductor()
681 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP, in cs35l34_boost_inductor()
683 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 0); in cs35l34_boost_inductor()
686 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x20); in cs35l34_boost_inductor()
687 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x20); in cs35l34_boost_inductor()
688 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP, in cs35l34_boost_inductor()
690 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 1); in cs35l34_boost_inductor()
693 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x20); in cs35l34_boost_inductor()
694 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x20); in cs35l34_boost_inductor()
695 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP, in cs35l34_boost_inductor()
697 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 2); in cs35l34_boost_inductor()
700 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x19); in cs35l34_boost_inductor()
701 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x25); in cs35l34_boost_inductor()
702 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP, in cs35l34_boost_inductor()
704 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 3); in cs35l34_boost_inductor()
707 dev_err(component->dev, "%s Invalid Inductor Value %d uH\n", in cs35l34_boost_inductor()
709 return -EINVAL; in cs35l34_boost_inductor()
719 pm_runtime_get_sync(component->dev); in cs35l34_probe()
722 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL, in cs35l34_probe()
728 regmap_write(cs35l34->regmap, CS35L34_PWRCTL2, 0xFD); in cs35l34_probe()
729 regmap_write(cs35l34->regmap, CS35L34_PWRCTL3, 0x1F); in cs35l34_probe()
732 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL, in cs35l34_probe()
736 if (cs35l34->pdata.boost_peak) in cs35l34_probe()
737 regmap_update_bits(cs35l34->regmap, CS35L34_BST_PEAK_I, in cs35l34_probe()
739 cs35l34->pdata.boost_peak); in cs35l34_probe()
741 if (cs35l34->pdata.gain_zc_disable) in cs35l34_probe()
742 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL, in cs35l34_probe()
745 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL, in cs35l34_probe()
748 if (cs35l34->pdata.aif_half_drv) in cs35l34_probe()
749 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_CLK_CTL, in cs35l34_probe()
752 if (cs35l34->pdata.digsft_disable) in cs35l34_probe()
753 regmap_update_bits(cs35l34->regmap, CS35L34_AMP_DIG_VOL_CTL, in cs35l34_probe()
756 if (cs35l34->pdata.amp_inv) in cs35l34_probe()
757 regmap_update_bits(cs35l34->regmap, CS35L34_AMP_DIG_VOL_CTL, in cs35l34_probe()
760 if (cs35l34->pdata.boost_ind) in cs35l34_probe()
761 ret = cs35l34_boost_inductor(cs35l34, cs35l34->pdata.boost_ind); in cs35l34_probe()
763 if (cs35l34->pdata.i2s_sdinloc) in cs35l34_probe()
764 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_I2S_CTL, in cs35l34_probe()
766 cs35l34->pdata.i2s_sdinloc << CS35L34_I2S_LOC_SHIFT); in cs35l34_probe()
768 if (cs35l34->pdata.tdm_rising_edge) in cs35l34_probe()
769 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_TDM_CTL, in cs35l34_probe()
772 pm_runtime_put_sync(component->dev); in cs35l34_probe()
808 struct device_node *np = i2c_client->dev.of_node; in cs35l34_handle_of_data()
811 if (of_property_read_u32(np, "cirrus,boost-vtge-millivolt", in cs35l34_handle_of_data()
815 dev_err(&i2c_client->dev, in cs35l34_handle_of_data()
817 return -EINVAL; in cs35l34_handle_of_data()
820 pdata->boost_vtge = 0; /* Use VP */ in cs35l34_handle_of_data()
822 pdata->boost_vtge = ((val - 3300)/100) + 1; in cs35l34_handle_of_data()
824 dev_warn(&i2c_client->dev, in cs35l34_handle_of_data()
828 if (of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val) >= 0) { in cs35l34_handle_of_data()
829 pdata->boost_ind = val; in cs35l34_handle_of_data()
831 dev_err(&i2c_client->dev, "Inductor not specified.\n"); in cs35l34_handle_of_data()
832 return -EINVAL; in cs35l34_handle_of_data()
835 if (of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val) >= 0) { in cs35l34_handle_of_data()
837 dev_err(&i2c_client->dev, in cs35l34_handle_of_data()
839 return -EINVAL; in cs35l34_handle_of_data()
841 pdata->boost_peak = ((val - 1200)/80) + 1; in cs35l34_handle_of_data()
844 pdata->aif_half_drv = of_property_read_bool(np, in cs35l34_handle_of_data()
845 "cirrus,aif-half-drv"); in cs35l34_handle_of_data()
846 pdata->digsft_disable = of_property_read_bool(np, in cs35l34_handle_of_data()
847 "cirrus,digsft-disable"); in cs35l34_handle_of_data()
849 pdata->gain_zc_disable = of_property_read_bool(np, in cs35l34_handle_of_data()
850 "cirrus,gain-zc-disable"); in cs35l34_handle_of_data()
851 pdata->amp_inv = of_property_read_bool(np, "cirrus,amp-inv"); in cs35l34_handle_of_data()
853 if (of_property_read_u32(np, "cirrus,i2s-sdinloc", &val) >= 0) in cs35l34_handle_of_data()
854 pdata->i2s_sdinloc = val; in cs35l34_handle_of_data()
855 if (of_property_read_u32(np, "cirrus,tdm-rising-edge", &val) >= 0) in cs35l34_handle_of_data()
856 pdata->tdm_rising_edge = val; in cs35l34_handle_of_data()
864 struct snd_soc_component *component = cs35l34->component; in cs35l34_irq_thread()
870 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_4, &sticky4); in cs35l34_irq_thread()
871 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_3, &sticky3); in cs35l34_irq_thread()
872 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_2, &sticky2); in cs35l34_irq_thread()
873 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_1, &sticky1); in cs35l34_irq_thread()
875 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_4, &mask4); in cs35l34_irq_thread()
876 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_3, &mask3); in cs35l34_irq_thread()
877 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_2, &mask2); in cs35l34_irq_thread()
878 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_1, &mask1); in cs35l34_irq_thread()
884 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_1, &current1); in cs35l34_irq_thread()
887 dev_err(component->dev, "Cal error\n"); in cs35l34_irq_thread()
889 /* error is no longer asserted; safe to reset */ in cs35l34_irq_thread()
891 dev_dbg(component->dev, "Cal error release\n"); in cs35l34_irq_thread()
892 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
895 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
899 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
902 /* note: amp will re-calibrate on next resume */ in cs35l34_irq_thread()
907 dev_err(component->dev, "Alive error\n"); in cs35l34_irq_thread()
910 dev_crit(component->dev, "Amp short error\n"); in cs35l34_irq_thread()
912 /* error is no longer asserted; safe to reset */ in cs35l34_irq_thread()
914 dev_dbg(component->dev, in cs35l34_irq_thread()
916 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
919 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
923 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
930 dev_crit(component->dev, "Over temperature warning\n"); in cs35l34_irq_thread()
932 /* error is no longer asserted; safe to reset */ in cs35l34_irq_thread()
934 dev_dbg(component->dev, in cs35l34_irq_thread()
936 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
939 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
943 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
950 dev_crit(component->dev, "Over temperature error\n"); in cs35l34_irq_thread()
952 /* error is no longer asserted; safe to reset */ in cs35l34_irq_thread()
954 dev_dbg(component->dev, in cs35l34_irq_thread()
956 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
959 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
963 regmap_update_bits(cs35l34->regmap, in cs35l34_irq_thread()
970 dev_crit(component->dev, "VBST too high error; powering off!\n"); in cs35l34_irq_thread()
971 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2, in cs35l34_irq_thread()
973 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1, in cs35l34_irq_thread()
978 dev_crit(component->dev, "LBST short error; powering off!\n"); in cs35l34_irq_thread()
979 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2, in cs35l34_irq_thread()
981 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1, in cs35l34_irq_thread()
998 dev_get_platdata(&i2c_client->dev); in cs35l34_i2c_probe()
1004 cs35l34 = devm_kzalloc(&i2c_client->dev, sizeof(*cs35l34), GFP_KERNEL); in cs35l34_i2c_probe()
1006 return -ENOMEM; in cs35l34_i2c_probe()
1009 cs35l34->regmap = devm_regmap_init_i2c(i2c_client, &cs35l34_regmap); in cs35l34_i2c_probe()
1010 if (IS_ERR(cs35l34->regmap)) { in cs35l34_i2c_probe()
1011 ret = PTR_ERR(cs35l34->regmap); in cs35l34_i2c_probe()
1012 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret); in cs35l34_i2c_probe()
1016 cs35l34->num_core_supplies = ARRAY_SIZE(cs35l34_core_supplies); in cs35l34_i2c_probe()
1018 cs35l34->core_supplies[i].supply = cs35l34_core_supplies[i]; in cs35l34_i2c_probe()
1020 ret = devm_regulator_bulk_get(&i2c_client->dev, in cs35l34_i2c_probe()
1021 cs35l34->num_core_supplies, in cs35l34_i2c_probe()
1022 cs35l34->core_supplies); in cs35l34_i2c_probe()
1024 dev_err(&i2c_client->dev, in cs35l34_i2c_probe()
1029 ret = regulator_bulk_enable(cs35l34->num_core_supplies, in cs35l34_i2c_probe()
1030 cs35l34->core_supplies); in cs35l34_i2c_probe()
1032 dev_err(&i2c_client->dev, in cs35l34_i2c_probe()
1038 cs35l34->pdata = *pdata; in cs35l34_i2c_probe()
1040 pdata = devm_kzalloc(&i2c_client->dev, sizeof(*pdata), in cs35l34_i2c_probe()
1043 return -ENOMEM; in cs35l34_i2c_probe()
1045 if (i2c_client->dev.of_node) { in cs35l34_i2c_probe()
1051 cs35l34->pdata = *pdata; in cs35l34_i2c_probe()
1054 ret = devm_request_threaded_irq(&i2c_client->dev, i2c_client->irq, NULL, in cs35l34_i2c_probe()
1058 dev_err(&i2c_client->dev, "Failed to request IRQ: %d\n", ret); in cs35l34_i2c_probe()
1060 cs35l34->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev, in cs35l34_i2c_probe()
1061 "reset-gpios", GPIOD_OUT_LOW); in cs35l34_i2c_probe()
1062 if (IS_ERR(cs35l34->reset_gpio)) in cs35l34_i2c_probe()
1063 return PTR_ERR(cs35l34->reset_gpio); in cs35l34_i2c_probe()
1065 gpiod_set_value_cansleep(cs35l34->reset_gpio, 1); in cs35l34_i2c_probe()
1069 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_AB, &reg); in cs35l34_i2c_probe()
1072 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_CD, &reg); in cs35l34_i2c_probe()
1074 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_E, &reg); in cs35l34_i2c_probe()
1078 dev_err(&i2c_client->dev, in cs35l34_i2c_probe()
1081 ret = -ENODEV; in cs35l34_i2c_probe()
1085 ret = regmap_read(cs35l34->regmap, CS35L34_REV_ID, &reg); in cs35l34_i2c_probe()
1087 dev_err(&i2c_client->dev, "Get Revision ID failed\n"); in cs35l34_i2c_probe()
1091 dev_info(&i2c_client->dev, in cs35l34_i2c_probe()
1096 regmap_update_bits(cs35l34->regmap, CS35L34_INT_MASK_1, in cs35l34_i2c_probe()
1100 regmap_update_bits(cs35l34->regmap, CS35L34_INT_MASK_3, in cs35l34_i2c_probe()
1103 pm_runtime_set_autosuspend_delay(&i2c_client->dev, 100); in cs35l34_i2c_probe()
1104 pm_runtime_use_autosuspend(&i2c_client->dev); in cs35l34_i2c_probe()
1105 pm_runtime_set_active(&i2c_client->dev); in cs35l34_i2c_probe()
1106 pm_runtime_enable(&i2c_client->dev); in cs35l34_i2c_probe()
1108 ret = devm_snd_soc_register_component(&i2c_client->dev, in cs35l34_i2c_probe()
1111 dev_err(&i2c_client->dev, in cs35l34_i2c_probe()
1119 regulator_bulk_disable(cs35l34->num_core_supplies, in cs35l34_i2c_probe()
1120 cs35l34->core_supplies); in cs35l34_i2c_probe()
1129 gpiod_set_value_cansleep(cs35l34->reset_gpio, 0); in cs35l34_i2c_remove()
1131 pm_runtime_disable(&client->dev); in cs35l34_i2c_remove()
1132 regulator_bulk_disable(cs35l34->num_core_supplies, in cs35l34_i2c_remove()
1133 cs35l34->core_supplies); in cs35l34_i2c_remove()
1143 ret = regulator_bulk_enable(cs35l34->num_core_supplies, in cs35l34_runtime_resume()
1144 cs35l34->core_supplies); in cs35l34_runtime_resume()
1152 regcache_cache_only(cs35l34->regmap, false); in cs35l34_runtime_resume()
1154 gpiod_set_value_cansleep(cs35l34->reset_gpio, 1); in cs35l34_runtime_resume()
1157 ret = regcache_sync(cs35l34->regmap); in cs35l34_runtime_resume()
1164 regcache_cache_only(cs35l34->regmap, true); in cs35l34_runtime_resume()
1165 regulator_bulk_disable(cs35l34->num_core_supplies, in cs35l34_runtime_resume()
1166 cs35l34->core_supplies); in cs35l34_runtime_resume()
1175 regcache_cache_only(cs35l34->regmap, true); in cs35l34_runtime_suspend()
1176 regcache_mark_dirty(cs35l34->regmap); in cs35l34_runtime_suspend()
1178 gpiod_set_value_cansleep(cs35l34->reset_gpio, 0); in cs35l34_runtime_suspend()
1180 regulator_bulk_disable(cs35l34->num_core_supplies, in cs35l34_runtime_suspend()
1181 cs35l34->core_supplies); in cs35l34_runtime_suspend()