diff --git a/sound/soc/rockchip/rockchip_pdm.c b/sound/soc/rockchip/rockchip_pdm.c index 4998730a9660..67f426f2e074 100644 --- a/sound/soc/rockchip/rockchip_pdm.c +++ b/sound/soc/rockchip/rockchip_pdm.c @@ -19,12 +19,14 @@ #include "rockchip_pdm.h" #define PDM_DMA_BURST_SIZE (8) /* size * width: 8*4 = 32 bytes */ -#define PDM_SIGNOFF_CLK_RATE (100000000) +#define PDM_SIGNOFF_CLK_100M (100000000) +#define PDM_SIGNOFF_CLK_300M (300000000) #define PDM_PATH_MAX (4) enum rk_pdm_version { RK_PDM_RK3229, RK_PDM_RK3308, + RK_PDM_RK3588, RK_PDM_RV1126, }; @@ -76,7 +78,8 @@ static struct rk_pdm_ds_ratio ds_ratio[] = { }; static unsigned int get_pdm_clk(struct rk_pdm_dev *pdm, unsigned int sr, - unsigned int *clk_src, unsigned int *clk_out) + unsigned int *clk_src, unsigned int *clk_out, + unsigned int signoff) { unsigned int i, count, clk, div, rate; @@ -101,7 +104,7 @@ static unsigned int get_pdm_clk(struct rk_pdm_dev *pdm, unsigned int sr, } if (!clk) { - clk = clk_round_rate(pdm->clk, PDM_SIGNOFF_CLK_RATE); + clk = clk_round_rate(pdm->clk, signoff); *clk_src = clk; } return clk; @@ -200,7 +203,7 @@ static int rockchip_pdm_hw_params(struct snd_pcm_substream *substream, struct rk_pdm_dev *pdm = to_info(dai); unsigned int val = 0; unsigned int clk_rate, clk_div, samplerate; - unsigned int clk_src, clk_out = 0; + unsigned int clk_src = 0, clk_out = 0, signoff = PDM_SIGNOFF_CLK_100M; unsigned long m, n; bool change; int ret; @@ -209,7 +212,10 @@ static int rockchip_pdm_hw_params(struct snd_pcm_substream *substream, return 0; samplerate = params_rate(params); - clk_rate = get_pdm_clk(pdm, samplerate, &clk_src, &clk_out); + + if (pdm->version == RK_PDM_RK3588) + signoff = PDM_SIGNOFF_CLK_300M; + clk_rate = get_pdm_clk(pdm, samplerate, &clk_src, &clk_out, signoff); if (!clk_rate) return -EINVAL; @@ -218,6 +224,7 @@ static int rockchip_pdm_hw_params(struct snd_pcm_substream *substream, return -EINVAL; if (pdm->version == RK_PDM_RK3308 || + pdm->version == RK_PDM_RK3588 || pdm->version == RK_PDM_RV1126) { rational_best_approximation(clk_out, clk_src, GENMASK(16 - 1, 0), @@ -247,7 +254,7 @@ static int rockchip_pdm_hw_params(struct snd_pcm_substream *substream, val); } - if (pdm->version == RK_PDM_RV1126) { + if (pdm->version == RK_PDM_RK3588 || pdm->version == RK_PDM_RV1126) { val = get_pdm_cic_ratio(clk_out); regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_CIC_RATIO_MSK, val); val = samplerate_to_bit(samplerate); @@ -535,7 +542,7 @@ static const struct of_device_id rockchip_pdm_match[] __maybe_unused = { { .compatible = "rockchip,rk3568-pdm", .data = (void *)RK_PDM_RV1126 }, { .compatible = "rockchip,rk3588-pdm", - .data = (void *)RK_PDM_RV1126 }, + .data = (void *)RK_PDM_RK3588 }, { .compatible = "rockchip,rv1126-pdm", .data = (void *)RK_PDM_RV1126 }, {},