Lines Matching defs:adau1977
26 #include <dt-bindings/sound/adi,adau1977.h>
28 #include "adau1977.h"
111 struct adau1977 {
225 static int adau1977_reset(struct adau1977 *adau1977)
235 regcache_cache_bypass(adau1977->regmap, true);
236 ret = regmap_write(adau1977->regmap, ADAU1977_REG_POWER,
238 regcache_cache_bypass(adau1977->regmap, false);
263 static int adau1977_lookup_mcs(struct adau1977 *adau1977, unsigned int rate,
276 if (adau1977->sysclk % rate != 0)
279 mcs = adau1977->sysclk / rate;
296 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
308 if (adau1977->sysclk_src == ADAU1977_SYSCLK_SRC_MCLK) {
309 mcs = adau1977_lookup_mcs(adau1977, rate, fs);
319 if (adau1977->right_j) {
333 if (adau1977->clock_provider) {
349 if (adau1977->slot_width)
350 slot_width = adau1977->slot_width;
357 ret = regmap_update_bits(adau1977->regmap,
366 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
371 return regmap_update_bits(adau1977->regmap, ADAU1977_REG_PLL,
375 static int adau1977_power_disable(struct adau1977 *adau1977)
379 if (!adau1977->enabled)
382 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_POWER,
387 regcache_mark_dirty(adau1977->regmap);
389 gpiod_set_value_cansleep(adau1977->reset_gpio, 0);
391 regcache_cache_only(adau1977->regmap, true);
393 regulator_disable(adau1977->avdd_reg);
394 if (adau1977->dvdd_reg)
395 regulator_disable(adau1977->dvdd_reg);
397 adau1977->enabled = false;
402 static int adau1977_power_enable(struct adau1977 *adau1977)
407 if (adau1977->enabled)
410 ret = regulator_enable(adau1977->avdd_reg);
414 if (adau1977->dvdd_reg) {
415 ret = regulator_enable(adau1977->dvdd_reg);
420 gpiod_set_value_cansleep(adau1977->reset_gpio, 1);
422 regcache_cache_only(adau1977->regmap, false);
424 if (adau1977->switch_mode)
425 adau1977->switch_mode(adau1977->dev);
427 ret = adau1977_reset(adau1977);
431 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_POWER,
436 ret = regcache_sync(adau1977->regmap);
447 ret = regmap_read(adau1977->regmap, ADAU1977_REG_PLL, &val);
452 regcache_cache_bypass(adau1977->regmap, true);
453 ret = regmap_write(adau1977->regmap, ADAU1977_REG_PLL,
457 regcache_cache_bypass(adau1977->regmap, false);
460 adau1977->enabled = true;
465 if (adau1977->dvdd_reg)
466 regulator_disable(adau1977->dvdd_reg);
468 regulator_disable(adau1977->avdd_reg);
475 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
485 ret = adau1977_power_enable(adau1977);
488 ret = adau1977_power_disable(adau1977);
498 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
506 adau1977->slot_width = 0;
507 adau1977->max_clock_provider_fs = 192000;
508 return regmap_update_bits(adau1977->regmap,
536 if (adau1977->clock_provider)
564 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_OVERTEMP,
572 ret = regmap_write(adau1977->regmap, ADAU1977_REG_CMAP12,
578 ret = regmap_write(adau1977->regmap, ADAU1977_REG_CMAP34,
584 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
589 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL1,
594 adau1977->slot_width = width;
597 adau1977->max_clock_provider_fs = min(192000, 24576000 / width / slots);
604 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
612 return regmap_update_bits(adau1977->regmap, ADAU1977_REG_MISC_CONTROL,
618 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
625 adau1977->clock_provider = false;
629 adau1977->clock_provider = true;
654 adau1977->right_j = false;
665 adau1977->right_j = true;
685 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI,
691 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL0,
697 return regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_CTRL1,
705 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
708 if (adau1977->slot_width == 16)
710 else if (adau1977->right_j || adau1977->slot_width == 24)
715 SNDRV_PCM_HW_PARAM_RATE, &adau1977->constraints);
717 if (adau1977->clock_provider)
720 adau1977->max_clock_provider_fs);
731 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(dai->component);
739 return regmap_update_bits(adau1977->regmap, ADAU1977_REG_SAI_OVERTEMP,
753 .name = "adau1977-hifi",
795 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
834 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_PLL,
839 adau1977->constraints.mask = mask;
840 adau1977->sysclk_src = source;
841 adau1977->sysclk = freq;
849 struct adau1977 *adau1977 = snd_soc_component_get_drvdata(component);
852 switch (adau1977->type) {
881 static int adau1977_setup_micbias(struct adau1977 *adau1977)
885 if (device_property_read_u32(adau1977->dev, "adi,micbias", &micbias))
889 dev_err(adau1977->dev, "Invalid value for 'adi,micbias'\n");
893 return regmap_update_bits(adau1977->regmap, ADAU1977_REG_MICBIAS,
902 struct adau1977 *adau1977;
908 adau1977 = devm_kzalloc(dev, sizeof(*adau1977), GFP_KERNEL);
909 if (adau1977 == NULL)
912 adau1977->dev = dev;
913 adau1977->type = type;
914 adau1977->regmap = regmap;
915 adau1977->switch_mode = switch_mode;
916 adau1977->max_clock_provider_fs = 192000;
918 adau1977->constraints.list = adau1977_rates;
919 adau1977->constraints.count = ARRAY_SIZE(adau1977_rates);
921 adau1977->avdd_reg = devm_regulator_get(dev, "AVDD");
922 if (IS_ERR(adau1977->avdd_reg))
923 return PTR_ERR(adau1977->avdd_reg);
925 adau1977->dvdd_reg = devm_regulator_get_optional(dev, "DVDD");
926 if (IS_ERR(adau1977->dvdd_reg)) {
927 if (PTR_ERR(adau1977->dvdd_reg) != -ENODEV)
928 return PTR_ERR(adau1977->dvdd_reg);
929 adau1977->dvdd_reg = NULL;
932 adau1977->reset_gpio = devm_gpiod_get_optional(dev, "reset",
934 if (IS_ERR(adau1977->reset_gpio))
935 return PTR_ERR(adau1977->reset_gpio);
937 dev_set_drvdata(dev, adau1977);
939 if (adau1977->reset_gpio)
942 ret = adau1977_power_enable(adau1977);
947 ret = adau1977_setup_micbias(adau1977);
952 if (adau1977->dvdd_reg)
957 ret = regmap_update_bits(adau1977->regmap, ADAU1977_REG_BLOCK_POWER_SAI,
962 ret = adau1977_power_disable(adau1977);
970 adau1977_power_disable(adau1977);