Lines Matching +full:gpio +full:- +full:out +full:- +full:pol

1 // SPDX-License-Identifier: GPL-2.0-only
3 * es8326.c -- es8326 ALSA SoC audio driver
8 * Author: David <zhuning@everset-semi.com>
9 * Author: Xing Zheng <zhengxing@rock-chips.com>
31 #include <sound/soc-dapm.h>
34 #include <linux/gpio.h>
100 static int es8326_set_gpio(struct es8326_priv *es8326, int gpio, bool level) in es8326_set_gpio() argument
105 if ((gpio & ES8326_CODEC_SET_SPK) && es8326->spk_ctl_gpio) in es8326_set_gpio()
106 gpiod_set_value(es8326->spk_ctl_gpio, level); in es8326_set_gpio()
108 if ((gpio & ES8326_CODEC_SET_HP) && es8326->hp_ctl_gpio) in es8326_set_gpio()
109 gpiod_set_value(es8326->hp_ctl_gpio, level); in es8326_set_gpio()
118 struct device *dev = es8326->component->dev; in es8326_hpdetect_work()
121 mutex_lock(&es8326->lock); in es8326_hpdetect_work()
122 if (!es8326->jack) in es8326_hpdetect_work()
123 goto out; in es8326_hpdetect_work()
125 snd_soc_component_write(es8326->component, 0x1b, 0x7c); in es8326_hpdetect_work()
128 iface = snd_soc_component_read(es8326->component, 0xfb); in es8326_hpdetect_work()
134 snd_soc_jack_report(es8326->jack, 0, SND_JACK_HEADSET); in es8326_hpdetect_work()
135 snd_soc_component_write(es8326->component, ES8326_ADC1_SRC_2A, in es8326_hpdetect_work()
136 es8326->mic2_src); in es8326_hpdetect_work()
140 es8326->hp_inserted = 0; in es8326_hpdetect_work()
143 /* iface == 0x02 is 4-Pole */ in es8326_hpdetect_work()
145 snd_soc_jack_report(es8326->jack, SND_JACK_HEADSET, in es8326_hpdetect_work()
147 snd_soc_component_write(es8326->component, in es8326_hpdetect_work()
149 es8326->mic1_src); in es8326_hpdetect_work()
151 /* iface == 0x03 is 3-Pole */ in es8326_hpdetect_work()
153 snd_soc_jack_report(es8326->jack, SND_JACK_HEADPHONE, in es8326_hpdetect_work()
159 es8326->hp_inserted = 1; in es8326_hpdetect_work()
162 out: in es8326_hpdetect_work()
163 mutex_unlock(&es8326->lock); in es8326_hpdetect_work()
164 snd_soc_component_write(es8326->component, 0x1b, 0x70); in es8326_hpdetect_work()
176 &es8326->hpdet_work, msecs_to_jiffies(10)); in es8326_irq()
181 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(dac_vol_tlv, -9550, 50, 0);
182 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9550, 50, 0);
185 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(drc_target_tlv, -3200, 200, 0);
186 static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(drc_recovery_tlv, -125, 250, 0);
243 SND_SOC_DAPM_AIF_OUT("I2S OUT", "Capture", 0,
266 {"I2S OUT", NULL, "Left ADC"},
267 {"I2S OUT", NULL, "Right ADC"},
392 return -EINVAL; in get_coeff()
430 struct snd_soc_component *component = codec_dai->component; in es8326_set_dai_sysclk()
432 unsigned int freq2 = es8326->mclk_rate; in es8326_set_dai_sysclk()
435 es8326->sysclk_constraints->list = NULL; in es8326_set_dai_sysclk()
436 es8326->sysclk_constraints->count = 0; in es8326_set_dai_sysclk()
445 es8326->sysclk_constraints = &constraints_112896; in es8326_set_dai_sysclk()
452 es8326->sysclk_constraints = &constraints_12288; in es8326_set_dai_sysclk()
458 es8326->sysclk_constraints = &constraints_12; in es8326_set_dai_sysclk()
462 return -EINVAL; in es8326_set_dai_sysclk()
468 struct snd_soc_component *component = codec_dai->component; in es8326_set_dai_fmt()
485 return -EINVAL; in es8326_set_dai_fmt()
497 struct snd_soc_component *component = dai->component; in es8326_pcm_hw_params()
500 int coeff = get_coeff(es8326->mclk_rate, params_rate(params)); in es8326_pcm_hw_params()
546 struct snd_soc_component *component = dai->component; in es8326_mute()
552 if (es8326->hp_inserted) in es8326_mute()
573 dev_dbg(component->dev, "%s SND_SOC_BIAS_ON\n", __func__); in es8326_set_bias_level()
576 dev_dbg(component->dev, "%s SND_SOC_BIAS_PREPARE\n", __func__); in es8326_set_bias_level()
577 if (!IS_ERR(es8326->mclk)) { in es8326_set_bias_level()
580 clk_disable_unprepare(es8326->mclk); in es8326_set_bias_level()
582 ret = clk_prepare_enable(es8326->mclk); in es8326_set_bias_level()
602 dev_dbg(component->dev, "%s SND_SOC_BIAS_STANDBY\n", __func__); in es8326_set_bias_level()
617 dev_dbg(component->dev, "%s SND_SOC_BIAS_OFF\n", __func__); in es8326_set_bias_level()
689 return -ENODEV; in es8326_probe()
692 es8326->component = component; in es8326_probe()
694 es8326->mclk = devm_clk_get_optional(component->dev, "mclk"); in es8326_probe()
695 if (IS_ERR(es8326->mclk)) { in es8326_probe()
696 dev_err(component->dev, "%s,unable to get mclk\n", __func__); in es8326_probe()
697 return PTR_ERR(es8326->mclk); in es8326_probe()
699 if (!es8326->mclk) in es8326_probe()
700 dev_err(component->dev, "%s, assuming static mclk\n", __func__); in es8326_probe()
702 ret = clk_prepare_enable(es8326->mclk); in es8326_probe()
704 dev_err(component->dev, "%s, unable to enable mclk\n", __func__); in es8326_probe()
734 snd_soc_component_write(component, 0x2A, es8326->mic2_src); in es8326_probe()
735 snd_soc_component_write(component, 0x2B, es8326->mic2_src); in es8326_probe()
745 snd_soc_component_write(component, 0x57, 0x10 | es8326->jack_pol); in es8326_probe()
769 mutex_lock(&es8326->lock); in es8326_enable_jack_detect()
770 es8326->jack = jack; in es8326_enable_jack_detect()
771 mutex_unlock(&es8326->lock); in es8326_enable_jack_detect()
774 enable_irq(es8326->irq); in es8326_enable_jack_detect()
776 &es8326->hpdet_work, msecs_to_jiffies(10)); in es8326_enable_jack_detect()
783 if (!es8326->jack) in es8326_disable_jack_detect()
786 disable_irq(es8326->irq); in es8326_disable_jack_detect()
788 mutex_lock(&es8326->lock); in es8326_disable_jack_detect()
789 if (es8326->jack->status & SND_JACK_MICROPHONE) in es8326_disable_jack_detect()
790 snd_soc_jack_report(es8326->jack, 0, SND_JACK_BTN_0); in es8326_disable_jack_detect()
791 es8326->jack = NULL; in es8326_disable_jack_detect()
792 mutex_unlock(&es8326->lock); in es8326_disable_jack_detect()
798 dev_info(component->dev, "Enter into %s jack:%p\n", __func__, jack); in es8326_set_jack()
825 struct i2c_adapter *adapter = to_i2c_adapter(i2c->dev.parent); in es8326_i2c_probe()
828 int ret = -1; in es8326_i2c_probe()
831 dev_warn(&adapter->dev, in es8326_i2c_probe()
832 "I2C-Adapter doesn't support I2C_FUNC_I2C\n"); in es8326_i2c_probe()
833 return -EIO; in es8326_i2c_probe()
836 es8326 = devm_kzalloc(&i2c->dev, sizeof(struct es8326_priv), GFP_KERNEL); in es8326_i2c_probe()
838 return -ENOMEM; in es8326_i2c_probe()
841 es8326->i2c = i2c; in es8326_i2c_probe()
842 es8326->hp_inserted = 0; in es8326_i2c_probe()
844 mutex_init(&es8326->lock); in es8326_i2c_probe()
845 es8326->regmap = devm_regmap_init_i2c(i2c, &es8326_regmap_config); in es8326_i2c_probe()
846 if (IS_ERR(es8326->regmap)) { in es8326_i2c_probe()
847 ret = PTR_ERR(es8326->regmap); in es8326_i2c_probe()
848 dev_err(&i2c->dev, "Failed to init regmap: %d\n", ret); in es8326_i2c_probe()
852 es8326->spk_ctl_gpio = devm_gpiod_get_optional(&i2c->dev, in es8326_i2c_probe()
853 "spk-con", in es8326_i2c_probe()
855 if (IS_ERR(es8326->spk_ctl_gpio)) in es8326_i2c_probe()
856 return PTR_ERR(es8326->spk_ctl_gpio); in es8326_i2c_probe()
858 es8326->hp_ctl_gpio = devm_gpiod_get_optional(&i2c->dev, in es8326_i2c_probe()
859 "hp-con", GPIOD_OUT_LOW); in es8326_i2c_probe()
860 if (IS_ERR(es8326->hp_ctl_gpio)) in es8326_i2c_probe()
861 return PTR_ERR(es8326->hp_ctl_gpio); in es8326_i2c_probe()
865 dev_err(&i2c->dev, "i2c recv Failed\n"); in es8326_i2c_probe()
870 es8326->mastermode = device_property_read_bool(&i2c->dev, "mastermode"); in es8326_i2c_probe()
871 dev_dbg(&i2c->dev, "master mode %d", es8326->mastermode); in es8326_i2c_probe()
873 ret = of_property_read_u8(i2c->dev.of_node, "mic1-src", in es8326_i2c_probe()
874 &es8326->mic1_src); in es8326_i2c_probe()
876 dev_dbg(&i2c->dev, "mic1-src return %d", ret); in es8326_i2c_probe()
877 es8326->mic1_src = 0x22; in es8326_i2c_probe()
879 dev_dbg(&i2c->dev, "mic1-src %x", es8326->mic1_src); in es8326_i2c_probe()
881 ret = of_property_read_u8(i2c->dev.of_node, "mic2-src", in es8326_i2c_probe()
882 &es8326->mic2_src); in es8326_i2c_probe()
884 dev_dbg(&i2c->dev, "mic2-src return %d", ret); in es8326_i2c_probe()
885 es8326->mic2_src = 0x44; in es8326_i2c_probe()
887 dev_dbg(&i2c->dev, "mic2-src %x", es8326->mic2_src); in es8326_i2c_probe()
889 ret = of_property_read_u8(i2c->dev.of_node, "jack-pol", in es8326_i2c_probe()
890 &es8326->jack_pol); in es8326_i2c_probe()
892 dev_dbg(&i2c->dev, "jack-pol return %d", ret); in es8326_i2c_probe()
893 es8326->jack_pol = 0x0f; in es8326_i2c_probe()
895 dev_dbg(&i2c->dev, "jack-pol %x", es8326->jack_pol); in es8326_i2c_probe()
897 ret = of_property_read_u32(i2c->dev.of_node, "mclk-rate", in es8326_i2c_probe()
898 &es8326->mclk_rate); in es8326_i2c_probe()
900 dev_dbg(&i2c->dev, "mclk-rate return %d", ret); in es8326_i2c_probe()
901 es8326->mclk_rate = 12288000; in es8326_i2c_probe()
903 dev_dbg(&i2c->dev, "mclk-rate %u", es8326->mclk_rate); in es8326_i2c_probe()
905 INIT_DELAYED_WORK(&es8326->hpdet_work, es8326_hpdetect_work); in es8326_i2c_probe()
907 es8326->irq = i2c->irq; in es8326_i2c_probe()
908 ret = devm_request_threaded_irq(&i2c->dev, es8326->irq, NULL, es8326_irq, in es8326_i2c_probe()
914 dev_err(&i2c->dev, "Getting irq failed."); in es8326_i2c_probe()
915 return -EINVAL; in es8326_i2c_probe()
918 disable_irq(es8326->irq); in es8326_i2c_probe()
919 dev_info(&i2c->dev, "Getting irq success."); in es8326_i2c_probe()
921 return snd_soc_register_component(&i2c->dev, &soc_codec_dev_es8326, in es8326_i2c_probe()
964 MODULE_AUTHOR("David <zhuning@everset-semi.com>");