value = jh7110_pwmdac_read_reg(dev->base, JH7110_PWMDAC_CTRL); if (dev->cfg.shift == PWMDAC_SHIFT_8)
value &= ~JH7110_PWMDAC_SHIFT; elseif (dev->cfg.shift == PWMDAC_SHIFT_10)
value |= JH7110_PWMDAC_SHIFT;
value = jh7110_pwmdac_read_reg(dev->base, JH7110_PWMDAC_CTRL);
value &= ~JH7110_PWMDAC_DUTY_CYCLE_MASK;
value |= (dev->cfg.duty_cycle & 0x3) << JH7110_PWMDAC_DUTY_CYCLE_SHIFT;
value = jh7110_pwmdac_read_reg(dev->base, JH7110_PWMDAC_CTRL); if (dev->cfg.data_change == NO_CHANGE)
value &= ~JH7110_PWMDAC_DATA_CHANGE; elseif (dev->cfg.data_change == CHANGE)
value |= JH7110_PWMDAC_DATA_CHANGE;
value = jh7110_pwmdac_read_reg(dev->base, JH7110_PWMDAC_CTRL); if (dev->cfg.data_mode == UNSIGNED_DATA)
value &= ~JH7110_PWMDAC_DATA_MODE; elseif (dev->cfg.data_mode == INVERTER_DATA_MSB)
value |= JH7110_PWMDAC_DATA_MODE;
value = jh7110_pwmdac_read_reg(dev->base, JH7110_PWMDAC_CTRL);
value &= ~JH7110_PWMDAC_DATA_SHIFT_MASK;
value |= (dev->cfg.data_shift & 0x7) << JH7110_PWMDAC_DATA_SHIFT_SHIFT;
switch (params_rate(params)) { case 8000:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_3;
core_clk_rate = 6144000; break; case 11025:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_2;
core_clk_rate = 5644800; break; case 16000:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_3;
core_clk_rate = 12288000; break; case 22050:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_1;
core_clk_rate = 5644800; break; case 32000:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_1;
core_clk_rate = 8192000; break; case 44100:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_1;
core_clk_rate = 11289600; break; case 48000:
dev->cfg.cnt_n = PWMDAC_SAMPLE_CNT_1;
core_clk_rate = 12288000; break; default:
dev_err(dai->dev, "%d rate not supported\n",
params_rate(params)); return -EINVAL;
}
switch (params_channels(params)) { case 1:
dev->play_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; break; case 2:
dev->play_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; break; default:
dev_err(dai->dev, "%d channels not supported\n",
params_channels(params)); return -EINVAL;
}
/* * The clock rate always rounds down when using clk_set_rate() * so increase the rate a bit
*/
core_clk_rate += 64;
jh7110_pwmdac_set(dev);
ret = clk_set_rate(dev->clks[1].clk, core_clk_rate); if (ret) return dev_err_probe(dai->dev, ret, "failed to set rate %lu for core clock\n",
core_clk_rate);
return 0;
}
staticint jh7110_pwmdac_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
{ struct jh7110_pwmdac_dev *dev = snd_soc_dai_get_drvdata(dai); int ret = 0;
switch (cmd) { case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
jh7110_pwmdac_set(dev); break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
jh7110_pwmdac_stop(dev); break; default:
ret = -EINVAL; break;
}
return ret;
}
staticint jh7110_pwmdac_crg_enable(struct jh7110_pwmdac_dev *dev, bool enable)
{ int ret;
if (enable) {
ret = clk_bulk_prepare_enable(ARRAY_SIZE(dev->clks), dev->clks); if (ret) return dev_err_probe(dev->dev, ret, "failed to enable pwmdac clocks\n");
ret = reset_control_deassert(dev->rst_apb); if (ret) {
dev_err(dev->dev, "failed to deassert pwmdac apb reset\n"); goto err_rst_apb;
}
} else {
clk_bulk_disable_unprepare(ARRAY_SIZE(dev->clks), dev->clks);
}
/* save the CTRL register value */
pwmdac->saved_ctrl = jh7110_pwmdac_read_reg(pwmdac->base,
JH7110_PWMDAC_CTRL); return pm_runtime_force_suspend(dev);
}
ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(dev->clks), dev->clks); if (ret) return dev_err_probe(&pdev->dev, ret, "failed to get pwmdac clocks\n");
dev->rst_apb = devm_reset_control_get_exclusive(&pdev->dev, NULL); if (IS_ERR(dev->rst_apb)) return dev_err_probe(&pdev->dev, PTR_ERR(dev->rst_apb), "failed to get pwmdac apb reset\n");
jh7110_pwmdac_init_params(dev);
dev->dev = &pdev->dev;
dev_set_drvdata(&pdev->dev, dev);
ret = devm_snd_soc_register_component(&pdev->dev,
&jh7110_pwmdac_component,
&jh7110_pwmdac_dai, 1); if (ret) return dev_err_probe(&pdev->dev, ret, "failed to register dai\n");
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0); if (ret) return dev_err_probe(&pdev->dev, ret, "failed to register pcm\n");
pm_runtime_enable(dev->dev); if (!pm_runtime_enabled(&pdev->dev)) {
ret = jh7110_pwmdac_runtime_resume(&pdev->dev); if (ret) goto err_pm_disable;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.