Skip to contentSkip to conversation

Add Ingenic JZ4755 CGU driver

PATCH In review Siarhei Volkau 4 participants 17 messages Oct 16, 2022 – Oct 18, 2022

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v2 cover Add Ingenic JZ4755 CGU driver

This patch serie adds a new JZ4755 machine type and the Clock Generation Unit (CGU) driver for the JZ4755 SoC.

Diffs from 1-st patchset:
- CGU patches splitted into its own patchset
- dual license for dt-bindings header
- acks collected

Siarhei Volkau (4):
MIPS: ingenic: add new machine type MACH_JZ4755
dt-bindings: ingenic: Add support for the JZ4755 CGU
dt-bindings: clock: Add Ingenic JZ4755 CGU header
clk: Add Ingenic JZ4755 CGU driver

 .../bindings/clock/ingenic,cgu.yaml           |   2 +
 arch/mips/ingenic/Kconfig                     |   5 +
 drivers/clk/ingenic/Kconfig                   |  10 +
 drivers/clk/ingenic/Makefile                  |   1 +
 drivers/clk/ingenic/jz4755-cgu.c              | 350 ++++++++++++++++++
 .../dt-bindings/clock/ingenic,jz4755-cgu.h    |  49 +++
 6 files changed, 417 insertions(+)
 create mode 100644 drivers/clk/ingenic/jz4755-cgu.c
 create mode 100644 include/dt-bindings/clock/ingenic,jz4755-cgu.h
Signature · 1 line
2.36.1
#1 lore raw

PATCH v2 1/4 MIPS: ingenic: add new machine type MACH_JZ4755

which is close to jz4725b because it is actually a low price successor of the jz4755.
It has the same MIPS32r1 core with Xburst(R) extension MXU version 1 release 2.

---
 arch/mips/ingenic/Kconfig | 5 +++++
 1 file changed, 5 insertions(+)
arch/mips/ingenic/Kconfig +5 -0
index f595b339a..edd84cf13 100644
@@ -4,6 +4,7 @@ config MACH_INGENIC_GENERIC
 	bool
 	select MACH_INGENIC
 	select MACH_JZ4740
+	select MACH_JZ4755
 	select MACH_JZ4725B
 	select MACH_JZ4770
 	select MACH_JZ4780
@@ -53,6 +54,10 @@ config MACH_JZ4740
 	bool
 	select SYS_HAS_CPU_MIPS32_R1
 
+config MACH_JZ4755
+	bool
+	select SYS_HAS_CPU_MIPS32_R1
+
 config MACH_JZ4770
 	bool
 	select MIPS_CPU_SCACHE
Signature · 1 line
2.36.1
maintainer
#2 lore raw

Re: [PATCH v2 1/4] MIPS: ingenic: add new machine type MACH_JZ4755

Hi Siarhei,

Quoted 6 lines · Siarhei Volkau

which is close to jz4725b because it is actually a low price successor of the jz4755.
It has the same MIPS32r1 core with Xburst(R) extension MXU version 1 release 2.

This patch doesn't really belong in the CGU patchset. It should go through the MIPS tree.

I see why you include it, but you do not need to have the MACH_JZ4755 symbol defined anywhere for the "default MACH_JZ4755" to work, it will just default to false until the patchset that adds JZ4755 support is merged in the MIPS tree.

Cheers,
-Paul

Quoted 30 lines
---
 arch/mips/ingenic/Kconfig | 5 +++++
 1 file changed, 5 insertions(+)
arch/mips/ingenic/Kconfig +5 -1
index f595b339a..edd84cf13 100644
@@ -4,6 +4,7 @@ config MACH_INGENIC_GENERIC
 	bool
 	select MACH_INGENIC
 	select MACH_JZ4740
+	select MACH_JZ4755
 	select MACH_JZ4725B
 	select MACH_JZ4770
 	select MACH_JZ4780
@@ -53,6 +54,10 @@ config MACH_JZ4740
 	bool
 	select SYS_HAS_CPU_MIPS32_R1
 
+config MACH_JZ4755
+	bool
+	select SYS_HAS_CPU_MIPS32_R1
+
 config MACH_JZ4770
 	bool
 	select MIPS_CPU_SCACHE
--

2.36.1

#3 lore raw

Re: [PATCH v2 1/4] MIPS: ingenic: add new machine type MACH_JZ4755

пн, 17 окт. 2022 г. в 12:10, Paul Cercueil <[email protected]>:

Quoted 4 lines

I see why you include it, but you do not need to have the MACH_JZ4755 symbol defined anywhere for the "default MACH_JZ4755" to work, it will just default to false until the patchset that adds JZ4755 support is merged in the MIPS tree.

Thank you for the clarification, Paul.
Will be done in the next version.

#4 lore raw

PATCH v2 2/4 dt-bindings: ingenic: Add support for the JZ4755 CGU

In reply to Siarhei Volkau
---
 Documentation/devicetree/bindings/clock/ingenic,cgu.yaml | 2 ++
 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/clock/ingenic,cgu.yaml +2 -0
index aa1df03ef..df256ebcd 100644
@@ -22,6 +22,7 @@ select:
         enum:
           - ingenic,jz4740-cgu
           - ingenic,jz4725b-cgu
+          - ingenic,jz4755-cgu
           - ingenic,jz4760-cgu
           - ingenic,jz4760b-cgu
           - ingenic,jz4770-cgu
@@ -51,6 +52,7 @@ properties:
       - enum:
           - ingenic,jz4740-cgu
           - ingenic,jz4725b-cgu
+          - ingenic,jz4755-cgu
           - ingenic,jz4760-cgu
           - ingenic,jz4760b-cgu
           - ingenic,jz4770-cgu
Signature · 1 line
2.36.1
#6 lore raw

PATCH v2 3/4 dt-bindings: clock: Add Ingenic JZ4755 CGU header

In reply to Siarhei Volkau

This will be used from the devicetree bindings to specify the clocks that should be obtained from the jz4755-cgu driver.

---
 .../dt-bindings/clock/ingenic,jz4755-cgu.h    | 49 +++++++++++++++++++
 1 file changed, 49 insertions(+)
 create mode 100644 include/dt-bindings/clock/ingenic,jz4755-cgu.h
include/dt-bindings/clock/ingenic,jz4755-cgu.h new file +49 -0
new file mode 100644
index 000000000..1ac13d61b
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause) */
+/*
+ * This header provides clock numbers for the ingenic,jz4755-cgu DT binding.
+ */
+
+#ifndef __DT_BINDINGS_CLOCK_JZ4755_CGU_H__
+#define __DT_BINDINGS_CLOCK_JZ4755_CGU_H__
+
+#define JZ4755_CLK_EXT		0
+#define JZ4755_CLK_OSC32K	1
+#define JZ4755_CLK_PLL		2
+#define JZ4755_CLK_PLL_HALF	3
+#define JZ4755_CLK_EXT_HALF	4
+#define JZ4755_CLK_CCLK		5
+#define JZ4755_CLK_H0CLK	6
+#define JZ4755_CLK_PCLK		7
+#define JZ4755_CLK_MCLK		8
+#define JZ4755_CLK_H1CLK	9
+#define JZ4755_CLK_UDC		10
+#define JZ4755_CLK_LCD		11
+#define JZ4755_CLK_UART0	12
+#define JZ4755_CLK_UART1	13
+#define JZ4755_CLK_UART2	14
+#define JZ4755_CLK_DMA		15
+#define JZ4755_CLK_MMC		16
+#define JZ4755_CLK_MMC0		17
+#define JZ4755_CLK_MMC1		18
+#define JZ4755_CLK_EXT512	19
+#define JZ4755_CLK_RTC		20
+#define JZ4755_CLK_UDC_PHY	21
+#define JZ4755_CLK_I2S		22
+#define JZ4755_CLK_SPI		23
+#define JZ4755_CLK_AIC		24
+#define JZ4755_CLK_ADC		25
+#define JZ4755_CLK_TCU		26
+#define JZ4755_CLK_BCH		27
+#define JZ4755_CLK_I2C		28
+#define JZ4755_CLK_TVE		29
+#define JZ4755_CLK_CIM		30
+#define JZ4755_CLK_AUX_CPU	31
+#define JZ4755_CLK_AHB1		32
+#define JZ4755_CLK_IDCT		33
+#define JZ4755_CLK_DB		34
+#define JZ4755_CLK_ME		35
+#define JZ4755_CLK_MC		36
+#define JZ4755_CLK_TSSI		37
+#define JZ4755_CLK_IPU		38
+
+#endif /* __DT_BINDINGS_CLOCK_JZ4755_CGU_H__ */
Signature · 1 line
2.36.1
#7 lore raw

Re: [PATCH v2 3/4] dt-bindings: clock: Add Ingenic JZ4755 CGU header

Quoted 15 lines · Siarhei Volkau

This will be used from the devicetree bindings to specify the clocks that should be obtained from the jz4755-cgu driver.

---
 .../dt-bindings/clock/ingenic,jz4755-cgu.h    | 49 +++++++++++++++++++
 1 file changed, 49 insertions(+)
 create mode 100644 include/dt-bindings/clock/ingenic,jz4755-cgu.h
include/dt-bindings/clock/ingenic,jz4755-cgu.h new file +0 -0
new file mode 100644
index 000000000..1ac13d61b

include/dt-bindings/clock/ingenic,jz4755-cgu.h line 1

Quoted 1 line
include/dt-bindings/clock/ingenic,jz4755-cgu.h new file +1 -0
@@ -0,0 +1,49 @@
+/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-2-Clause) */

Why did you choose 2.0+?

Best regards,
Krzysztof

#8 lore raw

Re: [PATCH v2 3/4] dt-bindings: clock: Add Ingenic JZ4755 CGU header

вс, 16 окт. 2022 г. в 18:32, Krzysztof Kozlowski
<[email protected]>:

Quoted 1 line

Why did you choose 2.0+?

It's the first time that I need to choose a license, so it's a bit confusing what
side effects they have, especially in that particular case.

What do you recommend?

BR,
Siarhei

#9 lore raw

Re: [PATCH v2 3/4] dt-bindings: clock: Add Ingenic JZ4755 CGU header

Quoted 10 lines · Siarhei Volkau

вс, 16 окт. 2022 г. в 18:32, Krzysztof Kozlowski
<[email protected]>:

Quoted 1 line

Why did you choose 2.0+?

It's the first time that I need to choose a license, so it's a bit confusing what
side effects they have, especially in that particular case.

What do you recommend?

Choice was fine, just not common so I was just wondering. You can keep it but usually we choose what the checkpatch is asking for - so GPL-2.0 (only )or BSD-2-clause.

Best regards,
Krzysztof

maintainer
#10 lore raw

Re: [PATCH v2 3/4] dt-bindings: clock: Add Ingenic JZ4755 CGU header

In reply to Siarhei Volkau
Quoted 10 lines · Siarhei Volkau

вс, 16 окт. 2022 г. в 18:32, Krzysztof Kozlowski
<[email protected]>:

Quoted 1 line

Why did you choose 2.0+?

It's the first time that I need to choose a license, so it's a bit confusing what
side effects they have, especially in that particular case.

What do you recommend?

Are you fine with GPLv4, GPLv5? Considering they haven't been written, I wouldn't be.

Rob

#11 lore raw

PATCH v2 4/4 clk: Add Ingenic JZ4755 CGU driver

In reply to Siarhei Volkau

Add support for the clocks provided by the CGU in the Ingenic JZ4755 SoC.

---
 drivers/clk/ingenic/Kconfig      |  10 +
 drivers/clk/ingenic/Makefile     |   1 +
 drivers/clk/ingenic/jz4755-cgu.c | 350 +++++++++++++++++++++++++++++++
 3 files changed, 361 insertions(+)
 create mode 100644 drivers/clk/ingenic/jz4755-cgu.c
drivers/clk/ingenic/Kconfig +10 -0
index 898f1bc47..f80ac4f29 100644
@@ -15,6 +15,16 @@ config INGENIC_CGU_JZ4740
 
 	  If building for a JZ4740 SoC, you want to say Y here.
 
+config INGENIC_CGU_JZ4755
+	bool "Ingenic JZ4755 CGU driver"
+	default MACH_JZ4755
+	select INGENIC_CGU_COMMON
+	help
+	  Support the clocks provided by the CGU hardware on Ingenic JZ4755
+	  and compatible SoCs.
+
+	  If building for a JZ4755 SoC, you want to say Y here.
+
 config INGENIC_CGU_JZ4725B
 	bool "Ingenic JZ4725B CGU driver"
 	default MACH_JZ4725B
drivers/clk/ingenic/Makefile +1 -0
index 9edfaf461..81d8e23c2 100644
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-$(CONFIG_INGENIC_CGU_COMMON)	+= cgu.o pm.o
 obj-$(CONFIG_INGENIC_CGU_JZ4740)	+= jz4740-cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4755)	+= jz4755-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
drivers/clk/ingenic/jz4755-cgu.c new file +350 -0

350 lines not on this page · raw message

Signature · 1 line
2.36.1
maintainer
#12 lore raw

Re: [PATCH v2 4/4] clk: Add Ingenic JZ4755 CGU driver

Hi Siarhei,

Quoted 268 lines · Siarhei Volkau

Add support for the clocks provided by the CGU in the Ingenic JZ4755 SoC.

---
 drivers/clk/ingenic/Kconfig      |  10 +
 drivers/clk/ingenic/Makefile     |   1 +
 drivers/clk/ingenic/jz4755-cgu.c | 350 
+++++++++++++++++++++++++++++++
 3 files changed, 361 insertions(+)
 create mode 100644 drivers/clk/ingenic/jz4755-cgu.c
drivers/clk/ingenic/Kconfig +10 -0
index 898f1bc47..f80ac4f29 100644
@@ -15,6 +15,16 @@ config INGENIC_CGU_JZ4740
 
 	  If building for a JZ4740 SoC, you want to say Y here.
 
+config INGENIC_CGU_JZ4755
+	bool "Ingenic JZ4755 CGU driver"
+	default MACH_JZ4755
+	select INGENIC_CGU_COMMON
+	help
+	  Support the clocks provided by the CGU hardware on Ingenic JZ4755
+	  and compatible SoCs.
+
+	  If building for a JZ4755 SoC, you want to say Y here.
+
 config INGENIC_CGU_JZ4725B
 	bool "Ingenic JZ4725B CGU driver"
 	default MACH_JZ4725B
drivers/clk/ingenic/Makefile +1 -0
index 9edfaf461..81d8e23c2 100644
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 obj-$(CONFIG_INGENIC_CGU_COMMON)	+= cgu.o pm.o
 obj-$(CONFIG_INGENIC_CGU_JZ4740)	+= jz4740-cgu.o
+obj-$(CONFIG_INGENIC_CGU_JZ4755)	+= jz4755-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
drivers/clk/ingenic/jz4755-cgu.c new file +217 -0
new file mode 100644
index 000000000..16728546a
@@ -0,0 +1,350 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Ingenic JZ4755 SoC CGU driver
+ * Heavily based on JZ4725b CGU driver
+ *
+ * Copyright (C) 2022 Siarhei Volkau
+ * Author: Siarhei Volkau <[email protected]>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/delay.h>
+#include <linux/of.h>
+
+#include <dt-bindings/clock/ingenic,jz4755-cgu.h>
+
+#include "cgu.h"
+#include "pm.h"
+
+/* CGU register offsets */
+#define CGU_REG_CPCCR		0x00
+#define CGU_REG_LCR		0x04
+#define CGU_REG_CPPCR		0x10
+#define CGU_REG_CLKGR		0x20
+#define CGU_REG_OPCR		0x24
+#define CGU_REG_I2SCDR		0x60
+#define CGU_REG_LPCDR		0x64
+#define CGU_REG_MSCCDR		0x68
+#define CGU_REG_SSICDR		0x74
+#define CGU_REG_CIMCDR		0x7C
+
+/* bits within the LCR register */
+#define LCR_SLEEP		BIT(0)
+
+static struct ingenic_cgu *cgu;
+
+static const s8 pll_od_encoding[4] = {
+	0x0, 0x1, -1, 0x3,
+};
+
+static const u8 jz4755_cgu_cpccr_div_table[] = {
+	1, 2, 3, 4, 6, 8,
+};
+
+static const u8 jz4755_cgu_pll_half_div_table[] = {
+	2, 1,
+};
+
+static const struct ingenic_cgu_clk_info jz4755_cgu_clocks[] = {
+
+	/* External clocks */
+
+	[JZ4755_CLK_EXT] = { "ext", CGU_CLK_EXT },
+	[JZ4755_CLK_OSC32K] = { "osc32k", CGU_CLK_EXT },
+
+	[JZ4755_CLK_PLL] = {
+		"pll", CGU_CLK_PLL,
+		.parents = { JZ4755_CLK_EXT, -1, -1, -1 },
+		.pll = {
+			.reg = CGU_REG_CPPCR,
+			.rate_multiplier = 1,
+			.m_shift = 23,
+			.m_bits = 9,
+			.m_offset = 2,
+			.n_shift = 18,
+			.n_bits = 5,
+			.n_offset = 2,
+			.od_shift = 16,
+			.od_bits = 2,
+			.od_max = 4,
+			.od_encoding = pll_od_encoding,
+			.stable_bit = 10,
+			.bypass_reg = CGU_REG_CPPCR,
+			.bypass_bit = 9,
+			.enable_bit = 8,
+		},
+	},
+
+	/* Muxes & dividers */
+
+	[JZ4755_CLK_PLL_HALF] = {
+		"pll half", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1, 0,
+			jz4755_cgu_pll_half_div_table,
+		},
+	},
+
+	[JZ4755_CLK_EXT_HALF] = {
+		"ext half", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_EXT, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 30, 1, 1, -1, -1, -1, 0,
+			NULL,
+		},
+	},
+
+	[JZ4755_CLK_CCLK] = {
+		"cclk", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
+			jz4755_cgu_cpccr_div_table,
+		},
+	},
+
+	[JZ4755_CLK_H0CLK] = {
+		"hclk", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1, 0,
+			jz4755_cgu_cpccr_div_table,
+		},
+	},
+
+	[JZ4755_CLK_PCLK] = {
+		"pclk", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1, 0,
+			jz4755_cgu_cpccr_div_table,
+		},
+	},
+
+	[JZ4755_CLK_MCLK] = {
+		"mclk", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
+			jz4755_cgu_cpccr_div_table,
+		},
+	},
+
+	[JZ4755_CLK_H1CLK] = {
+		"h1clk", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL, -1, -1, -1 },
+		.div = {
+			CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1, 0,
+			jz4755_cgu_cpccr_div_table,
+		},
+	},
+
+	[JZ4755_CLK_UDC] = {
+		"udc", CGU_CLK_MUX | CGU_CLK_DIV | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, JZ4755_CLK_PLL_HALF, -1, -1 },
+		.mux = { CGU_REG_CPCCR, 29, 1 },
+		.div = { CGU_REG_CPCCR, 23, 1, 6, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 10 },
+	},
+
+	[JZ4755_CLK_LCD] = {
+		"lcd", CGU_CLK_DIV | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_PLL_HALF, -1, -1, -1 },
+		.div = { CGU_REG_LPCDR, 0, 1, 11, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 9 },
+	},
+
+	[JZ4755_CLK_MMC] = {
+		"mmc", CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_PLL_HALF, -1, -1, -1 },
+		.div = { CGU_REG_MSCCDR, 0, 1, 5, -1, -1, -1 },
+	},
+
+	[JZ4755_CLK_I2S] = {
+		"i2s", CGU_CLK_MUX | CGU_CLK_DIV,
+		.parents = { JZ4755_CLK_EXT_HALF, JZ4755_CLK_PLL_HALF, -1, -1 },
+		.mux = { CGU_REG_CPCCR, 31, 1 },
+		.div = { CGU_REG_I2SCDR, 0, 1, 9, -1, -1, -1 },
+	},
+
+	[JZ4755_CLK_SPI] = {
+		"spi", CGU_CLK_DIV | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_PLL_HALF, -1, -1, -1 },
+		.div = { CGU_REG_SSICDR, 0, 1, 4, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 4 },
+	},
+
+	[JZ4755_CLK_TVE] = {
+		"tve", CGU_CLK_MUX | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_LCD, JZ4755_CLK_EXT, -1, -1 },
+		.mux = { CGU_REG_LPCDR, 31, 1 },
+		.gate = { CGU_REG_CLKGR, 18 },
+	},
+
+	[JZ4755_CLK_RTC] = {
+		"rtc", CGU_CLK_MUX | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT512, JZ4755_CLK_OSC32K, -1, -1 },
+		.mux = { CGU_REG_OPCR, 2, 1},
+		.gate = { CGU_REG_CLKGR, 2 },
+	},
+
+	[JZ4755_CLK_CIM] = {
+		"cim", CGU_CLK_DIV | CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_PLL_HALF, -1, -1, -1 },
+		.div = { CGU_REG_CIMCDR, 0, 1, 8, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 8 },
+	},
+
+	/* Gate-only clocks */
+
+	[JZ4755_CLK_UART0] = {
+		"uart0", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 0 },
+	},
+
+	[JZ4755_CLK_UART1] = {
+		"uart1", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 14 },
+	},
+
+	[JZ4755_CLK_UART2] = {
+		"uart2", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 15 },
+	},

drivers/clk/ingenic/jz4755-cgu.c line 227

Quoted 10 lines
drivers/clk/ingenic/jz4755-cgu.c new file +10 -0
+
+	[JZ4755_CLK_ADC] = {
+		"adc", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 7 },
+	},
+
+	[JZ4755_CLK_AIC] = {
+		"aic", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_I2S, -1, -1, -1 },

Wrong parent here, should be JZ4755_CLK_EXT_HALF.

Quoted 85 lines
drivers/clk/ingenic/jz4755-cgu.c new file +85 -0
+		.gate = { CGU_REG_CLKGR, 5 },
+	},
+
+	[JZ4755_CLK_I2C] = {
+		"i2c", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 3 },
+	},
+
+	[JZ4755_CLK_BCH] = {
+		"bch", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_MCLK/* not sure */, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 11 },
+	},
+
+	[JZ4755_CLK_TCU] = {
+		"tcu", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 1 },
+	},
+
+	[JZ4755_CLK_DMA] = {
+		"dma", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_PCLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 12 },
+	},
+
+	[JZ4755_CLK_MMC0] = {
+		"mmc0", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_MMC, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 6 },
+	},
+
+	[JZ4755_CLK_MMC1] = {
+		"mmc1", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_MMC, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 16 },
+	},
+
+	[JZ4755_CLK_AUX_CPU] = {
+		"aux_cpu", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 24 },
+	},
+
+	[JZ4755_CLK_AHB1] = {
+		"ahb1", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 23 },
+	},
+
+	[JZ4755_CLK_IDCT] = {
+		"idct", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 22 },
+	},
+
+	[JZ4755_CLK_DB] = {
+		"db", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 21 },
+	},
+
+	[JZ4755_CLK_ME] = {
+		"me", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 20 },
+	},
+
+	[JZ4755_CLK_MC] = {
+		"mc", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_H1CLK, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 19 },
+	},
+
+	[JZ4755_CLK_TSSI] = {
+		"tssi", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF/* not sure */, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 17 },
+	},
+
+	[JZ4755_CLK_IPU] = {
+		"ipu", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_PLL_HALF/* not sure */, -1, -1, -1 },
+		.gate = { CGU_REG_CLKGR, 13 },

drivers/clk/ingenic/jz4755-cgu.c line 322

Quoted 10 lines
drivers/clk/ingenic/jz4755-cgu.c new file +10 -0
+	},
+
+	[JZ4755_CLK_EXT512] = {
+		"ext/512", CGU_CLK_FIXDIV,
+		.parents = { JZ4755_CLK_EXT },
+
+		/* JZ4725b doc calls it EXT512, but it seems to be /256...
+		 * Not sure if it applied to JZ4755 too, and which actual
+		 * source is used EXT or EXT_HALF
+		 */

Well it would be good to know. It's easy to verify though. Parent the watchdog clock to EXT/512, configure it for e.g. 5 seconds, if it shuts down in 10 seconds, it's a /256 divider.

Cheers,
-Paul

Quoted 32 lines
drivers/clk/ingenic/jz4755-cgu.c new file +28 -0
+		.fixdiv = { 256 },
+	},
+
+	[JZ4755_CLK_UDC_PHY] = {
+		"udc_phy", CGU_CLK_GATE,
+		.parents = { JZ4755_CLK_EXT_HALF, -1, -1, -1 },
+		.gate = { CGU_REG_OPCR, 6, true },
+	},
+};
+
+static void __init jz4755_cgu_init(struct device_node *np)
+{
+	int retval;
+
+	cgu = ingenic_cgu_new(jz4755_cgu_clocks,
+			      ARRAY_SIZE(jz4755_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);
+}
+CLK_OF_DECLARE_DRIVER(jz4755_cgu, "ingenic,jz4755-cgu", 

jz4755_cgu_init);
--
2.36.1

#13 lore raw

Re: [PATCH v2 4/4] clk: Add Ingenic JZ4755 CGU driver

пн, 17 окт. 2022 г. в 12:24, Paul Cercueil <[email protected]>:

Quoted 5 lines

drivers/clk/ingenic/jz4755-cgu.c line 227

Quoted 3 lines
drivers/clk/ingenic/jz4755-cgu.c new file +3 -0
+     [JZ4755_CLK_AIC] = {
+             "aic", CGU_CLK_GATE,
+             .parents = { JZ4755_CLK_I2S, -1, -1, -1 },

Wrong parent here, should be JZ4755_CLK_EXT_HALF.

I don't agree, see Figure 20-13 in the JZ4755 PM.

Quoted 1 line

Well it would be good to know...

Indeed, I will try to figure it out.

maintainer
#14 lore raw

Re: [PATCH v2 4/4] clk: Add Ingenic JZ4755 CGU driver

Quoted 9 lines · Siarhei Volkau

пн, 17 окт. 2022 г. в 12:24, Paul Cercueil <[email protected]>:

Quoted 5 lines

drivers/clk/ingenic/jz4755-cgu.c line 227

Quoted 3 lines
drivers/clk/ingenic/jz4755-cgu.c new file +3 -0
+     [JZ4755_CLK_AIC] = {
+             "aic", CGU_CLK_GATE,
+             .parents = { JZ4755_CLK_I2S, -1, -1, -1 },

Wrong parent here, should be JZ4755_CLK_EXT_HALF.

I don't agree, see Figure 20-13 in the JZ4755 PM.

20-13 describes the I2S clock, no?

AIC clock's parent is EXT/2 according to the diagram in 8.2.2.

Quoted 3 lines
Quoted 1 line

Well it would be good to know...

Indeed, I will try to figure it out.

Cheers,
-Paul

#15 lore raw

Re: [PATCH v2 4/4] clk: Add Ingenic JZ4755 CGU driver

пн, 17 окт. 2022 г. в 20:24, Paul Cercueil <[email protected]>:

Quoted 12 lines
Quoted 7 lines · Siarhei Volkau

пн, 17 окт. 2022 г. в 12:24, Paul Cercueil
<[email protected]>:

Quoted 4 lines
Quoted 3 lines
drivers/clk/ingenic/jz4755-cgu.c new file +3 -0
+     [JZ4755_CLK_AIC] = {
+             "aic", CGU_CLK_GATE,
+             .parents = { JZ4755_CLK_I2S, -1, -1, -1 },
Quoted 5 lines
Quoted 3 lines
Quoted 1 line

Wrong parent here, should be JZ4755_CLK_EXT_HALF.

I don't agree, see Figure 20-13 in the JZ4755 PM.

20-13 describes the I2S clock, no?

See 20.4.9 Serial Audio Clocks and Sampling Frequencies. It stated that: "For internal CODEC ... CODEC needs a 12MHz clock from CPM called SYS_CLK ...", but SYS_CLK is described only in the I2S Controller section. I assume it is the same clock.

Quoted 3 lines

AIC clock's parent is EXT/2 according to the diagram in 8.2.2.

It's a bit cryptic manual, who knows how it's done in the HW. I observed that codec runs on a desired sample rate only when PLL equals 432 or 216 MHz, but SYS_CLK is definitely configured to be 12MHz - from EXTCLK. On other PLL frequencies it is lower by 2-4% than expected. That isn't observed on JZ4725B.

Quoted 8 lines
Quoted 3 lines
Quoted 1 line

Well it would be good to know...

Indeed, I will try to figure it out.

Cheers,
-Paul

maintainer
#16 lore raw

Re: [PATCH v2 4/4] clk: Add Ingenic JZ4755 CGU driver

Hi Siarhei,

Quoted 15 lines · Siarhei Volkau

пн, 17 окт. 2022 г. в 20:24, Paul Cercueil <[email protected]>:

Quoted 14 lines
Quoted 9 lines · Siarhei Volkau

пн, 17 окт. 2022 г. в 12:24, Paul Cercueil
<[email protected]>:

Quoted 5 lines

drivers/clk/ingenic/jz4755-cgu.c line 227

Quoted 3 lines
drivers/clk/ingenic/jz4755-cgu.c new file +3 -0
+     [JZ4755_CLK_AIC] = {
+             "aic", CGU_CLK_GATE,
+             .parents = { JZ4755_CLK_I2S, -1, -1, -1 },

Wrong parent here, should be JZ4755_CLK_EXT_HALF.

Quoted 8 lines
Quoted 3 lines
Quoted 1 line

I don't agree, see Figure 20-13 in the JZ4755 PM.

20-13 describes the I2S clock, no?

See 20.4.9 Serial Audio Clocks and Sampling Frequencies. It stated that: "For internal CODEC ... CODEC needs a 12MHz clock from CPM called SYS_CLK ...", but SYS_CLK is described only in the I2S Controller section. I assume it is the same clock.

Yes, and your SYS_CLK is the I2S clock, not the AIC clock.

Quoted 9 lines
Quoted 3 lines

AIC clock's parent is EXT/2 according to the diagram in 8.2.2.

It's a bit cryptic manual, who knows how it's done in the HW. I observed that codec runs on a desired sample rate only when PLL equals 432 or 216 MHz, but SYS_CLK is definitely configured to be 12MHz - from EXTCLK. On other PLL frequencies it is lower by 2-4% than expected. That isn't observed on JZ4725B.

The audio codec supplies SYS_CLK to the controller, not the other way around. Parent the I2S clock to EXT/2 (which is 12 MHz) and it should work fine, independently of the PLL.

The AIC clock does not drive anything, it only "powers" the AIC module. It should be parented only to EXT/2, similar to what's done in every other CGU driver.

Cheers,
-Paul