[PATCH v2 2/3] drivers: clk: agilex: Support for enable/disable API

Chee, Tien Fong tien.fong.chee at altera.com
Thu Sep 11 04:00:55 CEST 2025



> -----Original Message-----
> From: Yuslaimi, Alif Zakuan <alif.zakuan.yuslaimi at altera.com>
> Sent: Tuesday, September 9, 2025 10:11 AM
> To: u-boot at lists.denx.de
> Cc: Tom Rini <trini at konsulko.com>; Lukasz Majewski <lukma at denx.de>;
> Sean Anderson <seanga2 at gmail.com>; Peng Fan <peng.fan at nxp.com>;
> Jaehoon Chung <jh80.chung at samsung.com>; Chee, Tien Fong
> <tien.fong.chee at altera.com>; Simon Glass <sjg at chromium.org>; Marek
> Vasut <marek.vasut+renesas at mailbox.org>; Simon Goldschmidt
> <simon.k.r.goldschmidt at gmail.com>; Yuslaimi, Alif Zakuan
> <alif.zakuan.yuslaimi at altera.com>
> Subject: [PATCH v2 2/3] drivers: clk: agilex: Support for enable/disable API
> 
> From: Alif Zakuan Yuslaimi <alif.zakuan.yuslaimi at altera.com>
> 
> Update Agilex clock driver to support enabling or disabling the peripheral
> clocks via clock driver model APIs.
> 
> The caller will pass the clock ID to this driver and the driver will then proceed
> to manipulate the desired bit in the Agilex clock manager peripheral PLL
> register based on the given clock ID.
> 
> Signed-off-by: Alif Zakuan Yuslaimi <alif.zakuan.yuslaimi at altera.com>
> ---
>  drivers/clk/altera/clk-agilex.c | 120
> ++++++++++++++++++++++++++++++++  drivers/clk/altera/clk-agilex.h |
> 20 ++++++
>  2 files changed, 140 insertions(+)
> 
> diff --git a/drivers/clk/altera/clk-agilex.c b/drivers/clk/altera/clk-agilex.c
> index 242740a4b00..46b04895cc5 100644
> --- a/drivers/clk/altera/clk-agilex.c
> +++ b/drivers/clk/altera/clk-agilex.c
> @@ -22,6 +22,8 @@ DECLARE_GLOBAL_DATA_PTR;
> 
>  struct socfpga_clk_plat {
>  	void __iomem *regs;
> +	int pllgrp;
> +	int bitmask;
>  };
> 
>  /*
> @@ -643,8 +645,125 @@ static ulong socfpga_clk_get_rate(struct clk *clk)
>  	}
>  }
> 
> +static int bitmask_from_clk_id(struct clk *clk) {
> +	struct socfpga_clk_plat *plat = dev_get_plat(clk->dev);
> +
> +	switch (clk->id) {
> +	case AGILEX_MPU_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask = CLKMGR_MAINPLLGRP_EN_MPUCLK_MASK;
> +		break;
> +	case AGILEX_L4_MAIN_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask =
> CLKMGR_MAINPLLGRP_EN_L4MAINCLK_MASK;
> +		break;
> +	case AGILEX_L4_MP_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask =
> CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK;
> +		break;
> +	case AGILEX_L4_SP_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask = CLKMGR_MAINPLLGRP_EN_L4SPCLK_MASK;
> +		break;
> +	case AGILEX_CS_AT_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask = CLKMGR_MAINPLLGRP_EN_CSCLK_MASK;
> +		break;
> +	case AGILEX_CS_TRACE_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask = CLKMGR_MAINPLLGRP_EN_CSCLK_MASK;
> +		break;
> +	case AGILEX_CS_PDBG_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask = CLKMGR_MAINPLLGRP_EN_CSCLK_MASK;
> +		break;
> +	case AGILEX_CS_TIMER_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask =
> CLKMGR_MAINPLLGRP_EN_CSTIMERCLK_MASK;
> +		break;
> +	case AGILEX_S2F_USER0_CLK:
> +		plat->pllgrp = CLKMGR_MAINPLL_EN;
> +		plat->bitmask =
> CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK;
> +		break;
> +	case AGILEX_EMAC0_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_EMAC0CLK_MASK;
> +		break;
> +	case AGILEX_EMAC1_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_EMAC1CLK_MASK;
> +		break;
> +	case AGILEX_EMAC2_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_EMAC2CLK_MASK;
> +		break;
> +	case AGILEX_EMAC_PTP_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask =
> CLKMGR_PERPLLGRP_EN_EMACPTPCLK_MASK;
> +		break;
> +	case AGILEX_GPIO_DB_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask =
> CLKMGR_PERPLLGRP_EN_GPIODBCLK_MASK;
> +		break;
> +	case AGILEX_SDMMC_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask =
> CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK;
> +		break;
> +	case AGILEX_S2F_USER1_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask =
> CLKMGR_PERPLLGRP_EN_S2FUSER1CLK_MASK;
> +		break;
> +	case AGILEX_PSI_REF_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_PSIREFCLK_MASK;
> +		break;
> +	case AGILEX_USB_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_USBCLK_MASK;
> +		break;
> +	case AGILEX_SPI_M_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_SPIMCLK_MASK;
> +		break;
> +	case AGILEX_NAND_CLK:
> +		plat->pllgrp = CLKMGR_PERPLL_EN;
> +		plat->bitmask = CLKMGR_PERPLLGRP_EN_NANDCLK_MASK;
> +		break;
> +	default:
> +		return -ENXIO;
> +	}
> +
> +	return 0;
> +}
> +
>  static int socfpga_clk_enable(struct clk *clk)  {
> +	struct socfpga_clk_plat *plat = dev_get_plat(clk->dev);
> +	uintptr_t base_addr = (uintptr_t)plat->regs;
> +	int ret;
> +
> +	ret = bitmask_from_clk_id(clk);
> +	if (ret)
> +		return ret;
> +
> +	setbits_le32(base_addr + plat->pllgrp, plat->bitmask);
> +
> +	return 0;
> +}
> +
> +static int socfpga_clk_disable(struct clk *clk) {
> +	struct socfpga_clk_plat *plat = dev_get_plat(clk->dev);
> +	uintptr_t base_addr = (uintptr_t)plat->regs;
> +	int ret;
> +
> +	ret = bitmask_from_clk_id(clk);
> +	if (ret)
> +		return ret;
> +
> +	clrbits_le32(base_addr + plat->pllgrp, plat->bitmask);
> +
>  	return 0;
>  }
> 
> @@ -672,6 +791,7 @@ static int socfpga_clk_of_to_plat(struct udevice *dev)
> 
>  static struct clk_ops socfpga_clk_ops = {
>  	.enable		= socfpga_clk_enable,
> +	.disable	= socfpga_clk_disable,
>  	.get_rate	= socfpga_clk_get_rate,
>  };
> 
> diff --git a/drivers/clk/altera/clk-agilex.h b/drivers/clk/altera/clk-agilex.h
> index b3e8841a512..be639957940 100644
> --- a/drivers/clk/altera/clk-agilex.h
> +++ b/drivers/clk/altera/clk-agilex.h
> @@ -1,6 +1,7 @@
>  /* SPDX-License-Identifier: GPL-2.0 */
>  /*
>   * Copyright (C) 2019 Intel Corporation <www.intel.com>
> + * Copyright (C) 2025 Altera Corporation <www.altera.com>
>   */
> 
>  #ifndef	_CLK_AGILEX_
> @@ -210,7 +211,26 @@ struct cm_config {
> 
>  #define CLKMGR_LOSTLOCK_SET_MASK		BIT(0)
> 
> +#define CLKMGR_MAINPLLGRP_EN_MPUCLK_MASK		BIT(0)
> +#define CLKMGR_MAINPLLGRP_EN_L4MAINCLK_MASK		BIT(1)
> +#define CLKMGR_MAINPLLGRP_EN_L4MPCLK_MASK		BIT(2)
> +#define CLKMGR_MAINPLLGRP_EN_L4SPCLK_MASK		BIT(3)
> +#define CLKMGR_MAINPLLGRP_EN_CSCLK_MASK		BIT(4)
> +#define CLKMGR_MAINPLLGRP_EN_CSTIMERCLK_MASK		BIT(5)
> +#define CLKMGR_MAINPLLGRP_EN_S2FUSER0CLK_MASK		BIT(6)
> +
> +#define CLKMGR_PERPLLGRP_EN_EMAC0CLK_MASK		BIT(0)
> +#define CLKMGR_PERPLLGRP_EN_EMAC1CLK_MASK		BIT(1)
> +#define CLKMGR_PERPLLGRP_EN_EMAC2CLK_MASK		BIT(2)
> +#define CLKMGR_PERPLLGRP_EN_EMACPTPCLK_MASK		BIT(3)
> +#define CLKMGR_PERPLLGRP_EN_GPIODBCLK_MASK		BIT(4)
>  #define CLKMGR_PERPLLGRP_EN_SDMMCCLK_MASK		BIT(5)
> +#define CLKMGR_PERPLLGRP_EN_S2FUSER1CLK_MASK		BIT(6)
> +#define CLKMGR_PERPLLGRP_EN_PSIREFCLK_MASK		BIT(7)
> +#define CLKMGR_PERPLLGRP_EN_USBCLK_MASK		BIT(8)
> +#define CLKMGR_PERPLLGRP_EN_SPIMCLK_MASK		BIT(9)
> +#define CLKMGR_PERPLLGRP_EN_NANDCLK_MASK		BIT(10)
> +
>  #define CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_OFFSET	26
>  #define CLKMGR_PERPLLGRP_EMACCTL_EMAC0SELB_MASK		BIT(26)
>  #define CLKMGR_PERPLLGRP_EMACCTL_EMAC1SELB_OFFSET	27
> --
> 2.35.3

Reviewed-by: Tien Fong Chee <tien.fong.chee at altera.com>

Best regards,
Tien Fong



More information about the U-Boot mailing list