blob: b0af4036059817eb5edf71f1cb842555550abba7 [file] [log] [blame]
Varadarajan Narayanan065236d2025-02-26 12:15:01 +05301// SPDX-License-Identifier: GPL-2.0
2/*
3 * Clock drivers for Qualcomm ipq9574
4 *
5 * (C) Copyright 2025 Linaro Ltd.
6 */
7
8#include <linux/types.h>
9#include <clk-uclass.h>
10#include <dm.h>
11#include <linux/delay.h>
12#include <asm/io.h>
13#include <linux/bug.h>
14#include <linux/bitops.h>
15#include <dt-bindings/clock/qcom,ipq9574-gcc.h>
16#include <dt-bindings/reset/qcom,ipq9574-gcc.h>
17
18#include "clock-qcom.h"
19
20#define GCC_BLSP1_AHB_CBCR 0x1004
21#define GCC_BLSP1_UART3_APPS_CMD_RCGR 0x402C
22#define GCC_BLSP1_UART3_APPS_CBCR 0x4054
23
24#define GCC_SDCC1_APPS_CBCR 0x3302C
25#define GCC_SDCC1_AHB_CBCR 0x33034
26#define GCC_SDCC1_APPS_CMD_RCGR 0x33004
27#define GCC_SDCC1_ICE_CORE_CBCR 0x33030
28
29static ulong ipq9574_set_rate(struct clk *clk, ulong rate)
30{
31 struct msm_clk_priv *priv = dev_get_priv(clk->dev);
32
33 switch (clk->id) {
34 case GCC_BLSP1_UART3_APPS_CLK:
35 clk_rcg_set_rate_mnd(priv->base, GCC_BLSP1_UART3_APPS_CMD_RCGR,
36 0, 144, 15625, CFG_CLK_SRC_GPLL0, 16);
37 return rate;
38 case GCC_SDCC1_APPS_CLK:
39 clk_rcg_set_rate_mnd(priv->base, GCC_SDCC1_APPS_CMD_RCGR,
40 11, 0, 0, CFG_CLK_SRC_GPLL2, 16);
41 return rate;
42 default:
43 return -EINVAL;
44 }
45}
46
47static const struct gate_clk ipq9574_clks[] = {
48 GATE_CLK(GCC_BLSP1_UART3_APPS_CLK, 0x4054, 0x00000001),
49 GATE_CLK(GCC_BLSP1_AHB_CLK, 0x1004, 0x00000001),
50 GATE_CLK(GCC_SDCC1_AHB_CLK, 0x33034, 0x00000001),
51 GATE_CLK(GCC_SDCC1_APPS_CLK, 0x3302C, 0x00000001),
52 GATE_CLK(GCC_SDCC1_ICE_CORE_CLK, 0x33030, 0x00000001),
53};
54
55static int ipq9574_enable(struct clk *clk)
56{
57 struct msm_clk_priv *priv = dev_get_priv(clk->dev);
58
59 debug("%s: clk %s\n", __func__, ipq9574_clks[clk->id].name);
60
61 if (!ipq9574_clks[clk->id].reg)
62 return -EINVAL;
63
64 qcom_gate_clk_en(priv, clk->id);
65
66 return 0;
67}
68
69static const struct qcom_reset_map ipq9574_gcc_resets[] = {
70 [GCC_SDCC_BCR] = { 0x33000 },
71};
72
73static struct msm_clk_data ipq9574_gcc_data = {
74 .resets = ipq9574_gcc_resets,
75 .num_resets = ARRAY_SIZE(ipq9574_gcc_resets),
76 .enable = ipq9574_enable,
77 .set_rate = ipq9574_set_rate,
78};
79
80static const struct udevice_id gcc_ipq9574_of_match[] = {
81 {
82 .compatible = "qcom,ipq9574-gcc",
83 .data = (ulong)&ipq9574_gcc_data,
84 },
85 { }
86};
87
88U_BOOT_DRIVER(gcc_ipq9574) = {
89 .name = "gcc_ipq9574",
90 .id = UCLASS_NOP,
91 .of_match = gcc_ipq9574_of_match,
92 .bind = qcom_cc_bind,
93 .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF,
94};