Lines Matching +full:charge +full:- +full:cancellation +full:- +full:enable
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * da7218.c - DA7218 ALSA SoC Codec Driver
22 #include <sound/soc-dapm.h>
37 static const DECLARE_TLV_DB_SCALE(da7218_mic_gain_tlv, -600, 600, 0);
38 static const DECLARE_TLV_DB_SCALE(da7218_mixin_gain_tlv, -450, 150, 0);
39 static const DECLARE_TLV_DB_SCALE(da7218_in_dig_gain_tlv, -8325, 75, 0);
40 static const DECLARE_TLV_DB_SCALE(da7218_ags_trigger_tlv, -9000, 600, 0);
42 static const DECLARE_TLV_DB_SCALE(da7218_alc_threshold_tlv, -9450, 150, 0);
47 static const DECLARE_TLV_DB_SCALE(da7218_dmix_gain_tlv, -4200, 150, 0);
50 static const DECLARE_TLV_DB_SCALE(da7218_dgs_trigger_tlv, -9450, 150, 0);
51 static const DECLARE_TLV_DB_SCALE(da7218_dgs_anticlip_tlv, -4200, 600, 0);
52 static const DECLARE_TLV_DB_SCALE(da7218_dgs_signal_tlv, -9000, 600, 0);
53 static const DECLARE_TLV_DB_SCALE(da7218_out_eq_band_tlv, -1050, 150, 0);
54 static const DECLARE_TLV_DB_SCALE(da7218_out_dig_gain_tlv, -8325, 75, 0);
55 static const DECLARE_TLV_DB_SCALE(da7218_dac_ng_threshold_tlv, -10200, 600, 0);
56 static const DECLARE_TLV_DB_SCALE(da7218_mixout_gain_tlv, -100, 50, 0);
57 static const DECLARE_TLV_DB_SCALE(da7218_hp_gain_tlv, -5700, 150, 0);
201 "Sum", "SWG1", "SWG2", "SWG1_1-Cos"
318 /* Enable then Mute MIC PGAs */
330 /* Enable input mixers unmuted */
340 /* Enable input filters unmuted */
385 dev_warn(component->dev,
386 "ALC auto calibration failed - %s\n",
394 /* Enable DC offset cancellation */
399 /* Enable ALC hybrid mode */
438 if ((ret == 1) && (da7218->alc_en))
448 (struct soc_mixer_control *) kcontrol->private_value;
451 unsigned int lvalue = ucontrol->value.integer.value[0];
452 unsigned int rvalue = ucontrol->value.integer.value[1];
453 unsigned int lshift = mc->shift;
454 unsigned int rshift = mc->rshift;
455 unsigned int mask = (mc->max << lshift) | (mc->max << rshift);
458 if ((lvalue || rvalue) && (!da7218->alc_en))
462 da7218->alc_en &= ~mask;
463 da7218->alc_en |= (lvalue << lshift) | (rvalue << rshift);
475 (struct soc_mixer_control *) kcontrol->private_value;
476 unsigned int reg = mixer_ctrl->reg;
481 * Frequency value spans two 8-bit registers, lower then upper byte.
484 ret = regmap_raw_read(da7218->regmap, reg, &val, 2);
488 ucontrol->value.integer.value[0] = le16_to_cpu(val);
499 (struct soc_mixer_control *) kcontrol->private_value;
500 unsigned int reg = mixer_ctrl->reg;
504 * Frequency value spans two 8-bit registers, lower then upper byte.
508 val = cpu_to_le16(ucontrol->value.integer.value[0]);
510 return regmap_raw_write(da7218->regmap, reg, &val, 2);
519 (struct soc_mixer_control *) kcontrol->private_value;
520 unsigned int lvalue = ucontrol->value.integer.value[0];
521 unsigned int rvalue = ucontrol->value.integer.value[1];
522 unsigned int lshift = mixer_ctrl->shift;
523 unsigned int rshift = mixer_ctrl->rshift;
524 unsigned int mask = (mixer_ctrl->max << lshift) |
525 (mixer_ctrl->max << rshift);
526 da7218->mic_lvl_det_en &= ~mask;
527 da7218->mic_lvl_det_en |= (lvalue << lshift) | (rvalue << rshift);
530 * Here we only enable the feature on paths which are already
536 return snd_soc_component_write(component, mixer_ctrl->reg,
537 (da7218->in_filt_en & da7218->mic_lvl_det_en));
546 (struct soc_mixer_control *) kcontrol->private_value;
547 unsigned int lshift = mixer_ctrl->shift;
548 unsigned int rshift = mixer_ctrl->rshift;
549 unsigned int lmask = (mixer_ctrl->max << lshift);
550 unsigned int rmask = (mixer_ctrl->max << rshift);
552 ucontrol->value.integer.value[0] =
553 (da7218->mic_lvl_det_en & lmask) >> lshift;
554 ucontrol->value.integer.value[1] =
555 (da7218->mic_lvl_det_en & rmask) >> rshift;
566 (struct soc_bytes_ext *) kcontrol->private_value;
569 switch (bytes_ext->max) {
571 memcpy(ucontrol->value.bytes.data, da7218->biq_5stage_coeff,
572 bytes_ext->max);
575 memcpy(ucontrol->value.bytes.data, da7218->stbiq_3stage_coeff,
576 bytes_ext->max);
579 return -EINVAL;
591 (struct soc_bytes_ext *) kcontrol->private_value;
600 switch (bytes_ext->max) {
603 memcpy(da7218->biq_5stage_coeff, ucontrol->value.bytes.data,
604 bytes_ext->max);
608 memcpy(da7218->stbiq_3stage_coeff, ucontrol->value.bytes.data,
609 bytes_ext->max);
612 return -EINVAL;
620 for (i = 0; i < bytes_ext->max; ++i) {
621 cfg[DA7218_BIQ_CFG_DATA] = ucontrol->value.bytes.data[i];
623 regmap_raw_write(da7218->regmap, reg, cfg, DA7218_BIQ_CFG_SIZE);
796 /* Input High-Pass Filters */
1113 /* Output High-Pass Filter */
1118 /* 5-Band Equaliser */
1188 SOC_ENUM("Charge Pump Track Mode", da7218_cp_mchange),
1189 SOC_ENUM("Charge Pump Frequency", da7218_cp_fcontrol),
1190 SOC_ENUM("Charge Pump Decay Rate", da7218_cp_tau_delay),
1191 SOC_SINGLE("Charge Pump Threshold", DA7218_CP_VOL_THRESHOLD1,
1348 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1352 switch (w->reg) {
1366 return -EINVAL;
1371 da7218->in_filt_en |= mask;
1377 if (mask & da7218->mic_lvl_det_en)
1381 da7218->in_filt_en &= ~mask;
1384 return -EINVAL;
1387 /* Enable configured level detection paths */
1389 (da7218->in_filt_en & da7218->mic_lvl_det_en));
1397 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1405 if (da7218->master)
1406 /* Enable DAI clks for master mode */
1433 dev_warn(component->dev,
1459 dev_warn(component->dev, "SRM failed to lock\n");
1463 /* PC free-running */
1466 if (da7218->master)
1473 return -EINVAL;
1480 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1485 * output, we really don't want to touch the charge pump.
1487 if (da7218->hp_single_supply)
1500 return -EINVAL;
1507 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1511 /* Enable headphone output */
1512 snd_soc_component_update_bits(component, w->reg, DA7218_HP_AMP_OE_MASK,
1517 snd_soc_component_update_bits(component, w->reg, DA7218_HP_AMP_OE_MASK, 0);
1520 return -EINVAL;
1685 SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0, da7218_cp_event,
1800 {"HPL", NULL, "Charge Pump"},
1801 {"HPR", NULL, "Charge Pump"},
1812 struct snd_soc_component *component = codec_dai->component;
1816 if (da7218->mclk_rate == freq)
1820 dev_err(codec_dai->dev, "Unsupported MCLK value %d\n",
1822 return -EINVAL;
1836 dev_err(codec_dai->dev, "Unknown clock source %d\n", clk_id);
1837 return -EINVAL;
1840 if (da7218->mclk) {
1841 freq = clk_round_rate(da7218->mclk, freq);
1842 ret = clk_set_rate(da7218->mclk, freq);
1844 dev_err(codec_dai->dev, "Failed to set clock rate %d\n",
1850 da7218->mclk_rate = freq;
1858 struct snd_soc_component *component = codec_dai->component;
1866 /* Verify 2MHz - 54MHz MCLK provided, and set input divider */
1867 if (da7218->mclk_rate < 2000000) {
1868 dev_err(component->dev, "PLL input clock %d below valid range\n",
1869 da7218->mclk_rate);
1870 return -EINVAL;
1871 } else if (da7218->mclk_rate <= 4500000) {
1874 } else if (da7218->mclk_rate <= 9000000) {
1877 } else if (da7218->mclk_rate <= 18000000) {
1880 } else if (da7218->mclk_rate <= 36000000) {
1883 } else if (da7218->mclk_rate <= 54000000) {
1887 dev_err(component->dev, "PLL input clock %d above valid range\n",
1888 da7218->mclk_rate);
1889 return -EINVAL;
1891 freq_ref = (da7218->mclk_rate / indiv);
1909 dev_err(component->dev, "Invalid PLL config\n");
1910 return -EINVAL;
1933 struct snd_soc_component *component = codec_dai->component;
1939 da7218->master = true;
1942 da7218->master = false;
1945 return -EINVAL;
1966 return -EINVAL;
1984 return -EINVAL;
1988 return -EINVAL;
2005 return -EINVAL;
2022 struct snd_soc_component *component = dai->component;
2026 /* No channels enabled so disable TDM, revert to 64-bit frames */
2039 dev_err(component->dev, "Invalid number of slots, max = %d\n",
2041 return -EINVAL;
2046 dev_err(component->dev, "Invalid slot offset, max = %d\n",
2048 return -EINVAL;
2067 dev_err(component->dev, "Invalid frame size\n");
2068 return -EINVAL;
2091 struct snd_soc_component *component = dai->component;
2109 return -EINVAL;
2114 dev_err(component->dev,
2117 return -EINVAL;
2156 return -EINVAL;
2181 .name = "da7218-hifi",
2211 if (da7218->dev_id == DA7217_DEV_ID)
2212 return -EINVAL;
2214 da7218->jack = jack;
2230 kobject_uevent_env(&component->dev->kobj, KOBJ_CHANGE, envp);
2246 snd_soc_jack_report(da7218->jack, report, SND_JACK_HEADPHONE);
2311 dev_warn(component->dev, "Invalid micbias level");
2326 dev_warn(component->dev, "Invalid mic input type selection");
2339 dev_warn(component->dev, "Invalid DMIC data type selection");
2352 dev_warn(component->dev, "Invalid DMIC sample phase");
2366 dev_warn(component->dev, "Invalid DMIC clock rate");
2392 dev_warn(component->dev, "Invalid jack detect rate");
2410 dev_warn(component->dev, "Invalid jack debounce");
2428 dev_warn(component->dev, "Invalid jack threshold level");
2436 struct device_node *np = component->dev->of_node;
2443 pdata = devm_kzalloc(component->dev, sizeof(*pdata), GFP_KERNEL);
2447 if (of_property_read_u32(np, "dlg,micbias1-lvl-millivolt", &of_val32) >= 0)
2448 pdata->micbias1_lvl = da7218_of_micbias_lvl(component, of_val32);
2450 pdata->micbias1_lvl = DA7218_MICBIAS_1_6V;
2452 if (of_property_read_u32(np, "dlg,micbias2-lvl-millivolt", &of_val32) >= 0)
2453 pdata->micbias2_lvl = da7218_of_micbias_lvl(component, of_val32);
2455 pdata->micbias2_lvl = DA7218_MICBIAS_1_6V;
2457 if (!of_property_read_string(np, "dlg,mic1-amp-in-sel", &of_str))
2458 pdata->mic1_amp_in_sel =
2461 pdata->mic1_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
2463 if (!of_property_read_string(np, "dlg,mic2-amp-in-sel", &of_str))
2464 pdata->mic2_amp_in_sel =
2467 pdata->mic2_amp_in_sel = DA7218_MIC_AMP_IN_SEL_DIFF;
2469 if (!of_property_read_string(np, "dlg,dmic1-data-sel", &of_str))
2470 pdata->dmic1_data_sel = da7218_of_dmic_data_sel(component, of_str);
2472 pdata->dmic1_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
2474 if (!of_property_read_string(np, "dlg,dmic1-samplephase", &of_str))
2475 pdata->dmic1_samplephase =
2478 pdata->dmic1_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2480 if (of_property_read_u32(np, "dlg,dmic1-clkrate-hz", &of_val32) >= 0)
2481 pdata->dmic1_clk_rate = da7218_of_dmic_clkrate(component, of_val32);
2483 pdata->dmic1_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
2485 if (!of_property_read_string(np, "dlg,dmic2-data-sel", &of_str))
2486 pdata->dmic2_data_sel = da7218_of_dmic_data_sel(component, of_str);
2488 pdata->dmic2_data_sel = DA7218_DMIC_DATA_LRISE_RFALL;
2490 if (!of_property_read_string(np, "dlg,dmic2-samplephase", &of_str))
2491 pdata->dmic2_samplephase =
2494 pdata->dmic2_samplephase = DA7218_DMIC_SAMPLE_ON_CLKEDGE;
2496 if (of_property_read_u32(np, "dlg,dmic2-clkrate-hz", &of_val32) >= 0)
2497 pdata->dmic2_clk_rate = da7218_of_dmic_clkrate(component, of_val32);
2499 pdata->dmic2_clk_rate = DA7218_DMIC_CLK_3_0MHZ;
2501 if (da7218->dev_id == DA7217_DEV_ID) {
2502 if (of_property_read_bool(np, "dlg,hp-diff-single-supply"))
2503 pdata->hp_diff_single_supply = true;
2506 if (da7218->dev_id == DA7218_DEV_ID) {
2511 hpldet_pdata = devm_kzalloc(component->dev, sizeof(*hpldet_pdata),
2517 pdata->hpldet_pdata = hpldet_pdata;
2519 if (of_property_read_u32(hpldet_np, "dlg,jack-rate-us",
2521 hpldet_pdata->jack_rate =
2524 hpldet_pdata->jack_rate = DA7218_HPLDET_JACK_RATE_40US;
2526 if (of_property_read_u32(hpldet_np, "dlg,jack-debounce",
2528 hpldet_pdata->jack_debounce =
2531 hpldet_pdata->jack_debounce =
2534 if (of_property_read_u32(hpldet_np, "dlg,jack-threshold-pct",
2536 hpldet_pdata->jack_thr =
2539 hpldet_pdata->jack_thr = DA7218_HPLDET_JACK_THR_84PCT;
2541 if (of_property_read_bool(hpldet_np, "dlg,comp-inv"))
2542 hpldet_pdata->comp_inv = true;
2545 hpldet_pdata->hyst = true;
2548 hpldet_pdata->discharge = true;
2571 /* Enable MCLK for transition to ON state */
2573 if (da7218->mclk) {
2574 ret = clk_prepare_enable(da7218->mclk);
2576 dev_err(component->dev, "Failed to enable mclk\n");
2596 if (da7218->mclk)
2597 clk_disable_unprepare(da7218->mclk);
2602 if (!da7218->jack) {
2632 da7218->supplies[i].supply = da7218_supply_names[i];
2634 ret = devm_regulator_bulk_get(component->dev, DA7218_NUM_SUPPLIES,
2635 da7218->supplies);
2637 dev_err(component->dev, "Failed to get supplies\n");
2642 vddio = da7218->supplies[DA7218_SUPPLY_VDDIO].consumer;
2645 dev_warn(component->dev, "Invalid VDDIO voltage\n");
2649 /* Enable main supplies */
2650 ret = regulator_bulk_enable(DA7218_NUM_SUPPLIES, da7218->supplies);
2652 dev_err(component->dev, "Failed to enable supplies\n");
2668 struct da7218_pdata *pdata = da7218->pdata;
2674 switch (pdata->micbias1_lvl) {
2686 micbias_lvl |= (pdata->micbias1_lvl <<
2691 switch (pdata->micbias2_lvl) {
2703 micbias_lvl |= (pdata->micbias2_lvl <<
2711 switch (pdata->mic1_amp_in_sel) {
2716 pdata->mic1_amp_in_sel);
2720 switch (pdata->mic2_amp_in_sel) {
2725 pdata->mic2_amp_in_sel);
2730 switch (pdata->dmic1_data_sel) {
2733 dmic_cfg |= (pdata->dmic1_data_sel <<
2738 switch (pdata->dmic1_samplephase) {
2741 dmic_cfg |= (pdata->dmic1_samplephase <<
2746 switch (pdata->dmic1_clk_rate) {
2749 dmic_cfg |= (pdata->dmic1_clk_rate <<
2760 switch (pdata->dmic2_data_sel) {
2763 dmic_cfg |= (pdata->dmic2_data_sel <<
2768 switch (pdata->dmic2_samplephase) {
2771 dmic_cfg |= (pdata->dmic2_samplephase <<
2776 switch (pdata->dmic2_clk_rate) {
2779 dmic_cfg |= (pdata->dmic2_clk_rate <<
2790 if (da7218->dev_id == DA7217_DEV_ID) {
2791 da7218->hp_single_supply =
2792 pdata->hp_diff_single_supply;
2794 if (da7218->hp_single_supply) {
2804 if ((da7218->dev_id == DA7218_DEV_ID) &&
2805 (pdata->hpldet_pdata)) {
2807 pdata->hpldet_pdata;
2810 switch (hpldet_pdata->jack_rate) {
2820 (hpldet_pdata->jack_rate <<
2825 switch (hpldet_pdata->jack_debounce) {
2831 (hpldet_pdata->jack_debounce <<
2836 switch (hpldet_pdata->jack_thr) {
2842 (hpldet_pdata->jack_thr <<
2853 if (hpldet_pdata->comp_inv)
2856 if (hpldet_pdata->hyst)
2859 if (hpldet_pdata->discharge)
2878 if (component->dev->of_node)
2879 da7218->pdata = da7218_of_to_pdata(component);
2881 da7218->pdata = dev_get_platdata(component->dev);
2886 da7218->mclk = devm_clk_get_optional(component->dev, "mclk");
2887 if (IS_ERR(da7218->mclk)) {
2888 ret = PTR_ERR(da7218->mclk);
2892 /* Default PC to free-running */
2944 if (da7218->dev_id == DA7217_DEV_ID) {
2954 if (da7218->irq) {
2955 ret = devm_request_threaded_irq(component->dev, da7218->irq, NULL,
2960 dev_err(component->dev, "Failed to request IRQ %d: %d\n",
2961 da7218->irq, ret);
2970 regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
2979 regulator_bulk_disable(DA7218_NUM_SUPPLIES, da7218->supplies);
2990 if (!da7218->jack)
3001 if (!da7218->jack)
3251 da7218 = devm_kzalloc(&i2c->dev, sizeof(*da7218), GFP_KERNEL);
3253 return -ENOMEM;
3257 da7218->dev_id = (uintptr_t)i2c_get_match_data(i2c);
3259 if ((da7218->dev_id != DA7217_DEV_ID) &&
3260 (da7218->dev_id != DA7218_DEV_ID)) {
3261 dev_err(&i2c->dev, "Invalid device Id\n");
3262 return -EINVAL;
3265 da7218->irq = i2c->irq;
3267 da7218->regmap = devm_regmap_init_i2c(i2c, &da7218_regmap_config);
3268 if (IS_ERR(da7218->regmap)) {
3269 ret = PTR_ERR(da7218->regmap);
3270 dev_err(&i2c->dev, "regmap_init() failed: %d\n", ret);
3274 ret = devm_snd_soc_register_component(&i2c->dev,
3277 dev_err(&i2c->dev, "Failed to register da7218 component: %d\n",