From: Paul Cercueil <paul@crapouillou.net>
To: Zhou Yanjie <zhouyanjie@wanyeetech.com>
Cc: Michael Turquette <mturquette@baylibre.com>,
Stephen Boyd <sboyd@kernel.org>, Rob Herring <robh+dt@kernel.org>,
od@zcrc.me, linux-clk@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mips@vger.kernel.org
Subject: Re: [PATCH 6/6] clk: ingenic: Add support for the JZ4760
Date: Mon, 22 Mar 2021 17:40:20 +0000 [thread overview]
Message-ID: <83TDQQ.FC04M4R63ME53@crapouillou.net> (raw)
In-Reply-To: <dbd5bea3-a693-cbb6-c411-f164f8f0452f@wanyeetech.com>
Hi Zhou,
Le mer. 17 mars 2021 à 20:41, Zhou Yanjie <zhouyanjie@wanyeetech.com>
a écrit :
> Hi Paul,
>
> On 2021/3/7 下午10:17, Paul Cercueil wrote:
>> Add the CGU code and the compatible string to the TCU driver to
>> support
>> the JZ4760 SoC.
>>
>> Signed-off-by: Paul Cercueil <paul@crapouillou.net>
>> ---
>> drivers/clk/ingenic/Kconfig | 10 +
>> drivers/clk/ingenic/Makefile | 1 +
>> drivers/clk/ingenic/jz4760-cgu.c | 433
>> +++++++++++++++++++++++++
>> drivers/clk/ingenic/tcu.c | 2 +
>> include/dt-bindings/clock/jz4760-cgu.h | 54 +++
>> 5 files changed, 500 insertions(+)
>> create mode 100644 drivers/clk/ingenic/jz4760-cgu.c
>> create mode 100644 include/dt-bindings/clock/jz4760-cgu.h
>>
>> diff --git a/drivers/clk/ingenic/Kconfig
>> b/drivers/clk/ingenic/Kconfig
>> index 580b0cf69ed5..898f1bc478c9 100644
>> --- a/drivers/clk/ingenic/Kconfig
>> +++ b/drivers/clk/ingenic/Kconfig
>> @@ -25,6 +25,16 @@ config INGENIC_CGU_JZ4725B
>> \x7f If building for a JZ4725B SoC, you want to say Y here.
>> \x7f+config INGENIC_CGU_JZ4760
>> + bool "Ingenic JZ4760 CGU driver"
>> + default MACH_JZ4760
>> + select INGENIC_CGU_COMMON
>> + help
>> + Support the clocks provided by the CGU hardware on Ingenic JZ4760
>> + and compatible SoCs.
>> +
>> + If building for a JZ4760 SoC, you want to say Y here.
>> +
>> config INGENIC_CGU_JZ4770
>> bool "Ingenic JZ4770 CGU driver"
>> default MACH_JZ4770
>> diff --git a/drivers/clk/ingenic/Makefile
>> b/drivers/clk/ingenic/Makefile
>> index aaa4bffe03c6..9edfaf4610b9 100644
>> --- a/drivers/clk/ingenic/Makefile
>> +++ b/drivers/clk/ingenic/Makefile
>> @@ -2,6 +2,7 @@
>> obj-$(CONFIG_INGENIC_CGU_COMMON) += cgu.o pm.o
>> obj-$(CONFIG_INGENIC_CGU_JZ4740) += jz4740-cgu.o
>> obj-$(CONFIG_INGENIC_CGU_JZ4725B) += jz4725b-cgu.o
>> +obj-$(CONFIG_INGENIC_CGU_JZ4760) += jz4760-cgu.o
>> obj-$(CONFIG_INGENIC_CGU_JZ4770) += jz4770-cgu.o
>> obj-$(CONFIG_INGENIC_CGU_JZ4780) += jz4780-cgu.o
>> obj-$(CONFIG_INGENIC_CGU_X1000) += x1000-cgu.o
>> diff --git a/drivers/clk/ingenic/jz4760-cgu.c
>> b/drivers/clk/ingenic/jz4760-cgu.c
>> new file mode 100644
>> index 000000000000..a45327cba7d1
>> --- /dev/null
>> +++ b/drivers/clk/ingenic/jz4760-cgu.c
>> @@ -0,0 +1,433 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * JZ4760 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/io.h>
>> +#include <linux/of.h>
>> +
>> +#include <linux/clk.h>
>> +
>> +#include <dt-bindings/clock/jz4760-cgu.h>
>> +
>> +#include "cgu.h"
>> +#include "pm.h"
>> +
>> +#define MHZ (1000 * 1000)
>> +
>> +/*
>> + * 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_USBPCR 0x3c
>> +#define CGU_REG_USBCDR 0x50
>> +#define CGU_REG_I2SCDR 0x60
>> +#define CGU_REG_LPCDR 0x64
>> +#define CGU_REG_MSCCDR 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
>> +
>> +static const s8 pll_od_encoding[8] = {
>> + 0x0, 0x1, -1, 0x2, -1, -1, -1, 0x3,
>> +};
>> +
>> +static const u8 jz4760_cgu_cpccr_div_table[] = {
>> + 1, 2, 3, 4, 6, 8,
>> +};
>> +
>> +static const u8 jz4760_cgu_pll_half_div_table[] = {
>> + 2, 1,
>> +};
>> +
>> +static void
>> +jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info,
>> + unsigned long rate, unsigned long parent_rate,
>> + unsigned int *pm, unsigned int *pn, unsigned int *pod)
>> +{
>> + unsigned int m, n, od;
>> +
>> + /* The output of the PLL must be between 500 and 1500 MHz. */
>> + rate = clamp_val(rate, 500ul * MHZ, 1500ul * MHZ);
>> +
>> + /* The frequency after the N divider must be between 1 and 50 MHz.
>> */
>> + n = parent_rate / (1 * MHZ);
>> +
>> + /* The N divider must be >= 2. */
>> + n = clamp_val(n, 2, 1 << pll_info->n_bits);
>> +
>> + for (;;) {
>> + od = 0;
>> +
>> + do {
>> + m = (rate / MHZ) * ++od * n / (parent_rate / MHZ);
>
>
> Please correct me if I am wrong, according to the PM, when the
> register value of OD is 0, 1, 2, 3, the value corresponding
> participating PL frequency calculation is 1, 2, 4, 8. Therefore,
> change
>
> m = (rate / MHZ) * ++od * n / (parent_rate / MHZ); to m = (rate /
> MHZ) * (2 ^ od++) * n / (parent_rate / MHZ); seems to be more
> appropriate, it can avoid 3, 5, 6, and 7 that should not exist.
You are totally correct. I will send a revised version.
Thanks!
Cheers,
-Paul
>> + } while (m < pll_info->m_offset || m & 1);
>> +
>> + if (m <= (1 << pll_info->m_bits) - 2)
>> + break;
>> +
>> + n >>= 1;
>> + }
>> +
>> + *pm = m;
>> + *pn = n;
>> + *pod = od;
>
>
> If we change the above formula, we also need to change this to *pod =
> 2 ^ od;
>
>
> Thanks and best regards!
>
>
>> +}
>> +
>> +static const struct ingenic_cgu_clk_info jz4760_cgu_clocks[] = {
>> +
>> + /* External clocks */
>> +
>> + [JZ4760_CLK_EXT] = { "ext", CGU_CLK_EXT },
>> + [JZ4760_CLK_OSC32K] = { "osc32k", CGU_CLK_EXT },
>> +
>> + /* PLLs */
>> +
>> + [JZ4760_CLK_PLL0] = {
>> + "pll0", CGU_CLK_PLL,
>> + .parents = { JZ4760_CLK_EXT },
>> + .pll = {
>> + .reg = CGU_REG_CPPCR0,
>> + .rate_multiplier = 1,
>> + .m_shift = 23,
>> + .m_bits = 8,
>> + .m_offset = 0,
>> + .n_shift = 18,
>> + .n_bits = 4,
>> + .n_offset = 0,
>> + .od_shift = 16,
>> + .od_bits = 2,
>> + .od_max = 8,
>> + .od_encoding = pll_od_encoding,
>> + .bypass_reg = CGU_REG_CPPCR0,
>> + .bypass_bit = 9,
>> + .enable_bit = 8,
>> + .stable_bit = 10,
>> + .calc_m_n_od = jz4760_cgu_calc_m_n_od,
>> + },
>> + },
>> +
>> + [JZ4760_CLK_PLL1] = {
>> + /* TODO: PLL1 can depend on PLL0 */
>> + "pll1", CGU_CLK_PLL,
>> + .parents = { JZ4760_CLK_EXT },
>> + .pll = {
>> + .reg = CGU_REG_CPPCR1,
>> + .rate_multiplier = 1,
>> + .m_shift = 23,
>> + .m_bits = 8,
>> + .m_offset = 0,
>> + .n_shift = 18,
>> + .n_bits = 4,
>> + .n_offset = 0,
>> + .od_shift = 16,
>> + .od_bits = 2,
>> + .od_max = 8,
>> + .od_encoding = pll_od_encoding,
>> + .bypass_bit = -1,
>> + .enable_bit = 7,
>> + .stable_bit = 6,
>> + .calc_m_n_od = jz4760_cgu_calc_m_n_od,
>> + },
>> + },
>> +
>> + /* Main clocks */
>> +
>> + [JZ4760_CLK_CCLK] = {
>> + "cclk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> + [JZ4760_CLK_HCLK] = {
>> + "hclk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> + [JZ4760_CLK_SCLK] = {
>> + "sclk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> + [JZ4760_CLK_H2CLK] = {
>> + "h2clk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> + [JZ4760_CLK_MCLK] = {
>> + "mclk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> + [JZ4760_CLK_PCLK] = {
>> + "pclk", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0, },
>> + .div = {
>> + CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1, 0,
>> + jz4760_cgu_cpccr_div_table,
>> + },
>> + },
>> +
>> + /* Divided clocks */
>> +
>> + [JZ4760_CLK_PLL0_HALF] = {
>> + "pll0_half", CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_PLL0 },
>> + .div = {
>> + CGU_REG_CPCCR, 21, 1, 1, 22, -1, -1, 0,
>> + jz4760_cgu_pll_half_div_table,
>> + },
>> + },
>> +
>> + /* Those divided clocks can connect to PLL0 or PLL1 */
>> +
>> + [JZ4760_CLK_UHC] = {
>> + "uhc", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1, },
>> + .mux = { CGU_REG_UHCCDR, 31, 1 },
>> + .div = { CGU_REG_UHCCDR, 0, 1, 4, -1, -1, -1 },
>> + .gate = { CGU_REG_CLKGR0, 24 },
>> + },
>> + [JZ4760_CLK_GPU] = {
>> + "gpu", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1, },
>> + .mux = { CGU_REG_GPUCDR, 31, 1 },
>> + .div = { CGU_REG_GPUCDR, 0, 1, 3, -1, -1, -1 },
>> + .gate = { CGU_REG_CLKGR1, 9 },
>> + },
>> + [JZ4760_CLK_LPCLK_DIV] = {
>> + "lpclk_div", CGU_CLK_DIV | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1, },
>> + .mux = { CGU_REG_LPCDR, 29, 1 },
>> + .div = { CGU_REG_LPCDR, 0, 1, 11, -1, -1, -1 },
>> + },
>> + [JZ4760_CLK_TVE] = {
>> + "tve", CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_LPCLK_DIV, JZ4760_CLK_EXT, },
>> + .mux = { CGU_REG_LPCDR, 31, 1 },
>> + .gate = { CGU_REG_CLKGR0, 27 },
>> + },
>> + [JZ4760_CLK_LPCLK] = {
>> + "lpclk", CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_LPCLK_DIV, JZ4760_CLK_TVE, },
>> + .mux = { CGU_REG_LPCDR, 30, 1 },
>> + .gate = { CGU_REG_CLKGR0, 28 },
>> + },
>> + [JZ4760_CLK_GPS] = {
>> + "gps", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_PLL0_HALF, JZ4760_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 */
>> +
>> + [JZ4760_CLK_PCM] = {
>> + "pcm", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_EXT, -1,
>> + JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1 },
>> + .mux = { CGU_REG_PCMCDR, 30, 2 },
>> + .div = { CGU_REG_PCMCDR, 0, 1, 9, -1, -1, -1, BIT(0) },
>> + .gate = { CGU_REG_CLKGR1, 8 },
>> + },
>> + [JZ4760_CLK_I2S] = {
>> + "i2s", CGU_CLK_DIV | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_EXT, -1,
>> + JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1 },
>> + .mux = { CGU_REG_I2SCDR, 30, 2 },
>> + .div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1, BIT(0) },
>> + },
>> + [JZ4760_CLK_OTG] = {
>> + "usb", CGU_CLK_DIV | CGU_CLK_GATE | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_EXT, -1,
>> + JZ4760_CLK_PLL0_HALF, JZ4760_CLK_PLL1 },
>> + .mux = { CGU_REG_USBCDR, 30, 2 },
>> + .div = { CGU_REG_USBCDR, 0, 1, 8, -1, -1, -1 },
>> + .gate = { CGU_REG_CLKGR0, 2 },
>> + },
>> +
>> + /* Those divided clocks can connect to EXT or PLL0 */
>> + [JZ4760_CLK_MMC_MUX] = {
>> + "mmc_mux", CGU_CLK_MUX | CGU_CLK_DIV,
>> + .parents = { JZ4760_CLK_EXT, JZ4760_CLK_PLL0_HALF, },
>> + .mux = { CGU_REG_MSCCDR, 31, 1 },
>> + .div = { CGU_REG_MSCCDR, 0, 1, 6, -1, -1, -1, BIT(0) },
>> + },
>> + [JZ4760_CLK_SSI_MUX] = {
>> + "ssi_mux", CGU_CLK_DIV | CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_EXT, JZ4760_CLK_PLL0_HALF, },
>> + .mux = { CGU_REG_SSICDR, 31, 1 },
>> + .div = { CGU_REG_SSICDR, 0, 1, 6, -1, -1, -1, BIT(0) },
>> + },
>> +
>> + /* These divided clock can connect to PLL0 only */
>> + [JZ4760_CLK_CIM] = {
>> + "cim", CGU_CLK_DIV | CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_PLL0_HALF },
>> + .div = { CGU_REG_CIMCDR, 0, 1, 8, -1, -1, -1 },
>> + .gate = { CGU_REG_CLKGR0, 26 },
>> + },
>> +
>> + /* Gate-only clocks */
>> +
>> + [JZ4760_CLK_SSI0] = {
>> + "ssi0", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_SSI_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 4 },
>> + },
>> + [JZ4760_CLK_SSI1] = {
>> + "ssi1", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_SSI_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 19 },
>> + },
>> + [JZ4760_CLK_SSI2] = {
>> + "ssi2", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_SSI_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 20 },
>> + },
>> + [JZ4760_CLK_DMA] = {
>> + "dma", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_H2CLK, },
>> + .gate = { CGU_REG_CLKGR0, 21 },
>> + },
>> + [JZ4760_CLK_I2C0] = {
>> + "i2c0", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 5 },
>> + },
>> + [JZ4760_CLK_I2C1] = {
>> + "i2c1", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 6 },
>> + },
>> + [JZ4760_CLK_UART0] = {
>> + "uart0", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 15 },
>> + },
>> + [JZ4760_CLK_UART1] = {
>> + "uart1", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 16 },
>> + },
>> + [JZ4760_CLK_UART2] = {
>> + "uart2", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 17 },
>> + },
>> + [JZ4760_CLK_UART3] = {
>> + "uart3", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 18 },
>> + },
>> + [JZ4760_CLK_IPU] = {
>> + "ipu", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_HCLK, },
>> + .gate = { CGU_REG_CLKGR0, 29 },
>> + },
>> + [JZ4760_CLK_ADC] = {
>> + "adc", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 14 },
>> + },
>> + [JZ4760_CLK_AIC] = {
>> + "aic", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_EXT, },
>> + .gate = { CGU_REG_CLKGR0, 8 },
>> + },
>> + [JZ4760_CLK_VPU] = {
>> + "vpu", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_HCLK, },
>> + .gate = { CGU_REG_LCR, 30, false, 150 },
>> + },
>> + [JZ4760_CLK_MMC0] = {
>> + "mmc0", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_MMC_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 3 },
>> + },
>> + [JZ4760_CLK_MMC1] = {
>> + "mmc1", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_MMC_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 11 },
>> + },
>> + [JZ4760_CLK_MMC2] = {
>> + "mmc2", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_MMC_MUX, },
>> + .gate = { CGU_REG_CLKGR0, 12 },
>> + },
>> + [JZ4760_CLK_UHC_PHY] = {
>> + "uhc_phy", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_UHC, },
>> + .gate = { CGU_REG_OPCR, 5 },
>> + },
>> + [JZ4760_CLK_OTG_PHY] = {
>> + "usb_phy", CGU_CLK_GATE,
>> + .parents = { JZ4760_CLK_OTG },
>> + .gate = { CGU_REG_OPCR, 7, true, 50 },
>> + },
>> +
>> + /* Custom clocks */
>> + [JZ4760_CLK_EXT512] = {
>> + "ext/512", CGU_CLK_FIXDIV,
>> + .parents = { JZ4760_CLK_EXT },
>> + .fixdiv = { 512 },
>> + },
>> + [JZ4760_CLK_RTC] = {
>> + "rtc", CGU_CLK_MUX,
>> + .parents = { JZ4760_CLK_EXT512, JZ4760_CLK_OSC32K, },
>> + .mux = { CGU_REG_OPCR, 2, 1},
>> + },
>> +};
>> +
>> +static void __init jz4760_cgu_init(struct device_node *np)
>> +{
>> + struct ingenic_cgu *cgu;
>> + int retval;
>> +
>> + cgu = ingenic_cgu_new(jz4760_cgu_clocks,
>> + ARRAY_SIZE(jz4760_cgu_clocks), np);
>> + if (!cgu) {
>> + pr_err("%s: failed to initialise CGU\n", __func__);
>> + return;
>> + }
>> +
>> + retval = ingenic_cgu_register_clocks(cgu);
>> + if (retval)
>> + pr_err("%s: failed to register CGU Clocks\n", __func__);
>> +
>> + ingenic_cgu_register_syscore_ops(cgu);
>> +}
>> +
>> +/* We only probe via devicetree, no need for a platform driver */
>> +CLK_OF_DECLARE_DRIVER(jz4760_cgu, "ingenic,jz4760-cgu",
>> jz4760_cgu_init);
>> +
>> +/* JZ4760B has some small differences, but we don't implement them.
>> */
>> +CLK_OF_DECLARE_DRIVER(jz4760b_cgu, "ingenic,jz4760b-cgu",
>> jz4760_cgu_init);
>> diff --git a/drivers/clk/ingenic/tcu.c b/drivers/clk/ingenic/tcu.c
>> index 9382dc3aa27e..77acfbeb4830 100644
>> --- a/drivers/clk/ingenic/tcu.c
>> +++ b/drivers/clk/ingenic/tcu.c
>> @@ -326,6 +326,7 @@ static const struct ingenic_soc_info
>> x1000_soc_info = {
>> static const struct of_device_id __maybe_unused
>> ingenic_tcu_of_match[] __initconst = {
>> { .compatible = "ingenic,jz4740-tcu", .data = &jz4740_soc_info, },
>> { .compatible = "ingenic,jz4725b-tcu", .data = &jz4725b_soc_info,
>> },
>> + { .compatible = "ingenic,jz4760-tcu", .data = &jz4770_soc_info, },
>> { .compatible = "ingenic,jz4770-tcu", .data = &jz4770_soc_info, },
>> { .compatible = "ingenic,x1000-tcu", .data = &x1000_soc_info, },
>> { /* sentinel */ }
>> @@ -477,5 +478,6 @@ static void __init ingenic_tcu_init(struct
>> device_node *np)
>> \x7f CLK_OF_DECLARE_DRIVER(jz4740_cgu, "ingenic,jz4740-tcu",
>> ingenic_tcu_init);
>> CLK_OF_DECLARE_DRIVER(jz4725b_cgu, "ingenic,jz4725b-tcu",
>> ingenic_tcu_init);
>> +CLK_OF_DECLARE_DRIVER(jz4760_cgu, "ingenic,jz4760-tcu",
>> ingenic_tcu_init);
>> CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-tcu",
>> ingenic_tcu_init);
>> CLK_OF_DECLARE_DRIVER(x1000_cgu, "ingenic,x1000-tcu",
>> ingenic_tcu_init);
>> diff --git a/include/dt-bindings/clock/jz4760-cgu.h
>> b/include/dt-bindings/clock/jz4760-cgu.h
>> new file mode 100644
>> index 000000000000..4bb2e19c4743
>> --- /dev/null
>> +++ b/include/dt-bindings/clock/jz4760-cgu.h
>> @@ -0,0 +1,54 @@
>> +/* SPDX-License-Identifier: GPL-2.0 */
>> +/*
>> + * This header provides clock numbers for the ingenic,jz4760-cgu DT
>> binding.
>> + */
>> +
>> +#ifndef __DT_BINDINGS_CLOCK_JZ4760_CGU_H__
>> +#define __DT_BINDINGS_CLOCK_JZ4760_CGU_H__
>> +
>> +#define JZ4760_CLK_EXT 0
>> +#define JZ4760_CLK_OSC32K 1
>> +#define JZ4760_CLK_PLL0 2
>> +#define JZ4760_CLK_PLL0_HALF 3
>> +#define JZ4760_CLK_PLL1 4
>> +#define JZ4760_CLK_CCLK 5
>> +#define JZ4760_CLK_HCLK 6
>> +#define JZ4760_CLK_SCLK 7
>> +#define JZ4760_CLK_H2CLK 8
>> +#define JZ4760_CLK_MCLK 9
>> +#define JZ4760_CLK_PCLK 10
>> +#define JZ4760_CLK_MMC_MUX 11
>> +#define JZ4760_CLK_MMC0 12
>> +#define JZ4760_CLK_MMC1 13
>> +#define JZ4760_CLK_MMC2 14
>> +#define JZ4760_CLK_CIM 15
>> +#define JZ4760_CLK_UHC 16
>> +#define JZ4760_CLK_GPU 17
>> +#define JZ4760_CLK_GPS 18
>> +#define JZ4760_CLK_SSI_MUX 19
>> +#define JZ4760_CLK_PCM 20
>> +#define JZ4760_CLK_I2S 21
>> +#define JZ4760_CLK_OTG 22
>> +#define JZ4760_CLK_SSI0 23
>> +#define JZ4760_CLK_SSI1 24
>> +#define JZ4760_CLK_SSI2 25
>> +#define JZ4760_CLK_DMA 26
>> +#define JZ4760_CLK_I2C0 27
>> +#define JZ4760_CLK_I2C1 28
>> +#define JZ4760_CLK_UART0 29
>> +#define JZ4760_CLK_UART1 30
>> +#define JZ4760_CLK_UART2 31
>> +#define JZ4760_CLK_UART3 32
>> +#define JZ4760_CLK_IPU 33
>> +#define JZ4760_CLK_ADC 34
>> +#define JZ4760_CLK_AIC 35
>> +#define JZ4760_CLK_VPU 36
>> +#define JZ4760_CLK_UHC_PHY 37
>> +#define JZ4760_CLK_OTG_PHY 38
>> +#define JZ4760_CLK_EXT512 39
>> +#define JZ4760_CLK_RTC 40
>> +#define JZ4760_CLK_LPCLK_DIV 41
>> +#define JZ4760_CLK_TVE 42
>> +#define JZ4760_CLK_LPCLK 43
>> +
>> +#endif /* __DT_BINDINGS_CLOCK_JZ4760_CGU_H__ */
next prev parent reply other threads:[~2021-03-22 17:41 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-07 14:17 [PATCH 0/6] clk: Ingenic JZ4760(B) support Paul Cercueil
2021-03-07 14:17 ` [PATCH 1/6] dt-bindings: clock: ingenic: Add ingenic,jz4760{,b}-cgu compatibles Paul Cercueil
2021-03-08 22:56 ` Rob Herring
2021-03-07 14:17 ` [PATCH 2/6] clk: Support bypassing dividers Paul Cercueil
2021-03-07 14:17 ` [PATCH 3/6] clk: ingenic: Read bypass register only when there is one Paul Cercueil
2021-03-07 14:17 ` [PATCH 4/6] clk: ingenic: Remove pll_info.no_bypass_bit Paul Cercueil
2021-03-07 14:17 ` [PATCH 5/6] clk: ingenic: Support overriding PLLs M/N/OD calc algorithm Paul Cercueil
2021-03-10 14:42 ` Zhou Yanjie
2021-03-07 14:17 ` [PATCH 6/6] clk: ingenic: Add support for the JZ4760 Paul Cercueil
2021-03-17 12:41 ` Zhou Yanjie
2021-03-22 17:40 ` Paul Cercueil [this message]
2021-03-23 15:41 ` Zhou Yanjie
2021-03-23 15:55 ` Paul Cercueil
2021-03-09 6:31 ` [PATCH 0/6] clk: Ingenic JZ4760(B) support Zhou Yanjie
2021-03-09 15:33 ` Zhou Yanjie
2021-03-10 14:40 ` Zhou Yanjie
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=83TDQQ.FC04M4R63ME53@crapouillou.net \
--to=paul@crapouillou.net \
--cc=devicetree@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=mturquette@baylibre.com \
--cc=od@zcrc.me \
--cc=robh+dt@kernel.org \
--cc=sboyd@kernel.org \
--cc=zhouyanjie@wanyeetech.com \
/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.