Lines Matching +full:switching +full:- +full:freq
4 * SPDX-License-Identifier: GPL-2.0
8 #include <clk-uclass.h>
17 #include <dt-bindings/clock/rk3228-cru.h>
94 struct rk322x_cru *cru = priv->cru; in rk322x_armclk_set_clk()
101 return -EINVAL; in rk322x_armclk_set_clk()
110 priv->cru, APLL); in rk322x_armclk_set_clk()
113 priv->cru, APLL, hz)) in rk322x_armclk_set_clk()
114 return -EINVAL; in rk322x_armclk_set_clk()
115 rk_clrsetreg(&cru->cru_clksel_con[0], in rk322x_armclk_set_clk()
119 rk_clrsetreg(&cru->cru_clksel_con[1], in rk322x_armclk_set_clk()
121 rate->aclk_div << CORE_ACLK_DIV_SHIFT | in rk322x_armclk_set_clk()
122 rate->pclk_div << CORE_PERI_DIV_SHIFT); in rk322x_armclk_set_clk()
124 rk_clrsetreg(&cru->cru_clksel_con[1], in rk322x_armclk_set_clk()
126 rate->aclk_div << CORE_ACLK_DIV_SHIFT | in rk322x_armclk_set_clk()
127 rate->pclk_div << CORE_PERI_DIV_SHIFT); in rk322x_armclk_set_clk()
128 rk_clrsetreg(&cru->cru_clksel_con[0], in rk322x_armclk_set_clk()
133 priv->cru, APLL, hz)) in rk322x_armclk_set_clk()
134 return -EINVAL; in rk322x_armclk_set_clk()
137 return rockchip_pll_get_rate(&rk322x_pll_clks[APLL], priv->cru, APLL); in rk322x_armclk_set_clk()
143 struct rk322x_cru *cru = priv->cru; in rk322x_mmc_get_clk()
152 con = readl(&cru->cru_clksel_con[11]); in rk322x_mmc_get_clk()
154 con = readl(&cru->cru_clksel_con[12]); in rk322x_mmc_get_clk()
160 con = readl(&cru->cru_clksel_con[11]); in rk322x_mmc_get_clk()
166 con = readl(&cru->cru_clksel_con[11]); in rk322x_mmc_get_clk()
168 con = readl(&cru->cru_clksel_con[12]); in rk322x_mmc_get_clk()
172 return -EINVAL; in rk322x_mmc_get_clk()
175 src_rate = mux == EMMC_SEL_24M ? OSC_HZ : priv->gpll_hz; in rk322x_mmc_get_clk()
180 static ulong rk322x_mac_set_clk(struct rk322x_clk_priv *priv, uint freq) in rk322x_mac_set_clk() argument
182 struct rk322x_cru *cru = priv->cru; in rk322x_mac_set_clk()
189 if (readl(&cru->cru_clksel_con[5]) & BIT(5)) { in rk322x_mac_set_clk()
191 ret = freq; in rk322x_mac_set_clk()
193 u32 con = readl(&cru->cru_clksel_con[5]); in rk322x_mac_set_clk()
198 pll_rate = priv->gpll_hz; in rk322x_mac_set_clk()
201 return -EPERM; in rk322x_mac_set_clk()
203 div = DIV_ROUND_UP(pll_rate, freq) - 1; in rk322x_mac_set_clk()
205 rk_clrsetreg(&cru->cru_clksel_con[5], CLK_MAC_DIV_MASK, in rk322x_mac_set_clk()
218 int periph, uint freq) in rk322x_mmc_set_clk() argument
220 struct rk322x_cru *cru = priv->cru; in rk322x_mmc_set_clk()
225 src_clk_div = DIV_ROUND_UP(priv->gpll_hz / 2, freq); in rk322x_mmc_set_clk()
228 src_clk_div = DIV_ROUND_UP(OSC_HZ / 2, freq); in rk322x_mmc_set_clk()
229 assert(src_clk_div - 1 < 128); in rk322x_mmc_set_clk()
239 rk_clrsetreg(&cru->cru_clksel_con[11], in rk322x_mmc_set_clk()
242 rk_clrsetreg(&cru->cru_clksel_con[12], in rk322x_mmc_set_clk()
244 (src_clk_div - 1) << EMMC_DIV_SHIFT); in rk322x_mmc_set_clk()
249 rk_clrsetreg(&cru->cru_clksel_con[11], in rk322x_mmc_set_clk()
252 (src_clk_div - 1) << MMC0_DIV_SHIFT); in rk322x_mmc_set_clk()
256 rk_clrsetreg(&cru->cru_clksel_con[11], in rk322x_mmc_set_clk()
259 rk_clrsetreg(&cru->cru_clksel_con[12], in rk322x_mmc_set_clk()
261 (src_clk_div - 1) << SDIO_DIV_SHIFT); in rk322x_mmc_set_clk()
264 return -EINVAL; in rk322x_mmc_set_clk()
272 struct rk322x_cru *cru = priv->cru; in rk322x_bus_get_clk()
277 con = readl(&cru->cru_clksel_con[0]); in rk322x_bus_get_clk()
279 parent = priv->gpll_hz; in rk322x_bus_get_clk()
282 con = readl(&cru->cru_clksel_con[1]); in rk322x_bus_get_clk()
292 con = readl(&cru->cru_clksel_con[1]); in rk322x_bus_get_clk()
297 return -ENOENT; in rk322x_bus_get_clk()
306 struct rk322x_cru *cru = priv->cru; in rk322x_bus_set_clk()
315 src_clk_div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_bus_set_clk()
316 assert(src_clk_div - 1 < 32); in rk322x_bus_set_clk()
317 rk_clrsetreg(&cru->cru_clksel_con[0], in rk322x_bus_set_clk()
320 (src_clk_div - 1) << BUS_ACLK_DIV_SHIFT); in rk322x_bus_set_clk()
326 assert(src_clk_div - 1 < 4); in rk322x_bus_set_clk()
327 rk_clrsetreg(&cru->cru_clksel_con[1], in rk322x_bus_set_clk()
329 (src_clk_div - 1) << BUS_HCLK_DIV_SHIFT); in rk322x_bus_set_clk()
335 assert(src_clk_div - 1 < 8); in rk322x_bus_set_clk()
336 rk_clrsetreg(&cru->cru_clksel_con[1], in rk322x_bus_set_clk()
338 (src_clk_div - 1) << BUS_PCLK_DIV_SHIFT); in rk322x_bus_set_clk()
341 printf("do not support this bus freq\n"); in rk322x_bus_set_clk()
342 return -EINVAL; in rk322x_bus_set_clk()
350 struct rk322x_cru *cru = priv->cru; in rk322x_peri_get_clk()
355 con = readl(&cru->cru_clksel_con[10]); in rk322x_peri_get_clk()
357 parent = priv->gpll_hz; in rk322x_peri_get_clk()
360 con = readl(&cru->cru_clksel_con[10]); in rk322x_peri_get_clk()
365 con = readl(&cru->cru_clksel_con[10]); in rk322x_peri_get_clk()
370 return -ENOENT; in rk322x_peri_get_clk()
379 struct rk322x_cru *cru = priv->cru; in rk322x_peri_set_clk()
388 src_clk_div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_peri_set_clk()
389 assert(src_clk_div - 1 < 32); in rk322x_peri_set_clk()
390 rk_clrsetreg(&cru->cru_clksel_con[10], in rk322x_peri_set_clk()
393 (src_clk_div - 1) << PERI_ACLK_DIV_SHIFT); in rk322x_peri_set_clk()
399 assert(src_clk_div - 1 < 4); in rk322x_peri_set_clk()
400 rk_clrsetreg(&cru->cru_clksel_con[10], in rk322x_peri_set_clk()
402 (src_clk_div - 1) << PERI_HCLK_DIV_SHIFT); in rk322x_peri_set_clk()
408 assert(src_clk_div - 1 < 8); in rk322x_peri_set_clk()
409 rk_clrsetreg(&cru->cru_clksel_con[10], in rk322x_peri_set_clk()
411 (src_clk_div - 1) << PERI_PCLK_DIV_SHIFT); in rk322x_peri_set_clk()
414 printf("do not support this bus freq\n"); in rk322x_peri_set_clk()
415 return -EINVAL; in rk322x_peri_set_clk()
423 struct rk322x_cru *cru = priv->cru; in rk322x_spi_get_clk()
426 con = readl(&cru->cru_clksel_con[25]); in rk322x_spi_get_clk()
428 parent = priv->gpll_hz; in rk322x_spi_get_clk()
435 struct rk322x_cru *cru = priv->cru; in rk322x_spi_set_clk()
438 div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_spi_set_clk()
439 assert(div - 1 < 128); in rk322x_spi_set_clk()
440 rk_clrsetreg(&cru->cru_clksel_con[25], in rk322x_spi_set_clk()
443 (div - 1) << SPI_DIV_SHIFT); in rk322x_spi_set_clk()
450 struct rk322x_cru *cru = priv->cru; in rk322x_vop_get_clk()
455 con = readl(&cru->cru_clksel_con[33]); in rk322x_vop_get_clk()
457 parent = priv->gpll_hz; in rk322x_vop_get_clk()
460 con = readl(&cru->cru_clksel_con[27]); in rk322x_vop_get_clk()
463 sel = readl(&cru->cru_clksel_con[27]); in rk322x_vop_get_clk()
467 parent = priv->cpll_hz; in rk322x_vop_get_clk()
469 parent = priv->gpll_hz; in rk322x_vop_get_clk()
471 con = readl(&cru->cru_clksel_con[27]); in rk322x_vop_get_clk()
475 parent = priv->cpll_hz; in rk322x_vop_get_clk()
480 return -ENOENT; in rk322x_vop_get_clk()
489 struct rk322x_cru *cru = priv->cru; in rk322x_vop_set_clk()
495 src_clk_div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_vop_set_clk()
496 assert(src_clk_div - 1 < 32); in rk322x_vop_set_clk()
497 rk_clrsetreg(&cru->cru_clksel_con[33], in rk322x_vop_set_clk()
500 (src_clk_div - 1) << ACLK_VOP_DIV_CON_SHIFT); in rk322x_vop_set_clk()
503 con = readl(&cru->cru_clksel_con[27]); in rk322x_vop_set_clk()
506 parent = readl(&cru->cru_clksel_con[27]); in rk322x_vop_set_clk()
510 src_clk_div = DIV_ROUND_UP(priv->cpll_hz, hz); in rk322x_vop_set_clk()
512 src_clk_div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_vop_set_clk()
514 assert(src_clk_div - 1 < 256); in rk322x_vop_set_clk()
515 rk_clrsetreg(&cru->cru_clksel_con[27], in rk322x_vop_set_clk()
517 (src_clk_div - 1) << in rk322x_vop_set_clk()
522 printf("do not support this vop freq\n"); in rk322x_vop_set_clk()
523 return -EINVAL; in rk322x_vop_set_clk()
531 struct rk322x_cru *cru = priv->cru; in rk322x_crypto_get_clk()
536 con = readl(&cru->cru_clksel_con[24]); in rk322x_crypto_get_clk()
538 parent = priv->gpll_hz; in rk322x_crypto_get_clk()
541 return -ENOENT; in rk322x_crypto_get_clk()
550 struct rk322x_cru *cru = priv->cru; in rk322x_crypto_set_clk()
553 src_clk_div = DIV_ROUND_UP(priv->gpll_hz, hz); in rk322x_crypto_set_clk()
554 assert(src_clk_div - 1 <= 31); in rk322x_crypto_set_clk()
562 rk_clrsetreg(&cru->cru_clksel_con[24], in rk322x_crypto_set_clk()
565 (src_clk_div - 1) << CRYPTO_DIV_SHIFT); in rk322x_crypto_set_clk()
568 printf("do not support this peri freq\n"); in rk322x_crypto_set_clk()
569 return -EINVAL; in rk322x_crypto_set_clk()
578 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_clk_get_rate()
581 switch (clk->id) { in rk322x_clk_get_rate()
586 rate = rockchip_pll_get_rate(&rk322x_pll_clks[clk->id - 1], in rk322x_clk_get_rate()
587 priv->cru, clk->id - 1); in rk322x_clk_get_rate()
591 priv->cru, APLL); in rk322x_clk_get_rate()
601 rate = rk322x_mmc_get_clk(priv, clk->id); in rk322x_clk_get_rate()
614 rate = rk322x_bus_get_clk(priv, clk->id); in rk322x_clk_get_rate()
619 rate = rk322x_peri_get_clk(priv, clk->id); in rk322x_clk_get_rate()
624 rate = rk322x_vop_get_clk(priv, clk->id); in rk322x_clk_get_rate()
627 rate = rk322x_crypto_get_clk(priv, clk->id); in rk322x_clk_get_rate()
631 return -ENOENT; in rk322x_clk_get_rate()
639 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_clk_set_rate()
642 switch (clk->id) { in rk322x_clk_set_rate()
645 ret = rockchip_pll_set_rate(&rk322x_pll_clks[clk->id - 1], in rk322x_clk_set_rate()
646 priv->cru, clk->id - 1, rate); in rk322x_clk_set_rate()
650 priv->cru, CPLL, rate); in rk322x_clk_set_rate()
651 priv->cpll_hz = rate; in rk322x_clk_set_rate()
655 priv->cru, GPLL, rate); in rk322x_clk_set_rate()
656 priv->gpll_hz = rate; in rk322x_clk_set_rate()
659 if (priv->armclk_hz) in rk322x_clk_set_rate()
661 priv->armclk_hz = rate; in rk322x_clk_set_rate()
671 ret = rk322x_mmc_set_clk(priv, clk->id, rate); in rk322x_clk_set_rate()
675 priv->cru, DPLL, rate); in rk322x_clk_set_rate()
683 ret = rk322x_bus_set_clk(priv, clk->id, rate); in rk322x_clk_set_rate()
688 ret = rk322x_peri_set_clk(priv, clk->id, rate); in rk322x_clk_set_rate()
697 ret = rk322x_vop_set_clk(priv, clk->id, rate); in rk322x_clk_set_rate()
700 ret = rk322x_crypto_set_clk(priv, clk->id, rate); in rk322x_clk_set_rate()
704 return -ENOENT; in rk322x_clk_set_rate()
713 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_gmac_set_parent()
714 struct rk322x_cru *cru = priv->cru; in rk322x_gmac_set_parent()
717 * If the requested parent is in the same clock-controller and the id in rk322x_gmac_set_parent()
720 if ((parent->dev == clk->dev) && (parent->id == SCLK_MAC_SRC)) { in rk322x_gmac_set_parent()
721 debug("%s: switching RGMII to SCLK_MAC_SRC\n", __func__); in rk322x_gmac_set_parent()
722 rk_clrsetreg(&cru->cru_clksel_con[5], BIT(5), 0); in rk322x_gmac_set_parent()
727 * If the requested parent is in the same clock-controller and the id in rk322x_gmac_set_parent()
730 if ((parent->dev == clk->dev) && (parent->id == SCLK_MAC_EXTCLK)) { in rk322x_gmac_set_parent()
731 debug("%s: switching RGMII to SCLK_MAC_EXTCLK\n", __func__); in rk322x_gmac_set_parent()
732 rk_clrsetreg(&cru->cru_clksel_con[5], BIT(5), BIT(5)); in rk322x_gmac_set_parent()
736 return -EINVAL; in rk322x_gmac_set_parent()
741 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_gmac_extclk_set_parent()
743 struct rk322x_cru *cru = priv->cru; in rk322x_gmac_extclk_set_parent()
746 ret = dev_read_string_index(parent->dev, "clock-output-names", in rk322x_gmac_extclk_set_parent()
747 parent->id, &clock_output_name); in rk322x_gmac_extclk_set_parent()
749 return -ENODATA; in rk322x_gmac_extclk_set_parent()
752 debug("%s: switching gmac extclk to ext_gmac\n", __func__); in rk322x_gmac_extclk_set_parent()
753 rk_clrsetreg(&cru->cru_clksel_con[29], BIT(10), 0); in rk322x_gmac_extclk_set_parent()
756 debug("%s: switching gmac extclk to phy_50m_out\n", __func__); in rk322x_gmac_extclk_set_parent()
757 rk_clrsetreg(&cru->cru_clksel_con[29], BIT(10), BIT(10)); in rk322x_gmac_extclk_set_parent()
761 return -EINVAL; in rk322x_gmac_extclk_set_parent()
766 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_lcdc_set_parent()
768 if (parent->id == HDMIPHY) in rk322x_lcdc_set_parent()
769 rk_clrsetreg(&priv->cru->cru_clksel_con[27], in rk322x_lcdc_set_parent()
772 else if (parent->id == PLL_CPLL) in rk322x_lcdc_set_parent()
773 rk_clrsetreg(&priv->cru->cru_clksel_con[27], in rk322x_lcdc_set_parent()
779 rk_clrsetreg(&priv->cru->cru_clksel_con[27], in rk322x_lcdc_set_parent()
791 switch (clk->id) { in rk322x_clk_set_parent()
802 debug("%s: unsupported clk %ld\n", __func__, clk->id); in rk322x_clk_set_parent()
803 return -ENOENT; in rk322x_clk_set_parent()
813 * Each fine delay is between 44ps-77ps. Assume each fine delay is 60ps to
820 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_mmc_get_phase()
821 struct rk322x_cru *cru = priv->cru; in rk322x_mmc_get_phase()
831 if (clk->id == SCLK_EMMC_SAMPLE) in rk322x_mmc_get_phase()
832 raw_value = readl(&cru->cru_emmc_con[1]); in rk322x_mmc_get_phase()
833 else if (clk->id == SCLK_SDMMC_SAMPLE) in rk322x_mmc_get_phase()
834 raw_value = readl(&cru->cru_sdmmc_con[1]); in rk322x_mmc_get_phase()
836 raw_value = readl(&cru->cru_sdio_con[1]); in rk322x_mmc_get_phase()
856 struct rk322x_clk_priv *priv = dev_get_priv(clk->dev); in rk322x_mmc_set_phase()
857 struct rk322x_cru *cru = priv->cru; in rk322x_mmc_set_phase()
872 * don't overflow 32-bit / 64-bit numbers. in rk322x_mmc_set_phase()
886 if (clk->id == SCLK_EMMC_SAMPLE) in rk322x_mmc_set_phase()
887 writel(raw_value | 0xffff0000, &cru->cru_emmc_con[1]); in rk322x_mmc_set_phase()
888 else if (clk->id == SCLK_SDMMC_SAMPLE) in rk322x_mmc_set_phase()
889 writel(raw_value | 0xffff0000, &cru->cru_sdmmc_con[1]); in rk322x_mmc_set_phase()
891 writel(raw_value | 0xffff0000, &cru->cru_sdio_con[1]); in rk322x_mmc_set_phase()
903 debug("%s %ld\n", __func__, clk->id); in rk322x_clk_get_phase()
904 switch (clk->id) { in rk322x_clk_get_phase()
911 return -ENOENT; in rk322x_clk_get_phase()
921 debug("%s %ld\n", __func__, clk->id); in rk322x_clk_set_phase()
922 switch (clk->id) { in rk322x_clk_set_phase()
929 return -ENOENT; in rk322x_clk_set_phase()
947 priv->cru = dev_read_addr_ptr(dev); in rk322x_clk_ofdata_to_platdata()
955 struct rk322x_cru *cru = priv->cru; in rkclk_init()
958 priv->cru, APLL) != APLL_HZ) in rkclk_init()
961 priv->gpll_hz = rockchip_pll_get_rate(&rk322x_pll_clks[GPLL], in rkclk_init()
962 priv->cru, GPLL); in rkclk_init()
963 priv->cpll_hz = rockchip_pll_get_rate(&rk322x_pll_clks[CPLL], in rkclk_init()
964 priv->cru, CPLL); in rkclk_init()
972 rk_clrsetreg(&cru->cru_clksel_con[2], (0x1 << 14) | in rkclk_init()
974 rk_clrsetreg(&cru->cru_clksel_con[23], (0x1f << 0) | (0x1f << 8), in rkclk_init()
976 rk_clrsetreg(&cru->cru_clksel_con[33], in rkclk_init()
980 rk_clrsetreg(&cru->cru_clksel_con[22], 0x1f << 0, 5 << 0); in rkclk_init()
981 rk_clrsetreg(&cru->cru_clksel_con[24], 0x1f << 0, 0xb << 0); in rkclk_init()
982 rk_clrsetreg(&cru->cru_clksel_con[28], (0x1f << 8) | (0x1f << 0), in rkclk_init()
984 rk_clrsetreg(&cru->cru_clksel_con[31], (0x1f << 8) | (0x1f << 0), in rkclk_init()
986 rk_clrsetreg(&cru->cru_clksel_con[32], 0x1f << 0, 5 << 0); in rkclk_init()
987 rk_clrsetreg(&cru->cru_clksel_con[33], (0x1f << 8) | (0x1f << 0), in rkclk_init()
989 rk_clrsetreg(&cru->cru_clksel_con[34], (0x1f << 8) | (0x1f << 0), in rkclk_init()
993 priv->cru, GPLL, GPLL_HZ); in rkclk_init()
994 priv->gpll_hz = GPLL_HZ; in rkclk_init()
997 priv->cru, CPLL, CPLL_HZ); in rkclk_init()
998 priv->cpll_hz = CPLL_HZ; in rkclk_init()
1009 rk_clrsetreg(&cru->cru_misc_con, (0x1 << 13) | in rkclk_init()
1020 priv->sync_kernel = false; in rk322x_clk_probe()
1021 if (!priv->armclk_enter_hz) in rk322x_clk_probe()
1022 priv->armclk_enter_hz = in rk322x_clk_probe()
1024 priv->cru, APLL); in rk322x_clk_probe()
1026 if (!priv->armclk_init_hz) in rk322x_clk_probe()
1027 priv->armclk_init_hz = in rk322x_clk_probe()
1029 priv->cru, APLL); in rk322x_clk_probe()
1034 priv->sync_kernel = true; in rk322x_clk_probe()
1053 priv->glb_srst_fst_value = offsetof(struct rk322x_cru, in rk322x_clk_bind()
1055 priv->glb_srst_snd_value = offsetof(struct rk322x_cru, in rk322x_clk_bind()
1057 sys_child->priv = priv; in rk322x_clk_bind()
1066 sf_priv->sf_reset_offset = offsetof(struct rk322x_cru, in rk322x_clk_bind()
1068 sf_priv->sf_reset_num = 9; in rk322x_clk_bind()
1069 sf_child->priv = sf_priv; in rk322x_clk_bind()
1076 { .compatible = "rockchip,rk3228-cru" },
1093 * soc_clk_dump() - Print clock frequencies
1118 priv->sync_kernel ? "sync kernel" : "uboot", in soc_clk_dump()
1119 priv->armclk_enter_hz / 1000, in soc_clk_dump()
1120 priv->armclk_init_hz / 1000, in soc_clk_dump()
1121 priv->set_armclk_rate ? priv->armclk_hz / 1000 : 0, in soc_clk_dump()
1122 priv->set_armclk_rate ? " KHz" : "N/A"); in soc_clk_dump()
1125 if (clk_dump->name) { in soc_clk_dump()
1126 clk.id = clk_dump->id; in soc_clk_dump()
1127 if (clk_dump->is_cru) in soc_clk_dump()
1136 printf(" %s %s\n", clk_dump->name, in soc_clk_dump()
1139 printf(" %s %lu KHz\n", clk_dump->name, in soc_clk_dump()
1143 printf(" %s %s\n", clk_dump->name, in soc_clk_dump()
1146 printf(" %s %lu KHz\n", clk_dump->name, in soc_clk_dump()