clocks = <&clkgen JH7110_PDM_CLK_DMIC>,
<&clkgen JH7110_APB0>,
<&clkgen JH7110_PDM_CLK_APB>,
- <&clkgen JH7110_MCLK_INNER>,
<&clkgen JH7110_MCLK>,
- <&clkgen JH7110_MCLK_OUT>;
+ <&mclk_ext>;
clock-names = "pdm_mclk", "clk_apb0",
- "pdm_apb", "mclk_inner",
- "clk_mclk", "mclk_out";
+ "pdm_apb", "clk_mclk",
+ "mclk_ext";
resets = <&rstgen RSTN_U0_PDM_4MIC_DMIC>,
<&rstgen RSTN_U0_PDM_4MIC_APB>;
reset-names = "pdm_dmic", "pdm_apb";
struct clk *clk_pdm_apb;
struct clk *clk_pdm_mclk;
struct clk *clk_apb0;
- struct clk *clk_mclk_inner;
struct clk *clk_mclk;
- struct clk *clk_mclk_out;
+ struct clk *clk_mclk_ext;
struct reset_control *rst_pdm_dmic;
struct reset_control *rst_pdm_apb;
unsigned char flag_first;
unsigned int sample_rate;
unsigned int data_width;
int ret;
- unsigned int mclk_rate;
const int pdm_mul = 128;
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
sample_rate = params_rate(params);
switch (sample_rate) {
case 8000:
- mclk_rate = 12288000;
- break;
case 11025:
- mclk_rate = 11289600;
- break;
case 16000:
- mclk_rate = 24576000;
break;
default:
pr_err("PDM: not support sample rate:%d\n", sample_rate);
return -EINVAL;
}
- /* set clk_mclk */
- ret = clk_set_rate(priv->clk_mclk_inner, mclk_rate);
- if (ret) {
- dev_info(priv->dev, "Can't set clk_mclk: %d\n", ret);
- return ret;
- }
-
/* set pdm_mclk, PDM MCLK = 128 * LRCLK */
ret = clk_set_rate(priv->clk_pdm_mclk, pdm_mul * sample_rate);
if (ret) {
{ .id = "pdm_mclk" },
{ .id = "clk_apb0" },
{ .id = "pdm_apb" },
- { .id = "mclk_inner" },
{ .id = "clk_mclk" },
- { .id = "mclk_out" },
+ { .id = "mclk_ext" },
};
ret = devm_clk_bulk_get(&pdev->dev, ARRAY_SIZE(clks), clks);
priv->clk_pdm_mclk = clks[0].clk;
priv->clk_apb0 = clks[1].clk;
priv->clk_pdm_apb = clks[2].clk;
- priv->clk_mclk_inner = clks[3].clk;
- priv->clk_mclk = clks[4].clk;
- priv->clk_mclk_out = clks[5].clk;
+ priv->clk_mclk = clks[3].clk;
+ priv->clk_mclk_ext = clks[4].clk;
priv->rst_pdm_dmic = devm_reset_control_get_exclusive(&pdev->dev, "pdm_dmic");
if (IS_ERR(priv->rst_pdm_dmic)) {
goto exit;
}
- ret = clk_prepare_enable(priv->clk_mclk_inner);
+ ret = clk_set_parent(priv->clk_mclk, priv->clk_mclk_ext);
if (ret) {
- dev_err(&pdev->dev, "failed to prepare enable clk_mclk_inner\n");
+ dev_err(&pdev->dev, "failed to set parent clk_mclk ret=%d\n", ret);
goto exit;
}
goto err_dis_mclk;
}
- ret = clk_prepare_enable(priv->clk_mclk_out);
- if (ret) {
- dev_err(&pdev->dev, "failed to prepare enable clk_mclk_out\n");
- goto err_dis_mclk_out;
- }
-
ret = clk_prepare_enable(priv->clk_pdm_mclk);
if (ret) {
dev_err(&pdev->dev, "failed to prepare enable clk_pdm_mclk\n");
err_dis_apb0:
clk_disable_unprepare(priv->clk_pdm_mclk);
err_dis_pdm_mclk:
- clk_disable_unprepare(priv->clk_mclk_out);
-err_dis_mclk_out:
clk_disable_unprepare(priv->clk_mclk);
err_dis_mclk:
- clk_disable_unprepare(priv->clk_mclk_inner);
exit:
return ret;
}