Lines Matching +full:dout +full:- +full:gpios
20 * ---------------------------------------
21 * MONO_LOUT -> N/A | MONO_LOUT -> N/A
22 * | IN1L -> LINE1L
23 * | IN1R -> LINE1R
24 * | IN2L -> LINE2L
25 * | IN2R -> LINE2R
26 * | MIC3L/R -> N/A
29 * ---------------------------------------
96 /* Output Common-Mode Voltage */
168 (struct soc_mixer_control *)kcontrol->private_value; in snd_soc_dapm_put_volsw_aic3x()
169 unsigned int reg = mc->reg; in snd_soc_dapm_put_volsw_aic3x()
170 unsigned int shift = mc->shift; in snd_soc_dapm_put_volsw_aic3x()
171 int max = mc->max; in snd_soc_dapm_put_volsw_aic3x()
172 unsigned int mask = (1 << fls(max)) - 1; in snd_soc_dapm_put_volsw_aic3x()
173 unsigned int invert = mc->invert; in snd_soc_dapm_put_volsw_aic3x()
178 val = (ucontrol->value.integer.value[0] & mask); in snd_soc_dapm_put_volsw_aic3x()
187 val = mask - val; in snd_soc_dapm_put_volsw_aic3x()
218 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in mic_bias_event()
226 aic3x->micbias_vg << MICBIAS_LEVEL_SHIFT); in mic_bias_event()
248 "differential of HPLOUT", "constant VCM", "single-ended" };
253 "differential of HPROUT", "constant VCM", "single-ended",
259 "single-ended", "differential" };
279 "-5.5dB", "-8dB", "-10dB", "-12dB",
280 "-14dB", "-17dB", "-20dB", "-24dB" };
311 * DAC digital volumes. From -63.5 to 0 dB in 0.5 dB steps
313 static DECLARE_TLV_DB_SCALE(dac_tlv, -6350, 50, 0);
317 * Output stage volumes. From -78.3 to 0 dB. Muted below -78.3 dB.
320 * Define dB scale so that it is mostly correct for range about -55 to 0 dB
322 * so much). This setting shows -50 dB (actual is -50.3 dB) for register
323 * value 100 and -58.5 dB (actual is -78.3 dB) for register value 117.
325 static DECLARE_TLV_DB_SCALE(output_stage_tlv, -5900, 50, 1);
334 * only for swapped L-to-R and R-to-L routes. See below stereo controls
335 * for direct L-to-L and R-to-R routes.
367 /* Stereo output controls for direct L-to-L and R-to-R routes */
409 /* De-emphasis */
410 SOC_DOUBLE("De-emphasis Switch", AIC3X_CODEC_DFILT_CTRL, 2, 0, 0x01, 0),
417 SOC_ENUM("ADC HPF Cut-off", aic3x_adc_hpf_enum),
420 SOC_ENUM("Output Driver Power-On time", aic3x_poweron_time_enum),
421 SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum),
428 * only for swapped L-to-R and R-to-L routes. See below stereo controls
429 * for direct L-to-L and R-to-R routes.
449 /* Stereo output controls for direct L-to-L and R-to-R routes */
478 * Class-D amplifier gain. From 0 to 18 dB in 6 dB steps
483 SOC_DOUBLE_TLV("Class-D Playback Volume", CLASSD_CTRL, 6, 4, 3, 0, classd_amp_tlv);
769 ARRAY_SIZE(aic3x_left_line_mixer_controls) - 2),
772 ARRAY_SIZE(aic3x_right_line_mixer_controls) - 2),
775 ARRAY_SIZE(aic3x_left_hp_mixer_controls) - 2),
778 ARRAY_SIZE(aic3x_right_hp_mixer_controls) - 2),
781 ARRAY_SIZE(aic3x_left_hpcom_mixer_controls) - 2),
784 ARRAY_SIZE(aic3x_right_hpcom_mixer_controls) - 2),
802 /* Class-D outputs */
803 SND_SOC_DAPM_PGA("Left Class-D Out", CLASSD_CTRL, 3, 0, NULL, 0),
804 SND_SOC_DAPM_PGA("Right Class-D Out", CLASSD_CTRL, 2, 0, NULL, 0),
812 {"Left Line1L Mux", "single-ended", "LINE1L"},
814 {"Left Line1R Mux", "single-ended", "LINE1R"},
823 {"Right Line1R Mux", "single-ended", "LINE1R"},
825 {"Right Line1L Mux", "single-ended", "LINE1L"},
891 {"Left HPCOM Mux", "single-ended", "Left HPCOM Mixer"},
903 {"Right HPCOM Mux", "single-ended", "Right HPCOM Mixer"},
913 {"Left Line2L Mux", "single-ended", "LINE2L"},
923 {"Right Line2R Mux", "single-ended", "LINE2R"},
989 /* Class-D outputs */
990 {"Left Class-D Out", NULL, "Left Line Out"},
991 {"Right Class-D Out", NULL, "Left Line Out"},
992 {"SPOP", NULL, "Left Class-D Out"},
993 {"SPOM", NULL, "Right Class-D Out"},
1001 switch (aic3x->model) { in aic3x_add_widgets()
1038 struct snd_soc_component *component = dai->component; in aic3x_hw_params()
1044 int width = aic3x->slot_width; in aic3x_hw_params()
1072 if (aic3x->sysclk / (128 * pll_q) == fsref) { in aic3x_hw_params()
1104 data -= 2; in aic3x_hw_params()
1117 codec_clk = (2048 * fsref) / (aic3x->sysclk / 1000); in aic3x_hw_params()
1131 if (abs(codec_clk - tmp_clk) < in aic3x_hw_params()
1132 abs(codec_clk - last_clk)) { in aic3x_hw_params()
1152 d = ((2048 * p * fsref) - j * aic3x->sysclk) in aic3x_hw_params()
1153 * 100 / (aic3x->sysclk/100); in aic3x_hw_params()
1159 if (abs(codec_clk - clk) < abs(codec_clk - last_clk)) { in aic3x_hw_params()
1171 return -EINVAL; in aic3x_hw_params()
1190 struct snd_soc_component *component = dai->component; in aic3x_prepare()
1193 int width = aic3x->slot_width; in aic3x_prepare()
1196 width = substream->runtime->sample_bits; in aic3x_prepare()
1199 if (aic3x->dai_fmt == SND_SOC_DAIFMT_DSP_A) in aic3x_prepare()
1200 delay += (aic3x->tdm_delay*width + 1); in aic3x_prepare()
1201 else if (aic3x->dai_fmt == SND_SOC_DAIFMT_DSP_B) in aic3x_prepare()
1202 delay += aic3x->tdm_delay*width; in aic3x_prepare()
1212 struct snd_soc_component *component = dai->component; in aic3x_mute()
1230 struct snd_soc_component *component = codec_dai->component; in aic3x_set_dai_sysclk()
1239 aic3x->sysclk = freq; in aic3x_set_dai_sysclk()
1246 struct snd_soc_component *component = codec_dai->component; in aic3x_set_dai_fmt()
1256 aic3x->master = 1; in aic3x_set_dai_fmt()
1260 aic3x->master = 0; in aic3x_set_dai_fmt()
1264 return -EINVAL; in aic3x_set_dai_fmt()
1286 return -EINVAL; in aic3x_set_dai_fmt()
1289 aic3x->dai_fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK; in aic3x_set_dai_fmt()
1302 struct snd_soc_component *component = codec_dai->component; in aic3x_set_dai_tdm_slot()
1307 dev_err(component->dev, "tx and rx masks must be symmetric\n"); in aic3x_set_dai_tdm_slot()
1308 return -EINVAL; in aic3x_set_dai_tdm_slot()
1312 dev_err(component->dev, "tx and rx masks need to be non 0\n"); in aic3x_set_dai_tdm_slot()
1313 return -EINVAL; in aic3x_set_dai_tdm_slot()
1319 dev_err(component->dev, "Invalid mask, slots must be adjacent\n"); in aic3x_set_dai_tdm_slot()
1320 return -EINVAL; in aic3x_set_dai_tdm_slot()
1330 dev_err(component->dev, "Unsupported slot width %d\n", slot_width); in aic3x_set_dai_tdm_slot()
1331 return -EINVAL; in aic3x_set_dai_tdm_slot()
1335 aic3x->tdm_delay = lsb; in aic3x_set_dai_tdm_slot()
1336 aic3x->slot_width = slot_width; in aic3x_set_dai_tdm_slot()
1338 /* DOUT in high-impedance on inactive bit clocks */ in aic3x_set_dai_tdm_slot()
1350 struct aic3x_priv *aic3x = disable_nb->aic3x; in aic3x_regulator_event()
1357 if (gpio_is_valid(aic3x->gpio_reset)) in aic3x_regulator_event()
1358 gpio_set_value(aic3x->gpio_reset, 0); in aic3x_regulator_event()
1359 regcache_mark_dirty(aic3x->regmap); in aic3x_regulator_event()
1372 ret = regulator_bulk_enable(ARRAY_SIZE(aic3x->supplies), in aic3x_set_power()
1373 aic3x->supplies); in aic3x_set_power()
1376 aic3x->power = 1; in aic3x_set_power()
1378 if (gpio_is_valid(aic3x->gpio_reset)) { in aic3x_set_power()
1380 gpio_set_value(aic3x->gpio_reset, 1); in aic3x_set_power()
1384 regcache_cache_only(aic3x->regmap, false); in aic3x_set_power()
1385 regcache_sync(aic3x->regmap); in aic3x_set_power()
1400 * Delay is needed to reduce pop-noise after syncing back the in aic3x_set_power()
1411 regcache_mark_dirty(aic3x->regmap); in aic3x_set_power()
1412 aic3x->power = 0; in aic3x_set_power()
1414 regcache_cache_only(aic3x->regmap, true); in aic3x_set_power()
1415 ret = regulator_bulk_disable(ARRAY_SIZE(aic3x->supplies), in aic3x_set_power()
1416 aic3x->supplies); in aic3x_set_power()
1432 aic3x->master) { in aic3x_set_bias_level()
1439 if (!aic3x->power) in aic3x_set_bias_level()
1442 aic3x->master) { in aic3x_set_bias_level()
1449 if (aic3x->power) in aic3x_set_bias_level()
1472 .name = "tlv320aic3x-hifi",
1556 if (aic3x->model != AIC3X_MODEL_3104) { in aic3x_init()
1567 switch (aic3x->model) { in aic3x_init()
1577 /* Output common-mode voltage = 1.5 V */ in aic3x_init()
1579 aic3x->ocmv << HPOUT_SC_OCMV_SHIFT); in aic3x_init()
1589 if (gpio_is_valid(aic3x->gpio_reset) && in aic3x_is_shared_reset()
1590 aic3x->gpio_reset == a->gpio_reset) in aic3x_is_shared_reset()
1602 aic3x->component = component; in aic3x_probe()
1604 for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) { in aic3x_probe()
1605 aic3x->disable_nb[i].nb.notifier_call = aic3x_regulator_event; in aic3x_probe()
1606 aic3x->disable_nb[i].aic3x = aic3x; in aic3x_probe()
1607 ret = regulator_register_notifier(aic3x->supplies[i].consumer, in aic3x_probe()
1608 &aic3x->disable_nb[i].nb); in aic3x_probe()
1610 dev_err(component->dev, in aic3x_probe()
1617 regcache_mark_dirty(aic3x->regmap); in aic3x_probe()
1620 if (aic3x->setup) { in aic3x_probe()
1621 if (aic3x->model != AIC3X_MODEL_3104) { in aic3x_probe()
1624 (aic3x->setup->gpio_func[0] & 0xf) << 4); in aic3x_probe()
1626 (aic3x->setup->gpio_func[1] & 0xf) << 4); in aic3x_probe()
1628 dev_warn(component->dev, "GPIO functionality is not supported on tlv320aic3104\n"); in aic3x_probe()
1632 switch (aic3x->model) { in aic3x_probe()
1651 switch (aic3x->micbias_vg) { in aic3x_probe()
1657 (aic3x->micbias_vg) << MICBIAS_LEVEL_SHIFT); in aic3x_probe()
1673 while (i--) in aic3x_probe()
1674 regulator_unregister_notifier(aic3x->supplies[i].consumer, in aic3x_probe()
1675 &aic3x->disable_nb[i].nb); in aic3x_probe()
1684 for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) in aic3x_remove()
1685 regulator_unregister_notifier(aic3x->supplies[i].consumer, in aic3x_remove()
1686 &aic3x->disable_nb[i].nb); in aic3x_remove()
1706 struct device_node *np = client->dev.of_node; in aic3x_configure_ocmv()
1711 if (np && !of_property_read_u32(np, "ai3x-ocmv", &value)) { in aic3x_configure_ocmv()
1714 aic3x->ocmv = value; in aic3x_configure_ocmv()
1719 dvdd = regulator_get_voltage(aic3x->supplies[1].consumer); in aic3x_configure_ocmv()
1720 avdd = regulator_get_voltage(aic3x->supplies[2].consumer); in aic3x_configure_ocmv()
1723 dev_warn(&client->dev, in aic3x_configure_ocmv()
1727 aic3x->ocmv = HPOUT_SC_OCMV_1_8V; in aic3x_configure_ocmv()
1729 aic3x->ocmv = HPOUT_SC_OCMV_1_65V; in aic3x_configure_ocmv()
1731 aic3x->ocmv = HPOUT_SC_OCMV_1_5V; in aic3x_configure_ocmv()
1733 aic3x->ocmv = HPOUT_SC_OCMV_1_35V; in aic3x_configure_ocmv()
1735 dev_warn(&client->dev, in aic3x_configure_ocmv()
1757 /* Class-D speaker driver init; datasheet p. 46 */
1773 struct aic3x_pdata *pdata = i2c->dev.platform_data; in aic3x_i2c_probe()
1776 struct device_node *np = i2c->dev.of_node; in aic3x_i2c_probe()
1780 aic3x = devm_kzalloc(&i2c->dev, sizeof(struct aic3x_priv), GFP_KERNEL); in aic3x_i2c_probe()
1782 return -ENOMEM; in aic3x_i2c_probe()
1784 aic3x->regmap = devm_regmap_init_i2c(i2c, &aic3x_regmap); in aic3x_i2c_probe()
1785 if (IS_ERR(aic3x->regmap)) { in aic3x_i2c_probe()
1786 ret = PTR_ERR(aic3x->regmap); in aic3x_i2c_probe()
1790 regcache_cache_only(aic3x->regmap, true); in aic3x_i2c_probe()
1794 aic3x->gpio_reset = pdata->gpio_reset; in aic3x_i2c_probe()
1795 aic3x->setup = pdata->setup; in aic3x_i2c_probe()
1796 aic3x->micbias_vg = pdata->micbias_vg; in aic3x_i2c_probe()
1798 ai3x_setup = devm_kzalloc(&i2c->dev, sizeof(*ai3x_setup), in aic3x_i2c_probe()
1801 return -ENOMEM; in aic3x_i2c_probe()
1803 ret = of_get_named_gpio(np, "reset-gpios", 0); in aic3x_i2c_probe()
1805 aic3x->gpio_reset = ret; in aic3x_i2c_probe()
1807 ret = of_get_named_gpio(np, "gpio-reset", 0); in aic3x_i2c_probe()
1809 dev_warn(&i2c->dev, "Using deprecated property \"gpio-reset\", please update your DT"); in aic3x_i2c_probe()
1810 aic3x->gpio_reset = ret; in aic3x_i2c_probe()
1812 aic3x->gpio_reset = -1; in aic3x_i2c_probe()
1816 if (of_property_read_u32_array(np, "ai3x-gpio-func", in aic3x_i2c_probe()
1817 ai3x_setup->gpio_func, 2) >= 0) { in aic3x_i2c_probe()
1818 aic3x->setup = ai3x_setup; in aic3x_i2c_probe()
1821 if (!of_property_read_u32(np, "ai3x-micbias-vg", &value)) { in aic3x_i2c_probe()
1824 aic3x->micbias_vg = AIC3X_MICBIAS_2_0V; in aic3x_i2c_probe()
1827 aic3x->micbias_vg = AIC3X_MICBIAS_2_5V; in aic3x_i2c_probe()
1830 aic3x->micbias_vg = AIC3X_MICBIAS_AVDDV; in aic3x_i2c_probe()
1833 aic3x->micbias_vg = AIC3X_MICBIAS_OFF; in aic3x_i2c_probe()
1834 dev_err(&i2c->dev, "Unsuitable MicBias voltage " in aic3x_i2c_probe()
1838 aic3x->micbias_vg = AIC3X_MICBIAS_OFF; in aic3x_i2c_probe()
1842 aic3x->gpio_reset = -1; in aic3x_i2c_probe()
1845 aic3x->model = id->driver_data; in aic3x_i2c_probe()
1847 if (gpio_is_valid(aic3x->gpio_reset) && in aic3x_i2c_probe()
1849 ret = gpio_request(aic3x->gpio_reset, "tlv320aic3x reset"); in aic3x_i2c_probe()
1852 gpio_direction_output(aic3x->gpio_reset, 0); in aic3x_i2c_probe()
1855 for (i = 0; i < ARRAY_SIZE(aic3x->supplies); i++) in aic3x_i2c_probe()
1856 aic3x->supplies[i].supply = aic3x_supply_names[i]; in aic3x_i2c_probe()
1858 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(aic3x->supplies), in aic3x_i2c_probe()
1859 aic3x->supplies); in aic3x_i2c_probe()
1861 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); in aic3x_i2c_probe()
1867 if (aic3x->model == AIC3X_MODEL_3007) { in aic3x_i2c_probe()
1868 ret = regmap_register_patch(aic3x->regmap, aic3007_class_d, in aic3x_i2c_probe()
1871 dev_err(&i2c->dev, "Failed to init class D: %d\n", in aic3x_i2c_probe()
1875 ret = devm_snd_soc_register_component(&i2c->dev, in aic3x_i2c_probe()
1881 INIT_LIST_HEAD(&aic3x->list); in aic3x_i2c_probe()
1882 list_add(&aic3x->list, &reset_list); in aic3x_i2c_probe()
1887 if (gpio_is_valid(aic3x->gpio_reset) && in aic3x_i2c_probe()
1889 gpio_free(aic3x->gpio_reset); in aic3x_i2c_probe()
1898 list_del(&aic3x->list); in aic3x_i2c_remove()
1900 if (gpio_is_valid(aic3x->gpio_reset) && in aic3x_i2c_remove()
1902 gpio_set_value(aic3x->gpio_reset, 0); in aic3x_i2c_remove()
1903 gpio_free(aic3x->gpio_reset); in aic3x_i2c_remove()
1923 .name = "tlv320aic3x-codec",