// SPDX-License-Identifier: GPL-2.0 /* * Clock drivers for Qualcomm ipq9574 * * (C) Copyright 2025 Linaro Ltd. */ #include #include #include #include #include #include #include #include #include #include "clock-qcom.h" #define GCC_BLSP1_AHB_CBCR 0x1004 #define GCC_BLSP1_UART3_APPS_CMD_RCGR 0x402C #define GCC_BLSP1_UART3_APPS_CBCR 0x4054 #define GCC_SDCC1_APPS_CBCR 0x3302C #define GCC_SDCC1_AHB_CBCR 0x33034 #define GCC_SDCC1_APPS_CMD_RCGR 0x33004 #define GCC_SDCC1_ICE_CORE_CBCR 0x33030 static ulong ipq9574_set_rate(struct clk *clk, ulong rate) { struct msm_clk_priv *priv = dev_get_priv(clk->dev); switch (clk->id) { case GCC_BLSP1_UART3_APPS_CLK: clk_rcg_set_rate_mnd(priv->base, GCC_BLSP1_UART3_APPS_CMD_RCGR, 0, 144, 15625, CFG_CLK_SRC_GPLL0, 16); return rate; case GCC_SDCC1_APPS_CLK: clk_rcg_set_rate_mnd(priv->base, GCC_SDCC1_APPS_CMD_RCGR, 11, 0, 0, CFG_CLK_SRC_GPLL2, 16); return rate; default: return -EINVAL; } } static const struct gate_clk ipq9574_clks[] = { GATE_CLK(GCC_BLSP1_UART3_APPS_CLK, 0x4054, 0x00000001), GATE_CLK(GCC_BLSP1_AHB_CLK, 0x1004, 0x00000001), GATE_CLK(GCC_SDCC1_AHB_CLK, 0x33034, 0x00000001), GATE_CLK(GCC_SDCC1_APPS_CLK, 0x3302C, 0x00000001), GATE_CLK(GCC_SDCC1_ICE_CORE_CLK, 0x33030, 0x00000001), }; static int ipq9574_enable(struct clk *clk) { struct msm_clk_priv *priv = dev_get_priv(clk->dev); debug("%s: clk %s\n", __func__, ipq9574_clks[clk->id].name); if (!ipq9574_clks[clk->id].reg) return -EINVAL; qcom_gate_clk_en(priv, clk->id); return 0; } static const struct qcom_reset_map ipq9574_gcc_resets[] = { [GCC_SDCC_BCR] = { 0x33000 }, }; static struct msm_clk_data ipq9574_gcc_data = { .resets = ipq9574_gcc_resets, .num_resets = ARRAY_SIZE(ipq9574_gcc_resets), .enable = ipq9574_enable, .set_rate = ipq9574_set_rate, }; static const struct udevice_id gcc_ipq9574_of_match[] = { { .compatible = "qcom,ipq9574-gcc", .data = (ulong)&ipq9574_gcc_data, }, { } }; U_BOOT_DRIVER(gcc_ipq9574) = { .name = "gcc_ipq9574", .id = UCLASS_NOP, .of_match = gcc_ipq9574_of_match, .bind = qcom_cc_bind, .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, };