switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_B:
val = DAC_MODE_PCM; break; case SND_SOC_DAIFMT_I2S:
val = DAC_MODE_I2S; break; case SND_SOC_DAIFMT_RIGHT_J:
val = DAC_MODE_RJM; break; case SND_SOC_DAIFMT_LEFT_J:
val = DAC_MODE_LJM; break; default: return -EINVAL;
}
for (i = 0; i < ARRAY_SIZE(playback_open_list); i++) {
regmap_update_bits(rk3328->regmap,
playback_open_list[i].reg,
playback_open_list[i].msk,
playback_open_list[i].val);
mdelay(1);
}
for (i = 0; i < ARRAY_SIZE(playback_close_list); i++) {
regmap_update_bits(rk3328->regmap,
playback_close_list[i].reg,
playback_close_list[i].msk,
playback_close_list[i].val);
mdelay(1);
}
/* Workaround for silence when changed Fs 48 -> 44.1kHz */
rk3328_codec_reset(rk3328);
switch (params_format(params)) { case SNDRV_PCM_FORMAT_S16_LE:
val = DAC_VDL_16BITS; break; case SNDRV_PCM_FORMAT_S20_3LE:
val = DAC_VDL_20BITS; break; case SNDRV_PCM_FORMAT_S24_LE:
val = DAC_VDL_24BITS; break; case SNDRV_PCM_FORMAT_S32_LE:
val = DAC_VDL_32BITS; break; default: return -EINVAL;
}
regmap_update_bits(rk3328->regmap, DAC_INIT_CTRL2, DAC_VDL_MASK, val);
staticbool rk3328_codec_write_read_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case CODEC_RESET: case DAC_INIT_CTRL1: case DAC_INIT_CTRL2: case DAC_INIT_CTRL3: case DAC_PRECHARGE_CTRL: case DAC_PWR_CTRL: case DAC_CLK_CTRL: case HPMIX_CTRL: case DAC_SELECT: case HPOUT_CTRL: case HPOUTL_GAIN_CTRL: case HPOUTR_GAIN_CTRL: case HPOUT_POP_CTRL: returntrue; default: returnfalse;
}
}
ret = of_property_read_u32(rk3328_np, "spk-depop-time-ms",
&rk3328->spk_depop_time); if (ret < 0) {
dev_info(&pdev->dev, "spk_depop_time use default value.\n");
rk3328->spk_depop_time = 200;
}
rk3328->mute = gpiod_get_optional(&pdev->dev, "mute", GPIOD_OUT_HIGH); if (IS_ERR(rk3328->mute)) return PTR_ERR(rk3328->mute); /* * Rock64 is the only supported platform to have widely relied on * this; if we do happen to come across an old DTB, just leave the * external mute forced off.
*/ if (!rk3328->mute && of_machine_is_compatible("pine64,rock64")) {
dev_warn(&pdev->dev, "assuming implicit control of GPIO_MUTE; update devicetree if possible\n");
regmap_write(grf, RK3328_GRF_SOC_CON10, BIT(17) | BIT(1));
}
rk3328->mclk = devm_clk_get(&pdev->dev, "mclk"); if (IS_ERR(rk3328->mclk)) return PTR_ERR(rk3328->mclk);
ret = clk_prepare_enable(rk3328->mclk); if (ret) return ret;
clk_set_rate(rk3328->mclk, INITIAL_FREQ);
rk3328->pclk = devm_clk_get(&pdev->dev, "pclk"); if (IS_ERR(rk3328->pclk)) {
dev_err(&pdev->dev, "can't get acodec pclk\n");
ret = PTR_ERR(rk3328->pclk); goto err_unprepare_mclk;
}
ret = clk_prepare_enable(rk3328->pclk); if (ret < 0) {
dev_err(&pdev->dev, "failed to enable acodec pclk\n"); goto err_unprepare_mclk;
}
base = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(base)) {
ret = PTR_ERR(base); goto err_unprepare_pclk;
}
rk3328->regmap = devm_regmap_init_mmio(&pdev->dev, base,
&rk3328_codec_regmap_config); if (IS_ERR(rk3328->regmap)) {
ret = PTR_ERR(rk3328->regmap); goto err_unprepare_pclk;
}
platform_set_drvdata(pdev, rk3328);
ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328,
rk3328_dai,
ARRAY_SIZE(rk3328_dai)); if (ret) goto err_unprepare_pclk;
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.