• Home
  • Raw
  • Download

Lines Matching +full:spk +full:- +full:mute

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2014-2017 Texas Instruments Incorporated - https://www.ti.com/
10 * The TLV320AIC31xx series of audio codecs are low-power, highly integrated
12 * and mono/stereo Class-D speaker driver.
34 #include <dt-bindings/sound/tlv320aic31xx-micbias.h>
177 u8 ocmv; /* output common-mode voltage */
287 static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6350, 50, 0);
289 static const DECLARE_TLV_DB_SCALE(adc_cgain_tlv, -2000, 50, 0);
293 static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -6350, 50, 0);
294 static const DECLARE_TLV_DB_SCALE(sp_vol_tlv, -6350, 50, 0);
301 AIC31XX_RDACVOL, 0, -127, 48, 7, 0, dac_vol_tlv),
311 /* HP de-pop control: apply power not immediately but via ramp
316 SOC_ENUM("HP Output Driver Power-On time", hp_poweron_time_enum),
317 SOC_ENUM("HP Output Driver Ramp-up step", hp_rampup_step_enum),
328 0, -24, 40, 6, 0, adc_cgain_tlv),
366 int ret = regmap_read(aic31xx->regmap, reg, &bits); in aic31xx_wait_bits()
370 ret = regmap_read(aic31xx->regmap, reg, &bits); in aic31xx_wait_bits()
371 counter--; in aic31xx_wait_bits()
374 dev_err(aic31xx->dev, in aic31xx_wait_bits()
377 (count - counter) * sleep); in aic31xx_wait_bits()
378 ret = -1; in aic31xx_wait_bits()
388 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in aic31xx_dapm_power_event()
394 switch (WIDGET_BIT(w->reg, w->shift)) { in aic31xx_dapm_power_event()
422 dev_err(component->dev, "Unknown widget '%s' calling %s\n", in aic31xx_dapm_power_event()
423 w->name, __func__); in aic31xx_dapm_power_event()
424 return -EINVAL; in aic31xx_dapm_power_event()
435 dev_dbg(component->dev, in aic31xx_dapm_power_event()
437 event, w->name); in aic31xx_dapm_power_event()
465 SOC_DAPM_ENUM("MIC1LP P-Terminal", mic1lp_p_enum);
468 SOC_DAPM_ENUM("MIC1RP P-Terminal", mic1rp_p_enum);
471 SOC_DAPM_ENUM("MIC1LM P-Terminal", mic1lm_p_enum);
474 SOC_DAPM_ENUM("MIC1LM M-Terminal", mic1lm_m_enum);
491 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in mic_bias_event()
499 aic31xx->micbias_vg << in mic_bias_event()
501 dev_dbg(component->dev, "%s: turned on\n", __func__); in mic_bias_event()
507 dev_dbg(component->dev, "%s: turned off\n", __func__); in mic_bias_event()
577 SND_SOC_DAPM_MUX("MIC1LP P-Terminal", SND_SOC_NOPM, 0, 0,
579 SND_SOC_DAPM_MUX("MIC1RP P-Terminal", SND_SOC_NOPM, 0, 0,
581 SND_SOC_DAPM_MUX("MIC1LM P-Terminal", SND_SOC_NOPM, 0, 0,
589 SND_SOC_DAPM_MUX("MIC1LM M-Terminal", SND_SOC_NOPM, 0, 0,
608 /* AIC3111 and AIC3110 have stereo class-D amplifier */
623 /* AIC3100 and AIC3120 have only mono class-D amplifier */
625 SND_SOC_DAPM_OUT_DRV_E("SPK ClassD", AIC31XX_SPKAMP, 7, 0, NULL, 0,
630 SND_SOC_DAPM_OUTPUT("SPK"),
671 {"MIC1LP P-Terminal", "FFR 10 Ohm", "MIC1LP"},
672 {"MIC1LP P-Terminal", "FFR 20 Ohm", "MIC1LP"},
673 {"MIC1LP P-Terminal", "FFR 40 Ohm", "MIC1LP"},
674 {"MIC1RP P-Terminal", "FFR 10 Ohm", "MIC1RP"},
675 {"MIC1RP P-Terminal", "FFR 20 Ohm", "MIC1RP"},
676 {"MIC1RP P-Terminal", "FFR 40 Ohm", "MIC1RP"},
677 {"MIC1LM P-Terminal", "FFR 10 Ohm", "MIC1LM"},
678 {"MIC1LM P-Terminal", "FFR 20 Ohm", "MIC1LM"},
679 {"MIC1LM P-Terminal", "FFR 40 Ohm", "MIC1LM"},
681 {"MIC1LM M-Terminal", "FFR 10 Ohm", "MIC1LM"},
682 {"MIC1LM M-Terminal", "FFR 20 Ohm", "MIC1LM"},
683 {"MIC1LM M-Terminal", "FFR 40 Ohm", "MIC1LM"},
685 {"MIC_GAIN_CTL", NULL, "MIC1LP P-Terminal"},
686 {"MIC_GAIN_CTL", NULL, "MIC1RP P-Terminal"},
687 {"MIC_GAIN_CTL", NULL, "MIC1LM P-Terminal"},
688 {"MIC_GAIN_CTL", NULL, "MIC1LM M-Terminal"},
721 {"SPK ClassD", NULL, "Speaker"},
722 {"SPK", NULL, "SPK ClassD"},
757 if (!(aic31xx->codec_type & DAC31XX_BIT)) in aic31xx_add_controls()
764 if (aic31xx->codec_type & AIC31XX_STEREO_CLASS_D_BIT) in aic31xx_add_controls()
782 if (aic31xx->codec_type & DAC31XX_BIT) { in aic31xx_add_widgets()
806 if (aic31xx->codec_type & AIC31XX_STEREO_CLASS_D_BIT) { in aic31xx_add_widgets()
840 int match = -1; in aic31xx_setup_pll()
843 if (!aic31xx->sysclk || !aic31xx->p_div) { in aic31xx_setup_pll()
844 dev_err(component->dev, "Master clock not supplied\n"); in aic31xx_setup_pll()
845 return -EINVAL; in aic31xx_setup_pll()
847 mclk_p = aic31xx->sysclk / aic31xx->p_div; in aic31xx_setup_pll()
870 if (match == -1) { in aic31xx_setup_pll()
871 dev_err(component->dev, in aic31xx_setup_pll()
875 return -EINVAL; in aic31xx_setup_pll()
878 dev_warn(component->dev, "Can not produce exact bitclock"); in aic31xx_setup_pll()
891 (aic31xx->p_div << 4) | 0x01); in aic31xx_setup_pll()
920 aic31xx->rate_div_line = i; in aic31xx_setup_pll()
922 dev_dbg(component->dev, in aic31xx_setup_pll()
926 aic31xx->p_div, in aic31xx_setup_pll()
943 struct snd_soc_component *component = dai->component; in aic31xx_hw_params()
946 dev_dbg(component->dev, "## %s: width %d rate %d\n", in aic31xx_hw_params()
966 dev_err(component->dev, "%s: Unsupported width %d\n", in aic31xx_hw_params()
968 return -EINVAL; in aic31xx_hw_params()
978 static int aic31xx_dac_mute(struct snd_soc_dai *codec_dai, int mute, in aic31xx_dac_mute() argument
981 struct snd_soc_component *component = codec_dai->component; in aic31xx_dac_mute()
983 if (mute) { in aic31xx_dac_mute()
1004 aic31xx->master_dapm_route_applied) { in aic31xx_clock_master_routes()
1011 if (!ret && !(aic31xx->codec_type & DAC31XX_BIT)) in aic31xx_clock_master_routes()
1019 aic31xx->master_dapm_route_applied = false; in aic31xx_clock_master_routes()
1021 !aic31xx->master_dapm_route_applied) { in aic31xx_clock_master_routes()
1028 if (!ret && !(aic31xx->codec_type & DAC31XX_BIT)) in aic31xx_clock_master_routes()
1036 aic31xx->master_dapm_route_applied = true; in aic31xx_clock_master_routes()
1045 struct snd_soc_component *component = codec_dai->component; in aic31xx_set_dai_fmt()
1050 dev_dbg(component->dev, "## %s: fmt = 0x%x\n", __func__, fmt); in aic31xx_set_dai_fmt()
1066 dev_err(component->dev, "Invalid DAI master/slave interface\n"); in aic31xx_set_dai_fmt()
1067 return -EINVAL; in aic31xx_set_dai_fmt()
1078 dev_err(component->dev, "Invalid DAI clock signal polarity\n"); in aic31xx_set_dai_fmt()
1079 return -EINVAL; in aic31xx_set_dai_fmt()
1108 dev_err(component->dev, "Invalid DAI interface format\n"); in aic31xx_set_dai_fmt()
1109 return -EINVAL; in aic31xx_set_dai_fmt()
1129 struct snd_soc_component *component = codec_dai->component; in aic31xx_set_dai_sysclk()
1133 dev_dbg(component->dev, "## %s: clk_id = %d, freq = %d, dir = %d\n", in aic31xx_set_dai_sysclk()
1140 dev_err(aic31xx->dev, "%s: Too high mclk frequency %u\n", in aic31xx_set_dai_sysclk()
1142 return -EINVAL; in aic31xx_set_dai_sysclk()
1144 aic31xx->p_div = i; in aic31xx_set_dai_sysclk()
1147 if (aic31xx_divs[i].mclk_p == freq / aic31xx->p_div) in aic31xx_set_dai_sysclk()
1150 dev_err(aic31xx->dev, "%s: Unsupported frequency %d\n", in aic31xx_set_dai_sysclk()
1152 return -EINVAL; in aic31xx_set_dai_sysclk()
1159 aic31xx->sysclk = freq; in aic31xx_set_dai_sysclk()
1169 struct aic31xx_priv *aic31xx = disable_nb->aic31xx; in aic31xx_regulator_event()
1176 if (aic31xx->gpio_reset) in aic31xx_regulator_event()
1177 gpiod_set_value(aic31xx->gpio_reset, 1); in aic31xx_regulator_event()
1179 regcache_mark_dirty(aic31xx->regmap); in aic31xx_regulator_event()
1180 dev_dbg(aic31xx->dev, "## %s: DISABLE received\n", __func__); in aic31xx_regulator_event()
1190 if (aic31xx->gpio_reset) { in aic31xx_reset()
1191 gpiod_set_value(aic31xx->gpio_reset, 1); in aic31xx_reset()
1193 gpiod_set_value(aic31xx->gpio_reset, 0); in aic31xx_reset()
1195 ret = regmap_write(aic31xx->regmap, AIC31XX_RESET, 1); in aic31xx_reset()
1208 dev_dbg(component->dev, "codec clock -> on (rate %d)\n", in aic31xx_clk_on()
1209 aic31xx_divs[aic31xx->rate_div_line].rate); in aic31xx_clk_on()
1214 if (aic31xx_divs[aic31xx->rate_div_line].nadc) in aic31xx_clk_on()
1216 if (aic31xx_divs[aic31xx->rate_div_line].madc) in aic31xx_clk_on()
1226 dev_dbg(component->dev, "codec clock -> off\n"); in aic31xx_clk_off()
1240 ret = regulator_bulk_enable(ARRAY_SIZE(aic31xx->supplies), in aic31xx_power_on()
1241 aic31xx->supplies); in aic31xx_power_on()
1245 regcache_cache_only(aic31xx->regmap, false); in aic31xx_power_on()
1247 /* Reset device registers for a consistent power-on like state */ in aic31xx_power_on()
1250 dev_err(aic31xx->dev, "Could not reset device: %d\n", ret); in aic31xx_power_on()
1252 ret = regcache_sync(aic31xx->regmap); in aic31xx_power_on()
1254 dev_err(component->dev, in aic31xx_power_on()
1256 regcache_cache_only(aic31xx->regmap, true); in aic31xx_power_on()
1257 regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), in aic31xx_power_on()
1258 aic31xx->supplies); in aic31xx_power_on()
1267 aic31xx_set_jack(component, aic31xx->jack, NULL); in aic31xx_power_on()
1276 regcache_cache_only(aic31xx->regmap, true); in aic31xx_power_off()
1277 regulator_bulk_disable(ARRAY_SIZE(aic31xx->supplies), in aic31xx_power_off()
1278 aic31xx->supplies); in aic31xx_power_off()
1284 dev_dbg(component->dev, "## %s: %d -> %d\n", __func__, in aic31xx_set_bias_level()
1320 aic31xx->jack = jack; in aic31xx_set_jack()
1323 regmap_write(aic31xx->regmap, AIC31XX_HSDETECT, in aic31xx_set_jack()
1334 dev_dbg(aic31xx->dev, "## %s\n", __func__); in aic31xx_codec_probe()
1336 aic31xx->component = component; in aic31xx_codec_probe()
1338 for (i = 0; i < ARRAY_SIZE(aic31xx->supplies); i++) { in aic31xx_codec_probe()
1339 aic31xx->disable_nb[i].nb.notifier_call = in aic31xx_codec_probe()
1341 aic31xx->disable_nb[i].aic31xx = aic31xx; in aic31xx_codec_probe()
1343 aic31xx->supplies[i].consumer, in aic31xx_codec_probe()
1344 &aic31xx->disable_nb[i].nb); in aic31xx_codec_probe()
1346 dev_err(component->dev, in aic31xx_codec_probe()
1353 regcache_cache_only(aic31xx->regmap, true); in aic31xx_codec_probe()
1354 regcache_mark_dirty(aic31xx->regmap); in aic31xx_codec_probe()
1364 /* set output common-mode voltage */ in aic31xx_codec_probe()
1367 aic31xx->ocmv << AIC31XX_HPD_OCMV_SHIFT); in aic31xx_codec_probe()
1399 .name = "tlv320dac31xx-hifi",
1414 .name = "tlv320aic31xx-hifi",
1460 struct device *dev = aic31xx->dev; in aic31xx_irq()
1465 ret = regmap_read(aic31xx->regmap, AIC31XX_INTRDACFLAG, &value); in aic31xx_irq()
1484 ret = regmap_read(aic31xx->regmap, AIC31XX_INTRDACFLAG2, in aic31xx_irq()
1495 ret = regmap_read(aic31xx->regmap, AIC31XX_HSDETECT, &val); in aic31xx_irq()
1513 if (aic31xx->jack) in aic31xx_irq()
1514 snd_soc_jack_report(aic31xx->jack, status, in aic31xx_irq()
1524 ret = regmap_read(aic31xx->regmap, AIC31XX_OFFLAG, &value); in aic31xx_irq()
1536 dev_warn(dev, "Left-channel DAC overflow has occurred\n"); in aic31xx_irq()
1538 dev_warn(dev, "Right-channel DAC overflow has occurred\n"); in aic31xx_irq()
1561 struct device *dev = priv->dev; in aic31xx_configure_ocmv()
1565 if (dev->fwnode && in aic31xx_configure_ocmv()
1566 fwnode_property_read_u32(dev->fwnode, "ai31xx-ocmv", &value)) { in aic31xx_configure_ocmv()
1569 priv->ocmv = value; in aic31xx_configure_ocmv()
1574 avdd = regulator_get_voltage(priv->supplies[3].consumer); in aic31xx_configure_ocmv()
1575 dvdd = regulator_get_voltage(priv->supplies[5].consumer); in aic31xx_configure_ocmv()
1582 priv->ocmv = AIC31XX_HPD_OCMV_1_8V; in aic31xx_configure_ocmv()
1584 priv->ocmv = AIC31XX_HPD_OCMV_1_65V; in aic31xx_configure_ocmv()
1586 priv->ocmv = AIC31XX_HPD_OCMV_1_5V; in aic31xx_configure_ocmv()
1588 priv->ocmv = AIC31XX_HPD_OCMV_1_35V; in aic31xx_configure_ocmv()
1603 dev_dbg(&i2c->dev, "## %s: %s codec_type = %d\n", __func__, in aic31xx_i2c_probe()
1604 id->name, (int)id->driver_data); in aic31xx_i2c_probe()
1606 aic31xx = devm_kzalloc(&i2c->dev, sizeof(*aic31xx), GFP_KERNEL); in aic31xx_i2c_probe()
1608 return -ENOMEM; in aic31xx_i2c_probe()
1610 aic31xx->regmap = devm_regmap_init_i2c(i2c, &aic31xx_i2c_regmap); in aic31xx_i2c_probe()
1611 if (IS_ERR(aic31xx->regmap)) { in aic31xx_i2c_probe()
1612 ret = PTR_ERR(aic31xx->regmap); in aic31xx_i2c_probe()
1613 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in aic31xx_i2c_probe()
1617 aic31xx->dev = &i2c->dev; in aic31xx_i2c_probe()
1618 aic31xx->irq = i2c->irq; in aic31xx_i2c_probe()
1620 aic31xx->codec_type = id->driver_data; in aic31xx_i2c_probe()
1622 dev_set_drvdata(aic31xx->dev, aic31xx); in aic31xx_i2c_probe()
1624 fwnode_property_read_u32(aic31xx->dev->fwnode, "ai31xx-micbias-vg", in aic31xx_i2c_probe()
1630 aic31xx->micbias_vg = micbias_value; in aic31xx_i2c_probe()
1633 dev_err(aic31xx->dev, "Bad ai31xx-micbias-vg value %d\n", in aic31xx_i2c_probe()
1635 aic31xx->micbias_vg = MICBIAS_2_0V; in aic31xx_i2c_probe()
1638 if (dev_get_platdata(aic31xx->dev)) { in aic31xx_i2c_probe()
1639 memcpy(&aic31xx->pdata, dev_get_platdata(aic31xx->dev), sizeof(aic31xx->pdata)); in aic31xx_i2c_probe()
1640 aic31xx->codec_type = aic31xx->pdata.codec_type; in aic31xx_i2c_probe()
1641 aic31xx->micbias_vg = aic31xx->pdata.micbias_vg; in aic31xx_i2c_probe()
1644 aic31xx->gpio_reset = devm_gpiod_get_optional(aic31xx->dev, "reset", in aic31xx_i2c_probe()
1646 if (IS_ERR(aic31xx->gpio_reset)) { in aic31xx_i2c_probe()
1647 if (PTR_ERR(aic31xx->gpio_reset) != -EPROBE_DEFER) in aic31xx_i2c_probe()
1648 dev_err(aic31xx->dev, "not able to acquire gpio\n"); in aic31xx_i2c_probe()
1649 return PTR_ERR(aic31xx->gpio_reset); in aic31xx_i2c_probe()
1652 for (i = 0; i < ARRAY_SIZE(aic31xx->supplies); i++) in aic31xx_i2c_probe()
1653 aic31xx->supplies[i].supply = aic31xx_supply_names[i]; in aic31xx_i2c_probe()
1655 ret = devm_regulator_bulk_get(aic31xx->dev, in aic31xx_i2c_probe()
1656 ARRAY_SIZE(aic31xx->supplies), in aic31xx_i2c_probe()
1657 aic31xx->supplies); in aic31xx_i2c_probe()
1659 if (ret != -EPROBE_DEFER) in aic31xx_i2c_probe()
1660 dev_err(aic31xx->dev, in aic31xx_i2c_probe()
1667 if (aic31xx->irq > 0) { in aic31xx_i2c_probe()
1668 regmap_update_bits(aic31xx->regmap, AIC31XX_GPIO1, in aic31xx_i2c_probe()
1673 regmap_write(aic31xx->regmap, AIC31XX_INT1CTRL, in aic31xx_i2c_probe()
1679 ret = devm_request_threaded_irq(aic31xx->dev, aic31xx->irq, in aic31xx_i2c_probe()
1681 IRQF_ONESHOT, "aic31xx-irq", in aic31xx_i2c_probe()
1684 dev_err(aic31xx->dev, "Unable to request IRQ\n"); in aic31xx_i2c_probe()
1689 if (aic31xx->codec_type & DAC31XX_BIT) in aic31xx_i2c_probe()
1690 return devm_snd_soc_register_component(&i2c->dev, in aic31xx_i2c_probe()
1695 return devm_snd_soc_register_component(&i2c->dev, in aic31xx_i2c_probe()
1716 .name = "tlv320aic31xx-codec",