Lines Matching +full:main +full:- +full:micbias +full:- +full:supply

1 // SPDX-License-Identifier: GPL-2.0
3 // sgtl5000.c -- SGTL5000 ALSA SoC Audio driver
5 // Copyright 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
26 #include <sound/soc-dapm.h>
80 /* AVC: Threshold dB -> register: pre-calculated values */
94 /* regulator supplies for sgtl5000, VDDD is an optional external supply */
102 /* vddd is optional supply */
110 #define LINREG_VDDD ((1600 - LDO_VOLTAGE / 1000) / 50)
190 /* When VAG powering on to get local loop from Line-In, the sleep
210 * If the event comes from HP and Line-In is selected,
212 * As HP_POWERUP is not set when HP muxed to line-in,
240 * - LINE_IN (for HP events) / HP (for DAC/ADC events)
241 * - DAC
242 * - ADC
250 /* In power down case, we need wait 400-1000 ms
269 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
277 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
301 * both headphones and line-out.
312 sgtl5000->mute_state[event_source] =
318 sgtl5000->mute_state[event_source]);
321 sgtl5000->mute_state[event_source] =
327 sgtl5000->mute_state[event_source]);
344 snd_soc_dapm_to_component(w->dapm);
357 snd_soc_dapm_to_component(w->dapm);
366 snd_soc_dapm_to_component(w->dapm);
477 {"Capture Mux", "LINE_IN", "LINE_IN"}, /* line_in --> adc_mux */
478 {"Capture Mux", "MIC_IN", "MIC_IN"}, /* mic_in --> adc_mux */
480 {"ADC", NULL, "Capture Mux"}, /* adc_mux --> adc */
481 {"AIFOUT", NULL, "ADC"}, /* adc --> i2s_out */
483 {"DAP Mux", "ADC", "ADC"}, /* adc --> DAP mux */
484 {"DAP Mux", NULL, "AIFIN"}, /* i2s --> DAP mux */
485 {"DAP", NULL, "DAP Mux"}, /* DAP mux --> dap */
487 {"DAP MIX Mux", "ADC", "ADC"}, /* adc --> DAP MIX mux */
488 {"DAP MIX Mux", NULL, "AIFIN"}, /* i2s --> DAP MIX mux */
489 {"DAP", NULL, "DAP MIX Mux"}, /* DAP MIX mux --> dap */
491 {"Digital Input Mux", "ADC", "ADC"}, /* adc --> audio mux */
492 {"Digital Input Mux", NULL, "AIFIN"}, /* i2s --> audio mux */
493 {"Digital Input Mux", NULL, "DAP"}, /* dap --> audio mux */
494 {"DAC", NULL, "Digital Input Mux"}, /* audio mux --> dac */
496 {"Headphone Mux", "DAC", "DAC"}, /* dac --> hp_mux */
497 {"LO", NULL, "DAC"}, /* dac --> line_out */
499 {"Headphone Mux", "LINE_IN", "LINE_IN"},/* line_in --> hp_mux */
500 {"HP", NULL, "Headphone Mux"}, /* hp_mux --> hp */
510 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
511 uinfo->count = 2;
512 uinfo->value.integer.min = 0;
513 uinfo->value.integer.max = 0xfc - 0x3c;
521 * 15-------------8-7--------------0
523 * -------------------------------
525 * PCM volume with 0.5017 dB steps from 0 to -90 dB
530 * 0x3D = -0.5 dB
531 * 0xF0 = -90 dB
536 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
537 * ------------------------------
561 l = 0xfc - l;
562 r = 0xfc - r;
564 ucontrol->value.integer.value[0] = l;
565 ucontrol->value.integer.value[1] = r;
574 * 15-------------8-7--------------0
576 * -------------------------------
578 * PCM volume with 0.5017 dB steps from 0 to -90 dB
583 * 0x3D = -0.5 dB
584 * 0xF0 = -90 dB
590 * ------------------------------
591 * register value 0x3c(0dB) 0xf0(-90dB)0xfc
601 l = ucontrol->value.integer.value[0];
602 r = ucontrol->value.integer.value[1];
604 /* make sure userspace volume fall in (0, 0xfc-0x3c) */
605 l = clamp(l, 0, 0xfc - 0x3c);
606 r = clamp(r, 0, 0xfc - 0x3c);
609 l = 0xfc - l;
610 r = 0xfc - r;
626 * dB = ( fls(register_value) - 14.347 ) * 6.02
629 * 0 to 96 we use pre-calculated values.
638 /* register value 0 => -96dB */
640 ucontrol->value.integer.value[0] = 96;
641 ucontrol->value.integer.value[1] = 96;
650 ucontrol->value.integer.value[0] = db;
651 ucontrol->value.integer.value[1] = db;
662 * 0 to 96 we use pre-calculated values.
671 db = (int)ucontrol->value.integer.value[0];
673 return -EINVAL;
680 static const DECLARE_TLV_DB_SCALE(capture_6db_attenuate, -600, 600, 0);
688 /* tlv for DAP channels, 0% - 100% - 200% */
691 /* tlv for bass bands, -11.75db to 12.0db, step .25db */
692 static const DECLARE_TLV_DB_SCALE(bass_band, -1175, 25, 0);
694 /* tlv for hp volume, -51.5db to 12.0db, step .5db */
695 static const DECLARE_TLV_DB_SCALE(headphone_volume, -5150, 50, 0);
698 static const DECLARE_TLV_DB_SCALE(lineout_volume, -1550, 50, 0);
719 SOC_SINGLE_TLV("Capture Attenuate Switch (-6dB)",
746 SOC_SINGLE_TLV("DAP Main channel", SGTL5000_DAP_MAIN_CHAN,
780 struct snd_soc_component *component = codec_dai->component;
786 * only I2S block - this can be done by powering it off
797 struct snd_soc_component *component = codec_dai->component;
801 sgtl5000->master = 0;
805 * - clock and frame slave,
806 * - clock and frame master
813 sgtl5000->master = 1;
816 return -EINVAL;
840 return -EINVAL;
843 sgtl5000->fmt = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
853 return -EINVAL;
865 struct snd_soc_component *component = codec_dai->component;
870 sgtl5000->sysclk = freq;
873 return -EINVAL;
929 return -EINVAL;
947 dev_err(component->dev, "frame rate %d not supported\n",
949 return -EINVAL;
955 * of 8 MHz - 27 MHz
957 switch (sgtl5000->sysclk / frame_rate) {
972 if (sgtl5000->master) {
976 dev_err(component->dev,
978 dev_err(component->dev, "%d ratio is not supported. "
980 sgtl5000->sysclk / frame_rate);
981 return -EINVAL;
992 if (sgtl5000->sysclk > 17000000) {
994 in = sgtl5000->sysclk / 2;
997 in = sgtl5000->sysclk;
1051 struct snd_soc_component *component = dai->component;
1059 if (!sgtl5000->sysclk) {
1060 dev_err(component->dev, "%s: set sysclk first!\n", __func__);
1061 return -EFAULT;
1064 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1081 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
1082 return -EINVAL;
1098 if (sgtl5000->fmt == SND_SOC_DAIFMT_RIGHT_J)
1099 return -EINVAL;
1105 return -EINVAL;
1119 * off --> standby --> prepare --> on
1120 * standby --> prepare --> on
1123 * on --> prepare --> standby
1135 regcache_cache_only(sgtl->regmap, false);
1136 ret = regcache_sync(sgtl->regmap);
1138 regcache_cache_only(sgtl->regmap, true);
1147 regcache_cache_only(sgtl->regmap, true);
1303 vdda = regulator_get_voltage(sgtl5000->supplies[VDDA].consumer);
1304 vddio = regulator_get_voltage(sgtl5000->supplies[VDDIO].consumer);
1305 vddd = (sgtl5000->num_supplies > VDDD)
1306 ? regulator_get_voltage(sgtl5000->supplies[VDDD].consumer)
1314 dev_err(component->dev, "regulator voltage not set correctly\n");
1316 return -EINVAL;
1321 dev_err(component->dev,
1325 return -EINVAL;
1348 if (regulator_is_equal(sgtl5000->supplies[VDDA].consumer,
1349 sgtl5000->supplies[VDDIO].consumer)) {
1371 vag = (vag - SGTL5000_ANA_GND_BASE) / SGTL5000_ANA_GND_STP;
1384 lo_vag = (lo_vag - SGTL5000_LINE_OUT_GND_BASE) /
1427 for (i = 0; i < ARRAY_SIZE(sgtl5000->supplies); i++)
1428 sgtl5000->supplies[i].supply = supply_names[i];
1430 vddd = regulator_get_optional(&client->dev, "VDDD");
1433 if (PTR_ERR(vddd) == -EPROBE_DEFER)
1434 return -EPROBE_DEFER;
1440 sgtl5000->num_supplies = ARRAY_SIZE(sgtl5000->supplies)
1441 - 1 + external_vddd;
1442 ret = regulator_bulk_get(&client->dev, sgtl5000->num_supplies,
1443 sgtl5000->supplies);
1447 ret = regulator_bulk_enable(sgtl5000->num_supplies,
1448 sgtl5000->supplies);
1452 regulator_bulk_free(sgtl5000->num_supplies,
1453 sgtl5000->supplies);
1486 reg = ((sgtl5000->lrclk_strength) << SGTL5000_PAD_I2S_LRCLK_SHIFT |
1487 (sgtl5000->sclk_strength) << SGTL5000_PAD_I2S_SCLK_SHIFT |
1496 sgtl5000->micbias_resistor << SGTL5000_BIAS_R_SHIFT);
1500 sgtl5000->micbias_voltage << SGTL5000_BIAS_VOLT_SHIFT);
1573 ret = regmap_write(sgtl5000->regmap, index, val);
1575 dev_err(&client->dev,
1585 struct device_node *np = client->dev.of_node;
1589 sgtl5000 = devm_kzalloc(&client->dev, sizeof(*sgtl5000), GFP_KERNEL);
1591 return -ENOMEM;
1599 sgtl5000->regmap = devm_regmap_init_i2c(client, &sgtl5000_regmap);
1600 if (IS_ERR(sgtl5000->regmap)) {
1601 ret = PTR_ERR(sgtl5000->regmap);
1602 dev_err(&client->dev, "Failed to allocate regmap: %d\n", ret);
1606 sgtl5000->mclk = devm_clk_get(&client->dev, NULL);
1607 if (IS_ERR(sgtl5000->mclk)) {
1608 ret = PTR_ERR(sgtl5000->mclk);
1610 if (ret == -ENOENT)
1611 ret = -EPROBE_DEFER;
1613 dev_err_probe(&client->dev, ret, "Failed to get mclock\n");
1618 ret = clk_prepare_enable(sgtl5000->mclk);
1620 dev_err(&client->dev, "Error enabling clock %d\n", ret);
1628 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, &reg);
1630 dev_err(&client->dev, "Error reading chip id %d\n", ret);
1636 dev_err(&client->dev,
1638 ret = -ENODEV;
1643 dev_info(&client->dev, "sgtl5000 revision 0x%x\n", rev);
1644 sgtl5000->revision = rev;
1647 ret = regmap_write(sgtl5000->regmap,
1651 dev_err(&client->dev,
1654 /* Mute everything to avoid pop from the following power-up */
1655 ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_CTRL,
1658 dev_err(&client->dev,
1664 * If VAG is powered-on (e.g. from previous boot), it would be disabled
1668 * cool-down time.
1670 ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, &value);
1672 dev_err(&client->dev, "Failed to read ANA_POWER: %d\n", ret);
1676 ret = regmap_update_bits(sgtl5000->regmap,
1681 dev_err(&client->dev, "Error %d disabling VAG\n", ret);
1690 if (sgtl5000->num_supplies <= VDDD) {
1692 ret = regmap_update_bits(sgtl5000->regmap,
1697 dev_err(&client->dev,
1701 dev_info(&client->dev,
1710 dev_dbg(&client->dev, "Using external VDDD\n");
1712 ret = regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, ana_pwr);
1714 dev_err(&client->dev,
1720 "micbias-resistor-k-ohms", &value)) {
1723 sgtl5000->micbias_resistor = 0;
1726 sgtl5000->micbias_resistor = 1;
1729 sgtl5000->micbias_resistor = 2;
1732 sgtl5000->micbias_resistor = 3;
1735 sgtl5000->micbias_resistor = 2;
1736 dev_err(&client->dev,
1737 "Unsuitable MicBias resistor\n");
1741 sgtl5000->micbias_resistor = 2;
1744 "micbias-voltage-m-volts", &value)) {
1748 sgtl5000->micbias_voltage = (value / 250) - 5;
1750 sgtl5000->micbias_voltage = 0;
1751 dev_err(&client->dev,
1752 "Unsuitable MicBias voltage\n");
1755 sgtl5000->micbias_voltage = 0;
1759 sgtl5000->lrclk_strength = I2S_LRCLK_STRENGTH_LOW;
1760 if (!of_property_read_u32(np, "lrclk-strength", &value)) {
1763 sgtl5000->lrclk_strength = value;
1766 sgtl5000->sclk_strength = I2S_SCLK_STRENGTH_LOW;
1767 if (!of_property_read_u32(np, "sclk-strength", &value)) {
1770 sgtl5000->sclk_strength = value;
1776 ret = devm_snd_soc_register_component(&client->dev,
1784 clk_disable_unprepare(sgtl5000->mclk);
1787 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1788 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);
1797 regmap_write(sgtl5000->regmap, SGTL5000_CHIP_CLK_CTRL, SGTL5000_CHIP_CLK_CTRL_DEFAULT);
1798 regmap_write(sgtl5000->regmap, SGTL5000_CHIP_DIG_POWER, SGTL5000_DIG_POWER_DEFAULT);
1799 regmap_write(sgtl5000->regmap, SGTL5000_CHIP_ANA_POWER, SGTL5000_ANA_POWER_DEFAULT);
1801 clk_disable_unprepare(sgtl5000->mclk);
1802 regulator_bulk_disable(sgtl5000->num_supplies, sgtl5000->supplies);
1803 regulator_bulk_free(sgtl5000->num_supplies, sgtl5000->supplies);