Lines Matching refs:cs4234
2 // cs4234.c -- ALSA SoC CS4234 driver
26 #include "cs4234.h"
28 struct cs4234 {
89 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(component);
96 regmap_read(cs4234->regmap, CS4234_ADC_CTRL2, &val);
103 regmap_read(cs4234->regmap, CS4234_DAC_CTRL4, &val);
120 struct cs4234 *cs4234 = container_of(dw, struct cs4234, vq_ramp_delay);
122 complete_all(&cs4234->vq_ramp_complete);
128 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(component);
134 wait_for_completion(&cs4234->vq_ramp_complete);
290 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(component);
293 cs4234->format = format & SND_SOC_DAIFMT_FORMAT_MASK;
294 switch (cs4234->format) {
313 if (cs4234->format == SND_SOC_DAIFMT_DSP_A) {
335 regmap_update_bits(cs4234->regmap, CS4234_SP_CTRL,
347 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(component);
351 cs4234->lrclk_rate = params_rate(params);
352 mclk_mult = cs4234->mclk_rate / cs4234->lrclk_rate;
354 if (cs4234->lrclk_rate > 48000) {
363 regmap_update_bits(cs4234->regmap, CS4234_CLOCK_SP,
366 regmap_update_bits(cs4234->regmap, CS4234_CLOCK_SP,
375 switch (cs4234->lrclk_rate) {
392 regmap_update_bits(cs4234->regmap, CS4234_CLOCK_SP, CS4234_BASE_RATE_MASK,
414 regmap_update_bits(cs4234->regmap, CS4234_SAMPLE_WIDTH,
418 regmap_update_bits(cs4234->regmap, CS4234_SAMPLE_WIDTH,
447 struct cs4234 *cs4234 = rule->private;
448 int mclk = cs4234->mclk_rate;
467 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(comp);
470 switch (cs4234->format) {
473 cs4234->rate_constraint.nrats = 2;
498 cs4234->rate_constraint.nrats = 1;
505 for (i = 0; i < cs4234->rate_constraint.nrats; i++)
506 cs4234->rate_dividers[i].num = cs4234->mclk_rate / CS4234_MCLK_SCALE;
510 &cs4234->rate_constraint);
519 cs4234_dai_rule_rate, cs4234, -1);
526 struct cs4234 *cs4234 = snd_soc_component_get_drvdata(component);
543 regmap_update_bits(cs4234->regmap, CS4234_SP_DATA_SEL, CS4234_DAC14_SRC_MASK,
545 regmap_update_bits(cs4234->regmap, CS4234_SP_DATA_SEL, CS4234_LL_SRC_MASK,
554 regmap_bulk_write(cs4234->regmap,
572 .name = "cs4234-dai",
688 static void cs4234_shutdown(struct cs4234 *cs4234)
690 cancel_delayed_work_sync(&cs4234->vq_ramp_delay);
691 reinit_completion(&cs4234->vq_ramp_complete);
693 regmap_update_bits(cs4234->regmap, CS4234_DAC_CTRL4, CS4234_VQ_RAMP_MASK,
696 regcache_cache_only(cs4234->regmap, true);
698 regmap_update_bits(cs4234->regmap, CS4234_DAC_CTRL4, CS4234_VQ_RAMP_MASK, 0);
699 gpiod_set_value_cansleep(cs4234->reset_gpio, 0);
700 regulator_bulk_disable(cs4234->num_core_supplies, cs4234->core_supplies);
701 clk_disable_unprepare(cs4234->mclk);
704 static int cs4234_powerup(struct cs4234 *cs4234)
708 ret = clk_prepare_enable(cs4234->mclk);
710 dev_err(cs4234->dev, "Failed to enable mclk: %d\n", ret);
714 ret = regulator_bulk_enable(cs4234->num_core_supplies, cs4234->core_supplies);
716 dev_err(cs4234->dev, "Failed to enable core supplies: %d\n", ret);
717 clk_disable_unprepare(cs4234->mclk);
722 gpiod_set_value_cansleep(cs4234->reset_gpio, 1);
728 &cs4234->vq_ramp_delay,
736 struct cs4234 *cs4234;
743 cs4234 = devm_kzalloc(dev, sizeof(*cs4234), GFP_KERNEL);
744 if (!cs4234)
746 i2c_set_clientdata(i2c_client, cs4234);
747 cs4234->dev = dev;
748 init_completion(&cs4234->vq_ramp_complete);
749 INIT_DELAYED_WORK(&cs4234->vq_ramp_delay, cs4234_vq_ramp_done);
751 cs4234->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
752 if (IS_ERR(cs4234->reset_gpio))
753 return PTR_ERR(cs4234->reset_gpio);
755 BUILD_BUG_ON(ARRAY_SIZE(cs4234->core_supplies) < ARRAY_SIZE(cs4234_core_supplies));
757 cs4234->num_core_supplies = ARRAY_SIZE(cs4234_core_supplies);
759 cs4234->core_supplies[i].supply = cs4234_core_supplies[i];
761 ret = devm_regulator_bulk_get(dev, cs4234->num_core_supplies, cs4234->core_supplies);
767 cs4234->mclk = devm_clk_get(dev, "mclk");
768 if (IS_ERR(cs4234->mclk)) {
769 ret = PTR_ERR(cs4234->mclk);
773 cs4234->mclk_rate = clk_get_rate(cs4234->mclk);
775 if (cs4234->mclk_rate < 7680000 || cs4234->mclk_rate > 25600000) {
780 cs4234->regmap = devm_regmap_init_i2c(i2c_client, &cs4234_regmap);
781 if (IS_ERR(cs4234->regmap)) {
782 ret = PTR_ERR(cs4234->regmap);
787 ret = cs4234_powerup(cs4234);
791 ret = regmap_bulk_read(cs4234->regmap, CS4234_DEVID_AB, ids, ARRAY_SIZE(ids));
804 ret = regmap_read(cs4234->regmap, CS4234_REVID, &revid);
813 ret = regulator_get_voltage(cs4234->core_supplies[CS4234_SUPPLY_VA].consumer);
816 regmap_update_bits(cs4234->regmap, CS4234_ADC_CTRL1,
821 regmap_update_bits(cs4234->regmap, CS4234_ADC_CTRL1,
834 memcpy(&cs4234->rate_dividers, &cs4234_dividers, sizeof(cs4234_dividers));
835 cs4234->rate_constraint.rats = cs4234->rate_dividers;
848 cs4234_shutdown(cs4234);
855 struct cs4234 *cs4234 = i2c_get_clientdata(i2c_client);
860 cs4234_shutdown(cs4234);
867 struct cs4234 *cs4234 = dev_get_drvdata(dev);
870 ret = cs4234_powerup(cs4234);
874 regcache_mark_dirty(cs4234->regmap);
875 regcache_cache_only(cs4234->regmap, false);
876 ret = regcache_sync(cs4234->regmap);
879 cs4234_shutdown(cs4234);
888 struct cs4234 *cs4234 = dev_get_drvdata(dev);
890 cs4234_shutdown(cs4234);
900 { .compatible = "cirrus,cs4234", },
907 .name = "cs4234",