Lines Matching +full:sample +full:- +full:at +full:- +full:reset

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * The data format accepted is I2S or left-justified.
131 * Default CS4271 power-up configuration
132 * Array contains non-existing in hw register at address 0
134 * registers read operations at all
160 /* Current sample rate for de-emphasis control */
162 /* GPIO driving Reset pin, if any */
163 struct gpio_desc *reset; member
164 /* enable soft reset workaround */
175 SND_SOC_DAPM_OUTPUT("AOUTA-"),
177 SND_SOC_DAPM_OUTPUT("AOUTB-"),
185 { "AOUTA-", NULL, "Playback" },
187 { "AOUTB-", NULL, "Playback" },
192 * MCLK rate should (c) be the sample rate, multiplied by one of the
198 struct snd_soc_component *component = codec_dai->component; in cs4271_set_dai_sysclk()
201 cs4271->mclk = freq; in cs4271_set_dai_sysclk()
208 struct snd_soc_component *component = codec_dai->component; in cs4271_set_dai_fmt()
215 cs4271->master = false; in cs4271_set_dai_fmt()
218 cs4271->master = true; in cs4271_set_dai_fmt()
222 dev_err(component->dev, "Invalid DAI format\n"); in cs4271_set_dai_fmt()
223 return -EINVAL; in cs4271_set_dai_fmt()
229 ret = regmap_update_bits(cs4271->regmap, CS4271_ADCCTL, in cs4271_set_dai_fmt()
236 ret = regmap_update_bits(cs4271->regmap, CS4271_ADCCTL, in cs4271_set_dai_fmt()
242 dev_err(component->dev, "Invalid DAI format\n"); in cs4271_set_dai_fmt()
243 return -EINVAL; in cs4271_set_dai_fmt()
246 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE1, in cs4271_set_dai_fmt()
261 if (cs4271->deemph) { in cs4271_set_deemph()
262 /* Find closest de-emphasis freq */ in cs4271_set_deemph()
265 if (abs(cs4271_deemph[i] - cs4271->rate) < in cs4271_set_deemph()
266 abs(cs4271_deemph[val] - cs4271->rate)) in cs4271_set_deemph()
271 ret = regmap_update_bits(cs4271->regmap, CS4271_DACCTL, in cs4271_set_deemph()
284 ucontrol->value.integer.value[0] = cs4271->deemph; in cs4271_get_deemph()
294 cs4271->deemph = ucontrol->value.integer.value[0]; in cs4271_put_deemph()
301 unsigned short ratio; /* MCLK / sample rate */
341 struct snd_soc_component *component = dai->component; in cs4271_hw_params()
346 if (cs4271->enable_soft_reset) { in cs4271_hw_params()
348 * Put the codec in soft reset and back again in case it's not in cs4271_hw_params()
352 * to a read hardware reset, we don't have to sync back all in cs4271_hw_params()
356 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK && in cs4271_hw_params()
358 (substream->stream == SNDRV_PCM_STREAM_CAPTURE && in cs4271_hw_params()
360 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_hw_params()
366 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_hw_params()
373 cs4271->rate = params_rate(params); in cs4271_hw_params()
376 if (cs4271->rate < 50000) in cs4271_hw_params()
378 else if (cs4271->rate < 100000) in cs4271_hw_params()
383 ratio = cs4271->mclk / cs4271->rate; in cs4271_hw_params()
385 if ((cs4271_clk_tab[i].master == cs4271->master) && in cs4271_hw_params()
391 dev_err(component->dev, "Invalid sample rate\n"); in cs4271_hw_params()
392 return -EINVAL; in cs4271_hw_params()
397 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE1, in cs4271_hw_params()
407 struct snd_soc_component *component = dai->component; in cs4271_mute_stream()
421 ret = regmap_update_bits(cs4271->regmap, CS4271_VOLA, in cs4271_mute_stream()
426 ret = regmap_update_bits(cs4271->regmap, CS4271_VOLB, in cs4271_mute_stream()
435 static DECLARE_TLV_DB_SCALE(cs4271_dac_tlv, -12700, 100, 0);
443 SOC_SINGLE_BOOL_EXT("De-emphasis Switch", 0,
445 SOC_SINGLE("Auto-Mute Switch", CS4271_DACCTL, 7, 1, 0),
447 SOC_SINGLE("Soft Volume Ramp-Up Switch", CS4271_DACCTL, 3, 1, 0),
448 SOC_SINGLE("Soft Ramp-Down Switch", CS4271_DACCTL, 2, 1, 0),
452 SOC_SINGLE("Dither 16-Bit Data Switch", CS4271_ADCCTL, 5, 1, 0),
466 .name = "cs4271-hifi",
489 gpiod_direction_output(cs4271->reset, 1); in cs4271_reset()
491 gpiod_set_value(cs4271->reset, 0); in cs4271_reset()
503 /* Set power-down bit */ in cs4271_soc_suspend()
504 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_soc_suspend()
509 regcache_mark_dirty(cs4271->regmap); in cs4271_soc_suspend()
510 clk_disable_unprepare(cs4271->clk); in cs4271_soc_suspend()
511 regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); in cs4271_soc_suspend()
521 ret = regulator_bulk_enable(ARRAY_SIZE(cs4271->supplies), in cs4271_soc_resume()
522 cs4271->supplies); in cs4271_soc_resume()
524 dev_err(component->dev, "Failed to enable regulators: %d\n", ret); in cs4271_soc_resume()
528 ret = clk_prepare_enable(cs4271->clk); in cs4271_soc_resume()
530 dev_err(component->dev, "Failed to enable clk: %d\n", ret); in cs4271_soc_resume()
534 /* Do a proper reset after power up */ in cs4271_soc_resume()
538 ret = regcache_sync(cs4271->regmap); in cs4271_soc_resume()
542 /* then disable the power-down bit */ in cs4271_soc_resume()
543 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_soc_resume()
567 struct cs4271_platform_data *cs4271plat = component->dev->platform_data; in cs4271_component_probe()
571 amutec_eq_bmutec = of_property_read_bool(component->dev->of_node, in cs4271_component_probe()
572 "cirrus,amutec-eq-bmutec"); in cs4271_component_probe()
573 cs4271->enable_soft_reset = of_property_read_bool(component->dev->of_node, in cs4271_component_probe()
574 "cirrus,enable-soft-reset"); in cs4271_component_probe()
576 ret = regulator_bulk_enable(ARRAY_SIZE(cs4271->supplies), in cs4271_component_probe()
577 cs4271->supplies); in cs4271_component_probe()
579 dev_err(component->dev, "Failed to enable regulators: %d\n", ret); in cs4271_component_probe()
584 amutec_eq_bmutec = cs4271plat->amutec_eq_bmutec; in cs4271_component_probe()
585 cs4271->enable_soft_reset = cs4271plat->enable_soft_reset; in cs4271_component_probe()
588 ret = clk_prepare_enable(cs4271->clk); in cs4271_component_probe()
590 dev_err(component->dev, "Failed to enable clk: %d\n", ret); in cs4271_component_probe()
594 /* Reset codec */ in cs4271_component_probe()
597 ret = regcache_sync(cs4271->regmap); in cs4271_component_probe()
601 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_component_probe()
607 ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_component_probe()
612 /* Power-up sequence requires 85 uS */ in cs4271_component_probe()
616 regmap_update_bits(cs4271->regmap, CS4271_MODE2, in cs4271_component_probe()
623 clk_disable_unprepare(cs4271->clk); in cs4271_component_probe()
625 regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); in cs4271_component_probe()
633 /* Set codec to the reset state */ in cs4271_component_remove()
634 gpiod_set_value(cs4271->reset, 1); in cs4271_component_remove()
636 regcache_mark_dirty(cs4271->regmap); in cs4271_component_remove()
637 regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies); in cs4271_component_remove()
638 clk_disable_unprepare(cs4271->clk); in cs4271_component_remove()
665 return -ENOMEM; in cs4271_common_probe()
667 cs4271->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_ASIS); in cs4271_common_probe()
668 if (IS_ERR(cs4271->reset)) in cs4271_common_probe()
669 return dev_err_probe(dev, PTR_ERR(cs4271->reset), in cs4271_common_probe()
670 "error retrieving RESET GPIO\n"); in cs4271_common_probe()
671 gpiod_set_consumer_name(cs4271->reset, "CS4271 Reset"); in cs4271_common_probe()
673 cs4271->clk = devm_clk_get_optional(dev, "mclk"); in cs4271_common_probe()
674 if (IS_ERR(cs4271->clk)) in cs4271_common_probe()
675 return dev_err_probe(dev, PTR_ERR(cs4271->clk), "Failed to get mclk\n"); in cs4271_common_probe()
678 cs4271->supplies[i].supply = supply_names[i]; in cs4271_common_probe()
680 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(cs4271->supplies), in cs4271_common_probe()
681 cs4271->supplies); in cs4271_common_probe()
716 cs4271->regmap = regmap; in cs4271_probe()