All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: James Hogan <james.hogan@mips.com>
To: Paul Cercueil <paul@crapouillou.net>
Cc: Ralf Baechle <ralf@linux-mips.org>,
	Maarten ter Huurne <maarten@treewalker.org>,
	Paul Burton <paul.burton@mips.com>,
	<linux-kernel@vger.kernel.org>, <linux-mips@linux-mips.org>
Subject: Re: [PATCH v6 06/15] clk: Add Ingenic jz4770 CGU driver
Date: Wed, 10 Jan 2018 21:37:14 +0000	[thread overview]
Message-ID: <20180110213713.GR27409@jhogan-linux.mipstec.com> (raw)
In-Reply-To: <20180105182513.16248-7-paul@crapouillou.net>

[-- Attachment #1: Type: text/plain, Size: 16035 bytes --]

Hi Paul,

On Fri, Jan 05, 2018 at 07:25:04PM +0100, Paul Cercueil wrote:
> Add support for the clocks provided by the CGU in the Ingenic JZ4770
> SoC.
> 
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> Signed-off-by: Maarten ter Huurne <maarten@treewalker.org>
> Acked-by: Stephen Boyd <sboyd@codeaurora.org>
> ---
>  drivers/clk/ingenic/Makefile     |   1 +
>  drivers/clk/ingenic/jz4770-cgu.c | 483 +++++++++++++++++++++++++++++++++++++++

Should this file and the jz4770-cgu.h header be added to a new
MAINTAINERS entry for this driver and/or for the platform as a whole?

Cheers
James

>  2 files changed, 484 insertions(+)
>  create mode 100644 drivers/clk/ingenic/jz4770-cgu.c
> 
>  v2: Make structures static const
>  v3: <dt-bindings/clock/jz4770-cgu.h> is now added in a separate patch
>  v4: No change
>  v5: Use SPDX license identifier
>  v6: No change
> 
> diff --git a/drivers/clk/ingenic/Makefile b/drivers/clk/ingenic/Makefile
> index cd47b0664c2b..1456e4cdb562 100644
> --- a/drivers/clk/ingenic/Makefile
> +++ b/drivers/clk/ingenic/Makefile
> @@ -1,3 +1,4 @@
>  obj-y				+= cgu.o
>  obj-$(CONFIG_MACH_JZ4740)	+= jz4740-cgu.o
> +obj-$(CONFIG_MACH_JZ4770)	+= jz4770-cgu.o
>  obj-$(CONFIG_MACH_JZ4780)	+= jz4780-cgu.o
> diff --git a/drivers/clk/ingenic/jz4770-cgu.c b/drivers/clk/ingenic/jz4770-cgu.c
> new file mode 100644
> index 000000000000..c78d369b9403
> --- /dev/null
> +++ b/drivers/clk/ingenic/jz4770-cgu.c
> @@ -0,0 +1,483 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * JZ4770 SoC CGU driver
> + * Copyright 2018, Paul Cercueil <paul@crapouillou.net>
> + */
> +
> +#include <linux/bitops.h>
> +#include <linux/clk-provider.h>
> +#include <linux/delay.h>
> +#include <linux/of.h>
> +#include <linux/syscore_ops.h>
> +#include <dt-bindings/clock/jz4770-cgu.h>
> +#include "cgu.h"
> +
> +/*
> + * CPM registers offset address definition
> + */
> +#define CGU_REG_CPCCR		0x00
> +#define CGU_REG_LCR		0x04
> +#define CGU_REG_CPPCR0		0x10
> +#define CGU_REG_CLKGR0		0x20
> +#define CGU_REG_OPCR		0x24
> +#define CGU_REG_CLKGR1		0x28
> +#define CGU_REG_CPPCR1		0x30
> +#define CGU_REG_USBPCR1		0x48
> +#define CGU_REG_USBCDR		0x50
> +#define CGU_REG_I2SCDR		0x60
> +#define CGU_REG_LPCDR		0x64
> +#define CGU_REG_MSC0CDR		0x68
> +#define CGU_REG_UHCCDR		0x6c
> +#define CGU_REG_SSICDR		0x74
> +#define CGU_REG_CIMCDR		0x7c
> +#define CGU_REG_GPSCDR		0x80
> +#define CGU_REG_PCMCDR		0x84
> +#define CGU_REG_GPUCDR		0x88
> +#define CGU_REG_MSC1CDR		0xA4
> +#define CGU_REG_MSC2CDR		0xA8
> +#define CGU_REG_BCHCDR		0xAC
> +
> +/* bits within the LCR register */
> +#define LCR_LPM			BIT(0)		/* Low Power Mode */
> +
> +/* bits within the OPCR register */
> +#define OPCR_SPENDH		BIT(5)		/* UHC PHY suspend */
> +#define OPCR_SPENDN		BIT(7)		/* OTG PHY suspend */
> +
> +/* bits within the USBPCR1 register */
> +#define USBPCR1_UHC_POWER	BIT(5)		/* UHC PHY power down */
> +
> +static struct ingenic_cgu *cgu;
> +
> +static int jz4770_uhc_phy_enable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	writel(readl(reg_opcr) & ~OPCR_SPENDH, reg_opcr);
> +	writel(readl(reg_usbpcr1) | USBPCR1_UHC_POWER, reg_usbpcr1);
> +	return 0;
> +}
> +
> +static void jz4770_uhc_phy_disable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	writel(readl(reg_usbpcr1) & ~USBPCR1_UHC_POWER, reg_usbpcr1);
> +	writel(readl(reg_opcr) | OPCR_SPENDH, reg_opcr);
> +}
> +
> +static int jz4770_uhc_phy_is_enabled(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	return !(readl(reg_opcr) & OPCR_SPENDH) &&
> +		(readl(reg_usbpcr1) & USBPCR1_UHC_POWER);
> +}
> +
> +static const struct clk_ops jz4770_uhc_phy_ops = {
> +	.enable = jz4770_uhc_phy_enable,
> +	.disable = jz4770_uhc_phy_disable,
> +	.is_enabled = jz4770_uhc_phy_is_enabled,
> +};
> +
> +static int jz4770_otg_phy_enable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	writel(readl(reg_opcr) | OPCR_SPENDN, reg_opcr);
> +
> +	/* Wait for the clock to be stable */
> +	udelay(50);
> +	return 0;
> +}
> +
> +static void jz4770_otg_phy_disable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	writel(readl(reg_opcr) & ~OPCR_SPENDN, reg_opcr);
> +}
> +
> +static int jz4770_otg_phy_is_enabled(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	return !!(readl(reg_opcr) & OPCR_SPENDN);
> +}
> +
> +static const struct clk_ops jz4770_otg_phy_ops = {
> +	.enable = jz4770_otg_phy_enable,
> +	.disable = jz4770_otg_phy_disable,
> +	.is_enabled = jz4770_otg_phy_is_enabled,
> +};
> +
> +static const s8 pll_od_encoding[8] = {
> +	0x0, 0x1, -1, 0x2, -1, -1, -1, 0x3,
> +};
> +
> +static const struct ingenic_cgu_clk_info jz4770_cgu_clocks[] = {
> +
> +	/* External clocks */
> +
> +	[JZ4770_CLK_EXT] = { "ext", CGU_CLK_EXT },
> +	[JZ4770_CLK_OSC32K] = { "osc32k", CGU_CLK_EXT },
> +
> +	/* PLLs */
> +
> +	[JZ4770_CLK_PLL0] = {
> +		"pll0", CGU_CLK_PLL,
> +		.parents = { JZ4770_CLK_EXT },
> +		.pll = {
> +			.reg = CGU_REG_CPPCR0,
> +			.m_shift = 24,
> +			.m_bits = 7,
> +			.m_offset = 1,
> +			.n_shift = 18,
> +			.n_bits = 5,
> +			.n_offset = 1,
> +			.od_shift = 16,
> +			.od_bits = 2,
> +			.od_max = 8,
> +			.od_encoding = pll_od_encoding,
> +			.bypass_bit = 9,
> +			.enable_bit = 8,
> +			.stable_bit = 10,
> +		},
> +	},
> +
> +	[JZ4770_CLK_PLL1] = {
> +		/* TODO: PLL1 can depend on PLL0 */
> +		"pll1", CGU_CLK_PLL,
> +		.parents = { JZ4770_CLK_EXT },
> +		.pll = {
> +			.reg = CGU_REG_CPPCR1,
> +			.m_shift = 24,
> +			.m_bits = 7,
> +			.m_offset = 1,
> +			.n_shift = 18,
> +			.n_bits = 5,
> +			.n_offset = 1,
> +			.od_shift = 16,
> +			.od_bits = 2,
> +			.od_max = 8,
> +			.od_encoding = pll_od_encoding,
> +			.enable_bit = 7,
> +			.stable_bit = 6,
> +			.no_bypass_bit = true,
> +		},
> +	},
> +
> +	/* Main clocks */
> +
> +	[JZ4770_CLK_CCLK] = {
> +		"cclk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_H0CLK] = {
> +		"h0clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_H1CLK] = {
> +		"h1clk", CGU_CLK_DIV | CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1 },
> +		.gate = { CGU_REG_LCR, 30 },
> +	},
> +	[JZ4770_CLK_H2CLK] = {
> +		"h2clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_C1CLK] = {
> +		"c1clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_PCLK] = {
> +		"pclk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1 },
> +	},
> +
> +	/* Those divided clocks can connect to PLL0 or PLL1 */
> +
> +	[JZ4770_CLK_MMC0_MUX] = {
> +		"mmc0_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC0CDR, 30, 1 },
> +		.div = { CGU_REG_MSC0CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC0CDR, 31 },
> +	},
> +	[JZ4770_CLK_MMC1_MUX] = {
> +		"mmc1_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC1CDR, 30, 1 },
> +		.div = { CGU_REG_MSC1CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC1CDR, 31 },
> +	},
> +	[JZ4770_CLK_MMC2_MUX] = {
> +		"mmc2_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC2CDR, 30, 1 },
> +		.div = { CGU_REG_MSC2CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC2CDR, 31 },
> +	},
> +	[JZ4770_CLK_CIM] = {
> +		"cim", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_CIMCDR, 31, 1 },
> +		.div = { CGU_REG_CIMCDR, 0, 1, 8, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 26 },
> +	},
> +	[JZ4770_CLK_UHC] = {
> +		"uhc", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_UHCCDR, 29, 1 },
> +		.div = { CGU_REG_UHCCDR, 0, 1, 4, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 24 },
> +	},
> +	[JZ4770_CLK_GPU] = {
> +		"gpu", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, -1 },
> +		.mux = { CGU_REG_GPUCDR, 31, 1 },
> +		.div = { CGU_REG_GPUCDR, 0, 1, 3, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR1, 9 },
> +	},
> +	[JZ4770_CLK_BCH] = {
> +		"bch", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_BCHCDR, 31, 1 },
> +		.div = { CGU_REG_BCHCDR, 0, 1, 3, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 1 },
> +	},
> +	[JZ4770_CLK_LPCLK_MUX] = {
> +		"lpclk", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_LPCDR, 29, 1 },
> +		.div = { CGU_REG_LPCDR, 0, 1, 11, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 28 },
> +	},
> +	[JZ4770_CLK_GPS] = {
> +		"gps", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_GPSCDR, 31, 1 },
> +		.div = { CGU_REG_GPSCDR, 0, 1, 4, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 22 },
> +	},
> +
> +	/* Those divided clocks can connect to EXT, PLL0 or PLL1 */
> +
> +	[JZ4770_CLK_SSI_MUX] = {
> +		"ssi_mux", CGU_CLK_DIV | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_SSICDR, 30, 2 },
> +		.div = { CGU_REG_SSICDR, 0, 1, 6, -1, -1, -1 },
> +	},
> +	[JZ4770_CLK_PCM_MUX] = {
> +		"pcm_mux", CGU_CLK_DIV | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_PCMCDR, 30, 2 },
> +		.div = { CGU_REG_PCMCDR, 0, 1, 9, -1, -1, -1 },
> +	},
> +	[JZ4770_CLK_I2S] = {
> +		"i2s", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_I2SCDR, 30, 2 },
> +		.div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR1, 13 },
> +	},
> +	[JZ4770_CLK_OTG] = {
> +		"usb", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_USBCDR, 30, 2 },
> +		.div = { CGU_REG_USBCDR, 0, 1, 8, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 2 },
> +	},
> +
> +	/* Gate-only clocks */
> +
> +	[JZ4770_CLK_SSI0] = {
> +		"ssi0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 4 },
> +	},
> +	[JZ4770_CLK_SSI1] = {
> +		"ssi1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 19 },
> +	},
> +	[JZ4770_CLK_SSI2] = {
> +		"ssi2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 20 },
> +	},
> +	[JZ4770_CLK_PCM0] = {
> +		"pcm0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PCM_MUX, },
> +		.gate = { CGU_REG_CLKGR1, 8 },
> +	},
> +	[JZ4770_CLK_PCM1] = {
> +		"pcm1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PCM_MUX, },
> +		.gate = { CGU_REG_CLKGR1, 10 },
> +	},
> +	[JZ4770_CLK_DMA] = {
> +		"dma", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H2CLK, },
> +		.gate = { CGU_REG_CLKGR0, 21 },
> +	},
> +	[JZ4770_CLK_I2C0] = {
> +		"i2c0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 5 },
> +	},
> +	[JZ4770_CLK_I2C1] = {
> +		"i2c1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 6 },
> +	},
> +	[JZ4770_CLK_I2C2] = {
> +		"i2c2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR1, 15 },
> +	},
> +	[JZ4770_CLK_UART0] = {
> +		"uart0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 15 },
> +	},
> +	[JZ4770_CLK_UART1] = {
> +		"uart1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 16 },
> +	},
> +	[JZ4770_CLK_UART2] = {
> +		"uart2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 17 },
> +	},
> +	[JZ4770_CLK_UART3] = {
> +		"uart3", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 18 },
> +	},
> +	[JZ4770_CLK_IPU] = {
> +		"ipu", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H0CLK, },
> +		.gate = { CGU_REG_CLKGR0, 29 },
> +	},
> +	[JZ4770_CLK_ADC] = {
> +		"adc", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 14 },
> +	},
> +	[JZ4770_CLK_AIC] = {
> +		"aic", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 8 },
> +	},
> +	[JZ4770_CLK_AUX] = {
> +		"aux", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_C1CLK, },
> +		.gate = { CGU_REG_CLKGR1, 14 },
> +	},
> +	[JZ4770_CLK_VPU] = {
> +		"vpu", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H1CLK, },
> +		.gate = { CGU_REG_CLKGR1, 7 },
> +	},
> +	[JZ4770_CLK_MMC0] = {
> +		"mmc0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC0_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 3 },
> +	},
> +	[JZ4770_CLK_MMC1] = {
> +		"mmc1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC1_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 11 },
> +	},
> +	[JZ4770_CLK_MMC2] = {
> +		"mmc2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC2_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 12 },
> +	},
> +
> +	/* Custom clocks */
> +
> +	[JZ4770_CLK_UHC_PHY] = {
> +		"uhc_phy", CGU_CLK_CUSTOM,
> +		.parents = { JZ4770_CLK_UHC, -1, -1, -1 },
> +		.custom = { &jz4770_uhc_phy_ops },
> +	},
> +	[JZ4770_CLK_OTG_PHY] = {
> +		"usb_phy", CGU_CLK_CUSTOM,
> +		.parents = { JZ4770_CLK_OTG, -1, -1, -1 },
> +		.custom = { &jz4770_otg_phy_ops },
> +	},
> +
> +	[JZ4770_CLK_EXT512] = {
> +		"ext/512", CGU_CLK_FIXDIV,
> +		.parents = { JZ4770_CLK_EXT },
> +		.fixdiv = { 512 },
> +	},
> +
> +	[JZ4770_CLK_RTC] = {
> +		"rtc", CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT512, JZ4770_CLK_OSC32K, },
> +		.mux = { CGU_REG_OPCR, 2, 1},
> +	},
> +};
> +
> +#if IS_ENABLED(CONFIG_PM_SLEEP)
> +static int jz4770_cgu_pm_suspend(void)
> +{
> +	u32 val;
> +
> +	val = readl(cgu->base + CGU_REG_LCR);
> +	writel(val | LCR_LPM, cgu->base + CGU_REG_LCR);
> +	return 0;
> +}
> +
> +static void jz4770_cgu_pm_resume(void)
> +{
> +	u32 val;
> +
> +	val = readl(cgu->base + CGU_REG_LCR);
> +	writel(val & ~LCR_LPM, cgu->base + CGU_REG_LCR);
> +}
> +
> +static struct syscore_ops jz4770_cgu_pm_ops = {
> +	.suspend = jz4770_cgu_pm_suspend,
> +	.resume = jz4770_cgu_pm_resume,
> +};
> +#endif /* CONFIG_PM_SLEEP */
> +
> +static void __init jz4770_cgu_init(struct device_node *np)
> +{
> +	int retval;
> +
> +	cgu = ingenic_cgu_new(jz4770_cgu_clocks,
> +			      ARRAY_SIZE(jz4770_cgu_clocks), np);
> +	if (!cgu)
> +		pr_err("%s: failed to initialise CGU\n", __func__);
> +
> +	retval = ingenic_cgu_register_clocks(cgu);
> +	if (retval)
> +		pr_err("%s: failed to register CGU Clocks\n", __func__);
> +
> +#if IS_ENABLED(CONFIG_PM_SLEEP)
> +	register_syscore_ops(&jz4770_cgu_pm_ops);
> +#endif
> +}
> +
> +/* We only probe via devicetree, no need for a platform driver */
> +CLK_OF_DECLARE(jz4770_cgu, "ingenic,jz4770-cgu", jz4770_cgu_init);
> -- 
> 2.11.0
> 
> 

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: James Hogan <james.hogan@mips.com>
To: Paul Cercueil <paul@crapouillou.net>
Cc: Ralf Baechle <ralf@linux-mips.org>,
	Maarten ter Huurne <maarten@treewalker.org>,
	Paul Burton <paul.burton@mips.com>,
	linux-kernel@vger.kernel.org, linux-mips@linux-mips.org
Subject: Re: [PATCH v6 06/15] clk: Add Ingenic jz4770 CGU driver
Date: Wed, 10 Jan 2018 21:37:14 +0000	[thread overview]
Message-ID: <20180110213713.GR27409@jhogan-linux.mipstec.com> (raw)
Message-ID: <20180110213714.nQdK6kD0uhTb_0yzwiEu74E4UvKj0KAetFAqEH3FBi0@z> (raw)
In-Reply-To: <20180105182513.16248-7-paul@crapouillou.net>

[-- Attachment #1: Type: text/plain, Size: 16035 bytes --]

Hi Paul,

On Fri, Jan 05, 2018 at 07:25:04PM +0100, Paul Cercueil wrote:
> Add support for the clocks provided by the CGU in the Ingenic JZ4770
> SoC.
> 
> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
> Signed-off-by: Maarten ter Huurne <maarten@treewalker.org>
> Acked-by: Stephen Boyd <sboyd@codeaurora.org>
> ---
>  drivers/clk/ingenic/Makefile     |   1 +
>  drivers/clk/ingenic/jz4770-cgu.c | 483 +++++++++++++++++++++++++++++++++++++++

Should this file and the jz4770-cgu.h header be added to a new
MAINTAINERS entry for this driver and/or for the platform as a whole?

Cheers
James

>  2 files changed, 484 insertions(+)
>  create mode 100644 drivers/clk/ingenic/jz4770-cgu.c
> 
>  v2: Make structures static const
>  v3: <dt-bindings/clock/jz4770-cgu.h> is now added in a separate patch
>  v4: No change
>  v5: Use SPDX license identifier
>  v6: No change
> 
> diff --git a/drivers/clk/ingenic/Makefile b/drivers/clk/ingenic/Makefile
> index cd47b0664c2b..1456e4cdb562 100644
> --- a/drivers/clk/ingenic/Makefile
> +++ b/drivers/clk/ingenic/Makefile
> @@ -1,3 +1,4 @@
>  obj-y				+= cgu.o
>  obj-$(CONFIG_MACH_JZ4740)	+= jz4740-cgu.o
> +obj-$(CONFIG_MACH_JZ4770)	+= jz4770-cgu.o
>  obj-$(CONFIG_MACH_JZ4780)	+= jz4780-cgu.o
> diff --git a/drivers/clk/ingenic/jz4770-cgu.c b/drivers/clk/ingenic/jz4770-cgu.c
> new file mode 100644
> index 000000000000..c78d369b9403
> --- /dev/null
> +++ b/drivers/clk/ingenic/jz4770-cgu.c
> @@ -0,0 +1,483 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * JZ4770 SoC CGU driver
> + * Copyright 2018, Paul Cercueil <paul@crapouillou.net>
> + */
> +
> +#include <linux/bitops.h>
> +#include <linux/clk-provider.h>
> +#include <linux/delay.h>
> +#include <linux/of.h>
> +#include <linux/syscore_ops.h>
> +#include <dt-bindings/clock/jz4770-cgu.h>
> +#include "cgu.h"
> +
> +/*
> + * CPM registers offset address definition
> + */
> +#define CGU_REG_CPCCR		0x00
> +#define CGU_REG_LCR		0x04
> +#define CGU_REG_CPPCR0		0x10
> +#define CGU_REG_CLKGR0		0x20
> +#define CGU_REG_OPCR		0x24
> +#define CGU_REG_CLKGR1		0x28
> +#define CGU_REG_CPPCR1		0x30
> +#define CGU_REG_USBPCR1		0x48
> +#define CGU_REG_USBCDR		0x50
> +#define CGU_REG_I2SCDR		0x60
> +#define CGU_REG_LPCDR		0x64
> +#define CGU_REG_MSC0CDR		0x68
> +#define CGU_REG_UHCCDR		0x6c
> +#define CGU_REG_SSICDR		0x74
> +#define CGU_REG_CIMCDR		0x7c
> +#define CGU_REG_GPSCDR		0x80
> +#define CGU_REG_PCMCDR		0x84
> +#define CGU_REG_GPUCDR		0x88
> +#define CGU_REG_MSC1CDR		0xA4
> +#define CGU_REG_MSC2CDR		0xA8
> +#define CGU_REG_BCHCDR		0xAC
> +
> +/* bits within the LCR register */
> +#define LCR_LPM			BIT(0)		/* Low Power Mode */
> +
> +/* bits within the OPCR register */
> +#define OPCR_SPENDH		BIT(5)		/* UHC PHY suspend */
> +#define OPCR_SPENDN		BIT(7)		/* OTG PHY suspend */
> +
> +/* bits within the USBPCR1 register */
> +#define USBPCR1_UHC_POWER	BIT(5)		/* UHC PHY power down */
> +
> +static struct ingenic_cgu *cgu;
> +
> +static int jz4770_uhc_phy_enable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	writel(readl(reg_opcr) & ~OPCR_SPENDH, reg_opcr);
> +	writel(readl(reg_usbpcr1) | USBPCR1_UHC_POWER, reg_usbpcr1);
> +	return 0;
> +}
> +
> +static void jz4770_uhc_phy_disable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	writel(readl(reg_usbpcr1) & ~USBPCR1_UHC_POWER, reg_usbpcr1);
> +	writel(readl(reg_opcr) | OPCR_SPENDH, reg_opcr);
> +}
> +
> +static int jz4770_uhc_phy_is_enabled(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +	void __iomem *reg_usbpcr1	= cgu->base + CGU_REG_USBPCR1;
> +
> +	return !(readl(reg_opcr) & OPCR_SPENDH) &&
> +		(readl(reg_usbpcr1) & USBPCR1_UHC_POWER);
> +}
> +
> +static const struct clk_ops jz4770_uhc_phy_ops = {
> +	.enable = jz4770_uhc_phy_enable,
> +	.disable = jz4770_uhc_phy_disable,
> +	.is_enabled = jz4770_uhc_phy_is_enabled,
> +};
> +
> +static int jz4770_otg_phy_enable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	writel(readl(reg_opcr) | OPCR_SPENDN, reg_opcr);
> +
> +	/* Wait for the clock to be stable */
> +	udelay(50);
> +	return 0;
> +}
> +
> +static void jz4770_otg_phy_disable(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	writel(readl(reg_opcr) & ~OPCR_SPENDN, reg_opcr);
> +}
> +
> +static int jz4770_otg_phy_is_enabled(struct clk_hw *hw)
> +{
> +	void __iomem *reg_opcr		= cgu->base + CGU_REG_OPCR;
> +
> +	return !!(readl(reg_opcr) & OPCR_SPENDN);
> +}
> +
> +static const struct clk_ops jz4770_otg_phy_ops = {
> +	.enable = jz4770_otg_phy_enable,
> +	.disable = jz4770_otg_phy_disable,
> +	.is_enabled = jz4770_otg_phy_is_enabled,
> +};
> +
> +static const s8 pll_od_encoding[8] = {
> +	0x0, 0x1, -1, 0x2, -1, -1, -1, 0x3,
> +};
> +
> +static const struct ingenic_cgu_clk_info jz4770_cgu_clocks[] = {
> +
> +	/* External clocks */
> +
> +	[JZ4770_CLK_EXT] = { "ext", CGU_CLK_EXT },
> +	[JZ4770_CLK_OSC32K] = { "osc32k", CGU_CLK_EXT },
> +
> +	/* PLLs */
> +
> +	[JZ4770_CLK_PLL0] = {
> +		"pll0", CGU_CLK_PLL,
> +		.parents = { JZ4770_CLK_EXT },
> +		.pll = {
> +			.reg = CGU_REG_CPPCR0,
> +			.m_shift = 24,
> +			.m_bits = 7,
> +			.m_offset = 1,
> +			.n_shift = 18,
> +			.n_bits = 5,
> +			.n_offset = 1,
> +			.od_shift = 16,
> +			.od_bits = 2,
> +			.od_max = 8,
> +			.od_encoding = pll_od_encoding,
> +			.bypass_bit = 9,
> +			.enable_bit = 8,
> +			.stable_bit = 10,
> +		},
> +	},
> +
> +	[JZ4770_CLK_PLL1] = {
> +		/* TODO: PLL1 can depend on PLL0 */
> +		"pll1", CGU_CLK_PLL,
> +		.parents = { JZ4770_CLK_EXT },
> +		.pll = {
> +			.reg = CGU_REG_CPPCR1,
> +			.m_shift = 24,
> +			.m_bits = 7,
> +			.m_offset = 1,
> +			.n_shift = 18,
> +			.n_bits = 5,
> +			.n_offset = 1,
> +			.od_shift = 16,
> +			.od_bits = 2,
> +			.od_max = 8,
> +			.od_encoding = pll_od_encoding,
> +			.enable_bit = 7,
> +			.stable_bit = 6,
> +			.no_bypass_bit = true,
> +		},
> +	},
> +
> +	/* Main clocks */
> +
> +	[JZ4770_CLK_CCLK] = {
> +		"cclk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_H0CLK] = {
> +		"h0clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_H1CLK] = {
> +		"h1clk", CGU_CLK_DIV | CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1 },
> +		.gate = { CGU_REG_LCR, 30 },
> +	},
> +	[JZ4770_CLK_H2CLK] = {
> +		"h2clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_C1CLK] = {
> +		"c1clk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1 },
> +	},
> +	[JZ4770_CLK_PCLK] = {
> +		"pclk", CGU_CLK_DIV,
> +		.parents = { JZ4770_CLK_PLL0, },
> +		.div = { CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1 },
> +	},
> +
> +	/* Those divided clocks can connect to PLL0 or PLL1 */
> +
> +	[JZ4770_CLK_MMC0_MUX] = {
> +		"mmc0_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC0CDR, 30, 1 },
> +		.div = { CGU_REG_MSC0CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC0CDR, 31 },
> +	},
> +	[JZ4770_CLK_MMC1_MUX] = {
> +		"mmc1_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC1CDR, 30, 1 },
> +		.div = { CGU_REG_MSC1CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC1CDR, 31 },
> +	},
> +	[JZ4770_CLK_MMC2_MUX] = {
> +		"mmc2_mux", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_MSC2CDR, 30, 1 },
> +		.div = { CGU_REG_MSC2CDR, 0, 1, 7, -1, -1, 31 },
> +		.gate = { CGU_REG_MSC2CDR, 31 },
> +	},
> +	[JZ4770_CLK_CIM] = {
> +		"cim", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_CIMCDR, 31, 1 },
> +		.div = { CGU_REG_CIMCDR, 0, 1, 8, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 26 },
> +	},
> +	[JZ4770_CLK_UHC] = {
> +		"uhc", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_UHCCDR, 29, 1 },
> +		.div = { CGU_REG_UHCCDR, 0, 1, 4, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 24 },
> +	},
> +	[JZ4770_CLK_GPU] = {
> +		"gpu", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, -1 },
> +		.mux = { CGU_REG_GPUCDR, 31, 1 },
> +		.div = { CGU_REG_GPUCDR, 0, 1, 3, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR1, 9 },
> +	},
> +	[JZ4770_CLK_BCH] = {
> +		"bch", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_BCHCDR, 31, 1 },
> +		.div = { CGU_REG_BCHCDR, 0, 1, 3, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 1 },
> +	},
> +	[JZ4770_CLK_LPCLK_MUX] = {
> +		"lpclk", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_LPCDR, 29, 1 },
> +		.div = { CGU_REG_LPCDR, 0, 1, 11, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 28 },
> +	},
> +	[JZ4770_CLK_GPS] = {
> +		"gps", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_PLL0, JZ4770_CLK_PLL1, },
> +		.mux = { CGU_REG_GPSCDR, 31, 1 },
> +		.div = { CGU_REG_GPSCDR, 0, 1, 4, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 22 },
> +	},
> +
> +	/* Those divided clocks can connect to EXT, PLL0 or PLL1 */
> +
> +	[JZ4770_CLK_SSI_MUX] = {
> +		"ssi_mux", CGU_CLK_DIV | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_SSICDR, 30, 2 },
> +		.div = { CGU_REG_SSICDR, 0, 1, 6, -1, -1, -1 },
> +	},
> +	[JZ4770_CLK_PCM_MUX] = {
> +		"pcm_mux", CGU_CLK_DIV | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_PCMCDR, 30, 2 },
> +		.div = { CGU_REG_PCMCDR, 0, 1, 9, -1, -1, -1 },
> +	},
> +	[JZ4770_CLK_I2S] = {
> +		"i2s", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_I2SCDR, 30, 2 },
> +		.div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR1, 13 },
> +	},
> +	[JZ4770_CLK_OTG] = {
> +		"usb", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT, -1,
> +			JZ4770_CLK_PLL0, JZ4770_CLK_PLL1 },
> +		.mux = { CGU_REG_USBCDR, 30, 2 },
> +		.div = { CGU_REG_USBCDR, 0, 1, 8, -1, -1, -1 },
> +		.gate = { CGU_REG_CLKGR0, 2 },
> +	},
> +
> +	/* Gate-only clocks */
> +
> +	[JZ4770_CLK_SSI0] = {
> +		"ssi0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 4 },
> +	},
> +	[JZ4770_CLK_SSI1] = {
> +		"ssi1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 19 },
> +	},
> +	[JZ4770_CLK_SSI2] = {
> +		"ssi2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_SSI_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 20 },
> +	},
> +	[JZ4770_CLK_PCM0] = {
> +		"pcm0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PCM_MUX, },
> +		.gate = { CGU_REG_CLKGR1, 8 },
> +	},
> +	[JZ4770_CLK_PCM1] = {
> +		"pcm1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_PCM_MUX, },
> +		.gate = { CGU_REG_CLKGR1, 10 },
> +	},
> +	[JZ4770_CLK_DMA] = {
> +		"dma", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H2CLK, },
> +		.gate = { CGU_REG_CLKGR0, 21 },
> +	},
> +	[JZ4770_CLK_I2C0] = {
> +		"i2c0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 5 },
> +	},
> +	[JZ4770_CLK_I2C1] = {
> +		"i2c1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 6 },
> +	},
> +	[JZ4770_CLK_I2C2] = {
> +		"i2c2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR1, 15 },
> +	},
> +	[JZ4770_CLK_UART0] = {
> +		"uart0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 15 },
> +	},
> +	[JZ4770_CLK_UART1] = {
> +		"uart1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 16 },
> +	},
> +	[JZ4770_CLK_UART2] = {
> +		"uart2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 17 },
> +	},
> +	[JZ4770_CLK_UART3] = {
> +		"uart3", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 18 },
> +	},
> +	[JZ4770_CLK_IPU] = {
> +		"ipu", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H0CLK, },
> +		.gate = { CGU_REG_CLKGR0, 29 },
> +	},
> +	[JZ4770_CLK_ADC] = {
> +		"adc", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 14 },
> +	},
> +	[JZ4770_CLK_AIC] = {
> +		"aic", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_EXT, },
> +		.gate = { CGU_REG_CLKGR0, 8 },
> +	},
> +	[JZ4770_CLK_AUX] = {
> +		"aux", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_C1CLK, },
> +		.gate = { CGU_REG_CLKGR1, 14 },
> +	},
> +	[JZ4770_CLK_VPU] = {
> +		"vpu", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_H1CLK, },
> +		.gate = { CGU_REG_CLKGR1, 7 },
> +	},
> +	[JZ4770_CLK_MMC0] = {
> +		"mmc0", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC0_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 3 },
> +	},
> +	[JZ4770_CLK_MMC1] = {
> +		"mmc1", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC1_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 11 },
> +	},
> +	[JZ4770_CLK_MMC2] = {
> +		"mmc2", CGU_CLK_GATE,
> +		.parents = { JZ4770_CLK_MMC2_MUX, },
> +		.gate = { CGU_REG_CLKGR0, 12 },
> +	},
> +
> +	/* Custom clocks */
> +
> +	[JZ4770_CLK_UHC_PHY] = {
> +		"uhc_phy", CGU_CLK_CUSTOM,
> +		.parents = { JZ4770_CLK_UHC, -1, -1, -1 },
> +		.custom = { &jz4770_uhc_phy_ops },
> +	},
> +	[JZ4770_CLK_OTG_PHY] = {
> +		"usb_phy", CGU_CLK_CUSTOM,
> +		.parents = { JZ4770_CLK_OTG, -1, -1, -1 },
> +		.custom = { &jz4770_otg_phy_ops },
> +	},
> +
> +	[JZ4770_CLK_EXT512] = {
> +		"ext/512", CGU_CLK_FIXDIV,
> +		.parents = { JZ4770_CLK_EXT },
> +		.fixdiv = { 512 },
> +	},
> +
> +	[JZ4770_CLK_RTC] = {
> +		"rtc", CGU_CLK_MUX,
> +		.parents = { JZ4770_CLK_EXT512, JZ4770_CLK_OSC32K, },
> +		.mux = { CGU_REG_OPCR, 2, 1},
> +	},
> +};
> +
> +#if IS_ENABLED(CONFIG_PM_SLEEP)
> +static int jz4770_cgu_pm_suspend(void)
> +{
> +	u32 val;
> +
> +	val = readl(cgu->base + CGU_REG_LCR);
> +	writel(val | LCR_LPM, cgu->base + CGU_REG_LCR);
> +	return 0;
> +}
> +
> +static void jz4770_cgu_pm_resume(void)
> +{
> +	u32 val;
> +
> +	val = readl(cgu->base + CGU_REG_LCR);
> +	writel(val & ~LCR_LPM, cgu->base + CGU_REG_LCR);
> +}
> +
> +static struct syscore_ops jz4770_cgu_pm_ops = {
> +	.suspend = jz4770_cgu_pm_suspend,
> +	.resume = jz4770_cgu_pm_resume,
> +};
> +#endif /* CONFIG_PM_SLEEP */
> +
> +static void __init jz4770_cgu_init(struct device_node *np)
> +{
> +	int retval;
> +
> +	cgu = ingenic_cgu_new(jz4770_cgu_clocks,
> +			      ARRAY_SIZE(jz4770_cgu_clocks), np);
> +	if (!cgu)
> +		pr_err("%s: failed to initialise CGU\n", __func__);
> +
> +	retval = ingenic_cgu_register_clocks(cgu);
> +	if (retval)
> +		pr_err("%s: failed to register CGU Clocks\n", __func__);
> +
> +#if IS_ENABLED(CONFIG_PM_SLEEP)
> +	register_syscore_ops(&jz4770_cgu_pm_ops);
> +#endif
> +}
> +
> +/* We only probe via devicetree, no need for a platform driver */
> +CLK_OF_DECLARE(jz4770_cgu, "ingenic,jz4770-cgu", jz4770_cgu_init);
> -- 
> 2.11.0
> 
> 

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2018-01-10 21:38 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-02 15:08 [PATCH v5 01/15] clk: ingenic: Use const pointer to clk_ops in struct Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 02/15] clk: ingenic: Fix recalc_rate for clocks with fixed divider Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 03/15] clk: ingenic: support PLLs with no bypass bit Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 04/15] clk: ingenic: Add code to enable/disable PLLs Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 05/15] dt-bindings: clock: Add jz4770-cgu.h header Paul Cercueil
2018-01-05 16:34   ` Rob Herring
2018-01-05 16:34     ` Rob Herring
2018-01-02 15:08 ` [PATCH v5 06/15] clk: Add Ingenic jz4770 CGU driver Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 07/15] MIPS: Setup boot_command_line before plat_mem_setup Paul Cercueil
2018-01-02 17:05   ` Mathieu Malaterre
2018-01-02 15:08 ` [PATCH v5 08/15] MIPS: ingenic: Use common cmdline handling code Paul Cercueil
2018-01-02 15:58   ` PrasannaKumar Muralidharan
2018-01-02 15:58     ` PrasannaKumar Muralidharan
2018-01-02 15:08 ` [PATCH v5 09/15] MIPS: platform: add machtype IDs for more Ingenic SoCs Paul Cercueil
2018-01-02 15:59   ` PrasannaKumar Muralidharan
2018-01-02 15:59     ` PrasannaKumar Muralidharan
2018-01-02 15:08 ` [PATCH v5 10/15] MIPS: ingenic: Add machine info for supported boards Paul Cercueil
2018-01-02 16:02   ` PrasannaKumar Muralidharan
2018-01-02 16:32     ` Paul Cercueil
2018-01-02 16:32       ` Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 11/15] MIPS: ingenic: Initial JZ4770 support Paul Cercueil
2018-01-02 16:09   ` PrasannaKumar Muralidharan
2018-01-02 16:09     ` PrasannaKumar Muralidharan
2018-01-02 15:08 ` [PATCH v5 12/15] MIPS: JZ4770: Work around config2 misreporting associativity Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 13/15] MIPS: JZ4770: Workaround for corrupted DMA transfers Paul Cercueil
2018-01-02 15:08   ` Paul Cercueil
2018-01-02 16:45   ` PrasannaKumar Muralidharan
2018-01-05 18:03     ` Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 14/15] devicetree/bindings: Add GCW vendor prefix Paul Cercueil
2018-01-02 15:08 ` [PATCH v5 15/15] MIPS: ingenic: Initial GCW Zero support Paul Cercueil
2018-01-02 17:04   ` Mathieu Malaterre
2018-01-05 18:24 ` [PATCH v6 00/15] JZ4770 SoC support Paul Cercueil
2018-01-05 18:24   ` [PATCH v6 01/15] clk: ingenic: Use const pointer to clk_ops in struct Paul Cercueil
2018-01-16 15:47     ` [PATCH v7 00/14] JZ4770 and GCW0 patchset Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 01/14] clk: ingenic: Use const pointer to clk_ops in struct Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 02/14] clk: ingenic: Fix recalc_rate for clocks with fixed divider Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 03/14] clk: ingenic: support PLLs with no bypass bit Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 04/14] clk: ingenic: Add code to enable/disable PLLs Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 05/14] dt-bindings: clock: Add jz4770-cgu.h header Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 06/14] clk: Add Ingenic jz4770 CGU driver Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 07/14] MIPS: Setup boot_command_line before plat_mem_setup Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 08/14] MIPS: ingenic: Use common cmdline handling code Paul Cercueil
2018-01-16 15:47       ` [PATCH v7 09/14] MIPS: platform: add machtype IDs for more Ingenic SoCs Paul Cercueil
2018-01-16 15:48       ` [PATCH v7 10/14] MIPS: ingenic: Detect machtype from SoC compatible string Paul Cercueil
2018-01-16 22:06         ` James Hogan
2018-01-16 15:48       ` [PATCH v7 11/14] MIPS: ingenic: Initial JZ4770 support Paul Cercueil
2018-01-17 21:28         ` James Hogan
2018-01-17 21:28           ` James Hogan
2018-01-18 17:14           ` Paul Cercueil
2018-01-18 20:30             ` James Hogan
2018-01-18 20:30               ` James Hogan
2018-01-16 15:48       ` [PATCH v7 12/14] MIPS: JZ4770: Work around config2 misreporting associativity Paul Cercueil
2018-01-16 15:48       ` [PATCH v7 13/14] devicetree/bindings: Add GCW vendor prefix Paul Cercueil
2018-01-16 15:48       ` [PATCH v7 14/14] MIPS: ingenic: Initial GCW Zero support Paul Cercueil
2018-02-01 15:31       ` [PATCH v7 00/14] JZ4770 and GCW0 patchset James Hogan
2018-01-05 18:25   ` [PATCH v6 02/15] clk: ingenic: Fix recalc_rate for clocks with fixed divider Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 03/15] clk: ingenic: support PLLs with no bypass bit Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 04/15] clk: ingenic: Add code to enable/disable PLLs Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 05/15] dt-bindings: clock: Add jz4770-cgu.h header Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 06/15] clk: Add Ingenic jz4770 CGU driver Paul Cercueil
2018-01-10 21:37     ` James Hogan [this message]
2018-01-10 21:37       ` James Hogan
2018-01-05 18:25   ` [PATCH v6 07/15] MIPS: Setup boot_command_line before plat_mem_setup Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 08/15] MIPS: ingenic: Use common cmdline handling code Paul Cercueil
2018-01-10 22:16     ` James Hogan
2018-01-10 22:16       ` James Hogan
2018-01-05 18:25   ` [PATCH v6 09/15] MIPS: platform: add machtype IDs for more Ingenic SoCs Paul Cercueil
2018-01-10 22:19     ` James Hogan
2018-01-10 22:19       ` James Hogan
2018-01-05 18:25   ` [PATCH v6 10/15] MIPS: ingenic: Detect machtype from SoC compatible string Paul Cercueil
2018-01-10 22:27     ` James Hogan
2018-01-10 22:27       ` James Hogan
2018-01-16 14:06       ` Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 11/15] MIPS: ingenic: Initial JZ4770 support Paul Cercueil
2018-01-10 22:42     ` James Hogan
2018-01-10 22:42       ` James Hogan
2018-01-05 18:25   ` [PATCH v6 12/15] MIPS: JZ4770: Work around config2 misreporting associativity Paul Cercueil
2018-01-10 22:52     ` James Hogan
2018-01-10 22:52       ` James Hogan
2018-01-05 18:25   ` [PATCH v6 13/15] MIPS: JZ4770: Workaround for corrupted DMA transfers Paul Cercueil
2018-01-10 23:20     ` James Hogan
2018-01-10 23:20       ` James Hogan
2018-01-16 14:10       ` Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 14/15] devicetree/bindings: Add GCW vendor prefix Paul Cercueil
2018-01-05 18:25   ` [PATCH v6 15/15] MIPS: ingenic: Initial GCW Zero support Paul Cercueil
2018-01-07 16:18     ` Philippe Ombredanne
2018-01-10 22:59       ` Paul Cercueil
2018-01-23 10:31         ` Philippe Ombredanne

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=20180110213713.GR27409@jhogan-linux.mipstec.com \
    --to=james.hogan@mips.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=maarten@treewalker.org \
    --cc=paul.burton@mips.com \
    --cc=paul@crapouillou.net \
    --cc=ralf@linux-mips.org \
    /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.