Lines Matching full:pdm

3  * Rockchip PDM ALSA SoC Digital Audio Interface(DAI)  driver
100 static unsigned int get_pdm_clk(struct rk_pdm_dev *pdm, unsigned int sr, in get_pdm_clk() argument
117 if (pdm->clk_calibrate) { in get_pdm_clk()
122 rate = clk_round_rate(pdm->clk, clkref[i].clk); in get_pdm_clk()
134 clk = clk_round_rate(pdm->clk, signoff); in get_pdm_clk()
210 static void rockchip_pdm_rxctrl(struct rk_pdm_dev *pdm, int on) in rockchip_pdm_rxctrl() argument
215 /* The PDM device need to delete some unused data in rockchip_pdm_rxctrl()
216 * since the pdm of various manufacturers can not in rockchip_pdm_rxctrl()
218 * rockchip: pdm: Fix pop noise in the beginning". in rockchip_pdm_rxctrl()
233 regmap_update_bits(pdm->regmap, PDM_SYSCONFIG, in rockchip_pdm_rxctrl()
236 regmap_update_bits(pdm->regmap, PDM_DMA_CTRL, in rockchip_pdm_rxctrl()
240 regmap_update_bits(pdm->regmap, PDM_DMA_CTRL, in rockchip_pdm_rxctrl()
242 regmap_update_bits(pdm->regmap, PDM_SYSCONFIG, in rockchip_pdm_rxctrl()
248 static int rockchip_pdm_clk_set_rate(struct rk_pdm_dev *pdm, in rockchip_pdm_clk_set_rate() argument
255 if (ppm == pdm->clk_ppm) in rockchip_pdm_clk_set_rate()
275 pdm->clk_ppm = ppm; in rockchip_pdm_clk_set_rate()
280 static int rockchip_pdm_set_samplerate(struct rk_pdm_dev *pdm, unsigned int samplerate) in rockchip_pdm_set_samplerate() argument
291 if (pdm->version == RK_PDM_RK3588) in rockchip_pdm_set_samplerate()
293 clk_rate = get_pdm_clk(pdm, samplerate, &clk_src, &clk_out, signoff); in rockchip_pdm_set_samplerate()
297 if (pdm->clk_calibrate) { in rockchip_pdm_set_samplerate()
298 ret = clk_set_parent(pdm->clk, pdm->clk_root); in rockchip_pdm_set_samplerate()
302 ret = rockchip_pdm_clk_set_rate(pdm, pdm->clk_root, in rockchip_pdm_set_samplerate()
303 pdm->clk_root_rate, 0); in rockchip_pdm_set_samplerate()
307 rate = pdm->clk_root_rate; in rockchip_pdm_set_samplerate()
312 div = DIV_ROUND_CLOSEST(pdm->clk_root_initial_rate, clk_src); in rockchip_pdm_set_samplerate()
317 ret = clk_set_rate(pdm->clk_root, rate); in rockchip_pdm_set_samplerate()
321 pdm->clk_root_rate = clk_get_rate(pdm->clk_root); in rockchip_pdm_set_samplerate()
325 ret = clk_set_rate(pdm->clk, clk_src); in rockchip_pdm_set_samplerate()
329 if (pdm->version == RK_PDM_RK3308 || in rockchip_pdm_set_samplerate()
330 pdm->version == RK_PDM_RK3588 || in rockchip_pdm_set_samplerate()
331 pdm->version == RK_PDM_RV1126) { in rockchip_pdm_set_samplerate()
339 regmap_update_bits_check(pdm->regmap, PDM_CTRL1, in rockchip_pdm_set_samplerate()
344 reset_control_assert(pdm->reset); in rockchip_pdm_set_samplerate()
345 reset_control_deassert(pdm->reset); in rockchip_pdm_set_samplerate()
346 rockchip_pdm_rxctrl(pdm, 0); in rockchip_pdm_set_samplerate()
355 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, in rockchip_pdm_set_samplerate()
360 if (pdm->version == RK_PDM_RK3588 || pdm->version == RK_PDM_RV1126) { in rockchip_pdm_set_samplerate()
362 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_CIC_RATIO_MSK, val); in rockchip_pdm_set_samplerate()
364 regmap_update_bits(pdm->regmap, PDM_CTRL0, in rockchip_pdm_set_samplerate()
368 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_DS_RATIO_MSK, val); in rockchip_pdm_set_samplerate()
371 regmap_update_bits(pdm->regmap, PDM_HPF_CTRL, in rockchip_pdm_set_samplerate()
373 regmap_update_bits(pdm->regmap, PDM_HPF_CTRL, in rockchip_pdm_set_samplerate()
382 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_hw_params() local
388 rockchip_pdm_set_samplerate(pdm, params_rate(params)); in rockchip_pdm_hw_params()
390 if (pdm->version != RK_PDM_RK3229) in rockchip_pdm_hw_params()
391 regmap_update_bits(pdm->regmap, PDM_CTRL0, in rockchip_pdm_hw_params()
429 dev_err(pdm->dev, "invalid channel: %d\n", in rockchip_pdm_hw_params()
434 regmap_update_bits(pdm->regmap, PDM_CTRL0, in rockchip_pdm_hw_params()
438 regmap_update_bits(pdm->regmap, PDM_DMA_CTRL, PDM_DMA_RDL_MSK, in rockchip_pdm_hw_params()
447 struct rk_pdm_dev *pdm = to_info(cpu_dai); in rockchip_pdm_set_fmt() local
463 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, mask, val); in rockchip_pdm_set_fmt()
472 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_trigger() local
480 rockchip_pdm_rxctrl(pdm, 1); in rockchip_pdm_trigger()
486 rockchip_pdm_rxctrl(pdm, 0); in rockchip_pdm_trigger()
512 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_start_delay_get() local
514 ucontrol->value.integer.value[0] = pdm->start_delay_ms; in rockchip_pdm_start_delay_get()
523 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_start_delay_put() local
529 pdm->start_delay_ms = ucontrol->value.integer.value[0]; in rockchip_pdm_start_delay_put()
550 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_filter_delay_get() local
552 ucontrol->value.integer.value[0] = pdm->filter_delay_ms; in rockchip_pdm_filter_delay_get()
561 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_filter_delay_put() local
567 pdm->filter_delay_ms = ucontrol->value.integer.value[0]; in rockchip_pdm_filter_delay_put()
575 .name = "PDM Start Delay Ms",
582 .name = "PDM Filter Delay Ms",
607 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_clk_compensation_get() local
609 ucontrol->value.integer.value[0] = pdm->clk_ppm; in rockchip_pdm_clk_compensation_get()
618 struct rk_pdm_dev *pdm = snd_soc_dai_get_drvdata(dai); in rockchip_pdm_clk_compensation_put() local
626 return rockchip_pdm_clk_set_rate(pdm, pdm->clk_root, pdm->clk_root_rate, ppm); in rockchip_pdm_clk_compensation_put()
631 .name = "PDM PCM Clk Compensation In PPM",
640 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_dai_probe() local
642 dai->capture_dma_data = &pdm->capture_dma_data; in rockchip_pdm_dai_probe()
645 if (pdm->clk_calibrate) in rockchip_pdm_dai_probe()
653 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_shutdown() local
658 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_CLK_MSK, PDM_CLK_DIS); in rockchip_pdm_shutdown()
664 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_prepare() local
669 regmap_update_bits(pdm->regmap, PDM_SYSCONFIG, PDM_RX_MASK, PDM_RX_START); in rockchip_pdm_prepare()
674 usleep_range((pdm->filter_delay_ms) * 1000, (pdm->filter_delay_ms + 1) * 1000); in rockchip_pdm_prepare()
682 struct rk_pdm_dev *pdm = to_info(dai); in rockchip_pdm_startup() local
687 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, PDM_CLK_MSK, PDM_CLK_EN); in rockchip_pdm_startup()
692 usleep_range((pdm->start_delay_ms + 1) * 1000, (pdm->start_delay_ms + 2) * 1000); in rockchip_pdm_startup()
726 .name = "rockchip-pdm",
731 struct rk_pdm_dev *pdm = dev_get_drvdata(dev); in rockchip_pdm_pinctrl_select_clk_state() local
733 if (IS_ERR_OR_NULL(pdm->pinctrl) || !pdm->clk_state) in rockchip_pdm_pinctrl_select_clk_state()
745 * when pinctrl switch from gpio to pdm clk. in rockchip_pdm_pinctrl_select_clk_state()
747 clk_disable_unprepare(pdm->clk); in rockchip_pdm_pinctrl_select_clk_state()
748 pinctrl_select_state(pdm->pinctrl, pdm->clk_state); in rockchip_pdm_pinctrl_select_clk_state()
749 clk_prepare_enable(pdm->clk); in rockchip_pdm_pinctrl_select_clk_state()
756 struct rk_pdm_dev *pdm = dev_get_drvdata(dev); in rockchip_pdm_runtime_suspend() local
758 regcache_cache_only(pdm->regmap, true); in rockchip_pdm_runtime_suspend()
759 clk_disable_unprepare(pdm->clk); in rockchip_pdm_runtime_suspend()
760 clk_disable_unprepare(pdm->hclk); in rockchip_pdm_runtime_suspend()
769 struct rk_pdm_dev *pdm = dev_get_drvdata(dev); in rockchip_pdm_runtime_resume() local
772 ret = clk_prepare_enable(pdm->clk); in rockchip_pdm_runtime_resume()
776 ret = clk_prepare_enable(pdm->hclk); in rockchip_pdm_runtime_resume()
780 regcache_cache_only(pdm->regmap, false); in rockchip_pdm_runtime_resume()
781 regcache_mark_dirty(pdm->regmap); in rockchip_pdm_runtime_resume()
782 ret = regcache_sync(pdm->regmap); in rockchip_pdm_runtime_resume()
786 rockchip_pdm_rxctrl(pdm, 0); in rockchip_pdm_runtime_resume()
793 clk_disable_unprepare(pdm->hclk); in rockchip_pdm_runtime_resume()
795 clk_disable_unprepare(pdm->clk); in rockchip_pdm_runtime_resume()
887 { .compatible = "rockchip,pdm",
889 { .compatible = "rockchip,px30-pdm",
891 { .compatible = "rockchip,rk1808-pdm",
893 { .compatible = "rockchip,rk3308-pdm",
895 { .compatible = "rockchip,rk3568-pdm",
897 { .compatible = "rockchip,rk3588-pdm",
899 { .compatible = "rockchip,rv1126-pdm",
905 static int rockchip_pdm_path_parse(struct rk_pdm_dev *pdm, struct device_node *node) in rockchip_pdm_path_parse() argument
927 regmap_update_bits(pdm->regmap, PDM_CLK_CTRL, msk, val); in rockchip_pdm_path_parse()
936 struct rk_pdm_dev *pdm; in rockchip_pdm_probe() local
941 pdm = devm_kzalloc(&pdev->dev, sizeof(*pdm), GFP_KERNEL); in rockchip_pdm_probe()
942 if (!pdm) in rockchip_pdm_probe()
947 pdm->version = (enum rk_pdm_version)match->data; in rockchip_pdm_probe()
949 if (pdm->version == RK_PDM_RK3308) { in rockchip_pdm_probe()
950 pdm->reset = devm_reset_control_get(&pdev->dev, "pdm-m"); in rockchip_pdm_probe()
951 if (IS_ERR(pdm->reset)) in rockchip_pdm_probe()
952 return PTR_ERR(pdm->reset); in rockchip_pdm_probe()
959 pdm->regmap = devm_regmap_init_mmio(&pdev->dev, regs, in rockchip_pdm_probe()
961 if (IS_ERR(pdm->regmap)) in rockchip_pdm_probe()
962 return PTR_ERR(pdm->regmap); in rockchip_pdm_probe()
964 pdm->capture_dma_data.addr = res->start + PDM_RXFIFO_DATA; in rockchip_pdm_probe()
965 pdm->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; in rockchip_pdm_probe()
966 pdm->capture_dma_data.maxburst = PDM_DMA_BURST_SIZE; in rockchip_pdm_probe()
968 pdm->dev = &pdev->dev; in rockchip_pdm_probe()
969 dev_set_drvdata(&pdev->dev, pdm); in rockchip_pdm_probe()
971 pdm->pinctrl = devm_pinctrl_get(&pdev->dev); in rockchip_pdm_probe()
972 if (!IS_ERR_OR_NULL(pdm->pinctrl)) { in rockchip_pdm_probe()
973 pdm->clk_state = pinctrl_lookup_state(pdm->pinctrl, "clk"); in rockchip_pdm_probe()
974 if (IS_ERR(pdm->clk_state)) { in rockchip_pdm_probe()
975 pdm->clk_state = NULL; in rockchip_pdm_probe()
976 dev_dbg(pdm->dev, "Have no clk pinctrl state\n"); in rockchip_pdm_probe()
980 pdm->start_delay_ms = PDM_START_DELAY_MS_DEFAULT; in rockchip_pdm_probe()
981 pdm->filter_delay_ms = PDM_FILTER_DELAY_MS_MIN; in rockchip_pdm_probe()
983 pdm->clk_calibrate = in rockchip_pdm_probe()
985 if (pdm->clk_calibrate) { in rockchip_pdm_probe()
986 pdm->clk_root = devm_clk_get(&pdev->dev, "pdm_clk_root"); in rockchip_pdm_probe()
987 if (IS_ERR(pdm->clk_root)) in rockchip_pdm_probe()
988 return PTR_ERR(pdm->clk_root); in rockchip_pdm_probe()
990 pdm->clk_root_initial_rate = clk_get_rate(pdm->clk_root); in rockchip_pdm_probe()
991 pdm->clk_root_rate = pdm->clk_root_initial_rate; in rockchip_pdm_probe()
994 pdm->clk = devm_clk_get(&pdev->dev, "pdm_clk"); in rockchip_pdm_probe()
995 if (IS_ERR(pdm->clk)) in rockchip_pdm_probe()
996 return PTR_ERR(pdm->clk); in rockchip_pdm_probe()
998 pdm->hclk = devm_clk_get(&pdev->dev, "pdm_hclk"); in rockchip_pdm_probe()
999 if (IS_ERR(pdm->hclk)) in rockchip_pdm_probe()
1000 return PTR_ERR(pdm->hclk); in rockchip_pdm_probe()
1002 ret = clk_prepare_enable(pdm->hclk); in rockchip_pdm_probe()
1022 rockchip_pdm_set_samplerate(pdm, PDM_DEFAULT_RATE); in rockchip_pdm_probe()
1023 rockchip_pdm_rxctrl(pdm, 0); in rockchip_pdm_probe()
1025 ret = rockchip_pdm_path_parse(pdm, node); in rockchip_pdm_probe()
1040 clk_disable_unprepare(pdm->hclk); in rockchip_pdm_probe()
1050 clk_disable_unprepare(pdm->hclk); in rockchip_pdm_probe()
1067 struct rk_pdm_dev *pdm = dev_get_drvdata(dev); in rockchip_pdm_suspend() local
1069 regcache_mark_dirty(pdm->regmap); in rockchip_pdm_suspend()
1076 struct rk_pdm_dev *pdm = dev_get_drvdata(dev); in rockchip_pdm_resume() local
1085 ret = regcache_sync(pdm->regmap); in rockchip_pdm_resume()
1103 .name = "rockchip-pdm",
1112 MODULE_DESCRIPTION("Rockchip PDM Controller Driver");