All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sean Anderson <seanga2@gmail.com>
To: Jim Liu <jim.t90615@gmail.com>,
	JJLIU0@nuvoton.com, KWLIU@nuvoton.com, YSCHU@nuvoton.com,
	lukma@denx.de, sjg@chromium.org, sr@denx.de, trini@konsulko.com
Cc: u-boot@lists.denx.de
Subject: Re: [PATCH v3 2/4] clk: nuvoton: Add support for NPCM750
Date: Thu, 21 Apr 2022 20:36:05 -0400	[thread overview]
Message-ID: <0b310264-1140-9786-10c3-f29cce131938@gmail.com> (raw)
In-Reply-To: <20220419053222.29518-3-JJLIU0@nuvoton.com>

On 4/19/22 1:32 AM, Jim Liu wrote:
> Add clock controller driver for NPCM750
> 
> Signed-off-by: Jim Liu <JJLIU0@nuvoton.com>
> Signed-off-by: Stanley Chu <yschu@nuvoton.com>
> ---
> Changes for v3:
>     - no changes since v2
> Changes for v2:
>     - combine NPCM750 and NPCM845 clk driver.
> ---
>   drivers/clk/Makefile                          |   1 +
>   drivers/clk/nuvoton/Makefile                  |   2 +
>   drivers/clk/nuvoton/clk_npcm.c                | 299 ++++++++++++++++++
>   drivers/clk/nuvoton/clk_npcm.h                | 105 ++++++
>   drivers/clk/nuvoton/clk_npcm7xx.c             |  95 ++++++
>   .../dt-bindings/clock/nuvoton,npcm7xx-clock.h |  46 +++
>   6 files changed, 548 insertions(+)
>   create mode 100644 drivers/clk/nuvoton/Makefile
>   create mode 100644 drivers/clk/nuvoton/clk_npcm.c
>   create mode 100644 drivers/clk/nuvoton/clk_npcm.h
>   create mode 100644 drivers/clk/nuvoton/clk_npcm7xx.c
>   create mode 100644 include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
> 
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index bb4eee5d99..f5b553172c 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -20,6 +20,7 @@ obj-$(CONFIG_ARCH_ASPEED) += aspeed/
>   obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
>   obj-$(CONFIG_ARCH_MESON) += meson/
>   obj-$(CONFIG_ARCH_MTMIPS) += mtmips/
> +obj-$(CONFIG_ARCH_NPCM) += nuvoton/
>   obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
>   obj-$(CONFIG_ARCH_SOCFPGA) += altera/
>   obj-$(CONFIG_ARCH_SUNXI) += sunxi/
> diff --git a/drivers/clk/nuvoton/Makefile b/drivers/clk/nuvoton/Makefile
> new file mode 100644
> index 0000000000..c63d9c16f1
> --- /dev/null
> +++ b/drivers/clk/nuvoton/Makefile
> @@ -0,0 +1,2 @@
> +obj-$(CONFIG_ARCH_NPCM) += clk_npcm.o
> +obj-$(CONFIG_ARCH_NPCM7xx) += clk_npcm7xx.o
> diff --git a/drivers/clk/nuvoton/clk_npcm.c b/drivers/clk/nuvoton/clk_npcm.c
> new file mode 100644
> index 0000000000..8d71f2a24b
> --- /dev/null
> +++ b/drivers/clk/nuvoton/clk_npcm.c
> @@ -0,0 +1,299 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2022 Nuvoton Technology Corp.
> + *
> + * Formula for calculating clock rate:
> + * Fout = ((Fin / PRE_DIV) / div) / POST_DIV
> + */
> +
> +#include <div64.h>
> +#include <dm.h>
> +#include <asm/io.h>
> +#include <linux/bitfield.h>
> +#include <linux/log2.h>
> +#include "clk_npcm.h"
> +
> +static int clkid_to_clksel(struct npcm_clk_select *selector, int id)
> +{
> +	int i;
> +
> +	for (i = 0; i < selector->num_parents; i++) {
> +		if (selector->parents[i].id == id)
> +			return selector->parents[i].clksel;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +static int clksel_to_clkid(struct npcm_clk_select *selector, int clksel)
> +{
> +	int i;
> +
> +	for (i = 0; i < selector->num_parents; i++) {
> +		if (selector->parents[i].clksel == clksel)
> +			return selector->parents[i].id;
> +	}
> +
> +	return -EINVAL;
> +}
> +
> +static struct npcm_clk_pll *npcm_clk_pll_get(struct npcm_clk_data *clk_data, int id)
> +{
> +	struct npcm_clk_pll *pll = clk_data->clk_plls;
> +	int i;
> +
> +	for (i = 0; i < clk_data->num_plls; i++) {
> +		if (pll->id == id)
> +			return pll;
> +		pll++;
> +	}
> +
> +	return NULL;
> +}
> +
> +static struct npcm_clk_select *npcm_clk_selector_get(struct npcm_clk_data *clk_data,
> +						     int id)
> +{
> +	struct npcm_clk_select *selector = clk_data->clk_selectors;
> +	int i;
> +
> +	for (i = 0; i < clk_data->num_selectors; i++) {
> +		if (selector->id == id)
> +			return selector;
> +		selector++;
> +	}
> +
> +	return NULL;
> +}
> +
> +static struct npcm_clk_div *npcm_clk_divider_get(struct npcm_clk_data *clk_data,
> +						 int id)
> +{
> +	struct npcm_clk_div *divider = clk_data->clk_dividers;
> +	int i;
> +
> +	for (i = 0; i < clk_data->num_dividers; i++) {
> +		if (divider->id == id)
> +			return divider;
> +		divider++;
> +	}
> +
> +	return NULL;
> +}
> +
> +static ulong npcm_clk_get_fin(struct clk *clk)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_select *selector;
> +	struct clk parent;
> +	ulong parent_rate;
> +	u32 val, clksel;
> +	int ret;
> +
> +	selector = npcm_clk_selector_get(priv->clk_data, clk->id);
> +	if (!selector)
> +		return 0;
> +
> +	if (selector->flags & FIXED_PARENT) {
> +		clksel = 0;
> +	} else {
> +		val = readl(priv->base + selector->reg);
> +		clksel = (val & selector->mask) >> (ffs(selector->mask) - 1);
> +	}
> +	parent.id = clksel_to_clkid(selector, clksel);
> +
> +	ret = clk_request(clk->dev, &parent);
> +	if (ret)
> +		return 0;
> +
> +	parent_rate = clk_get_rate(&parent);
> +
> +	debug("fin of clk%lu = %lu\n", clk->id, parent_rate);
> +	return parent_rate;
> +}
> +
> +static u32 npcm_clk_get_div(struct clk *clk)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_div *divider;
> +	u32 val, div;
> +
> +	divider = npcm_clk_divider_get(priv->clk_data, clk->id);
> +	if (!divider)
> +		return 0;
> +
> +	val = readl(priv->base + divider->reg);
> +	div = (val & divider->mask) >> (ffs(divider->mask) - 1);
> +	if (divider->flags & DIV_TYPE1)
> +		div = div + 1;
> +	else
> +		div = 1 << div;
> +
> +	if (divider->flags & PRE_DIV2)
> +		div = div << 1;
> +
> +	return div;
> +}
> +
> +static u32 npcm_clk_set_div(struct clk *clk, u32 div)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_div *divider;
> +	u32 val, clkdiv;
> +
> +	divider = npcm_clk_divider_get(priv->clk_data, clk->id);
> +	if (!divider)
> +		return -EINVAL;
> +
> +	if (divider->flags & PRE_DIV2)
> +		div = div >> 1;
> +
> +	if (divider->flags & DIV_TYPE1)
> +		clkdiv = div - 1;
> +	else
> +		clkdiv = ilog2(div);
> +
> +	val = readl(priv->base + divider->reg);
> +	val &= ~divider->mask;
> +	val |= (clkdiv << (ffs(divider->mask) - 1)) & divider->mask;
> +	writel(val, priv->base + divider->reg);
> +
> +	return 0;
> +}
> +
> +static ulong npcm_clk_get_fout(struct clk *clk)
> +{
> +	ulong parent_rate;
> +	u32 div;
> +
> +	parent_rate = npcm_clk_get_fin(clk);
> +	if (!parent_rate)
> +		return -EINVAL;
> +
> +	div = npcm_clk_get_div(clk);
> +	if (!div)
> +		return -EINVAL;
> +
> +	debug("fout of clk%lu = (%lu / %u)\n", clk->id, parent_rate, div);
> +	return (parent_rate / div);
> +}
> +
> +static ulong npcm_clk_get_pll_fout(struct clk *clk)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_pll *pll;
> +	struct clk parent;
> +	ulong parent_rate;
> +	ulong fbdv, indv, otdv1, otdv2;
> +	u32 val;
> +	u64 ret;
> +
> +	pll = npcm_clk_pll_get(priv->clk_data, clk->id);
> +	if (!pll)
> +		return -ENODEV;
> +
> +	parent.id = pll->parent_id;
> +	ret = clk_request(clk->dev, &parent);
> +	if (ret)
> +		return ret;
> +
> +	parent_rate = clk_get_rate(&parent);
> +
> +	val = readl(priv->base + pll->reg);
> +	indv = FIELD_GET(PLLCON_INDV, val);
> +	fbdv = FIELD_GET(PLLCON_FBDV, val);
> +	otdv1 = FIELD_GET(PLLCON_OTDV1, val);
> +	otdv2 = FIELD_GET(PLLCON_OTDV2, val);
> +
> +	ret = (u64)parent_rate * fbdv;
> +	do_div(ret, indv * otdv1 * otdv2);
> +	if (pll->flags & POST_DIV2)
> +		do_div(ret, 2);
> +
> +	debug("fout of pll(id %lu) = %llu\n", clk->id, ret);
> +	return ret;
> +}
> +
> +static ulong npcm_clk_get_rate(struct clk *clk)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_data *clk_data = priv->clk_data;
> +	struct clk refclk;
> +	int ret;
> +
> +	debug("%s: id %lu\n", __func__, clk->id);
> +	if (clk->id == clk_data->refclk_id) {
> +		ret = clk_get_by_name(clk->dev, "refclk", &refclk);
> +		if (!ret)
> +			return clk_get_rate(&refclk);
> +		else
> +			return ret;
> +	}
> +
> +	if (clk->id >= clk_data->pll0_id &&
> +	    clk->id < clk_data->pll0_id + clk_data->num_plls)
> +		return npcm_clk_get_pll_fout(clk);
> +	else
> +		return npcm_clk_get_fout(clk);
> +}
> +
> +static ulong npcm_clk_set_rate(struct clk *clk, ulong rate)
> +{
> +	ulong parent_rate;
> +	u32 div;
> +	int ret;
> +
> +	debug("%s: id %lu, rate %lu\n", __func__, clk->id, rate);
> +	parent_rate = npcm_clk_get_fin(clk);
> +	if (!parent_rate)
> +		return -EINVAL;
> +
> +	div = DIV_ROUND_UP(parent_rate, rate);
> +	ret = npcm_clk_set_div(clk, div);
> +	if (ret)
> +		return ret;
> +
> +	debug("%s: rate %lu, new rate (%lu / %u)\n", __func__, rate, parent_rate, div);
> +	return (parent_rate / div);
> +}
> +
> +static int npcm_clk_set_parent(struct clk *clk, struct clk *parent)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +	struct npcm_clk_select *selector;
> +	int clksel;
> +	u32 val;
> +
> +	debug("%s: id %lu, parent %lu\n", __func__, clk->id, parent->id);
> +	selector = npcm_clk_selector_get(priv->clk_data, clk->id);
> +	if (!selector)
> +		return -EINVAL;
> +
> +	clksel = clkid_to_clksel(selector, parent->id);
> +	if (clksel < 0)
> +		return -EINVAL;
> +
> +	val = readl(priv->base + selector->reg);
> +	val &= ~selector->mask;
> +	val |= clksel << (ffs(selector->mask) - 1);
> +	writel(val, priv->base + selector->reg);
> +
> +	return 0;
> +}
> +
> +static int npcm_clk_request(struct clk *clk)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(clk->dev);
> +
> +	if (clk->id >= priv->num_clks)
> +		return -EINVAL;
> +
> +	return 0;
> +}
> +
> +const struct clk_ops npcm_clk_ops = {
> +	.get_rate = npcm_clk_get_rate,
> +	.set_rate = npcm_clk_set_rate,
> +	.set_parent = npcm_clk_set_parent,
> +	.request = npcm_clk_request,
> +};
> diff --git a/drivers/clk/nuvoton/clk_npcm.h b/drivers/clk/nuvoton/clk_npcm.h
> new file mode 100644
> index 0000000000..06b60dc8b8
> --- /dev/null
> +++ b/drivers/clk/nuvoton/clk_npcm.h
> @@ -0,0 +1,105 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +
> +#ifndef _CLK_NPCM_H_
> +#define _CLK_NPCM_H_
> +
> +#include <clk-uclass.h>
> +
> +/* Register offsets */
> +#define CLKSEL		0x04	/* clock source selection */
> +#define CLKDIV1		0x08	/* clock divider 1 */
> +#define CLKDIV2		0x2C	/* clock divider 2 */
> +#define CLKDIV3		0x58	/* clock divider 3 */
> +#define PLLCON0		0x0C	/* pll0 control */
> +#define PLLCON1		0x10	/* pll1 control */
> +#define PLLCON2		0x54	/* pll2 control */
> +
> +/* CLKSEL bit filed */
> +#define NPCM7XX_CPUCKSEL	GENMASK(1, 0)
> +#define NPCM8XX_CPUCKSEL	GENMASK(2, 0)
> +#define SDCKSEL		GENMASK(7, 6)
> +#define UARTCKSEL	GENMASK(9, 8)
> +#define TIMCKSEL	GENMASK(15, 14)
> +
> +/* CLKDIV1 bit filed */
> +#define SPI3CKDIV	GENMASK(10, 6)
> +#define MMCCKDIV	GENMASK(15, 11)
> +#define UARTDIV1	GENMASK(20, 16)
> +#define TIMCKDIV	GENMASK(25, 21)
> +#define CLK4DIV		GENMASK(27, 26)
> +
> +/* CLKDIV2 bit filed */
> +#define APB5CKDIV	GENMASK(23, 22)
> +#define APB2CKDIV	GENMASK(27, 26)
> +
> +/* CLKDIV3 bit filed */
> +#define SPIXCKDIV	GENMASK(5, 1)
> +#define SPI0CKDIV	GENMASK(10, 6)
> +#define UARTDIV2	GENMASK(15, 11)
> +#define SPI1CKDIV	GENMASK(23, 16)
> +
> +/* PLLCON bit filed */
> +#define PLLCON_INDV	GENMASK(5, 0)
> +#define PLLCON_OTDV1	GENMASK(10, 8)
> +#define PLLCON_OTDV2	GENMASK(15, 13)
> +#define PLLCON_FBDV	GENMASK(27, 16)
> +
> +/* Flags */
> +#define DIV_TYPE1	BIT(0)	/* div = clkdiv + 1 */
> +#define DIV_TYPE2	BIT(1)	/* div = 1 << clkdiv */
> +#define PRE_DIV2	BIT(2)	/* Pre divisor = 2 */
> +#define POST_DIV2	BIT(3)	/* Post divisor = 2 */
> +#define FIXED_PARENT	BIT(4)	/* clock source is fixed */
> +
> +/* Parameters of PLL configuration */
> +struct npcm_clk_pll {
> +	const int id;
> +	const int parent_id;
> +	u32 reg;
> +	u32 flags;
> +};
> +
> +/* Parent clock id to clksel mapping */
> +struct parent_data {
> +	int id;
> +	int clksel;
> +};
> +
> +/* Parameters of parent selection */
> +struct npcm_clk_select {
> +	const int id;
> +	const struct parent_data *parents;
> +	u32 reg;
> +	u32 mask;
> +	u8 num_parents;
> +	u32 flags;
> +};
> +
> +/* Parameters of clock divider */
> +struct npcm_clk_div {
> +	const int id;
> +	u32 reg;
> +	u32 mask;
> +	u32 flags;
> +};
> +
> +struct npcm_clk_data {
> +	struct npcm_clk_pll *clk_plls;
> +	int num_plls;
> +	struct npcm_clk_select *clk_selectors;
> +	int num_selectors;
> +	struct npcm_clk_div *clk_dividers;
> +	int num_dividers;
> +	int refclk_id;
> +	int pll0_id;
> +};
> +
> +struct npcm_clk_priv {
> +	void __iomem *base;
> +	struct npcm_clk_data *clk_data;
> +	int num_clks;
> +};
> +
> +extern const struct clk_ops npcm_clk_ops;
> +
> +#endif
> diff --git a/drivers/clk/nuvoton/clk_npcm7xx.c b/drivers/clk/nuvoton/clk_npcm7xx.c
> new file mode 100644
> index 0000000000..a12aaa2f4c
> --- /dev/null
> +++ b/drivers/clk/nuvoton/clk_npcm7xx.c
> @@ -0,0 +1,95 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (c) 2021 Nuvoton Technology Corp.
> + */
> +
> +#include <dm.h>
> +#include <dt-bindings/clock/nuvoton,npcm7xx-clock.h>
> +#include "clk_npcm.h"
> +
> +/* Parent clock map */
> +static const struct parent_data pll_parents[] = {
> +	{NPCM7XX_CLK_PLL0, 0},
> +	{NPCM7XX_CLK_PLL1, 1},
> +	{NPCM7XX_CLK_REFCLK, 2},
> +	{NPCM7XX_CLK_PLL2DIV2, 3}
> +};
> +
> +static const struct parent_data cpuck_parents[] = {
> +	{NPCM7XX_CLK_PLL0, 0},
> +	{NPCM7XX_CLK_PLL1, 1},
> +	{NPCM7XX_CLK_REFCLK, 2},
> +};
> +
> +static const struct parent_data apb_parent[] = {{NPCM7XX_CLK_AHB, 0}};
> +
> +static struct npcm_clk_pll npcm7xx_clk_plls[] = {
> +	{NPCM7XX_CLK_PLL0, NPCM7XX_CLK_REFCLK, PLLCON0, 0},
> +	{NPCM7XX_CLK_PLL1, NPCM7XX_CLK_REFCLK, PLLCON1, 0},
> +	{NPCM7XX_CLK_PLL2, NPCM7XX_CLK_REFCLK, PLLCON2, 0},
> +	{NPCM7XX_CLK_PLL2DIV2, NPCM7XX_CLK_REFCLK, PLLCON2, POST_DIV2}
> +};
> +
> +static struct npcm_clk_select npcm7xx_clk_selectors[] = {
> +	{NPCM7XX_CLK_AHB, cpuck_parents, CLKSEL, NPCM7XX_CPUCKSEL, 3, 0},
> +	{NPCM7XX_CLK_APB2, apb_parent, 0, 0, 1, FIXED_PARENT},
> +	{NPCM7XX_CLK_APB5, apb_parent, 0, 0, 1, FIXED_PARENT},
> +	{NPCM7XX_CLK_SPI0, apb_parent, 0, 0, 1, FIXED_PARENT},
> +	{NPCM7XX_CLK_SPI3, apb_parent, 0, 0, 1, FIXED_PARENT},
> +	{NPCM7XX_CLK_SPIX, apb_parent, 0, 0, 1, FIXED_PARENT},
> +	{NPCM7XX_CLK_UART, pll_parents, CLKSEL, UARTCKSEL, 4, 0},
> +	{NPCM7XX_CLK_TIMER, pll_parents, CLKSEL, TIMCKSEL, 4, 0},
> +	{NPCM7XX_CLK_SDHC, pll_parents, CLKSEL, SDCKSEL, 4, 0}
> +};
> +
> +static struct npcm_clk_div npcm7xx_clk_dividers[] = {
> +	{NPCM7XX_CLK_AHB, CLKDIV1, CLK4DIV, DIV_TYPE1 | PRE_DIV2},
> +	{NPCM7XX_CLK_APB2, CLKDIV2, APB2CKDIV, DIV_TYPE2},
> +	{NPCM7XX_CLK_APB5, CLKDIV2, APB5CKDIV, DIV_TYPE2},
> +	{NPCM7XX_CLK_SPI0, CLKDIV3, SPI0CKDIV, DIV_TYPE1},
> +	{NPCM7XX_CLK_SPI3, CLKDIV1, SPI3CKDIV, DIV_TYPE1},
> +	{NPCM7XX_CLK_SPIX, CLKDIV3, SPIXCKDIV, DIV_TYPE1},
> +	{NPCM7XX_CLK_UART, CLKDIV1, UARTDIV1, DIV_TYPE1},
> +	{NPCM7XX_CLK_TIMER, CLKDIV1, TIMCKDIV, DIV_TYPE2},
> +	{NPCM7XX_CLK_SDHC, CLKDIV1, MMCCKDIV, DIV_TYPE1}
> +};
> +
> +static struct npcm_clk_data npcm7xx_clk_data = {
> +	.clk_plls = npcm7xx_clk_plls,
> +	.num_plls = ARRAY_SIZE(npcm7xx_clk_plls),
> +	.clk_selectors = npcm7xx_clk_selectors,
> +	.num_selectors = ARRAY_SIZE(npcm7xx_clk_selectors),
> +	.clk_dividers = npcm7xx_clk_dividers,
> +	.num_dividers = ARRAY_SIZE(npcm7xx_clk_dividers),
> +	.refclk_id = NPCM7XX_CLK_REFCLK,
> +	.pll0_id = NPCM7XX_CLK_PLL0,
> +};
> +
> +static int npcm7xx_clk_probe(struct udevice *dev)
> +{
> +	struct npcm_clk_priv *priv = dev_get_priv(dev);
> +
> +	priv->base = dev_read_addr_ptr(dev);
> +	if (!priv->base)
> +		return -EINVAL;
> +
> +	priv->clk_data = &npcm7xx_clk_data;
> +	priv->num_clks = NPCM7XX_NUM_CLOCKS;
> +
> +	return 0;
> +}
> +
> +static const struct udevice_id npcm7xx_clk_ids[] = {
> +	{ .compatible = "nuvoton,npcm750-clk" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(clk_npcm) = {
> +	.name           = "clk_npcm",
> +	.id             = UCLASS_CLK,
> +	.of_match       = npcm7xx_clk_ids,
> +	.ops            = &npcm_clk_ops,
> +	.priv_auto	= sizeof(struct npcm_clk_priv),
> +	.probe          = npcm7xx_clk_probe,
> +	.flags = DM_FLAG_PRE_RELOC,
> +};
> diff --git a/include/dt-bindings/clock/nuvoton,npcm7xx-clock.h b/include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
> new file mode 100644
> index 0000000000..65e6bc4eee
> --- /dev/null
> +++ b/include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
> @@ -0,0 +1,46 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Nuvoton NPCM7xx Clock Generator binding
> + * clock binding number for all clocks supportted by nuvoton,npcm7xx-clk
> + *
> + * Copyright (C) 2018 Nuvoton Technologies tali.perry@nuvoton.com
> + *
> + */
> +
> +#ifndef __DT_BINDINGS_CLOCK_NPCM7XX_H
> +#define __DT_BINDINGS_CLOCK_NPCM7XX_H
> +
> +#define NPCM7XX_CLK_CPU		0
> +#define NPCM7XX_CLK_GFX_PIXEL	1
> +#define NPCM7XX_CLK_MC		2
> +#define NPCM7XX_CLK_ADC		3
> +#define NPCM7XX_CLK_AHB		4
> +#define NPCM7XX_CLK_TIMER	5
> +#define NPCM7XX_CLK_UART	6
> +#define NPCM7XX_CLK_MMC		7
> +#define NPCM7XX_CLK_SPI3	8
> +#define NPCM7XX_CLK_PCI		9
> +#define NPCM7XX_CLK_AXI		10
> +#define NPCM7XX_CLK_APB4	11
> +#define NPCM7XX_CLK_APB3	12
> +#define NPCM7XX_CLK_APB2	13
> +#define NPCM7XX_CLK_APB1	14
> +#define NPCM7XX_CLK_APB5	15
> +#define NPCM7XX_CLK_CLKOUT	16
> +#define NPCM7XX_CLK_GFX		17
> +#define NPCM7XX_CLK_SU		18
> +#define NPCM7XX_CLK_SU48	19
> +#define NPCM7XX_CLK_SDHC	20
> +#define NPCM7XX_CLK_SPI0	21
> +#define NPCM7XX_CLK_SPIX	22
> +#define NPCM7XX_CLK_REFCLK	23
> +#define NPCM7XX_CLK_SYSBYPCK	24
> +#define NPCM7XX_CLK_MCBYPCK	25
> +#define NPCM7XX_CLK_PLL0	26
> +#define NPCM7XX_CLK_PLL1	27
> +#define NPCM7XX_CLK_PLL2	28
> +#define NPCM7XX_CLK_PLL2DIV2	29
> +#define NPCM7XX_NUM_CLOCKS	(NPCM7XX_CLK_PLL2DIV2 + 1)
> +
> +#endif
> +
> 

Reviewed-by: Sean Anderson <seanga2@gmail.com>

  reply	other threads:[~2022-04-22  0:36 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-19  5:32 [PATCH v3 0/4] Add Nuvoton NPCM750 support Jim Liu
2022-04-19  5:32 ` [PATCH v3 1/4] arm: nuvoton: Add support for Nuvoton NPCM750 BMC Jim Liu
2022-05-05 18:51   ` Tom Rini
2022-04-19  5:32 ` [PATCH v3 2/4] clk: nuvoton: Add support for NPCM750 Jim Liu
2022-04-22  0:36   ` Sean Anderson [this message]
2022-05-05 18:52   ` Tom Rini
2022-04-19  5:32 ` [PATCH v3 3/4] serial: npcm: Add support for Nuvoton NPCM SoCs Jim Liu
2022-05-05 18:52   ` Tom Rini
2022-04-19  5:32 ` [PATCH v3 4/4] timer: npcm: Add NPCM timer support Jim Liu
2022-05-05 18:52   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0b310264-1140-9786-10c3-f29cce131938@gmail.com \
    --to=seanga2@gmail.com \
    --cc=JJLIU0@nuvoton.com \
    --cc=KWLIU@nuvoton.com \
    --cc=YSCHU@nuvoton.com \
    --cc=jim.t90615@gmail.com \
    --cc=lukma@denx.de \
    --cc=sjg@chromium.org \
    --cc=sr@denx.de \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.