[PATCH v6 02/11] clk/qcom: add initial clock driver for ipq5210
Casey Connolly
casey.connolly at linaro.org
Tue Jun 30 12:53:43 CEST 2026
Initial clock driver? As opposed to what? This is just redundant
As an aside, why does your CC list have a bunch of emails multiple
times? Please check this.
On 6/23/26 08:47, Varadarajan Narayanan wrote:
> Add initial set of clocks and resets for enabling U-Boot on ipq5210
> based RDP platforms.
>
> Signed-off-by: Varadarajan Narayanan <varadarajan.narayanan at oss.qualcomm.com>
> ---
> v4: Add comment for using cbcr_reg instead of reg
> Return error in ipq5210_enable() for failures
> ---
> drivers/clk/qcom/Kconfig | 8 +++
> drivers/clk/qcom/Makefile | 1 +
> drivers/clk/qcom/clock-ipq5210.c | 98 ++++++++++++++++++++++++++++++++
> 3 files changed, 107 insertions(+)
> create mode 100644 drivers/clk/qcom/clock-ipq5210.c
>
> diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
> index 0a2ce55aaa2..03eace6d8d8 100644
> --- a/drivers/clk/qcom/Kconfig
> +++ b/drivers/clk/qcom/Kconfig
> @@ -31,6 +31,14 @@ config CLK_QCOM_IPQ4019
> on the Snapdragon IPQ4019 SoC. This driver supports the clocks
> and resets exposed by the GCC hardware block.
>
> +config CLK_QCOM_IPQ5210
> + bool "Qualcomm IPQ5210 GCC"
> + select CLK_QCOM
> + help
> + Say Y here to enable support for the Global Clock Controller
> + on the Qualcomm IPQ5210 SoC. This driver supports the clocks
> + and resets exposed by the GCC hardware block.
> +
> config CLK_QCOM_IPQ5424
> bool "Qualcomm IPQ5424 GCC"
> select CLK_QCOM
> diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
> index b96d61b603e..845587a23cd 100644
> --- a/drivers/clk/qcom/Makefile
> +++ b/drivers/clk/qcom/Makefile
> @@ -7,6 +7,7 @@ obj-$(CONFIG_CLK_QCOM_SDM845) += clock-sdm845.o
> obj-$(CONFIG_CLK_QCOM_APQ8016) += clock-apq8016.o
> obj-$(CONFIG_CLK_QCOM_APQ8096) += clock-apq8096.o
> obj-$(CONFIG_CLK_QCOM_IPQ4019) += clock-ipq4019.o
> +obj-$(CONFIG_CLK_QCOM_IPQ5210) += clock-ipq5210.o
> obj-$(CONFIG_CLK_QCOM_IPQ5424) += clock-ipq5424.o
> obj-$(CONFIG_CLK_QCOM_IPQ9574) += clock-ipq9574.o
> obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o
> diff --git a/drivers/clk/qcom/clock-ipq5210.c b/drivers/clk/qcom/clock-ipq5210.c
> new file mode 100644
> index 00000000000..2e6037b6410
> --- /dev/null
> +++ b/drivers/clk/qcom/clock-ipq5210.c
> @@ -0,0 +1,98 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Clock drivers for Qualcomm IPQ5210
> + *
> + * (C) Copyright 2024 Linaro Ltd.
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +
> +#include <linux/types.h>
> +#include <clk-uclass.h>
> +#include <dm.h>
> +#include <linux/delay.h>
> +#include <asm/io.h>
> +#include <linux/bug.h>
> +#include <linux/bitops.h>
> +#include <dt-bindings/clock/qcom,ipq5210-gcc.h>
> +#include <dt-bindings/reset/qcom,ipq5210-gcc.h>
> +#include "clock-qcom.h"
> +
> +static ulong ipq5210_set_rate(struct clk *clk, ulong rate)
> +{
> + struct msm_clk_priv *priv = dev_get_priv(clk->dev);
> +
> + /*
> + * Since GATE_CLK is deprecated and GATE_CLK_POLLED is being used
> + * use 'cbcr_reg' instead of 'reg'.
No need to leave comments explaining why a deprecated API is unused> + */
> + switch (clk->id) {
> + case GCC_QUPV3_WRAP_SE1_CLK:
> + clk_rcg_set_rate_mnd(priv->base, priv->data->clks[clk->id].cbcr_reg,
> + 0, 2, 217, CFG_CLK_SRC_GPLL0, 16);
> + break;
> + case GCC_SDCC1_AHB_CLK:
> + break;
> + case GCC_SDCC1_APPS_CLK:
> + clk_rcg_set_rate_mnd(priv->base, priv->data->clks[clk->id].cbcr_reg,
> + 0, 6, 25, CFG_CLK_SRC_GPLL0, 16);
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return rate;
> +}
> +
> +static const struct gate_clk ipq5210_clks[] = {
> + GATE_CLK_POLLED(GCC_QUPV3_WRAP_SE1_CLK, 0x05020, BIT(0), 0x05004),
> + GATE_CLK_POLLED(GCC_SDCC1_AHB_CLK, 0x3303c, BIT(0), 0x3303c),
> + GATE_CLK_POLLED(GCC_SDCC1_APPS_CLK, 0x3302c, BIT(0), 0x33004),
> + GATE_CLK_POLLED(GCC_IM_SLEEP_CLK, 0x34020, BIT(0), 0x34020),
> +};
> +
> +static int ipq5210_enable(struct clk *clk)
> +{
> + struct msm_clk_priv *priv = dev_get_priv(clk->dev);
> +
> + if (priv->data->num_clks <= clk->id) {
> + debug("%s: unknown clk id %lu\n", __func__, clk->id);
> + return -ENOENT;
> + }
> +
> + debug("%s: clk %s\n", __func__, ipq5210_clks[clk->id].name);
> +
> + return qcom_gate_clk_en(priv, clk->id);
> +}
> +
> +static const struct qcom_reset_map ipq5210_gcc_resets[] = {
> + [GCC_SDCC_BCR] = {0x33000, 0},
> + [GCC_USB0_PHY_BCR] = {0x2c06c, 0},
> + [GCC_USB3PHY_0_PHY_BCR] = {0x2c070, 0},
> + [GCC_QUSB2_0_PHY_BCR] = {0x2c068, 0},
> + [GCC_USB_BCR] = {0x2c000, 0},
> +};
> +
> +static struct msm_clk_data ipq5210_gcc_data = {
> + .resets = ipq5210_gcc_resets,
> + .num_resets = ARRAY_SIZE(ipq5210_gcc_resets),
> + .clks = ipq5210_clks,
> + .num_clks = ARRAY_SIZE(ipq5210_clks),
> + .enable = ipq5210_enable,
> + .set_rate = ipq5210_set_rate,
> +};
> +
> +static const struct udevice_id gcc_ipq5210_of_match[] = {
> + {
> + .compatible = "qcom,ipq5210-gcc",
> + .data = (ulong)&ipq5210_gcc_data,
> + },
> + { }
> +};
> +
> +U_BOOT_DRIVER(gcc_ipq5210) = {
> + .name = "gcc_ipq5210",
> + .id = UCLASS_NOP,
> + .of_match = gcc_ipq5210_of_match,
> + .bind = qcom_cc_bind,
> + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF,
> +};
More information about the U-Boot
mailing list