[PATCH 17/20] clk: add initial StarFive clock support

Ahmad Fatoum a.fatoum at pengutronix.de
Mon May 31 01:41:45 PDT 2021


On 31.05.21 09:38, Ahmad Fatoum wrote:
> All clocks seem to share a common format:
> 
>  struct starfive_clk {
> 	u32 divisor : 24;
> 	u32 mux : 6;
> 	u32 invert : 1;
> 	u32 enable : 1;
>  };
> 
> There is no documentation, what the acceptable divisor values are, but
> we could already register gates and muxes, do so for now until
> documentation is available.
> 
> The bulk of this code has been machine-generated by parsing the macros
> in the vendor U-Boot <asm/arch-vic7100/clkgen_ctrl_macro.h>.

If someone's curious:
https://gist.github.com/a3f/085ea5d58e3bf3e5536e441b1a45f0ce

Advising to rinse your eyes afterwards.

> 
> Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
> ---
>  drivers/clk/Makefile                        |   1 +
>  drivers/clk/starfive/Makefile               |   3 +
>  drivers/clk/starfive/clk.h                  |  64 ++++
>  drivers/clk/starfive/jh7100-clkgen.c        | 363 ++++++++++++++++++++
>  include/dt-bindings/clock/starfive-jh7100.h | 203 +++++++++++
>  5 files changed, 634 insertions(+)
>  create mode 100644 drivers/clk/starfive/Makefile
>  create mode 100644 drivers/clk/starfive/clk.h
>  create mode 100644 drivers/clk/starfive/jh7100-clkgen.c
>  create mode 100644 include/dt-bindings/clock/starfive-jh7100.h
> 
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index b0be8d1bd89a..499df2fe392b 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -23,3 +23,4 @@ obj-$(CONFIG_MACH_MIPS_LOONGSON)+= loongson/
>  obj-$(CONFIG_ARCH_LAYERSCAPE)	+= clk-qoric.o
>  obj-y				+= analogbits/
>  obj-$(CONFIG_CLK_SIFIVE)	+= sifive/
> +obj-$(CONFIG_SOC_STARFIVE)	+= starfive/
> diff --git a/drivers/clk/starfive/Makefile b/drivers/clk/starfive/Makefile
> new file mode 100644
> index 000000000000..7e4104993580
> --- /dev/null
> +++ b/drivers/clk/starfive/Makefile
> @@ -0,0 +1,3 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +obj-$(CONFIG_SOC_STARFIVE_JH7100) += jh7100-clkgen.o
> diff --git a/drivers/clk/starfive/clk.h b/drivers/clk/starfive/clk.h
> new file mode 100644
> index 000000000000..cfbf116dcb78
> --- /dev/null
> +++ b/drivers/clk/starfive/clk.h
> @@ -0,0 +1,64 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright 2021 Ahmad Fatoum, Pengutronix
> + */
> +
> +#ifndef STARFIVE_CLK_H_
> +#define STARFIVE_CLK_H_
> +
> +#include <linux/clk.h>
> +
> +#define STARFIVE_CLK_ENABLE_SHIFT	31
> +#define STARFIVE_CLK_INVERT_SHIFT	30
> +#define STARFIVE_CLK_MUX_SHIFT		24
> +
> +static inline struct clk *starfive_clk_underspecifid(const char *name, const char *parent)
> +{
> +	/*
> +	 * TODO With documentation available, all users of this functions can be
> +	 * migrated to one of the above or to a clk_fixed_factor with
> +	 * appropriate factor
> +	 */
> +	return clk_fixed_factor(name, parent, 1, 1, 0);
> +}
> +
> +static inline struct clk *starfive_clk_divider(const char *name, const char *parent,
> +		void __iomem *reg, u8 width)
> +{
> +	return starfive_clk_underspecifid(name, parent);
> +}
> +
> +static inline struct clk *starfive_clk_gate(const char *name, const char *parent,
> +		void __iomem *reg)
> +{
> +	return clk_gate(name, parent, reg, STARFIVE_CLK_ENABLE_SHIFT, CLK_SET_RATE_PARENT, 0);
> +}
> +
> +static inline struct clk *starfive_clk_divider_table(const char *name,
> +		const char *parent, void __iomem *reg, u8 width,
> +		const struct clk_div_table *table)
> +{
> +	return clk_divider_table(name, parent, CLK_SET_RATE_PARENT, reg, 0,
> +				 width, table, 0);
> +}
> +
> +static inline struct clk *starfive_clk_gated_divider(const char *name,
> +		const char *parent, void __iomem *reg, u8 width)
> +{
> +	/* TODO divider part */
> +	return clk_gate(name, parent, reg, STARFIVE_CLK_ENABLE_SHIFT, CLK_SET_RATE_PARENT, 0);
> +}
> +
> +static inline struct clk *starfive_clk_gate_dis(const char *name, const char *parent,
> +		void __iomem *reg)
> +{
> +	return clk_gate_inverted(name, parent, reg, STARFIVE_CLK_INVERT_SHIFT, CLK_SET_RATE_PARENT);
> +}
> +
> +static inline struct clk *starfive_clk_mux(const char *name, void __iomem *reg,
> +		u8 width, const char * const *parents, u8 num_parents)
> +{
> +	return clk_mux(name, 0, reg, STARFIVE_CLK_MUX_SHIFT, width, parents, num_parents, 0);
> +}
> +
> +#endif
> diff --git a/drivers/clk/starfive/jh7100-clkgen.c b/drivers/clk/starfive/jh7100-clkgen.c
> new file mode 100644
> index 000000000000..df5353e8e624
> --- /dev/null
> +++ b/drivers/clk/starfive/jh7100-clkgen.c
> @@ -0,0 +1,363 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright 2021 Ahmad Fatoum, Pengutronix
> + */
> +
> +#include <common.h>
> +#include <init.h>
> +#include <driver.h>
> +#include <linux/clk.h>
> +#include <io.h>
> +#include <of.h>
> +#include <linux/clkdev.h>
> +#include <linux/err.h>
> +#include <dt-bindings/clock/starfive-jh7100.h>
> +
> +#include "clk.h"
> +
> +
> +static const char *cpundbus_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll0_out",
> +	[2] = "pll1_out",
> +	[3] = "pll2_out",
> +};
> +
> +static const char *dla_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll1_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *dsp_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll0_out",
> +	[2] = "pll1_out",
> +	[3] = "pll2_out",
> +};
> +
> +static const char *gmacusb_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll0_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *perh0_root_sels[2] = {
> +	[0] = "osc_sys",
> +	[1] = "pll0_out",
> +};
> +
> +static const char *perh1_root_sels[2] = {
> +	[0] = "osc_sys",
> +	[1] = "pll2_out",
> +};
> +
> +static const char *vin_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll1_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *vout_root_sels[4] = {
> +	[0] = "osc_aud",
> +	[1] = "pll0_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *cdechifi4_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll1_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *cdec_root_sels[4] = {
> +	[0] = "osc_sys",
> +	[1] = "pll0_out",
> +	[2] = "pll1_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *voutbus_root_sels[4] = {
> +	[0] = "osc_aud",
> +	[1] = "pll0_out",
> +	[2] = "pll2_out",
> +	[3] = "dummy",
> +};
> +
> +static const char *pll2_refclk_sels[2] = {
> +	[0] = "osc_sys",
> +	[1] = "osc_aud",
> +};
> +
> +static const char *ddrc0_sels[4] = {
> +	[0] = "ddrosc_div2",
> +	[1] = "ddrpll_div2",
> +	[2] = "ddrpll_div4",
> +	[3] = "ddrpll_div8",
> +};
> +
> +static const char *ddrc1_sels[4] = {
> +	[0] = "ddrosc_div2",
> +	[1] = "ddrpll_div2",
> +	[2] = "ddrpll_div4",
> +	[3] = "ddrpll_div8",
> +};
> +
> +static const char *nne_bus_sels[2] = {
> +	[0] = "cpu_axi",
> +	[1] = "nnebus_src1",
> +};
> +
> +static const char *usbphy_25m_sels[2] = {
> +	[0] = "osc_sys",
> +	[1] = "usbphy_plldiv25m",
> +};
> +
> +static const char *gmac_tx_sels[4] = {
> +	[0] = "gmac_gtxclk",
> +	[1] = "gmac_mii_txclk",
> +	[2] = "gmac_rmii_txclk",
> +	[3] = "dummy",
> +};
> +
> +static const char *gmac_rx_pre_sels[2] = {
> +	[0] = "gmac_gr_mii_rxclk",
> +	[1] = "gmac_rmii_rxclk",
> +};
> +
> +static struct clk *clks[CLK_END];
> +
> +/* assume osc_sys as direct parent for clocks of yet unknown lineage */
> +#define UNKNOWN "osc_sys"
> +
> +static void starfive_clkgen_init(struct device_node *np, void __iomem *base)
> +{
> +	clks[CLK_OSC_SYS]		= of_clk_get_by_name(np, "osc_sys");
> +	clks[CLK_OSC_AUD]		= of_clk_get_by_name(np, "osc_aud");
> +	clks[CLK_PLL0_OUT]		= starfive_clk_underspecifid("pll0_out", "osc_sys");
> +	clks[CLK_PLL1_OUT]		= starfive_clk_underspecifid("pll1_out", "osc_sys");
> +	clks[CLK_PLL2_OUT]		= starfive_clk_underspecifid("pll2_out", "pll2_refclk");
> +	clks[CLK_CPUNDBUS_ROOT]		= starfive_clk_mux("cpundbus_root", base + 0x0, 2, cpundbus_root_sels, ARRAY_SIZE(cpundbus_root_sels));
> +	clks[CLK_DLA_ROOT]		= starfive_clk_mux("dla_root",	base + 0x4, 2, dla_root_sels, ARRAY_SIZE(dla_root_sels));
> +	clks[CLK_DSP_ROOT]		= starfive_clk_mux("dsp_root",	base + 0x8, 2, dsp_root_sels, ARRAY_SIZE(dsp_root_sels));
> +	clks[CLK_GMACUSB_ROOT]		= starfive_clk_mux("gmacusb_root",	base + 0xC, 2, gmacusb_root_sels, ARRAY_SIZE(gmacusb_root_sels));
> +	clks[CLK_PERH0_ROOT]		= starfive_clk_mux("perh0_root",	base + 0x10, 1, perh0_root_sels, ARRAY_SIZE(perh0_root_sels));
> +	clks[CLK_PERH1_ROOT]		= starfive_clk_mux("perh1_root",	base + 0x14, 1, perh1_root_sels, ARRAY_SIZE(perh1_root_sels));
> +	clks[CLK_VIN_ROOT]		= starfive_clk_mux("vin_root",	base + 0x18, 2, vin_root_sels, ARRAY_SIZE(vin_root_sels));
> +	clks[CLK_VOUT_ROOT]		= starfive_clk_mux("vout_root",	base + 0x1C, 2, vout_root_sels, ARRAY_SIZE(vout_root_sels));
> +	clks[CLK_AUDIO_ROOT]		= starfive_clk_gated_divider("audio_root",		UNKNOWN,	base + 0x20, 4);
> +	clks[CLK_CDECHIFI4_ROOT]	= starfive_clk_mux("cdechifi4_root",	base + 0x24, 2, cdechifi4_root_sels, ARRAY_SIZE(cdechifi4_root_sels));
> +	clks[CLK_CDEC_ROOT]		= starfive_clk_mux("cdec_root",	base + 0x28, 2, cdec_root_sels, ARRAY_SIZE(cdec_root_sels));
> +	clks[CLK_VOUTBUS_ROOT]		= starfive_clk_mux("voutbus_root",	base + 0x2C, 2, voutbus_root_sels, ARRAY_SIZE(voutbus_root_sels));
> +	clks[CLK_CPUNBUS_ROOT_DIV]	= starfive_clk_divider("cpunbus_root_div",		"cpunbus_root",	base + 0x30, 2);
> +	clks[CLK_DSP_ROOT_DIV]		= starfive_clk_divider("dsp_root_div",		"dsp_root",	base + 0x34, 3);
> +	clks[CLK_PERH0_SRC]		= starfive_clk_divider("perh0_src",		"perh0_root",	base + 0x38, 3);
> +	clks[CLK_PERH1_SRC]		= starfive_clk_divider("perh1_src",		"perh1_root",	base + 0x3C, 3);
> +	clks[CLK_PLL0_TESTOUT]		= starfive_clk_gated_divider("pll0_testout",		"pll0_out",	base + 0x40, 5);
> +	clks[CLK_PLL1_TESTOUT]		= starfive_clk_gated_divider("pll1_testout",		"pll1_out",	base + 0x44, 5);
> +	clks[CLK_PLL2_TESTOUT]		= starfive_clk_gated_divider("pll2_testout",		"pll2_out",	base + 0x48, 5);
> +	clks[CLK_PLL2_REF]		= starfive_clk_mux("pll2_refclk",	base + 0x4C, 1, pll2_refclk_sels, ARRAY_SIZE(pll2_refclk_sels));
> +	clks[CLK_CPU_CORE]		= starfive_clk_divider("cpu_core",		UNKNOWN,	base + 0x50, 4);
> +	clks[CLK_CPU_AXI]		= starfive_clk_divider("cpu_axi",		UNKNOWN,	base + 0x54, 4);
> +	clks[CLK_AHB_BUS]		= starfive_clk_divider("ahb_bus",		UNKNOWN,	base + 0x58, 4);
> +	clks[CLK_APB1_BUS]		= starfive_clk_divider("apb1_bus",		UNKNOWN,	base + 0x5C, 4);
> +	clks[CLK_APB2_BUS]		= starfive_clk_divider("apb2_bus",		UNKNOWN,	base + 0x60, 4);
> +	clks[CLK_DOM3AHB_BUS]		= starfive_clk_gate("dom3ahb_bus",		UNKNOWN,	base + 0x64);
> +	clks[CLK_DOM7AHB_BUS]		= starfive_clk_gate("dom7ahb_bus",		UNKNOWN,	base + 0x68);
> +	clks[CLK_U74_CORE0]		= starfive_clk_gate("u74_core0",		UNKNOWN,	base + 0x6C);
> +	clks[CLK_U74_CORE1]		= starfive_clk_gated_divider("u74_core1",		"",	base + 0x70, 4);
> +	clks[CLK_U74_AXI]		= starfive_clk_gate("u74_axi",		UNKNOWN,	base + 0x74);
> +	clks[CLK_U74RTC_TOGGLE]		= starfive_clk_gate("u74rtc_toggle",		UNKNOWN,	base + 0x78);
> +	clks[CLK_SGDMA2P_AXI]		= starfive_clk_gate("sgdma2p_axi",		UNKNOWN,	base + 0x7C);
> +	clks[CLK_DMA2PNOC_AXI]		= starfive_clk_gate("dma2pnoc_axi",		UNKNOWN,	base + 0x80);
> +	clks[CLK_SGDMA2P_AHB]		= starfive_clk_gate("sgdma2p_ahb",		UNKNOWN,	base + 0x84);
> +	clks[CLK_DLA_BUS]		= starfive_clk_divider("dla_bus",		UNKNOWN,	base + 0x88, 3);
> +	clks[CLK_DLA_AXI]		= starfive_clk_gate("dla_axi",		UNKNOWN,	base + 0x8C);
> +	clks[CLK_DLANOC_AXI]		= starfive_clk_gate("dlanoc_axi",		UNKNOWN,	base + 0x90);
> +	clks[CLK_DLA_APB]		= starfive_clk_gate("dla_apb",		UNKNOWN,	base + 0x94);
> +	clks[CLK_VP6_CORE]		= starfive_clk_gated_divider("vp6_core",		UNKNOWN,	base + 0x98, 3);
> +	clks[CLK_VP6BUS_SRC]		= starfive_clk_divider("vp6bus_src",		UNKNOWN,	base + 0x9C, 3);
> +	clks[CLK_VP6_AXI]		= starfive_clk_gated_divider("vp6_axi",		UNKNOWN,	base + 0xA0, 3);
> +	clks[CLK_VCDECBUS_SRC]		= starfive_clk_divider("vcdecbus_src",		UNKNOWN,	base + 0xA4, 3);
> +	clks[CLK_VDEC_BUS]		= starfive_clk_divider("vdec_bus",		UNKNOWN,	base + 0xA8, 4);
> +	clks[CLK_VDEC_AXI]		= starfive_clk_gate("vdec_axi",		UNKNOWN,	base + 0xAC);
> +	clks[CLK_VDECBRG_MAIN]		= starfive_clk_gate("vdecbrg_mainclk",		UNKNOWN,	base + 0xB0);
> +	clks[CLK_VDEC_BCLK]		= starfive_clk_gated_divider("vdec_bclk",		UNKNOWN,	base + 0xB4, 4);
> +	clks[CLK_VDEC_CCLK]		= starfive_clk_gated_divider("vdec_cclk",		UNKNOWN,	base + 0xB8, 4);
> +	clks[CLK_VDEC_APB]		= starfive_clk_gate("vdec_apb",		UNKNOWN,	base + 0xBC);
> +	clks[CLK_JPEG_AXI]		= starfive_clk_gated_divider("jpeg_axi",		UNKNOWN,	base + 0xC0, 4);
> +	clks[CLK_JPEG_CCLK]		= starfive_clk_gated_divider("jpeg_cclk",		UNKNOWN,	base + 0xC4, 4);
> +	clks[CLK_JPEG_APB]		= starfive_clk_gate("jpeg_apb",		UNKNOWN,	base + 0xC8);
> +	clks[CLK_GC300_2X]		= starfive_clk_gated_divider("gc300_2x",		UNKNOWN,	base + 0xCC, 4);
> +	clks[CLK_GC300_AHB]		= starfive_clk_gate("gc300_ahb",		UNKNOWN,	base + 0xD0);
> +	clks[CLK_JPCGC300_AXIBUS]	= starfive_clk_divider("jpcgc300_axibus",		UNKNOWN,	base + 0xD4, 4);
> +	clks[CLK_GC300_AXI]		= starfive_clk_gate("gc300_axi",		UNKNOWN,	base + 0xD8);
> +	clks[CLK_JPCGC300_MAIN]		= starfive_clk_gate("jpcgc300_mainclk",		UNKNOWN,	base + 0xDC);
> +	clks[CLK_VENC_BUS]		= starfive_clk_divider("venc_bus",		UNKNOWN,	base + 0xE0, 4);
> +	clks[CLK_VENC_AXI]		= starfive_clk_gate("venc_axi",		UNKNOWN,	base + 0xE4);
> +	clks[CLK_VENCBRG_MAIN]		= starfive_clk_gate("vencbrg_mainclk",		UNKNOWN,	base + 0xE8);
> +	clks[CLK_VENC_BCLK]		= starfive_clk_gated_divider("venc_bclk",		UNKNOWN,	base + 0xEC, 4);
> +	clks[CLK_VENC_CCLK]		= starfive_clk_gated_divider("venc_cclk",		UNKNOWN,	base + 0xF0, 4);
> +	clks[CLK_VENC_APB]		= starfive_clk_gate("venc_apb",		UNKNOWN,	base + 0xF4);
> +	clks[CLK_DDRPLL_DIV2]		= starfive_clk_gated_divider("ddrpll_div2",		UNKNOWN,	base + 0xF8, 2);
> +	clks[CLK_DDRPLL_DIV4]		= starfive_clk_gated_divider("ddrpll_div4",		UNKNOWN,	base + 0xFC, 2);
> +	clks[CLK_DDRPLL_DIV8]		= starfive_clk_gated_divider("ddrpll_div8",		UNKNOWN,	base + 0x100, 2);
> +	clks[CLK_DDROSC_DIV2]		= starfive_clk_gated_divider("ddrosc_div2",		UNKNOWN,	base + 0x104, 2);
> +	clks[CLK_DDRC0]			= starfive_clk_mux("ddrc0",	base + 0x108, 2, ddrc0_sels, ARRAY_SIZE(ddrc0_sels));
> +	clks[CLK_DDRC1]			= starfive_clk_mux("ddrc1",	base + 0x10C, 2, ddrc1_sels, ARRAY_SIZE(ddrc1_sels));
> +	clks[CLK_DDRPHY_APB]		= starfive_clk_gate("ddrphy_apb",		UNKNOWN,	base + 0x110);
> +	clks[CLK_NOC_ROB]		= starfive_clk_divider("noc_rob",		UNKNOWN,	base + 0x114, 4);
> +	clks[CLK_NOC_COG]		= starfive_clk_divider("noc_cog",		UNKNOWN,	base + 0x118, 4);
> +	clks[CLK_NNE_AHB]		= starfive_clk_gate("nne_ahb",		UNKNOWN,	base + 0x11C);
> +	clks[CLK_NNEBUS_SRC1]		= starfive_clk_divider("nnebus_src1",		UNKNOWN,	base + 0x120, 3);
> +	clks[CLK_NNE_BUS]		= starfive_clk_mux("nne_bus",	base + 0x124, 2, nne_bus_sels, ARRAY_SIZE(nne_bus_sels));
> +	clks[CLK_NNE_AXI]		= starfive_clk_gate("nne_axi",	UNKNOWN, base + 0x128);
> +	clks[CLK_NNENOC_AXI]		= starfive_clk_gate("nnenoc_axi",		UNKNOWN,	base + 0x12C);
> +	clks[CLK_DLASLV_AXI]		= starfive_clk_gate("dlaslv_axi",		UNKNOWN,	base + 0x130);
> +	clks[CLK_DSPX2C_AXI]		= starfive_clk_gate("dspx2c_axi",		UNKNOWN,	base + 0x134);
> +	clks[CLK_HIFI4_SRC]		= starfive_clk_divider("hifi4_src",		UNKNOWN,	base + 0x138, 3);
> +	clks[CLK_HIFI4_COREFREE]	= starfive_clk_divider("hifi4_corefree",		UNKNOWN,	base + 0x13C, 4);
> +	clks[CLK_HIFI4_CORE]		= starfive_clk_gate("hifi4_core",		UNKNOWN,	base + 0x140);
> +	clks[CLK_HIFI4_BUS]		= starfive_clk_divider("hifi4_bus",		UNKNOWN,	base + 0x144, 4);
> +	clks[CLK_HIFI4_AXI]		= starfive_clk_gate("hifi4_axi",		UNKNOWN,	base + 0x148);
> +	clks[CLK_HIFI4NOC_AXI]		= starfive_clk_gate("hifi4noc_axi",		UNKNOWN,	base + 0x14C);
> +	clks[CLK_SGDMA1P_BUS]		= starfive_clk_divider("sgdma1p_bus",		UNKNOWN,	base + 0x150, 4);
> +	clks[CLK_SGDMA1P_AXI]		= starfive_clk_gate("sgdma1p_axi",		UNKNOWN,	base + 0x154);
> +	clks[CLK_DMA1P_AXI]		= starfive_clk_gate("dma1p_axi",		UNKNOWN,	base + 0x158);
> +	clks[CLK_X2C_AXI]		= starfive_clk_gated_divider("x2c_axi",		UNKNOWN,	base + 0x15C, 4);
> +	clks[CLK_USB_BUS]		= starfive_clk_divider("usb_bus",		UNKNOWN,	base + 0x160, 4);
> +	clks[CLK_USB_AXI]		= starfive_clk_gate("usb_axi",		UNKNOWN,	base + 0x164);
> +	clks[CLK_USBNOC_AXI]		= starfive_clk_gate("usbnoc_axi",		UNKNOWN,	base + 0x168);
> +	clks[CLK_USBPHY_ROOTDIV]	= starfive_clk_divider("usbphy_rootdiv",		UNKNOWN,	base + 0x16C, 3);
> +	clks[CLK_USBPHY_125M]		= starfive_clk_gated_divider("usbphy_125m",		UNKNOWN,	base + 0x170, 4);
> +	clks[CLK_USBPHY_PLLDIV25M]	= starfive_clk_gated_divider("usbphy_plldiv25m",		UNKNOWN,	base + 0x174, 6);
> +	clks[CLK_USBPHY_25M]		= starfive_clk_mux("usbphy_25m",	base + 0x178, 1, usbphy_25m_sels, ARRAY_SIZE(usbphy_25m_sels));
> +	clks[CLK_AUDIO_DIV]		= starfive_clk_divider("audio_div",		UNKNOWN,	base + 0x17C, 18);
> +	clks[CLK_AUDIO_SRC]		= starfive_clk_gate("audio_src",		UNKNOWN,	base + 0x180);
> +	clks[CLK_AUDIO_12288]		= starfive_clk_gate("audio_12288",		UNKNOWN,	base + 0x184);
> +	clks[CLK_VIN_SRC]		= starfive_clk_gated_divider("vin_src",		UNKNOWN,	base + 0x188, 3);
> +	clks[CLK_ISP0_BUS]		= starfive_clk_divider("isp0_bus",		UNKNOWN,	base + 0x18C, 4);
> +	clks[CLK_ISP0_AXI]		= starfive_clk_gate("isp0_axi",		UNKNOWN,	base + 0x190);
> +	clks[CLK_ISP0NOC_AXI]		= starfive_clk_gate("isp0noc_axi",		UNKNOWN,	base + 0x194);
> +	clks[CLK_ISPSLV_AXI]		= starfive_clk_gate("ispslv_axi",		UNKNOWN,	base + 0x198);
> +	clks[CLK_ISP1_BUS]		= starfive_clk_divider("isp1_bus",		UNKNOWN,	base + 0x19C, 4);
> +	clks[CLK_ISP1_AXI]		= starfive_clk_gate("isp1_axi",		UNKNOWN,	base + 0x1A0);
> +	clks[CLK_ISP1NOC_AXI]		= starfive_clk_gate("isp1noc_axi",		UNKNOWN,	base + 0x1A4);
> +	clks[CLK_VIN_BUS]		= starfive_clk_divider("vin_bus",		UNKNOWN,	base + 0x1A8, 4);
> +	clks[CLK_VIN_AXI]		= starfive_clk_gate("vin_axi",		UNKNOWN,	base + 0x1AC);
> +	clks[CLK_VINNOC_AXI]		= starfive_clk_gate("vinnoc_axi",		UNKNOWN,	base + 0x1B0);
> +	clks[CLK_VOUT_SRC]		= starfive_clk_gated_divider("vout_src",		UNKNOWN,	base + 0x1B4, 3);
> +	clks[CLK_DISPBUS_SRC]		= starfive_clk_divider("dispbus_src",		UNKNOWN,	base + 0x1B8, 3);
> +	clks[CLK_DISP_BUS]		= starfive_clk_divider("disp_bus",		UNKNOWN,	base + 0x1BC, 3);
> +	clks[CLK_DISP_AXI]		= starfive_clk_gate("disp_axi",		UNKNOWN,	base + 0x1C0);
> +	clks[CLK_DISPNOC_AXI]		= starfive_clk_gate("dispnoc_axi",		UNKNOWN,	base + 0x1C4);
> +	clks[CLK_SDIO0_AHB]		= starfive_clk_gate("sdio0_ahb",		UNKNOWN,	base + 0x1C8);
> +	clks[CLK_SDIO0_CCLKINT]		= starfive_clk_gated_divider("sdio0_cclkint",		UNKNOWN,	base + 0x1CC, 5);
> +	clks[CLK_SDIO0_CCLKINT_INV]	= starfive_clk_gate_dis("sdio0_cclkint_inv",		UNKNOWN,	base + 0x1D0);
> +	clks[CLK_SDIO1_AHB]		= starfive_clk_gate("sdio1_ahb",		UNKNOWN,	base + 0x1D4);
> +	clks[CLK_SDIO1_CCLKINT]		= starfive_clk_gated_divider("sdio1_cclkint",		UNKNOWN,	base + 0x1D8, 5);
> +	clks[CLK_SDIO1_CCLKINT_INV]	= starfive_clk_gate_dis("sdio1_cclkint_inv",		UNKNOWN,	base + 0x1DC);
> +	clks[CLK_GMAC_AHB]		= starfive_clk_gate("gmac_ahb",		UNKNOWN,	base + 0x1E0);
> +	clks[CLK_GMAC_ROOT_DIV]		= starfive_clk_divider("gmac_root_div",		UNKNOWN,	base + 0x1E4, 4);
> +	clks[CLK_GMAC_PTP_REF]		= starfive_clk_gated_divider("gmac_ptp_refclk",		UNKNOWN,	base + 0x1E8, 5);
> +	clks[CLK_GMAC_GTX]		= starfive_clk_gated_divider("gmac_gtxclk",		UNKNOWN,	base + 0x1EC, 8);
> +	clks[CLK_GMAC_RMII_TX]		= starfive_clk_gated_divider("gmac_rmii_txclk",		UNKNOWN,	base + 0x1F0, 4);
> +	clks[CLK_GMAC_RMII_RX]		= starfive_clk_gated_divider("gmac_rmii_rxclk",		UNKNOWN,	base + 0x1F4, 4);
> +	clks[CLK_GMAC_TX]		= starfive_clk_mux("gmac_tx",	base + 0x1F8, 2, gmac_tx_sels, ARRAY_SIZE(gmac_tx_sels));
> +	clks[CLK_GMAC_TX_INV]		= starfive_clk_gate_dis("gmac_tx_inv",		UNKNOWN,	base + 0x1FC);
> +	clks[CLK_GMAC_RX_PRE]		= starfive_clk_mux("gmac_rx_pre",	base + 0x200, 1, gmac_rx_pre_sels, ARRAY_SIZE(gmac_rx_pre_sels));
> +	clks[CLK_GMAC_RX_INV]		= starfive_clk_gate_dis("gmac_rx_inv",		UNKNOWN,	base + 0x204);
> +	clks[CLK_GMAC_RMII]		= starfive_clk_gate("gmac_rmii",		UNKNOWN,	base + 0x208);
> +	clks[CLK_GMAC_TOPHYREF]		= starfive_clk_gated_divider("gmac_tophyref",		UNKNOWN,	base + 0x20C, 7);
> +	clks[CLK_SPI2AHB_AHB]		= starfive_clk_gate("spi2ahb_ahb",		UNKNOWN,	base + 0x210);
> +	clks[CLK_SPI2AHB_CORE]		= starfive_clk_gated_divider("spi2ahb_core",		UNKNOWN,	base + 0x214, 5);
> +	clks[CLK_EZMASTER_AHB]		= starfive_clk_gate("ezmaster_ahb",		UNKNOWN,	base + 0x218);
> +	clks[CLK_E24_AHB]		= starfive_clk_gate("e24_ahb",		UNKNOWN,	base + 0x21C);
> +	clks[CLK_E24RTC_TOGGLE]		= starfive_clk_gate("e24rtc_toggle",		UNKNOWN,	base + 0x220);
> +	clks[CLK_QSPI_AHB]		= starfive_clk_gate("qspi_ahb",		UNKNOWN,	base + 0x224);
> +	clks[CLK_QSPI_APB]		= starfive_clk_gate("qspi_apb",		UNKNOWN,	base + 0x228);
> +	clks[CLK_QSPI_REF]		= starfive_clk_gated_divider("qspi_refclk",		UNKNOWN,	base + 0x22C, 5);
> +	clks[CLK_SEC_AHB]		= starfive_clk_gate("sec_ahb",		UNKNOWN,	base + 0x230);
> +	clks[CLK_AES]			= starfive_clk_gate("aes_clk",		UNKNOWN,	base + 0x234);
> +	clks[CLK_SHA]			= starfive_clk_gate("sha_clk",		UNKNOWN,	base + 0x238);
> +	clks[CLK_PKA]			= starfive_clk_gate("pka_clk",		UNKNOWN,	base + 0x23C);
> +	clks[CLK_TRNG_APB]		= starfive_clk_gate("trng_apb",		UNKNOWN,	base + 0x240);
> +	clks[CLK_OTP_APB]		= starfive_clk_gate("otp_apb",		UNKNOWN,	base + 0x244);
> +	clks[CLK_UART0_APB]		= starfive_clk_gate("uart0_apb",		UNKNOWN,	base + 0x248);
> +	clks[CLK_UART0_CORE]		= starfive_clk_gated_divider("uart0_core",		UNKNOWN,	base + 0x24C, 6);
> +	clks[CLK_UART1_APB]		= starfive_clk_gate("uart1_apb",		UNKNOWN,	base + 0x250);
> +	clks[CLK_UART1_CORE]		= starfive_clk_gated_divider("uart1_core",		UNKNOWN,	base + 0x254, 6);
> +	clks[CLK_SPI0_APB]		= starfive_clk_gate("spi0_apb",		UNKNOWN,	base + 0x258);
> +	clks[CLK_SPI0_CORE]		= starfive_clk_gated_divider("spi0_core",		UNKNOWN,	base + 0x25C, 6);
> +	clks[CLK_SPI1_APB]		= starfive_clk_gate("spi1_apb",		UNKNOWN,	base + 0x260);
> +	clks[CLK_SPI1_CORE]		= starfive_clk_gated_divider("spi1_core",		UNKNOWN,	base + 0x264, 6);
> +	clks[CLK_I2C0_APB]		= starfive_clk_gate("i2c0_apb",		UNKNOWN,	base + 0x268);
> +	clks[CLK_I2C0_CORE]		= starfive_clk_gated_divider("i2c0_core",		UNKNOWN,	base + 0x26C, 6);
> +	clks[CLK_I2C1_APB]		= starfive_clk_gate("i2c1_apb",		UNKNOWN,	base + 0x270);
> +	clks[CLK_I2C1_CORE]		= starfive_clk_gated_divider("i2c1_core",		UNKNOWN,	base + 0x274, 6);
> +	clks[CLK_GPIO_APB]		= starfive_clk_gate("gpio_apb",		UNKNOWN,	base + 0x278);
> +	clks[CLK_UART2_APB]		= starfive_clk_gate("uart2_apb",		UNKNOWN,	base + 0x27C);
> +	clks[CLK_UART2_CORE]		= starfive_clk_gated_divider("uart2_core",		UNKNOWN,	base + 0x280, 6);
> +	clks[CLK_UART3_APB]		= starfive_clk_gate("uart3_apb",		UNKNOWN,	base + 0x284);
> +	clks[CLK_UART3_CORE]		= starfive_clk_gated_divider("uart3_core",		UNKNOWN,	base + 0x288, 6);
> +	clks[CLK_SPI2_APB]		= starfive_clk_gate("spi2_apb",		UNKNOWN,	base + 0x28C);
> +	clks[CLK_SPI2_CORE]		= starfive_clk_gated_divider("spi2_core",		UNKNOWN,	base + 0x290, 6);
> +	clks[CLK_SPI3_APB]		= starfive_clk_gate("spi3_apb",		UNKNOWN,	base + 0x294);
> +	clks[CLK_SPI3_CORE]		= starfive_clk_gated_divider("spi3_core",		UNKNOWN,	base + 0x298, 6);
> +	clks[CLK_I2C2_APB]		= starfive_clk_gate("i2c2_apb",		UNKNOWN,	base + 0x29C);
> +	clks[CLK_I2C2_CORE]		= starfive_clk_gated_divider("i2c2_core",		UNKNOWN,	base + 0x2A0, 6);
> +	clks[CLK_I2C3_APB]		= starfive_clk_gate("i2c3_apb",		UNKNOWN,	base + 0x2A4);
> +	clks[CLK_I2C3_CORE]		= starfive_clk_gated_divider("i2c3_core",		UNKNOWN,	base + 0x2A8, 6);
> +	clks[CLK_WDTIMER_APB]		= starfive_clk_gate("wdtimer_apb",		UNKNOWN,	base + 0x2AC);
> +	clks[CLK_WDT_CORE]		= starfive_clk_gated_divider("wdt_coreclk",		UNKNOWN,	base + 0x2B0, 6);
> +	clks[CLK_TIMER0_CORE]		= starfive_clk_gated_divider("timer0_coreclk",		UNKNOWN,	base + 0x2B4, 6);
> +	clks[CLK_TIMER1_CORE]		= starfive_clk_gated_divider("timer1_coreclk",		UNKNOWN,	base + 0x2B8, 6);
> +	clks[CLK_TIMER2_CORE]		= starfive_clk_gated_divider("timer2_coreclk",		UNKNOWN,	base + 0x2BC, 6);
> +	clks[CLK_TIMER3_CORE]		= starfive_clk_gated_divider("timer3_coreclk",		UNKNOWN,	base + 0x2C0, 6);
> +	clks[CLK_TIMER4_CORE]		= starfive_clk_gated_divider("timer4_coreclk",		UNKNOWN,	base + 0x2C4, 6);
> +	clks[CLK_TIMER5_CORE]		= starfive_clk_gated_divider("timer5_coreclk",		UNKNOWN,	base + 0x2C8, 6);
> +	clks[CLK_TIMER6_CORE]		= starfive_clk_gated_divider("timer6_coreclk",		UNKNOWN,	base + 0x2CC, 6);
> +	clks[CLK_VP6INTC_APB]		= starfive_clk_gate("vp6intc_apb",		UNKNOWN,	base + 0x2D0);
> +	clks[CLK_PWM_APB]		= starfive_clk_gate("pwm_apb",		UNKNOWN,	base + 0x2D4);
> +	clks[CLK_MSI_APB]		= starfive_clk_gate("msi_apb",		UNKNOWN,	base + 0x2D8);
> +	clks[CLK_TEMP_APB]		= starfive_clk_gate("temp_apb",		UNKNOWN,	base + 0x2DC);
> +	clks[CLK_TEMP_SENSE]		= starfive_clk_gated_divider("temp_sense",		UNKNOWN,	base + 0x2E0, 5);
> +	clks[CLK_SYSERR_APB]		= starfive_clk_gate("syserr_apb",		UNKNOWN,	base + 0x2E4);
> +}
> +
> +static struct clk_onecell_data clk_data;
> +
> +static int starfive_clkgen_clk_probe(struct device_d *dev)
> +{
> +	struct resource *iores;
> +
> +	iores = dev_request_mem_resource(dev, 0);
> +	if (IS_ERR(iores))
> +		return PTR_ERR(iores);
> +
> +	starfive_clkgen_init(dev->device_node, IOMEM(iores->start));
> +
> +	clk_data.clks = clks;
> +	clk_data.clk_num = ARRAY_SIZE(clks);
> +	of_clk_add_provider(dev->device_node, of_clk_src_onecell_get,
> +			    &clk_data);
> +
> +	return 0;
> +}
> +
> +static __maybe_unused struct of_device_id starfive_clkgen_clk_dt_ids[] = {
> +	{ .compatible = "starfive,jh7100-clkgen" },
> +	{ /* sentinel */ }
> +};
> +
> +static struct driver_d starfive_clkgen_clk_driver = {
> +	.probe	= starfive_clkgen_clk_probe,
> +	.name	= "starfive-clkgen",
> +	.of_compatible = starfive_clkgen_clk_dt_ids,
> +};
> +core_platform_driver(starfive_clkgen_clk_driver);
> diff --git a/include/dt-bindings/clock/starfive-jh7100.h b/include/dt-bindings/clock/starfive-jh7100.h
> new file mode 100644
> index 000000000000..9ad5e7f9bfd5
> --- /dev/null
> +++ b/include/dt-bindings/clock/starfive-jh7100.h
> @@ -0,0 +1,203 @@
> +/* SPDX-License-Identifier: GPL-2.0 OR X11 */
> +/*
> + * Copyright (C) 2021 Ahmad Fatoum, Pengutronix
> + */
> +
> +#ifndef __DT_BINDINGS_CLOCK_STARFIVE_JH7100_H
> +#define __DT_BINDINGS_CLOCK_STARFIVE_JH7100_H
> +
> +#define	CLK_OSC_SYS		0
> +#define	CLK_OSC_AUD		1
> +#define	CLK_PLL0_OUT		2
> +#define	CLK_PLL1_OUT		3
> +#define	CLK_PLL2_OUT		4
> +#define CLK_CPUNDBUS_ROOT	5
> +#define CLK_DLA_ROOT		6
> +#define CLK_DSP_ROOT		7
> +#define CLK_GMACUSB_ROOT	8
> +#define CLK_PERH0_ROOT		9
> +#define CLK_PERH1_ROOT		10
> +#define CLK_VIN_ROOT		11
> +#define CLK_VOUT_ROOT		12
> +#define CLK_AUDIO_ROOT		13
> +#define CLK_CDECHIFI4_ROOT	14
> +#define CLK_CDEC_ROOT		15
> +#define CLK_VOUTBUS_ROOT	16
> +#define CLK_CPUNBUS_ROOT_DIV	17
> +#define CLK_DSP_ROOT_DIV	18
> +#define CLK_PERH0_SRC		19
> +#define CLK_PERH1_SRC		20
> +#define CLK_PLL0_TESTOUT	21
> +#define CLK_PLL1_TESTOUT	22
> +#define CLK_PLL2_TESTOUT	23
> +#define CLK_PLL2_REF		24
> +#define CLK_CPU_CORE		25
> +#define CLK_CPU_AXI		26
> +#define CLK_AHB_BUS		27
> +#define CLK_APB1_BUS		28
> +#define CLK_APB2_BUS		29
> +#define CLK_DOM3AHB_BUS		30
> +#define CLK_DOM7AHB_BUS		31
> +#define CLK_U74_CORE0		32
> +#define CLK_U74_CORE1		33
> +#define CLK_U74_AXI		34
> +#define CLK_U74RTC_TOGGLE	35
> +#define CLK_SGDMA2P_AXI		35
> +#define CLK_DMA2PNOC_AXI	37
> +#define CLK_SGDMA2P_AHB		37
> +#define CLK_DLA_BUS		39
> +#define CLK_DLA_AXI		40
> +#define CLK_DLANOC_AXI		41
> +#define CLK_DLA_APB		42
> +#define CLK_VP6_CORE		43
> +#define CLK_VP6BUS_SRC		44
> +#define CLK_VP6_AXI		45
> +#define CLK_VCDECBUS_SRC	46
> +#define CLK_VDEC_BUS		47
> +#define CLK_VDEC_AXI		48
> +#define CLK_VDECBRG_MAIN	49
> +#define CLK_VDEC_BCLK		50
> +#define CLK_VDEC_CCLK		51
> +#define CLK_VDEC_APB		52
> +#define CLK_JPEG_AXI		53
> +#define CLK_JPEG_CCLK		54
> +#define CLK_JPEG_APB		55
> +#define CLK_GC300_2X		56
> +#define CLK_GC300_AHB		57
> +#define CLK_JPCGC300_AXIBUS	58
> +#define CLK_GC300_AXI		59
> +#define CLK_JPCGC300_MAIN	60
> +#define CLK_VENC_BUS		61
> +#define CLK_VENC_AXI		62
> +#define CLK_VENCBRG_MAIN	63
> +#define CLK_VENC_BCLK		64
> +#define CLK_VENC_CCLK		65
> +#define CLK_VENC_APB		66
> +#define CLK_DDRPLL_DIV2		67
> +#define CLK_DDRPLL_DIV4		68
> +#define CLK_DDRPLL_DIV8		69
> +#define CLK_DDROSC_DIV2		70
> +#define CLK_DDRC0		71
> +#define CLK_DDRC1		72
> +#define CLK_DDRPHY_APB		73
> +#define CLK_NOC_ROB		74
> +#define CLK_NOC_COG		75
> +#define CLK_NNE_AHB		76
> +#define CLK_NNEBUS_SRC1		77
> +#define CLK_NNE_BUS		78
> +#define CLK_NNE_AXI		79
> +#define CLK_NNENOC_AXI		80
> +#define CLK_DLASLV_AXI		81
> +#define CLK_DSPX2C_AXI		82
> +#define CLK_HIFI4_SRC		83
> +#define CLK_HIFI4_COREFREE	84
> +#define CLK_HIFI4_CORE		85
> +#define CLK_HIFI4_BUS		86
> +#define CLK_HIFI4_AXI		87
> +#define CLK_HIFI4NOC_AXI	88
> +#define CLK_SGDMA1P_BUS		89
> +#define CLK_SGDMA1P_AXI		90
> +#define CLK_DMA1P_AXI		91
> +#define CLK_X2C_AXI		92
> +#define CLK_USB_BUS		93
> +#define CLK_USB_AXI		94
> +#define CLK_USBNOC_AXI		95
> +#define CLK_USBPHY_ROOTDIV	96
> +#define CLK_USBPHY_125M		97
> +#define CLK_USBPHY_PLLDIV25M	98
> +#define CLK_USBPHY_25M		99
> +#define CLK_AUDIO_DIV		100
> +#define CLK_AUDIO_SRC		101
> +#define CLK_AUDIO_12288		102
> +#define CLK_VIN_SRC		103
> +#define CLK_ISP0_BUS		104
> +#define CLK_ISP0_AXI		105
> +#define CLK_ISP0NOC_AXI		106
> +#define CLK_ISPSLV_AXI		107
> +#define CLK_ISP1_BUS		108
> +#define CLK_ISP1_AXI		109
> +#define CLK_ISP1NOC_AXI		110
> +#define CLK_VIN_BUS		111
> +#define CLK_VIN_AXI		112
> +#define CLK_VINNOC_AXI		113
> +#define CLK_VOUT_SRC		114
> +#define CLK_DISPBUS_SRC		115
> +#define CLK_DISP_BUS		116
> +#define CLK_DISP_AXI		117
> +#define CLK_DISPNOC_AXI		118
> +#define CLK_SDIO0_AHB		119
> +#define CLK_SDIO0_CCLKINT	120
> +#define CLK_SDIO0_CCLKINT_INV	121
> +#define CLK_SDIO1_AHB		122
> +#define CLK_SDIO1_CCLKINT	123
> +#define CLK_SDIO1_CCLKINT_INV	124
> +#define CLK_GMAC_AHB		125
> +#define CLK_GMAC_ROOT_DIV	126
> +#define CLK_GMAC_PTP_REF	127
> +#define CLK_GMAC_GTX		128
> +#define CLK_GMAC_RMII_TX	129
> +#define CLK_GMAC_RMII_RX	130
> +#define CLK_GMAC_TX		131
> +#define CLK_GMAC_TX_INV		132
> +#define CLK_GMAC_RX_PRE		133
> +#define CLK_GMAC_RX_INV		134
> +#define CLK_GMAC_RMII		135
> +#define CLK_GMAC_TOPHYREF	136
> +#define CLK_SPI2AHB_AHB		137
> +#define CLK_SPI2AHB_CORE	138
> +#define CLK_EZMASTER_AHB	139
> +#define CLK_E24_AHB		140
> +#define CLK_E24RTC_TOGGLE	141
> +#define CLK_QSPI_AHB		142
> +#define CLK_QSPI_APB		143
> +#define CLK_QSPI_REF		144
> +#define CLK_SEC_AHB		145
> +#define CLK_AES			146
> +#define CLK_SHA			147
> +#define CLK_PKA			148
> +#define CLK_TRNG_APB		149
> +#define CLK_OTP_APB		150
> +#define CLK_UART0_APB		151
> +#define CLK_UART0_CORE		152
> +#define CLK_UART1_APB		153
> +#define CLK_UART1_CORE		154
> +#define CLK_SPI0_APB		155
> +#define CLK_SPI0_CORE		156
> +#define CLK_SPI1_APB		157
> +#define CLK_SPI1_CORE		158
> +#define CLK_I2C0_APB		159
> +#define CLK_I2C0_CORE		160
> +#define CLK_I2C1_APB		161
> +#define CLK_I2C1_CORE		162
> +#define CLK_GPIO_APB		163
> +#define CLK_UART2_APB		164
> +#define CLK_UART2_CORE		165
> +#define CLK_UART3_APB		166
> +#define CLK_UART3_CORE		167
> +#define CLK_SPI2_APB		168
> +#define CLK_SPI2_CORE		169
> +#define CLK_SPI3_APB		170
> +#define CLK_SPI3_CORE		171
> +#define CLK_I2C2_APB		172
> +#define CLK_I2C2_CORE		173
> +#define CLK_I2C3_APB		174
> +#define CLK_I2C3_CORE		175
> +#define CLK_WDTIMER_APB		176
> +#define CLK_WDT_CORE		177
> +#define CLK_TIMER0_CORE		178
> +#define CLK_TIMER1_CORE		179
> +#define CLK_TIMER2_CORE		180
> +#define CLK_TIMER3_CORE		181
> +#define CLK_TIMER4_CORE		182
> +#define CLK_TIMER5_CORE		183
> +#define CLK_TIMER6_CORE		184
> +#define CLK_VP6INTC_APB		185
> +#define CLK_PWM_APB		186
> +#define CLK_MSI_APB		187
> +#define CLK_TEMP_APB		188
> +#define CLK_TEMP_SENSE		189
> +#define CLK_SYSERR_APB		190
> +
> +#define CLK_END			191
> +
> +#endif
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the barebox mailing list