Lines Matching defs:pcm512x
23 #include "pcm512x.h"
62 struct pcm512x_priv *pcm512x = container_of(nb, struct pcm512x_priv, \
65 regcache_mark_dirty(pcm512x->regmap); \
66 regcache_cache_only(pcm512x->regmap, true); \
225 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
227 ucontrol->value.integer.value[0] = pcm512x->overclock_pll;
235 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
245 pcm512x->overclock_pll = ucontrol->value.integer.value[0];
253 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
255 ucontrol->value.integer.value[0] = pcm512x->overclock_dsp;
263 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
273 pcm512x->overclock_dsp = ucontrol->value.integer.value[0];
281 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
283 ucontrol->value.integer.value[0] = pcm512x->overclock_dac;
291 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
301 pcm512x->overclock_dac = ucontrol->value.integer.value[0];
382 static int pcm512x_update_mute(struct pcm512x_priv *pcm512x)
385 pcm512x->regmap, PCM512x_MUTE, PCM512x_RQML | PCM512x_RQMR,
386 (!!(pcm512x->mute & 0x5) << PCM512x_RQML_SHIFT)
387 | (!!(pcm512x->mute & 0x3) << PCM512x_RQMR_SHIFT));
394 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
396 mutex_lock(&pcm512x->mutex);
397 ucontrol->value.integer.value[0] = !(pcm512x->mute & 0x4);
398 ucontrol->value.integer.value[1] = !(pcm512x->mute & 0x2);
399 mutex_unlock(&pcm512x->mutex);
408 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
411 mutex_lock(&pcm512x->mutex);
413 if ((pcm512x->mute & 0x4) == (ucontrol->value.integer.value[0] << 2)) {
414 pcm512x->mute ^= 0x4;
417 if ((pcm512x->mute & 0x2) == (ucontrol->value.integer.value[1] << 1)) {
418 pcm512x->mute ^= 0x2;
423 ret = pcm512x_update_mute(pcm512x);
427 mutex_unlock(&pcm512x->mutex);
432 mutex_unlock(&pcm512x->mutex);
496 static unsigned long pcm512x_pll_max(struct pcm512x_priv *pcm512x)
498 return 25000000 + 25000000 * pcm512x->overclock_pll / 100;
501 static unsigned long pcm512x_dsp_max(struct pcm512x_priv *pcm512x)
503 return 50000000 + 50000000 * pcm512x->overclock_dsp / 100;
506 static unsigned long pcm512x_dac_max(struct pcm512x_priv *pcm512x,
509 return rate + rate * pcm512x->overclock_dac / 100;
512 static unsigned long pcm512x_sck_max(struct pcm512x_priv *pcm512x)
514 if (!pcm512x->pll_out)
516 return pcm512x_pll_max(pcm512x);
519 static unsigned long pcm512x_ncp_target(struct pcm512x_priv *pcm512x,
532 return pcm512x_dac_max(pcm512x, 1536000);
548 struct pcm512x_priv *pcm512x = rule->private;
567 ranges[0].max = pcm512x_sck_max(pcm512x) / frame_size / 2;
583 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
588 if (IS_ERR(pcm512x->sclk)) {
590 PTR_ERR(pcm512x->sclk));
591 return PTR_ERR(pcm512x->sclk);
594 if (pcm512x->pll_out)
598 pcm512x,
611 rats_no_pll->num = clk_get_rate(pcm512x->sclk) / 64;
625 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
627 struct regmap *regmap = pcm512x->regmap;
629 if (IS_ERR(pcm512x->sclk)) {
631 PTR_ERR(pcm512x->sclk));
651 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
653 switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
669 struct pcm512x_priv *pcm512x = dev_get_drvdata(component->dev);
678 ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
688 ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
706 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
717 pow2 = 1 << fls((pcm512x_pll_max(pcm512x) - 16000000) / bclk_rate);
719 sck_rate = rounddown(pcm512x_pll_max(pcm512x),
752 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
786 pcm512x->real_pll = pll_rate;
816 pcm512x->real_pll = pll_rate;
844 pcm512x->real_pll = DIV_ROUND_DOWN_ULL((u64)K * pllin_rate, 10000 * P);
847 pcm512x->pll_r = R;
848 pcm512x->pll_j = J;
849 pcm512x->pll_d = D;
850 pcm512x->pll_p = P;
859 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
862 if (!pcm512x->pll_out)
869 for (dac_rate = rounddown(pcm512x_dac_max(pcm512x, 6144000), osr_rate);
890 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
911 if (pcm512x->bclk_ratio > 0) {
912 lrclk_div = pcm512x->bclk_ratio;
922 if (!pcm512x->pll_out) {
923 sck_rate = clk_get_rate(pcm512x->sclk);
940 pllin_rate = clk_get_rate(pcm512x->sclk);
951 ret = regmap_write(pcm512x->regmap,
952 PCM512x_PLL_COEFF_0, pcm512x->pll_p - 1);
958 ret = regmap_write(pcm512x->regmap,
959 PCM512x_PLL_COEFF_1, pcm512x->pll_j);
965 ret = regmap_write(pcm512x->regmap,
966 PCM512x_PLL_COEFF_2, pcm512x->pll_d >> 8);
972 ret = regmap_write(pcm512x->regmap,
973 PCM512x_PLL_COEFF_3, pcm512x->pll_d & 0xff);
979 ret = regmap_write(pcm512x->regmap,
980 PCM512x_PLL_COEFF_4, pcm512x->pll_r - 1);
986 mck_rate = pcm512x->real_pll;
1001 dsp_div = mck_rate > pcm512x_dsp_max(pcm512x) ? 2 : 1;
1011 ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF,
1019 gpio = PCM512x_GREF_GPIO1 + pcm512x->pll_in - 1;
1020 ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_DACIN,
1025 pcm512x->pll_in, ret);
1032 unsigned long dac_mul = pcm512x_dac_max(pcm512x, 6144000)
1049 ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF,
1074 pcm512x_ncp_target(pcm512x, dac_rate));
1086 ret = regmap_write(pcm512x->regmap, PCM512x_DSP_CLKDIV, dsp_div - 1);
1092 ret = regmap_write(pcm512x->regmap, PCM512x_DAC_CLKDIV, dac_div - 1);
1098 ret = regmap_write(pcm512x->regmap, PCM512x_NCP_CLKDIV, ncp_div - 1);
1104 ret = regmap_write(pcm512x->regmap, PCM512x_OSR_CLKDIV, osr_div - 1);
1110 ret = regmap_write(pcm512x->regmap,
1117 ret = regmap_write(pcm512x->regmap,
1124 ret = regmap_write(pcm512x->regmap, PCM512x_IDAC_1, idac >> 8);
1130 ret = regmap_write(pcm512x->regmap, PCM512x_IDAC_2, idac & 0xff);
1136 if (sample_rate <= pcm512x_dac_max(pcm512x, 48000))
1138 else if (sample_rate <= pcm512x_dac_max(pcm512x, 96000))
1140 else if (sample_rate <= pcm512x_dac_max(pcm512x, 192000))
1144 ret = regmap_update_bits(pcm512x->regmap, PCM512x_FS_SPEED_MODE,
1168 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
1198 switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1200 ret = regmap_update_bits(pcm512x->regmap,
1211 ret = regmap_update_bits(pcm512x->regmap, PCM512x_ERROR_DETECT,
1232 ret = regmap_update_bits(pcm512x->regmap, PCM512x_I2S_1,
1239 if (pcm512x->pll_out) {
1240 ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_A, 0x11);
1246 ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_B, 0xff);
1252 ret = regmap_update_bits(pcm512x->regmap, PCM512x_ERROR_DETECT,
1267 ret = regmap_update_bits(pcm512x->regmap, PCM512x_ERROR_DETECT,
1282 ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN,
1294 if (pcm512x->pll_out) {
1295 ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_REF,
1303 gpio = PCM512x_GREF_GPIO1 + pcm512x->pll_in - 1;
1304 ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_PLLIN,
1309 pcm512x->pll_in, ret);
1313 ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN,
1321 ret = regmap_update_bits(pcm512x->regmap, PCM512x_BCLK_LRCLK_CFG,
1329 ret = regmap_update_bits(pcm512x->regmap, PCM512x_MASTER_MODE,
1337 if (pcm512x->pll_out) {
1338 gpio = PCM512x_G1OE << (pcm512x->pll_out - 1);
1339 ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_EN,
1343 pcm512x->pll_out, ret);
1347 gpio = PCM512x_GPIO_OUTPUT_1 + pcm512x->pll_out - 1;
1348 ret = regmap_update_bits(pcm512x->regmap, gpio,
1352 ret, pcm512x->pll_out);
1357 ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE,
1364 ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE,
1377 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
1379 pcm512x->fmt = fmt;
1387 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
1392 pcm512x->bclk_ratio = ratio;
1400 struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
1404 mutex_lock(&pcm512x->mutex);
1407 pcm512x->mute |= 0x1;
1408 ret = regmap_update_bits(pcm512x->regmap, PCM512x_MUTE,
1417 regmap_read_poll_timeout(pcm512x->regmap,
1422 pcm512x->mute &= ~0x1;
1423 ret = pcm512x_update_mute(pcm512x);
1430 regmap_read_poll_timeout(pcm512x->regmap,
1434 == ((~pcm512x->mute >> 1) & 0x3),
1439 mutex_unlock(&pcm512x->mutex);
1454 .name = "pcm512x-hifi",
1509 struct pcm512x_priv *pcm512x;
1512 pcm512x = devm_kzalloc(dev, sizeof(struct pcm512x_priv), GFP_KERNEL);
1513 if (!pcm512x)
1516 mutex_init(&pcm512x->mutex);
1518 dev_set_drvdata(dev, pcm512x);
1519 pcm512x->regmap = regmap;
1521 for (i = 0; i < ARRAY_SIZE(pcm512x->supplies); i++)
1522 pcm512x->supplies[i].supply = pcm512x_supply_names[i];
1524 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(pcm512x->supplies),
1525 pcm512x->supplies);
1531 pcm512x->supply_nb[0].notifier_call = pcm512x_regulator_event_0;
1532 pcm512x->supply_nb[1].notifier_call = pcm512x_regulator_event_1;
1533 pcm512x->supply_nb[2].notifier_call = pcm512x_regulator_event_2;
1535 for (i = 0; i < ARRAY_SIZE(pcm512x->supplies); i++) {
1537 pcm512x->supplies[i].consumer,
1538 &pcm512x->supply_nb[i]);
1546 ret = regulator_bulk_enable(ARRAY_SIZE(pcm512x->supplies),
1547 pcm512x->supplies);
1567 pcm512x->sclk = devm_clk_get(dev, NULL);
1568 if (PTR_ERR(pcm512x->sclk) == -EPROBE_DEFER) {
1572 if (!IS_ERR(pcm512x->sclk)) {
1573 ret = clk_prepare_enable(pcm512x->sclk);
1581 ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
1604 pcm512x->pll_in = val;
1613 pcm512x->pll_out = val;
1616 if (!pcm512x->pll_in != !pcm512x->pll_out) {
1622 if (pcm512x->pll_in && pcm512x->pll_in == pcm512x->pll_out) {
1642 if (!IS_ERR(pcm512x->sclk))
1643 clk_disable_unprepare(pcm512x->sclk);
1645 regulator_bulk_disable(ARRAY_SIZE(pcm512x->supplies),
1646 pcm512x->supplies);
1653 struct pcm512x_priv *pcm512x = dev_get_drvdata(dev);
1656 if (!IS_ERR(pcm512x->sclk))
1657 clk_disable_unprepare(pcm512x->sclk);
1658 regulator_bulk_disable(ARRAY_SIZE(pcm512x->supplies),
1659 pcm512x->supplies);
1666 struct pcm512x_priv *pcm512x = dev_get_drvdata(dev);
1669 ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
1676 ret = regulator_bulk_disable(ARRAY_SIZE(pcm512x->supplies),
1677 pcm512x->supplies);
1683 if (!IS_ERR(pcm512x->sclk))
1684 clk_disable_unprepare(pcm512x->sclk);
1691 struct pcm512x_priv *pcm512x = dev_get_drvdata(dev);
1694 if (!IS_ERR(pcm512x->sclk)) {
1695 ret = clk_prepare_enable(pcm512x->sclk);
1702 ret = regulator_bulk_enable(ARRAY_SIZE(pcm512x->supplies),
1703 pcm512x->supplies);
1709 regcache_cache_only(pcm512x->regmap, false);
1710 ret = regcache_sync(pcm512x->regmap);
1716 ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,