Lines Matching +full:current +full:- +full:limiter

1 // SPDX-License-Identifier: GPL-2.0
349 struct snd_soc_component *component = codec_dai->component;
360 dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
377 dev_err(component->dev, "DAI invert mode %d unsupported\n",
379 return -EINVAL;
397 dev_err(component->dev, "DAI format %d unsupported\n",
399 return -EINVAL;
402 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
404 return -EINVAL;
407 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
409 return -EINVAL;
413 ret = regmap_read(max98396->regmap,
416 return -EINVAL;
422 max98396_global_enable_onoff(max98396->regmap, false);
425 regmap_update_bits(max98396->regmap,
429 regmap_update_bits(max98396->regmap,
435 max98396_global_enable_onoff(max98396->regmap, true);
497 if (in_slots == c->in && out_slots <= c->out && width == c->width)
501 return -1;
508 struct snd_soc_component *component = dai->component;
527 dev_err(component->dev, "format unsupported %d\n",
532 dev_dbg(component->dev, "format supported %d",
574 dev_err(component->dev, "rate %d not supported\n",
579 if (max98396->tdm_mode) {
580 if (params_rate(params) > max98396->tdm_max_samplerate) {
581 dev_err(component->dev, "TDM sample rate %d too high",
591 dev_err(component->dev,
600 dev_err(component->dev, "sample rate %d too high",
606 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
611 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
617 ret = regmap_read(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP, &reg);
626 max98396_global_enable_onoff(max98396->regmap, false);
630 regmap_update_bits(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG,
634 regmap_update_bits(max98396->regmap, MAX98396_R2043_PCM_SR_SETUP,
638 if (max98396->interleave_mode &&
640 regmap_update_bits(max98396->regmap,
643 (sampling_rate - 3)
646 regmap_update_bits(max98396->regmap,
652 regmap_update_bits(max98396->regmap,
658 max98396_global_enable_onoff(max98396->regmap, true);
663 return -EINVAL;
670 struct snd_soc_component *component = dai->component;
680 max98396->tdm_mode = false;
682 max98396->tdm_mode = true;
687 dev_err(component->dev, "no TDM config for %d slots %d bits\n",
689 return -EINVAL;
693 max98396->tdm_max_samplerate = max98396_pcm_configs[ret].max_sr;
707 dev_err(component->dev, "slot width %d unsupported\n",
709 return -EINVAL;
712 ret = regmap_read(max98396->regmap, MAX98396_R210F_GLOBAL_EN, &status);
714 return -EINVAL;
717 ret = regmap_read(max98396->regmap, MAX98396_R2042_PCM_CLK_SETUP, &reg);
719 return -EINVAL;
723 ret = regmap_read(max98396->regmap, MAX98396_R2041_PCM_MODE_CFG, &reg);
725 return -EINVAL;
732 max98396_global_enable_onoff(max98396->regmap, false);
735 regmap_update_bits(max98396->regmap,
740 regmap_update_bits(max98396->regmap,
745 if (max98396->device_id == CODEC_TYPE_MAX98396) {
746 regmap_update_bits(max98396->regmap,
750 regmap_update_bits(max98396->regmap,
755 regmap_update_bits(max98396->regmap,
759 regmap_update_bits(max98396->regmap,
765 /* Tx slot Hi-Z configuration */
766 if (max98396->device_id == CODEC_TYPE_MAX98396) {
767 regmap_write(max98396->regmap,
770 regmap_write(max98396->regmap,
774 regmap_write(max98396->regmap,
777 regmap_write(max98396->regmap,
783 max98396_global_enable_onoff(max98396->regmap, true);
803 snd_soc_dapm_to_component(w->dapm);
809 max98396_global_enable_onoff(max98396->regmap, true);
812 max98396_global_enable_onoff(max98396->regmap, false);
814 max98396->tdm_mode = false;
941 static DECLARE_TLV_DB_SCALE(max98396_digital_tlv, -6350, 50, 1);
947 0x4B, 0xFF, TLV_DB_SCALE_ITEM(-9000, 50, 0),
960 if (max98396->device_id == CODEC_TYPE_MAX98396)
965 regmap_read(max98396->regmap, reg, &val);
967 ucontrol->value.enumerated.item[0] = val;
978 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
979 unsigned int *item = ucontrol->value.enumerated.item;
983 if (item[0] >= e->items)
984 return -EINVAL;
986 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
988 if (max98396->device_id == CODEC_TYPE_MAX98396)
997 regmap_update_bits(max98396->regmap, reg,
1027 SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
1110 (struct soc_mixer_control *)kcontrol->private_value;
1114 int reg = mc->reg;
1120 if (max98396->device_id == CODEC_TYPE_MAX98397) {
1121 switch (mc->reg) {
1136 ret = regmap_raw_read(max98396->regmap, reg, &val, 2);
1141 ucontrol->value.integer.value[0] = (val[0] << 1) | (val[1] & 1);
1145 ucontrol->value.integer.value[0] = 0;
1185 SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1258 SOC_SINGLE("BPE Limiter Switch", MAX98396_R210D_BPE_EN, 1, 1, 0),
1305 { "Current Sense", NULL, "VI Sense" },
1310 .name = "max98396-aif1",
1331 .name = "max98397-aif1",
1355 ret = regmap_write(max98396->regmap,
1364 ret = regmap_read(max98396->regmap,
1365 GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1381 max98396_reset(max98396, component->dev);
1384 if (max98396->device_id == CODEC_TYPE_MAX98396) {
1385 regmap_write(max98396->regmap,
1387 regmap_write(max98396->regmap,
1390 regmap_write(max98396->regmap,
1392 regmap_write(max98396->regmap,
1396 regmap_update_bits(max98396->regmap,
1399 (max98396->vbat == NULL) ?
1402 regmap_update_bits(max98396->regmap,
1405 regmap_update_bits(max98396->regmap,
1410 regmap_write(max98396->regmap,
1413 regmap_update_bits(max98396->regmap,
1416 regmap_update_bits(max98396->regmap,
1420 regmap_write(max98396->regmap,
1422 max98396->bypass_slot);
1423 /* Voltage, current slot configuration */
1424 regmap_write(max98396->regmap,
1426 max98396->v_slot);
1427 regmap_write(max98396->regmap,
1429 max98396->i_slot);
1430 regmap_write(max98396->regmap,
1432 max98396->spkfb_slot);
1434 if (max98396->v_slot < 8)
1435 if (max98396->device_id == CODEC_TYPE_MAX98396)
1436 regmap_update_bits(max98396->regmap,
1438 1 << max98396->v_slot, 0);
1440 regmap_update_bits(max98396->regmap,
1442 1 << max98396->v_slot, 0);
1444 if (max98396->device_id == CODEC_TYPE_MAX98396)
1445 regmap_update_bits(max98396->regmap,
1447 1 << (max98396->v_slot - 8), 0);
1449 regmap_update_bits(max98396->regmap,
1451 1 << (max98396->v_slot - 8), 0);
1453 if (max98396->i_slot < 8)
1454 if (max98396->device_id == CODEC_TYPE_MAX98396)
1455 regmap_update_bits(max98396->regmap,
1457 1 << max98396->i_slot, 0);
1459 regmap_update_bits(max98396->regmap,
1461 1 << max98396->i_slot, 0);
1463 if (max98396->device_id == CODEC_TYPE_MAX98396)
1464 regmap_update_bits(max98396->regmap,
1466 1 << (max98396->i_slot - 8), 0);
1468 regmap_update_bits(max98396->regmap,
1470 1 << (max98396->i_slot - 8), 0);
1473 if (max98396->interleave_mode)
1474 regmap_update_bits(max98396->regmap,
1479 regmap_update_bits(max98396->regmap,
1484 regmap_update_bits(max98396->regmap,
1487 max98396->dmon_stuck_enable ?
1490 regmap_update_bits(max98396->regmap,
1493 max98396->dmon_mag_enable ?
1496 switch (max98396->dmon_duration) {
1498 regmap_update_bits(max98396->regmap,
1503 regmap_update_bits(max98396->regmap,
1508 regmap_update_bits(max98396->regmap,
1513 regmap_update_bits(max98396->regmap,
1518 dev_err(component->dev, "Invalid DMON duration %d\n",
1519 max98396->dmon_duration);
1522 switch (max98396->dmon_stuck_threshold) {
1524 regmap_update_bits(max98396->regmap,
1530 regmap_update_bits(max98396->regmap,
1536 regmap_update_bits(max98396->regmap,
1542 regmap_update_bits(max98396->regmap,
1548 dev_err(component->dev, "Invalid DMON stuck threshold %d\n",
1549 max98396->dmon_stuck_threshold);
1552 switch (max98396->dmon_mag_threshold) {
1554 regmap_update_bits(max98396->regmap,
1557 (5 - max98396->dmon_mag_threshold)
1561 dev_err(component->dev, "Invalid DMON magnitude threshold %d\n",
1562 max98396->dmon_mag_threshold);
1566 regmap_update_bits(max98396->regmap,
1577 regcache_cache_only(max98396->regmap, true);
1578 regcache_mark_dirty(max98396->regmap);
1580 max98396->core_supplies);
1581 if (max98396->pvdd)
1582 regulator_disable(max98396->pvdd);
1584 if (max98396->vbat)
1585 regulator_disable(max98396->vbat);
1596 max98396->core_supplies);
1600 if (max98396->pvdd) {
1601 ret = regulator_enable(max98396->pvdd);
1606 if (max98396->vbat) {
1607 ret = regulator_enable(max98396->vbat);
1612 regcache_cache_only(max98396->regmap, false);
1614 regcache_sync(max98396->regmap);
1675 if (!device_property_read_u32(dev, "adi,vmon-slot-no", &value))
1676 max98396->v_slot = value & 0xF;
1678 max98396->v_slot = 0;
1680 if (!device_property_read_u32(dev, "adi,imon-slot-no", &value))
1681 max98396->i_slot = value & 0xF;
1683 max98396->i_slot = 1;
1685 if (!device_property_read_u32(dev, "adi,spkfb-slot-no", &value))
1686 max98396->spkfb_slot = value & 0xF;
1688 max98396->spkfb_slot = 2;
1690 if (!device_property_read_u32(dev, "adi,bypass-slot-no", &value))
1691 max98396->bypass_slot = value & 0xF;
1693 max98396->bypass_slot = 0;
1695 max98396->dmon_stuck_enable =
1696 device_property_read_bool(dev, "adi,dmon-stuck-enable");
1698 if (!device_property_read_u32(dev, "adi,dmon-stuck-threshold-bits", &value))
1699 max98396->dmon_stuck_threshold = value;
1701 max98396->dmon_stuck_threshold = 15;
1703 max98396->dmon_mag_enable =
1704 device_property_read_bool(dev, "adi,dmon-magnitude-enable");
1706 if (!device_property_read_u32(dev, "adi,dmon-magnitude-threshold-bits", &value))
1707 max98396->dmon_mag_threshold = value;
1709 max98396->dmon_mag_threshold = 5;
1711 if (!device_property_read_u32(dev, "adi,dmon-duration-ms", &value))
1712 max98396->dmon_duration = value;
1714 max98396->dmon_duration = 64;
1722 max98396->core_supplies);
1736 max98396 = devm_kzalloc(&i2c->dev, sizeof(*max98396), GFP_KERNEL);
1739 ret = -ENOMEM;
1744 max98396->device_id = id->driver_data;
1747 if (max98396->device_id == CODEC_TYPE_MAX98396)
1748 max98396->regmap = devm_regmap_init_i2c(i2c, &max98396_regmap);
1751 max98396->regmap = devm_regmap_init_i2c(i2c, &max98397_regmap);
1753 if (IS_ERR(max98396->regmap)) {
1754 ret = PTR_ERR(max98396->regmap);
1755 dev_err(&i2c->dev,
1762 max98396->core_supplies[i].supply = max98396_core_supplies[i];
1764 ret = devm_regulator_bulk_get(&i2c->dev, MAX98396_NUM_CORE_SUPPLIES,
1765 max98396->core_supplies);
1767 dev_err(&i2c->dev, "Failed to request core supplies: %d\n", ret);
1771 max98396->vbat = devm_regulator_get_optional(&i2c->dev, "vbat");
1772 if (IS_ERR(max98396->vbat)) {
1773 if (PTR_ERR(max98396->vbat) == -EPROBE_DEFER)
1774 return -EPROBE_DEFER;
1776 max98396->vbat = NULL;
1779 max98396->pvdd = devm_regulator_get_optional(&i2c->dev, "pvdd");
1780 if (IS_ERR(max98396->pvdd)) {
1781 if (PTR_ERR(max98396->pvdd) == -EPROBE_DEFER)
1782 return -EPROBE_DEFER;
1784 max98396->pvdd = NULL;
1788 max98396->core_supplies);
1790 dev_err(&i2c->dev, "Unable to enable core supplies: %d", ret);
1794 ret = devm_add_action_or_reset(&i2c->dev, max98396_core_supplies_disable,
1799 if (max98396->pvdd) {
1800 ret = regulator_enable(max98396->pvdd);
1804 ret = devm_add_action_or_reset(&i2c->dev,
1806 max98396->pvdd);
1811 if (max98396->vbat) {
1812 ret = regulator_enable(max98396->vbat);
1816 ret = devm_add_action_or_reset(&i2c->dev,
1818 max98396->vbat);
1824 if (device_property_read_bool(&i2c->dev, "adi,interleave_mode"))
1825 max98396->interleave_mode = true;
1827 max98396->interleave_mode = false;
1829 /* voltage/current slot & gpio configuration */
1830 max98396_read_device_property(&i2c->dev, max98396);
1833 max98396->reset_gpio = devm_gpiod_get_optional(&i2c->dev,
1835 if (IS_ERR(max98396->reset_gpio)) {
1836 ret = PTR_ERR(max98396->reset_gpio);
1837 dev_err(&i2c->dev, "Unable to request GPIO pin: %d.\n", ret);
1841 if (max98396->reset_gpio) {
1843 gpiod_set_value_cansleep(max98396->reset_gpio, 0);
1848 ret = regmap_read(max98396->regmap,
1849 GET_REG_ADDR_REV_ID(max98396->device_id), &reg);
1851 dev_err(&i2c->dev, "%s: failed to read revision of the device.\n", id->name);
1854 dev_info(&i2c->dev, "%s revision ID: 0x%02X\n", id->name, reg);
1857 if (max98396->device_id == CODEC_TYPE_MAX98396)
1858 ret = devm_snd_soc_register_component(&i2c->dev,
1863 ret = devm_snd_soc_register_component(&i2c->dev,
1868 dev_err(&i2c->dev, "Failed to register codec: %d\n", ret);