Skip to contentSkip to conversation

Add Amlogic meson8b clock gates

PATCH Superseded Alexander Müller 5 participants 24 messages Jul 5, 2016 – Jul 13, 2016

Subsystems (6)

v1 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

cover Add Amlogic meson8b clock gates

This patch series adds support for the Amlogic meson8b clock gates. The Amlogic U-Boot disables most of them at boot. In order to enable ethernet, USB and other components it's mandatory to enable the clock gates when loading the corresponding drivers.

The meson8b clock gate support is based on the previous work done for Amlogic gxbb currently available in clk-next.

Alexander M?ller (7):
clk: meson: Rename meson8b-clkc.c to reflect gxbb naming convention
meson: clk: Move register definitions to meson8b.h
meson: clk: Rename register names according to Amlogic datasheet
meson: clk: Add CLKIDs for DT binding
gxbb: clk: Move MESON_GATE macro to gxbb
meson: clk: Add support for clock gates
arm: amlogic: select meson8b clk driver

 arch/arm/mach-meson/Kconfig              |   2 +
 drivers/clk/meson/Makefile               |   2 +-
 drivers/clk/meson/clkc.h                 |  14 -
 drivers/clk/meson/gxbb.c                 | 176 ++++----
 drivers/clk/meson/meson8b-clkc.c         | 458 --------------------
 drivers/clk/meson/meson8b.c              | 706 +++++++++++++++++++++++++++++++
 drivers/clk/meson/meson8b.h              |  44 ++
 include/dt-bindings/clock/meson8b-clkc.h |  79 +++-
 8 files changed, 926 insertions(+), 555 deletions(-)
 delete mode 100644 drivers/clk/meson/meson8b-clkc.c
 create mode 100644 drivers/clk/meson/meson8b.c
 create mode 100644 drivers/clk/meson/meson8b.h
Signature · 1 line
2.5.0
#1 lore raw

PATCH 1/7 clk: meson: Rename meson8b-clkc.c to reflect gxbb naming convention

---
 drivers/clk/meson/Makefile       |   2 +-
 drivers/clk/meson/meson8b-clkc.c | 458 ---------------------------------------
 drivers/clk/meson/meson8b.c      | 458 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 459 insertions(+), 459 deletions(-)
 delete mode 100644 drivers/clk/meson/meson8b-clkc.c
 create mode 100644 drivers/clk/meson/meson8b.c
drivers/clk/meson/Makefile +1 -1
index 197e401..1a66799 100644
@@ -3,5 +3,5 @@
 #
 
 obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-cpu.o clk-mpll.o
-obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b-clkc.o
+obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
 obj-$(CONFIG_COMMON_CLK_GXBB)	 += gxbb.o
drivers/clk/meson/meson8b-clkc.c deleted +0 -458

458 lines not on this page · raw message

drivers/clk/meson/meson8b.c new file +458 -0

458 lines not on this page · raw message

Signature · 1 line
2.5.0
#2 lore raw

PATCH 1/7 clk: meson: Rename meson8b-clkc.c to reflect gxbb naming convention

Quoted 8 lines · Alexander M?ller
---
 drivers/clk/meson/Makefile       |   2 +-
 drivers/clk/meson/meson8b-clkc.c | 458 ---------------------------------------
 drivers/clk/meson/meson8b.c      | 458 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 459 insertions(+), 459 deletions(-)
 delete mode 100644 drivers/clk/meson/meson8b-clkc.c
 create mode 100644 drivers/clk/meson/meson8b.c

Can you create the patch passing the '-M' parameter to git-format-patch to detect renames?

Thanks,

Signature · 1 line
Carlo Caione
#3 lore raw

PATCH 1/7 clk: meson: Rename meson8b-clkc.c to reflect gxbb naming convention

---
 drivers/clk/meson/Makefile                      | 2 +-
 drivers/clk/meson/{meson8b-clkc.c => meson8b.c} | 0
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename drivers/clk/meson/{meson8b-clkc.c => meson8b.c} (100%)
drivers/clk/meson/Makefile +1 -1
index 197e401..1a66799 100644
@@ -3,5 +3,5 @@
 #
 
 obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-cpu.o clk-mpll.o
-obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b-clkc.o
+obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
 obj-$(CONFIG_COMMON_CLK_GXBB)	 += gxbb.o
drivers/clk/meson/meson8b.c renamed from drivers/clk/meson/meson8b-clkc.c +0 -0
similarity index 100%
rename from drivers/clk/meson/meson8b-clkc.c
rename to drivers/clk/meson/meson8b.c
Signature · 1 line
2.5.0
#4 lore raw

PATCH 2/7 meson: clk: Move register definitions to meson8b.h

In reply to Alexander Müller
---
 drivers/clk/meson/meson8b.c | 17 +----------------
 drivers/clk/meson/meson8b.h | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 16 deletions(-)
 create mode 100644 drivers/clk/meson/meson8b.h
drivers/clk/meson/meson8b.c +1 -16
index b1902e9..537cc53 100644
@@ -26,22 +26,7 @@
 #include <linux/module.h>
 
 #include "clkc.h"
-
-/*
- * Clock controller register offsets
- *
- * Register offsets from the HardKernel[0] data sheet are listed in comment
- * blocks below. Those offsets must be multiplied by 4 before adding them to
- * the base address to get the right value
- *
- * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
- */
-#define MESON8B_REG_SYS_CPU_CNTL1	0x015c /* 0x57 offset in data sheet */
-#define MESON8B_REG_HHI_MPEG		0x0174 /* 0x5d offset in data sheet */
-#define MESON8B_REG_MALI		0x01b0 /* 0x6c offset in data sheet */
-#define MESON8B_REG_PLL_FIXED		0x0280
-#define MESON8B_REG_PLL_SYS		0x0300
-#define MESON8B_REG_PLL_VID		0x0320
+#include "meson8b.h"
 
 static DEFINE_SPINLOCK(clk_lock);
 
drivers/clk/meson/meson8b.h new file +40 -0
new file mode 100644
index 0000000..5b9cb9f
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2015 Endless Mobile, Inc.
+ * Author: Carlo Caione <[email protected]>
+ *
+ * Copyright (c) 2016 BayLibre, Inc.
+ * Michael Turquette <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __MESON8B_H
+#define __MESON8B_H
+
+/*
+ * Clock controller register offsets
+ *
+ * Register offsets from the HardKernel[0] data sheet are listed in comment
+ * blocks below. Those offsets must be multiplied by 4 before adding them to
+ * the base address to get the right value
+ *
+ * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
+ */
+#define MESON8B_REG_SYS_CPU_CNTL1	0x015c /* 0x57 offset in data sheet */
+#define MESON8B_REG_HHI_MPEG		0x0174 /* 0x5d offset in data sheet */
+#define MESON8B_REG_MALI		0x01b0 /* 0x6c offset in data sheet */
+#define MESON8B_REG_PLL_FIXED		0x0280
+#define MESON8B_REG_PLL_SYS		0x0300
+#define MESON8B_REG_PLL_VID		0x0320
+
+#endif /* __MESON8B_H */
Signature · 1 line
2.5.0
#5 lore raw

PATCH 3/7 meson: clk: Rename register names according to Amlogic datasheet

In reply to Alexander Müller
---
 drivers/clk/meson/meson8b.c | 26 +++++++++++++-------------
 drivers/clk/meson/meson8b.h | 11 +++++------
 2 files changed, 18 insertions(+), 19 deletions(-)
drivers/clk/meson/meson8b.c +13 -13
index 537cc53..0c6e26f 100644
@@ -111,17 +111,17 @@ static struct clk_fixed_rate meson8b_xtal = {
 
 static struct meson_clk_pll meson8b_fixed_pll = {
 	.m = {
-		.reg_off = MESON8B_REG_PLL_FIXED,
+		.reg_off = HHI_MPLL_CNTL,
 		.shift   = 0,
 		.width   = 9,
 	},
 	.n = {
-		.reg_off = MESON8B_REG_PLL_FIXED,
+		.reg_off = HHI_MPLL_CNTL,
 		.shift   = 9,
 		.width   = 5,
 	},
 	.od = {
-		.reg_off = MESON8B_REG_PLL_FIXED,
+		.reg_off = HHI_MPLL_CNTL,
 		.shift   = 16,
 		.width   = 2,
 	},
@@ -137,17 +137,17 @@ static struct meson_clk_pll meson8b_fixed_pll = {
 
 static struct meson_clk_pll meson8b_vid_pll = {
 	.m = {
-		.reg_off = MESON8B_REG_PLL_VID,
+		.reg_off = HHI_VID_PLL_CNTL,
 		.shift   = 0,
 		.width   = 9,
 	},
 	.n = {
-		.reg_off = MESON8B_REG_PLL_VID,
+		.reg_off = HHI_VID_PLL_CNTL,
 		.shift   = 9,
 		.width   = 5,
 	},
 	.od = {
-		.reg_off = MESON8B_REG_PLL_VID,
+		.reg_off = HHI_VID_PLL_CNTL,
 		.shift   = 16,
 		.width   = 2,
 	},
@@ -163,17 +163,17 @@ static struct meson_clk_pll meson8b_vid_pll = {
 
 static struct meson_clk_pll meson8b_sys_pll = {
 	.m = {
-		.reg_off = MESON8B_REG_PLL_SYS,
+		.reg_off = HHI_SYS_PLL_CNTL,
 		.shift   = 0,
 		.width   = 9,
 	},
 	.n = {
-		.reg_off = MESON8B_REG_PLL_SYS,
+		.reg_off = HHI_SYS_PLL_CNTL,
 		.shift   = 9,
 		.width   = 5,
 	},
 	.od = {
-		.reg_off = MESON8B_REG_PLL_SYS,
+		.reg_off = HHI_SYS_PLL_CNTL,
 		.shift   = 16,
 		.width   = 2,
 	},
@@ -250,7 +250,7 @@ static struct clk_fixed_factor meson8b_fclk_div7 = {
  * forthcoming coordinated clock rates feature
  */
 static struct meson_clk_cpu meson8b_cpu_clk = {
-	.reg_off = MESON8B_REG_SYS_CPU_CNTL1,
+	.reg_off = HHI_SYS_CPU_CLK_CNTL1,
 	.div_table = cpu_div_table,
 	.clk_nb.notifier_call = meson_clk_cpu_notifier_cb,
 	.hw.init = &(struct clk_init_data){
@@ -264,7 +264,7 @@ static struct meson_clk_cpu meson8b_cpu_clk = {
 static u32 mux_table_clk81[]	= { 6, 5, 7 };
 
 struct clk_mux meson8b_mpeg_clk_sel = {
-	.reg = (void *)MESON8B_REG_HHI_MPEG,
+	.reg = (void *)HHI_MPEG_CLK_CNTL,
 	.mask = 0x7,
 	.shift = 12,
 	.flags = CLK_MUX_READ_ONLY,
@@ -286,7 +286,7 @@ struct clk_mux meson8b_mpeg_clk_sel = {
 };
 
 struct clk_divider meson8b_mpeg_clk_div = {
-	.reg = (void *)MESON8B_REG_HHI_MPEG,
+	.reg = (void *)HHI_MPEG_CLK_CNTL,
 	.shift = 0,
 	.width = 7,
 	.lock = &clk_lock,
@@ -300,7 +300,7 @@ struct clk_divider meson8b_mpeg_clk_div = {
 };
 
 struct clk_gate meson8b_clk81 = {
-	.reg = (void *)MESON8B_REG_HHI_MPEG,
+	.reg = (void *)HHI_MPEG_CLK_CNTL,
 	.bit_idx = 7,
 	.lock = &clk_lock,
 	.hw.init = &(struct clk_init_data){
drivers/clk/meson/meson8b.h +5 -6
index 5b9cb9f..b2f29f7 100644
@@ -30,11 +30,10 @@
  *
  * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
  */
-#define MESON8B_REG_SYS_CPU_CNTL1	0x015c /* 0x57 offset in data sheet */
-#define MESON8B_REG_HHI_MPEG		0x0174 /* 0x5d offset in data sheet */
-#define MESON8B_REG_MALI		0x01b0 /* 0x6c offset in data sheet */
-#define MESON8B_REG_PLL_FIXED		0x0280
-#define MESON8B_REG_PLL_SYS		0x0300
-#define MESON8B_REG_PLL_VID		0x0320
+#define HHI_SYS_CPU_CLK_CNTL1		0x15c /* 0x57 offset in data sheet */
+#define HHI_MPEG_CLK_CNTL		0x174 /* 0x5d offset in data sheet */
+#define HHI_MPLL_CNTL			0x280 /* 0xa0 offset in data sheet */
+#define HHI_SYS_PLL_CNTL		0x300 /* 0xc0 offset in data sheet */
+#define HHI_VID_PLL_CNTL		0x320 /* 0xc8 offset in data sheet */
 
 #endif /* __MESON8B_H */
Signature · 1 line
2.5.0
#6 lore raw

PATCH 3/7 meson: clk: Rename register names according to Amlogic datasheet

Quoting Alexander M?ller (2016-07-05 10:56:27)

drivers/clk/meson/meson8b.h line 37

Quoted 4 lines
drivers/clk/meson/meson8b.h +3 -0
+#define HHI_MPLL_CNTL                  0x280 /* 0xa0 offset in data sheet */
+#define HHI_SYS_PLL_CNTL               0x300 /* 0xc0 offset in data sheet */
+#define HHI_VID_PLL_CNTL               0x320 /* 0xc8 offset in data sheet */

Nitpick: these three regs are not present in the data sheet, which is why I did not include the comment for these three addresses originally.

Regards,
Mike

#7 lore raw

PATCH 4/7 meson: clk: Add CLKIDs for DT binding

In reply to Alexander Müller

Add clock ids for the clock gates to be used for DT bindings.

---
 include/dt-bindings/clock/meson8b-clkc.h | 79 +++++++++++++++++++++++++++++++-
 1 file changed, 78 insertions(+), 1 deletion(-)
include/dt-bindings/clock/meson8b-clkc.h +78 -1
index 595a58d..d8a9d53 100644
@@ -21,7 +21,84 @@
 #define CLKID_ZERO		13
 #define CLKID_MPEG_SEL		14
 #define CLKID_MPEG_DIV		15
+#define CLKID_DDR		16
+#define CLKID_DOS		17
+#define CLKID_ISA		18
+#define CLKID_PL301		19
+#define CLKID_PERIPHS		20
+#define CLKID_SPICC		21
+#define CLKID_I2C		22
+#define CLKID_SAR_ADC		23
+#define CLKID_SMART_CARD	24
+#define CLKID_RNG0		25
+#define CLKID_UART0		26
+#define CLKID_SDHC		27
+#define CLKID_STREAM		28
+#define CLKID_ASYNC_FIFO	29
+#define CLKID_SDIO		30
+#define CLKID_ABUF		31
+#define CLKID_HIU_IFACE		32
+#define CLKID_ASSIST_MISC	33
+#define CLKID_SPI		34
+#define CLKID_I2S_SPDIF		35
+#define CLKID_ETH		36
+#define CLKID_DEMUX		37
+#define CLKID_AIU_GLUE		38
+#define CLKID_IEC958		39
+#define CLKID_I2S_OUT		40
+#define CLKID_AMCLK		41
+#define CLKID_AIFIFO2		42
+#define CLKID_MIXER		43
+#define CLKID_MIXER_IFACE	44
+#define CLKID_ADC		45
+#define CLKID_BLKMV		46
+#define CLKID_AIU		47
+#define CLKID_UART1		48
+#define CLKID_G2D		49
+#define CLKID_USB0		50
+#define CLKID_USB1		51
+#define CLKID_RESET		52
+#define CLKID_NAND		53
+#define CLKID_DOS_PARSER	54
+#define CLKID_USB		55
+#define CLKID_VDIN1		56
+#define CLKID_AHB_ARB0		57
+#define CLKID_EFUSE		58
+#define CLKID_BOOT_ROM		59
+#define CLKID_AHB_DATA_BUS	60
+#define CLKID_AHB_CTRL_BUS	61
+#define CLKID_HDMI_INTR_SYNC	62
+#define CLKID_HDMI_PCLK		63
+#define CLKID_USB1_DDR_BRIDGE	64
+#define CLKID_USB0_DDR_BRIDGE	65
+#define CLKID_MMC_PCLK		66
+#define CLKID_DVIN		67
+#define CLKID_UART2		68
+#define CLKID_SANA		69
+#define CLKID_VPU_INTR		70
+#define CLKID_SEC_AHB_AHB3_BRIDGE	71
+#define CLKID_CLK81_A9		72
+#define CLKID_VCLK2_VENCI0	73
+#define CLKID_VCLK2_VENCI1	74
+#define CLKID_VCLK2_VENCP0	75
+#define CLKID_VCLK2_VENCP1	76
+#define CLKID_GCLK_VENCI_INT	77
+#define CLKID_GCLK_VENCP_INT	78
+#define CLKID_DAC_CLK		79
+#define CLKID_AOCLK_GATE	80
+#define CLKID_IEC958_GATE	81
+#define CLKID_ENC480P		82
+#define CLKID_RNG1		83
+#define CLKID_GCLK_VENCL_INT	84
+#define CLKID_VCLK2_VENCLMCC	85
+#define CLKID_VCLK2_VENCL	86
+#define CLKID_VCLK2_OTHER	87
+#define CLKID_EDP		88
+#define CLKID_AO_MEDIA_CPU	89
+#define CLKID_AO_AHB_SRAM	90
+#define CLKID_AO_AHB_BUS	91
+#define CLKID_AO_IFACE		92
 
-#define CLK_NR_CLKS		(CLKID_MPEG_DIV + 1)
+#define CLK_NR_CLKS		(CLKID_AO_IFACE + 1)
 
 #endif /* __MESON8B_CLKC_H */
Signature · 1 line
2.5.0
#8 lore raw

PATCH 4/7 meson: clk: Add CLKIDs for DT binding

Hi Alexander,

Quoting Alexander M?ller (2016-07-05 10:56:28)

include/dt-bindings/clock/meson8b-clkc.h line 102

Quoted 5 lines
include/dt-bindings/clock/meson8b-clkc.h +3 -1
+#define CLKID_AO_AHB_BUS       91
+#define CLKID_AO_IFACE         92
 
-#define CLK_NR_CLKS            (CLKID_MPEG_DIV + 1)
+#define CLK_NR_CLKS            (CLKID_AO_IFACE + 1)

Did you take a look at how I did this for gxbb? I like to limit the number of clocks exposed in DT as much as possible. This is because a DT binding (of which this header is a part) constitutes an immutable ABI which shall only be relinquished when the Sun burns out and our solar system dies.

Also, putting NR_CLKS inside of the binding is kind of gross, since the binding doesn't care about that value, but the driver does. The GXBB clk driver has two headers: one internal to Linux with the bulk of the clks and NR_CLKS, and a second one in the shared DT header chroot that only exposes the bare minimum necessary.

Regards,
Mike

#9 lore raw

PATCH 5/7 gxbb: clk: Move MESON_GATE macro to gxbb

In reply to Alexander Müller
---
 drivers/clk/meson/clkc.h |  14 ----
 drivers/clk/meson/gxbb.c | 176 +++++++++++++++++++++++++----------------------
 2 files changed, 95 insertions(+), 95 deletions(-)
drivers/clk/meson/clkc.h +0 -14
index 53326c3..061a01e 100644
@@ -97,20 +97,6 @@ struct meson_clk_mpll {
 	spinlock_t *lock;
 };
 
-#define MESON_GATE(_name, _reg, _bit)					\
-struct clk_gate gxbb_##_name = { 						\
-	.reg = (void __iomem *) _reg, 					\
-	.bit_idx = (_bit), 						\
-	.lock = &clk_lock,						\
-	.hw.init = &(struct clk_init_data) { 				\
-		.name = #_name,					\
-		.ops = &clk_gate_ops,					\
-		.parent_names = (const char *[]){ "clk81" },		\
-		.num_parents = 1,					\
-		.flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), 	\
-	},								\
-};
-
 /* clk_ops */
 extern const struct clk_ops meson_clk_pll_ro_ops;
 extern const struct clk_ops meson_clk_pll_ops;
drivers/clk/meson/gxbb.c +95 -81

191 lines not on this page · raw message

Signature · 1 line
2.5.0
#10 lore raw

PATCH 5/7 gxbb: clk: Move MESON_GATE macro to gxbb

Hi Alexander,

Quoting Alexander M?ller (2016-07-05 10:56:29)

Quoted 17 lines
---
 drivers/clk/meson/clkc.h |  14 ----
 drivers/clk/meson/gxbb.c | 176 +++++++++++++++++++++++++----------------------
 2 files changed, 95 insertions(+), 95 deletions(-)
drivers/clk/meson/clkc.h +0 -3
index 53326c3..061a01e 100644
@@ -97,20 +97,6 @@ struct meson_clk_mpll {
        spinlock_t *lock;
 };
 
-#define MESON_GATE(_name, _reg, _bit)                                  \
-struct clk_gate gxbb_##_name = {                                               \
-       .reg = (void __iomem *) _reg,                                   \

drivers/clk/meson/clkc.h struct meson_clk_mpll { · line 112

Quoted 10 lines
drivers/clk/meson/clkc.h +0 -10
-       .bit_idx = (_bit),                                              \
-       .lock = &clk_lock,                                              \
-       .hw.init = &(struct clk_init_data) {                            \
-               .name = #_name,                                 \
-               .ops = &clk_gate_ops,                                   \
-               .parent_names = (const char *[]){ "clk81" },            \
-               .num_parents = 1,                                       \
-               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
-       },                                                              \
-};

Why can't this macro be shared between meson8b and gxbb? Looks identical to me, but maybe I missed something.

drivers/clk/meson/gxbb.c line 27

Quoted 13 lines
drivers/clk/meson/clkc.h +0 -1
-
 /* clk_ops */
 extern const struct clk_ops meson_clk_pll_ro_ops;
 extern const struct clk_ops meson_clk_pll_ops;
drivers/clk/meson/gxbb.c +1 -0
index 007b715..0ea71be 100644
@@ -24,6 +24,20 @@
 #include "clkc.h"
 #include "gxbb.h"
 
+#define GBXX_GATE(_name, _reg, _bit)                                   \

s/GBXX/GXBB/g

Including all of the static data further below ;-)

Regards,
Mike

Quoted 191 lines
drivers/clk/meson/gxbb.c +94 -81
+struct clk_gate gxbb_##_name = {                                               \
+       .reg = (void __iomem *) _reg,                                   \
+       .bit_idx = (_bit),                                              \
+       .lock = &clk_lock,                                              \
+       .hw.init = &(struct clk_init_data) {                            \
+               .name = #_name,                                 \
+               .ops = &clk_gate_ops,                                   \
+               .parent_names = (const char *[]){ "clk81" },            \
+               .num_parents = 1,                                       \
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
+       },                                                              \
+};
+
 static DEFINE_SPINLOCK(clk_lock);
 
 static const struct pll_rate_table sys_pll_rate_table[] = {
@@ -563,90 +577,90 @@ static struct clk_gate gxbb_clk81 = {
 };
 
 /* Everything Else (EE) domain gates */
-static MESON_GATE(ddr, HHI_GCLK_MPEG0, 0);
-static MESON_GATE(dos, HHI_GCLK_MPEG0, 1);
-static MESON_GATE(isa, HHI_GCLK_MPEG0, 5);
-static MESON_GATE(pl301, HHI_GCLK_MPEG0, 6);
-static MESON_GATE(periphs, HHI_GCLK_MPEG0, 7);
-static MESON_GATE(spicc, HHI_GCLK_MPEG0, 8);
-static MESON_GATE(i2c, HHI_GCLK_MPEG0, 9);
-static MESON_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
-static MESON_GATE(smart_card, HHI_GCLK_MPEG0, 11);
-static MESON_GATE(rng0, HHI_GCLK_MPEG0, 12);
-static MESON_GATE(uart0, HHI_GCLK_MPEG0, 13);
-static MESON_GATE(sdhc, HHI_GCLK_MPEG0, 14);
-static MESON_GATE(stream, HHI_GCLK_MPEG0, 15);
-static MESON_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
-static MESON_GATE(sdio, HHI_GCLK_MPEG0, 17);
-static MESON_GATE(abuf, HHI_GCLK_MPEG0, 18);
-static MESON_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
-static MESON_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
-static MESON_GATE(spi, HHI_GCLK_MPEG0, 30);
-
-static MESON_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
-static MESON_GATE(eth, HHI_GCLK_MPEG1, 3);
-static MESON_GATE(demux, HHI_GCLK_MPEG1, 4);
-static MESON_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
-static MESON_GATE(iec958, HHI_GCLK_MPEG1, 7);
-static MESON_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
-static MESON_GATE(amclk, HHI_GCLK_MPEG1, 9);
-static MESON_GATE(aififo2, HHI_GCLK_MPEG1, 10);
-static MESON_GATE(mixer, HHI_GCLK_MPEG1, 11);
-static MESON_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
-static MESON_GATE(adc, HHI_GCLK_MPEG1, 13);
-static MESON_GATE(blkmv, HHI_GCLK_MPEG1, 14);
-static MESON_GATE(aiu, HHI_GCLK_MPEG1, 15);
-static MESON_GATE(uart1, HHI_GCLK_MPEG1, 16);
-static MESON_GATE(g2d, HHI_GCLK_MPEG1, 20);
-static MESON_GATE(usb0, HHI_GCLK_MPEG1, 21);
-static MESON_GATE(usb1, HHI_GCLK_MPEG1, 22);
-static MESON_GATE(reset, HHI_GCLK_MPEG1, 23);
-static MESON_GATE(nand, HHI_GCLK_MPEG1, 24);
-static MESON_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
-static MESON_GATE(usb, HHI_GCLK_MPEG1, 26);
-static MESON_GATE(vdin1, HHI_GCLK_MPEG1, 28);
-static MESON_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
-static MESON_GATE(efuse, HHI_GCLK_MPEG1, 30);
-static MESON_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
-
-static MESON_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
-static MESON_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
-static MESON_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
-static MESON_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
-static MESON_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
-static MESON_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
-static MESON_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
-static MESON_GATE(dvin, HHI_GCLK_MPEG2, 12);
-static MESON_GATE(uart2, HHI_GCLK_MPEG2, 15);
-static MESON_GATE(sana, HHI_GCLK_MPEG2, 22);
-static MESON_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
-static MESON_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
-static MESON_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
-
-static MESON_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
-static MESON_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
-static MESON_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
-static MESON_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
-static MESON_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
-static MESON_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
-static MESON_GATE(dac_clk, HHI_GCLK_OTHER, 10);
-static MESON_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
-static MESON_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
-static MESON_GATE(enc480p, HHI_GCLK_OTHER, 20);
-static MESON_GATE(rng1, HHI_GCLK_OTHER, 21);
-static MESON_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
-static MESON_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
-static MESON_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
-static MESON_GATE(vclk_other, HHI_GCLK_OTHER, 26);
-static MESON_GATE(edp, HHI_GCLK_OTHER, 31);
+static GBXX_GATE(ddr, HHI_GCLK_MPEG0, 0);
+static GBXX_GATE(dos, HHI_GCLK_MPEG0, 1);
+static GBXX_GATE(isa, HHI_GCLK_MPEG0, 5);
+static GBXX_GATE(pl301, HHI_GCLK_MPEG0, 6);
+static GBXX_GATE(periphs, HHI_GCLK_MPEG0, 7);
+static GBXX_GATE(spicc, HHI_GCLK_MPEG0, 8);
+static GBXX_GATE(i2c, HHI_GCLK_MPEG0, 9);
+static GBXX_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
+static GBXX_GATE(smart_card, HHI_GCLK_MPEG0, 11);
+static GBXX_GATE(rng0, HHI_GCLK_MPEG0, 12);
+static GBXX_GATE(uart0, HHI_GCLK_MPEG0, 13);
+static GBXX_GATE(sdhc, HHI_GCLK_MPEG0, 14);
+static GBXX_GATE(stream, HHI_GCLK_MPEG0, 15);
+static GBXX_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
+static GBXX_GATE(sdio, HHI_GCLK_MPEG0, 17);
+static GBXX_GATE(abuf, HHI_GCLK_MPEG0, 18);
+static GBXX_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
+static GBXX_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
+static GBXX_GATE(spi, HHI_GCLK_MPEG0, 30);
+
+static GBXX_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
+static GBXX_GATE(eth, HHI_GCLK_MPEG1, 3);
+static GBXX_GATE(demux, HHI_GCLK_MPEG1, 4);
+static GBXX_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
+static GBXX_GATE(iec958, HHI_GCLK_MPEG1, 7);
+static GBXX_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
+static GBXX_GATE(amclk, HHI_GCLK_MPEG1, 9);
+static GBXX_GATE(aififo2, HHI_GCLK_MPEG1, 10);
+static GBXX_GATE(mixer, HHI_GCLK_MPEG1, 11);
+static GBXX_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
+static GBXX_GATE(adc, HHI_GCLK_MPEG1, 13);
+static GBXX_GATE(blkmv, HHI_GCLK_MPEG1, 14);
+static GBXX_GATE(aiu, HHI_GCLK_MPEG1, 15);
+static GBXX_GATE(uart1, HHI_GCLK_MPEG1, 16);
+static GBXX_GATE(g2d, HHI_GCLK_MPEG1, 20);
+static GBXX_GATE(usb0, HHI_GCLK_MPEG1, 21);
+static GBXX_GATE(usb1, HHI_GCLK_MPEG1, 22);
+static GBXX_GATE(reset, HHI_GCLK_MPEG1, 23);
+static GBXX_GATE(nand, HHI_GCLK_MPEG1, 24);
+static GBXX_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
+static GBXX_GATE(usb, HHI_GCLK_MPEG1, 26);
+static GBXX_GATE(vdin1, HHI_GCLK_MPEG1, 28);
+static GBXX_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
+static GBXX_GATE(efuse, HHI_GCLK_MPEG1, 30);
+static GBXX_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
+
+static GBXX_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
+static GBXX_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
+static GBXX_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
+static GBXX_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
+static GBXX_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
+static GBXX_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
+static GBXX_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
+static GBXX_GATE(dvin, HHI_GCLK_MPEG2, 12);
+static GBXX_GATE(uart2, HHI_GCLK_MPEG2, 15);
+static GBXX_GATE(sana, HHI_GCLK_MPEG2, 22);
+static GBXX_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
+static GBXX_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
+static GBXX_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
+
+static GBXX_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
+static GBXX_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
+static GBXX_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
+static GBXX_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
+static GBXX_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
+static GBXX_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
+static GBXX_GATE(dac_clk, HHI_GCLK_OTHER, 10);
+static GBXX_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
+static GBXX_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
+static GBXX_GATE(enc480p, HHI_GCLK_OTHER, 20);
+static GBXX_GATE(rng1, HHI_GCLK_OTHER, 21);
+static GBXX_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
+static GBXX_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
+static GBXX_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
+static GBXX_GATE(vclk_other, HHI_GCLK_OTHER, 26);
+static GBXX_GATE(edp, HHI_GCLK_OTHER, 31);
 
 /* Always On (AO) domain gates */
 
-static MESON_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
-static MESON_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
-static MESON_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
-static MESON_GATE(ao_iface, HHI_GCLK_AO, 3);
-static MESON_GATE(ao_i2c, HHI_GCLK_AO, 4);
+static GBXX_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
+static GBXX_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
+static GBXX_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
+static GBXX_GATE(ao_iface, HHI_GCLK_AO, 3);
+static GBXX_GATE(ao_i2c, HHI_GCLK_AO, 4);
 
 /* Array of all clocks provided by this provider */
 
Signature · 1 line
2.5.0
#11 lore raw

PATCH 5/7 gxbb: clk: Move MESON_GATE macro to gxbb

I moved the macro because of the struct variable name which is gxbb_##_name here.

Quoted 247 lines · Michael Turquette

Hi Alexander,

Quoting Alexander M?ller (2016-07-05 10:56:29)

Quoted 17 lines

---
drivers/clk/meson/clkc.h | 14 ----
drivers/clk/meson/gxbb.c | 176 +++++++++++++++++++++++++----------------------

2 files changed, 95 insertions(+), 95 deletions(-)
drivers/clk/meson/clkc.h +0 -3
index 53326c3..061a01e 100644
@@ -97,20 +97,6 @@ struct meson_clk_mpll {
       spinlock_t *lock;
 };
 
-#define MESON_GATE(_name, _reg, _bit)                                  \
-struct clk_gate gxbb_##_name = {                                               \
-       .reg = (void __iomem *) _reg,                                   \

drivers/clk/meson/clkc.h struct meson_clk_mpll { · line 112

Quoted 10 lines
drivers/clk/meson/clkc.h +0 -10
-       .bit_idx = (_bit),                                              \
-       .lock = &clk_lock,                                              \
-       .hw.init = &(struct clk_init_data) {                            \
-               .name = #_name,                                 \
-               .ops = &clk_gate_ops,                                   \
-               .parent_names = (const char *[]){ "clk81" },            \
-               .num_parents = 1,                                       \
-               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
-       },                                                              \
-};

Why can't this macro be shared between meson8b and gxbb? Looks identical to me, but maybe I missed something.

drivers/clk/meson/gxbb.c line 27

Quoted 13 lines
drivers/clk/meson/clkc.h +0 -1
-
 /* clk_ops */
 extern const struct clk_ops meson_clk_pll_ro_ops;
 extern const struct clk_ops meson_clk_pll_ops;
drivers/clk/meson/gxbb.c +1 -0
index 007b715..0ea71be 100644
@@ -24,6 +24,20 @@
 #include "clkc.h"
 #include "gxbb.h"
 
+#define GBXX_GATE(_name, _reg, _bit)                                   \

s/GBXX/GXBB/g

Including all of the static data further below ;-)

Regards,
Mike

Quoted 190 lines
drivers/clk/meson/gxbb.c +94 -81
+struct clk_gate gxbb_##_name = {                                               \
+       .reg = (void __iomem *) _reg,                                   \
+       .bit_idx = (_bit),                                              \
+       .lock = &clk_lock,                                              \
+       .hw.init = &(struct clk_init_data) {                            \
+               .name = #_name,                                 \
+               .ops = &clk_gate_ops,                                   \
+               .parent_names = (const char *[]){ "clk81" },            \
+               .num_parents = 1,                                       \
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
+       },                                                              \
+};
+
 static DEFINE_SPINLOCK(clk_lock);
 
 static const struct pll_rate_table sys_pll_rate_table[] = {
@@ -563,90 +577,90 @@ static struct clk_gate gxbb_clk81 = {
 };
 
 /* Everything Else (EE) domain gates */
-static MESON_GATE(ddr, HHI_GCLK_MPEG0, 0);
-static MESON_GATE(dos, HHI_GCLK_MPEG0, 1);
-static MESON_GATE(isa, HHI_GCLK_MPEG0, 5);
-static MESON_GATE(pl301, HHI_GCLK_MPEG0, 6);
-static MESON_GATE(periphs, HHI_GCLK_MPEG0, 7);
-static MESON_GATE(spicc, HHI_GCLK_MPEG0, 8);
-static MESON_GATE(i2c, HHI_GCLK_MPEG0, 9);
-static MESON_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
-static MESON_GATE(smart_card, HHI_GCLK_MPEG0, 11);
-static MESON_GATE(rng0, HHI_GCLK_MPEG0, 12);
-static MESON_GATE(uart0, HHI_GCLK_MPEG0, 13);
-static MESON_GATE(sdhc, HHI_GCLK_MPEG0, 14);
-static MESON_GATE(stream, HHI_GCLK_MPEG0, 15);
-static MESON_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
-static MESON_GATE(sdio, HHI_GCLK_MPEG0, 17);
-static MESON_GATE(abuf, HHI_GCLK_MPEG0, 18);
-static MESON_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
-static MESON_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
-static MESON_GATE(spi, HHI_GCLK_MPEG0, 30);
-
-static MESON_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
-static MESON_GATE(eth, HHI_GCLK_MPEG1, 3);
-static MESON_GATE(demux, HHI_GCLK_MPEG1, 4);
-static MESON_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
-static MESON_GATE(iec958, HHI_GCLK_MPEG1, 7);
-static MESON_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
-static MESON_GATE(amclk, HHI_GCLK_MPEG1, 9);
-static MESON_GATE(aififo2, HHI_GCLK_MPEG1, 10);
-static MESON_GATE(mixer, HHI_GCLK_MPEG1, 11);
-static MESON_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
-static MESON_GATE(adc, HHI_GCLK_MPEG1, 13);
-static MESON_GATE(blkmv, HHI_GCLK_MPEG1, 14);
-static MESON_GATE(aiu, HHI_GCLK_MPEG1, 15);
-static MESON_GATE(uart1, HHI_GCLK_MPEG1, 16);
-static MESON_GATE(g2d, HHI_GCLK_MPEG1, 20);
-static MESON_GATE(usb0, HHI_GCLK_MPEG1, 21);
-static MESON_GATE(usb1, HHI_GCLK_MPEG1, 22);
-static MESON_GATE(reset, HHI_GCLK_MPEG1, 23);
-static MESON_GATE(nand, HHI_GCLK_MPEG1, 24);
-static MESON_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
-static MESON_GATE(usb, HHI_GCLK_MPEG1, 26);
-static MESON_GATE(vdin1, HHI_GCLK_MPEG1, 28);
-static MESON_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
-static MESON_GATE(efuse, HHI_GCLK_MPEG1, 30);
-static MESON_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
-
-static MESON_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
-static MESON_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
-static MESON_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
-static MESON_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
-static MESON_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
-static MESON_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
-static MESON_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
-static MESON_GATE(dvin, HHI_GCLK_MPEG2, 12);
-static MESON_GATE(uart2, HHI_GCLK_MPEG2, 15);
-static MESON_GATE(sana, HHI_GCLK_MPEG2, 22);
-static MESON_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
-static MESON_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
-static MESON_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
-
-static MESON_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
-static MESON_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
-static MESON_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
-static MESON_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
-static MESON_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
-static MESON_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
-static MESON_GATE(dac_clk, HHI_GCLK_OTHER, 10);
-static MESON_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
-static MESON_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
-static MESON_GATE(enc480p, HHI_GCLK_OTHER, 20);
-static MESON_GATE(rng1, HHI_GCLK_OTHER, 21);
-static MESON_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
-static MESON_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
-static MESON_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
-static MESON_GATE(vclk_other, HHI_GCLK_OTHER, 26);
-static MESON_GATE(edp, HHI_GCLK_OTHER, 31);
+static GBXX_GATE(ddr, HHI_GCLK_MPEG0, 0);
+static GBXX_GATE(dos, HHI_GCLK_MPEG0, 1);
+static GBXX_GATE(isa, HHI_GCLK_MPEG0, 5);
+static GBXX_GATE(pl301, HHI_GCLK_MPEG0, 6);
+static GBXX_GATE(periphs, HHI_GCLK_MPEG0, 7);
+static GBXX_GATE(spicc, HHI_GCLK_MPEG0, 8);
+static GBXX_GATE(i2c, HHI_GCLK_MPEG0, 9);
+static GBXX_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
+static GBXX_GATE(smart_card, HHI_GCLK_MPEG0, 11);
+static GBXX_GATE(rng0, HHI_GCLK_MPEG0, 12);
+static GBXX_GATE(uart0, HHI_GCLK_MPEG0, 13);
+static GBXX_GATE(sdhc, HHI_GCLK_MPEG0, 14);
+static GBXX_GATE(stream, HHI_GCLK_MPEG0, 15);
+static GBXX_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
+static GBXX_GATE(sdio, HHI_GCLK_MPEG0, 17);
+static GBXX_GATE(abuf, HHI_GCLK_MPEG0, 18);
+static GBXX_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
+static GBXX_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
+static GBXX_GATE(spi, HHI_GCLK_MPEG0, 30);
+
+static GBXX_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
+static GBXX_GATE(eth, HHI_GCLK_MPEG1, 3);
+static GBXX_GATE(demux, HHI_GCLK_MPEG1, 4);
+static GBXX_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
+static GBXX_GATE(iec958, HHI_GCLK_MPEG1, 7);
+static GBXX_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
+static GBXX_GATE(amclk, HHI_GCLK_MPEG1, 9);
+static GBXX_GATE(aififo2, HHI_GCLK_MPEG1, 10);
+static GBXX_GATE(mixer, HHI_GCLK_MPEG1, 11);
+static GBXX_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
+static GBXX_GATE(adc, HHI_GCLK_MPEG1, 13);
+static GBXX_GATE(blkmv, HHI_GCLK_MPEG1, 14);
+static GBXX_GATE(aiu, HHI_GCLK_MPEG1, 15);
+static GBXX_GATE(uart1, HHI_GCLK_MPEG1, 16);
+static GBXX_GATE(g2d, HHI_GCLK_MPEG1, 20);
+static GBXX_GATE(usb0, HHI_GCLK_MPEG1, 21);
+static GBXX_GATE(usb1, HHI_GCLK_MPEG1, 22);
+static GBXX_GATE(reset, HHI_GCLK_MPEG1, 23);
+static GBXX_GATE(nand, HHI_GCLK_MPEG1, 24);
+static GBXX_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
+static GBXX_GATE(usb, HHI_GCLK_MPEG1, 26);
+static GBXX_GATE(vdin1, HHI_GCLK_MPEG1, 28);
+static GBXX_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
+static GBXX_GATE(efuse, HHI_GCLK_MPEG1, 30);
+static GBXX_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
+
+static GBXX_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
+static GBXX_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
+static GBXX_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
+static GBXX_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
+static GBXX_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
+static GBXX_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
+static GBXX_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
+static GBXX_GATE(dvin, HHI_GCLK_MPEG2, 12);
+static GBXX_GATE(uart2, HHI_GCLK_MPEG2, 15);
+static GBXX_GATE(sana, HHI_GCLK_MPEG2, 22);
+static GBXX_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
+static GBXX_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
+static GBXX_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
+
+static GBXX_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
+static GBXX_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
+static GBXX_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
+static GBXX_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
+static GBXX_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
+static GBXX_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
+static GBXX_GATE(dac_clk, HHI_GCLK_OTHER, 10);
+static GBXX_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
+static GBXX_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
+static GBXX_GATE(enc480p, HHI_GCLK_OTHER, 20);
+static GBXX_GATE(rng1, HHI_GCLK_OTHER, 21);
+static GBXX_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
+static GBXX_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
+static GBXX_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
+static GBXX_GATE(vclk_other, HHI_GCLK_OTHER, 26);
+static GBXX_GATE(edp, HHI_GCLK_OTHER, 31);
 
 /* Always On (AO) domain gates */
 
-static MESON_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
-static MESON_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
-static MESON_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
-static MESON_GATE(ao_iface, HHI_GCLK_AO, 3);
-static MESON_GATE(ao_i2c, HHI_GCLK_AO, 4);
+static GBXX_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
+static GBXX_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
+static GBXX_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
+static GBXX_GATE(ao_iface, HHI_GCLK_AO, 3);
+static GBXX_GATE(ao_i2c, HHI_GCLK_AO, 4);
 
 /* Array of all clocks provided by this provider */
 
Signature · 1 line
2.5.0
#12 lore raw

PATCH 5/7 gxbb: clk: Move MESON_GATE macro to gxbb

Hi Alexander,

Quoting Alexander M?ller (2016-07-13 10:43:51)

Quoted 1 line

I moved the macro because of the struct variable name which is gxbb_##_name here.

Do you mind not top-posting? It makes it easier to maintain context when reviewing 74927432 mails.

Thanks,
Mike

Quoted 249 lines
Quoted 248 lines · Michael Turquette

Hi Alexander,

Quoting Alexander M?ller (2016-07-05 10:56:29)

Quoted 17 lines

---
drivers/clk/meson/clkc.h | 14 ----
drivers/clk/meson/gxbb.c | 176 +++++++++++++++++++++++++----------------------

2 files changed, 95 insertions(+), 95 deletions(-)
drivers/clk/meson/clkc.h +0 -3
index 53326c3..061a01e 100644
@@ -97,20 +97,6 @@ struct meson_clk_mpll {
       spinlock_t *lock;
 };
 
-#define MESON_GATE(_name, _reg, _bit)                                  \
-struct clk_gate gxbb_##_name = {                                               \
-       .reg = (void __iomem *) _reg,                                   \

drivers/clk/meson/clkc.h struct meson_clk_mpll { · line 112

Quoted 10 lines
drivers/clk/meson/clkc.h +0 -10
-       .bit_idx = (_bit),                                              \
-       .lock = &clk_lock,                                              \
-       .hw.init = &(struct clk_init_data) {                            \
-               .name = #_name,                                 \
-               .ops = &clk_gate_ops,                                   \
-               .parent_names = (const char *[]){ "clk81" },            \
-               .num_parents = 1,                                       \
-               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
-       },                                                              \
-};

Why can't this macro be shared between meson8b and gxbb? Looks identical to me, but maybe I missed something.

drivers/clk/meson/gxbb.c line 27

Quoted 13 lines
drivers/clk/meson/clkc.h +0 -1
-
 /* clk_ops */
 extern const struct clk_ops meson_clk_pll_ro_ops;
 extern const struct clk_ops meson_clk_pll_ops;
drivers/clk/meson/gxbb.c +1 -0
index 007b715..0ea71be 100644
@@ -24,6 +24,20 @@
 #include "clkc.h"
 #include "gxbb.h"
 
+#define GBXX_GATE(_name, _reg, _bit)                                   \

s/GBXX/GXBB/g

Including all of the static data further below ;-)

Regards,
Mike

Quoted 190 lines
drivers/clk/meson/gxbb.c +94 -81
+struct clk_gate gxbb_##_name = {                                               \
+       .reg = (void __iomem *) _reg,                                   \
+       .bit_idx = (_bit),                                              \
+       .lock = &clk_lock,                                              \
+       .hw.init = &(struct clk_init_data) {                            \
+               .name = #_name,                                 \
+               .ops = &clk_gate_ops,                                   \
+               .parent_names = (const char *[]){ "clk81" },            \
+               .num_parents = 1,                                       \
+               .flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED),     \
+       },                                                              \
+};
+
 static DEFINE_SPINLOCK(clk_lock);
 
 static const struct pll_rate_table sys_pll_rate_table[] = {
@@ -563,90 +577,90 @@ static struct clk_gate gxbb_clk81 = {
 };
 
 /* Everything Else (EE) domain gates */
-static MESON_GATE(ddr, HHI_GCLK_MPEG0, 0);
-static MESON_GATE(dos, HHI_GCLK_MPEG0, 1);
-static MESON_GATE(isa, HHI_GCLK_MPEG0, 5);
-static MESON_GATE(pl301, HHI_GCLK_MPEG0, 6);
-static MESON_GATE(periphs, HHI_GCLK_MPEG0, 7);
-static MESON_GATE(spicc, HHI_GCLK_MPEG0, 8);
-static MESON_GATE(i2c, HHI_GCLK_MPEG0, 9);
-static MESON_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
-static MESON_GATE(smart_card, HHI_GCLK_MPEG0, 11);
-static MESON_GATE(rng0, HHI_GCLK_MPEG0, 12);
-static MESON_GATE(uart0, HHI_GCLK_MPEG0, 13);
-static MESON_GATE(sdhc, HHI_GCLK_MPEG0, 14);
-static MESON_GATE(stream, HHI_GCLK_MPEG0, 15);
-static MESON_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
-static MESON_GATE(sdio, HHI_GCLK_MPEG0, 17);
-static MESON_GATE(abuf, HHI_GCLK_MPEG0, 18);
-static MESON_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
-static MESON_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
-static MESON_GATE(spi, HHI_GCLK_MPEG0, 30);
-
-static MESON_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
-static MESON_GATE(eth, HHI_GCLK_MPEG1, 3);
-static MESON_GATE(demux, HHI_GCLK_MPEG1, 4);
-static MESON_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
-static MESON_GATE(iec958, HHI_GCLK_MPEG1, 7);
-static MESON_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
-static MESON_GATE(amclk, HHI_GCLK_MPEG1, 9);
-static MESON_GATE(aififo2, HHI_GCLK_MPEG1, 10);
-static MESON_GATE(mixer, HHI_GCLK_MPEG1, 11);
-static MESON_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
-static MESON_GATE(adc, HHI_GCLK_MPEG1, 13);
-static MESON_GATE(blkmv, HHI_GCLK_MPEG1, 14);
-static MESON_GATE(aiu, HHI_GCLK_MPEG1, 15);
-static MESON_GATE(uart1, HHI_GCLK_MPEG1, 16);
-static MESON_GATE(g2d, HHI_GCLK_MPEG1, 20);
-static MESON_GATE(usb0, HHI_GCLK_MPEG1, 21);
-static MESON_GATE(usb1, HHI_GCLK_MPEG1, 22);
-static MESON_GATE(reset, HHI_GCLK_MPEG1, 23);
-static MESON_GATE(nand, HHI_GCLK_MPEG1, 24);
-static MESON_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
-static MESON_GATE(usb, HHI_GCLK_MPEG1, 26);
-static MESON_GATE(vdin1, HHI_GCLK_MPEG1, 28);
-static MESON_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
-static MESON_GATE(efuse, HHI_GCLK_MPEG1, 30);
-static MESON_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
-
-static MESON_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
-static MESON_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
-static MESON_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
-static MESON_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
-static MESON_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
-static MESON_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
-static MESON_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
-static MESON_GATE(dvin, HHI_GCLK_MPEG2, 12);
-static MESON_GATE(uart2, HHI_GCLK_MPEG2, 15);
-static MESON_GATE(sana, HHI_GCLK_MPEG2, 22);
-static MESON_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
-static MESON_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
-static MESON_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
-
-static MESON_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
-static MESON_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
-static MESON_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
-static MESON_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
-static MESON_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
-static MESON_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
-static MESON_GATE(dac_clk, HHI_GCLK_OTHER, 10);
-static MESON_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
-static MESON_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
-static MESON_GATE(enc480p, HHI_GCLK_OTHER, 20);
-static MESON_GATE(rng1, HHI_GCLK_OTHER, 21);
-static MESON_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
-static MESON_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
-static MESON_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
-static MESON_GATE(vclk_other, HHI_GCLK_OTHER, 26);
-static MESON_GATE(edp, HHI_GCLK_OTHER, 31);
+static GBXX_GATE(ddr, HHI_GCLK_MPEG0, 0);
+static GBXX_GATE(dos, HHI_GCLK_MPEG0, 1);
+static GBXX_GATE(isa, HHI_GCLK_MPEG0, 5);
+static GBXX_GATE(pl301, HHI_GCLK_MPEG0, 6);
+static GBXX_GATE(periphs, HHI_GCLK_MPEG0, 7);
+static GBXX_GATE(spicc, HHI_GCLK_MPEG0, 8);
+static GBXX_GATE(i2c, HHI_GCLK_MPEG0, 9);
+static GBXX_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
+static GBXX_GATE(smart_card, HHI_GCLK_MPEG0, 11);
+static GBXX_GATE(rng0, HHI_GCLK_MPEG0, 12);
+static GBXX_GATE(uart0, HHI_GCLK_MPEG0, 13);
+static GBXX_GATE(sdhc, HHI_GCLK_MPEG0, 14);
+static GBXX_GATE(stream, HHI_GCLK_MPEG0, 15);
+static GBXX_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
+static GBXX_GATE(sdio, HHI_GCLK_MPEG0, 17);
+static GBXX_GATE(abuf, HHI_GCLK_MPEG0, 18);
+static GBXX_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
+static GBXX_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
+static GBXX_GATE(spi, HHI_GCLK_MPEG0, 30);
+
+static GBXX_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
+static GBXX_GATE(eth, HHI_GCLK_MPEG1, 3);
+static GBXX_GATE(demux, HHI_GCLK_MPEG1, 4);
+static GBXX_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
+static GBXX_GATE(iec958, HHI_GCLK_MPEG1, 7);
+static GBXX_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
+static GBXX_GATE(amclk, HHI_GCLK_MPEG1, 9);
+static GBXX_GATE(aififo2, HHI_GCLK_MPEG1, 10);
+static GBXX_GATE(mixer, HHI_GCLK_MPEG1, 11);
+static GBXX_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
+static GBXX_GATE(adc, HHI_GCLK_MPEG1, 13);
+static GBXX_GATE(blkmv, HHI_GCLK_MPEG1, 14);
+static GBXX_GATE(aiu, HHI_GCLK_MPEG1, 15);
+static GBXX_GATE(uart1, HHI_GCLK_MPEG1, 16);
+static GBXX_GATE(g2d, HHI_GCLK_MPEG1, 20);
+static GBXX_GATE(usb0, HHI_GCLK_MPEG1, 21);
+static GBXX_GATE(usb1, HHI_GCLK_MPEG1, 22);
+static GBXX_GATE(reset, HHI_GCLK_MPEG1, 23);
+static GBXX_GATE(nand, HHI_GCLK_MPEG1, 24);
+static GBXX_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
+static GBXX_GATE(usb, HHI_GCLK_MPEG1, 26);
+static GBXX_GATE(vdin1, HHI_GCLK_MPEG1, 28);
+static GBXX_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
+static GBXX_GATE(efuse, HHI_GCLK_MPEG1, 30);
+static GBXX_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
+
+static GBXX_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
+static GBXX_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
+static GBXX_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
+static GBXX_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
+static GBXX_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
+static GBXX_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
+static GBXX_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
+static GBXX_GATE(dvin, HHI_GCLK_MPEG2, 12);
+static GBXX_GATE(uart2, HHI_GCLK_MPEG2, 15);
+static GBXX_GATE(sana, HHI_GCLK_MPEG2, 22);
+static GBXX_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
+static GBXX_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
+static GBXX_GATE(clk81_a53, HHI_GCLK_MPEG2, 29);
+
+static GBXX_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
+static GBXX_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
+static GBXX_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
+static GBXX_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
+static GBXX_GATE(gclk_venci_int0, HHI_GCLK_OTHER, 8);
+static GBXX_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
+static GBXX_GATE(dac_clk, HHI_GCLK_OTHER, 10);
+static GBXX_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
+static GBXX_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
+static GBXX_GATE(enc480p, HHI_GCLK_OTHER, 20);
+static GBXX_GATE(rng1, HHI_GCLK_OTHER, 21);
+static GBXX_GATE(gclk_venci_int1, HHI_GCLK_OTHER, 22);
+static GBXX_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
+static GBXX_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
+static GBXX_GATE(vclk_other, HHI_GCLK_OTHER, 26);
+static GBXX_GATE(edp, HHI_GCLK_OTHER, 31);
 
 /* Always On (AO) domain gates */
 
-static MESON_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
-static MESON_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
-static MESON_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
-static MESON_GATE(ao_iface, HHI_GCLK_AO, 3);
-static MESON_GATE(ao_i2c, HHI_GCLK_AO, 4);
+static GBXX_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
+static GBXX_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
+static GBXX_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
+static GBXX_GATE(ao_iface, HHI_GCLK_AO, 3);
+static GBXX_GATE(ao_i2c, HHI_GCLK_AO, 4);
 
 /* Array of all clocks provided by this provider */
 
Signature · 1 line
2.5.0
#13 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

In reply to Alexander Müller

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

---
 drivers/clk/meson/meson8b.c | 263 ++++++++++++++++++++++++++++++++++++++++++++
 drivers/clk/meson/meson8b.h |   5 +
 2 files changed, 268 insertions(+)
drivers/clk/meson/meson8b.c +263 -0
index 0c6e26f..9a2d0c1 100644
@@ -28,6 +28,20 @@
 #include "clkc.h"
 #include "meson8b.h"
 
+#define MESON8B_GATE(_name, _reg, _bit)					\
+struct clk_gate meson8b_##_name = { 					\
+	.reg = (void __iomem *) _reg, 					\
+	.bit_idx = (_bit), 						\
+	.lock = &clk_lock,						\
+	.hw.init = &(struct clk_init_data) { 				\
+		.name = #_name,						\
+		.ops = &clk_gate_ops,					\
+		.parent_names = (const char *[]){ "clk81" },		\
+		.num_parents = 1,					\
+		.flags = (CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED), 	\
+	},								\
+};
+
 static DEFINE_SPINLOCK(clk_lock);
 
 static const struct pll_rate_table sys_pll_rate_table[] = {
@@ -312,6 +326,92 @@ struct clk_gate meson8b_clk81 = {
 	},
 };
 
+/* Everything Else (EE) domain gates */
+
+static MESON8B_GATE(ddr, HHI_GCLK_MPEG0, 0);
+static MESON8B_GATE(dos, HHI_GCLK_MPEG0, 1);
+static MESON8B_GATE(isa, HHI_GCLK_MPEG0, 5);
+static MESON8B_GATE(pl301, HHI_GCLK_MPEG0, 6);
+static MESON8B_GATE(periphs, HHI_GCLK_MPEG0, 7);
+static MESON8B_GATE(spicc, HHI_GCLK_MPEG0, 8);
+static MESON8B_GATE(i2c, HHI_GCLK_MPEG0, 9);
+static MESON8B_GATE(sar_adc, HHI_GCLK_MPEG0, 10);
+static MESON8B_GATE(smart_card, HHI_GCLK_MPEG0, 11);
+static MESON8B_GATE(rng0, HHI_GCLK_MPEG0, 12);
+static MESON8B_GATE(uart0, HHI_GCLK_MPEG0, 13);
+static MESON8B_GATE(sdhc, HHI_GCLK_MPEG0, 14);
+static MESON8B_GATE(stream, HHI_GCLK_MPEG0, 15);
+static MESON8B_GATE(async_fifo, HHI_GCLK_MPEG0, 16);
+static MESON8B_GATE(sdio, HHI_GCLK_MPEG0, 17);
+static MESON8B_GATE(abuf, HHI_GCLK_MPEG0, 18);
+static MESON8B_GATE(hiu_iface, HHI_GCLK_MPEG0, 19);
+static MESON8B_GATE(assist_misc, HHI_GCLK_MPEG0, 23);
+static MESON8B_GATE(spi, HHI_GCLK_MPEG0, 30);
+
+static MESON8B_GATE(i2s_spdif, HHI_GCLK_MPEG1, 2);
+static MESON8B_GATE(eth, HHI_GCLK_MPEG1, 3);
+static MESON8B_GATE(demux, HHI_GCLK_MPEG1, 4);
+static MESON8B_GATE(aiu_glue, HHI_GCLK_MPEG1, 6);
+static MESON8B_GATE(iec958, HHI_GCLK_MPEG1, 7);
+static MESON8B_GATE(i2s_out, HHI_GCLK_MPEG1, 8);
+static MESON8B_GATE(amclk, HHI_GCLK_MPEG1, 9);
+static MESON8B_GATE(aififo2, HHI_GCLK_MPEG1, 10);
+static MESON8B_GATE(mixer, HHI_GCLK_MPEG1, 11);
+static MESON8B_GATE(mixer_iface, HHI_GCLK_MPEG1, 12);
+static MESON8B_GATE(adc, HHI_GCLK_MPEG1, 13);
+static MESON8B_GATE(blkmv, HHI_GCLK_MPEG1, 14);
+static MESON8B_GATE(aiu, HHI_GCLK_MPEG1, 15);
+static MESON8B_GATE(uart1, HHI_GCLK_MPEG1, 16);
+static MESON8B_GATE(g2d, HHI_GCLK_MPEG1, 20);
+static MESON8B_GATE(usb0, HHI_GCLK_MPEG1, 21);
+static MESON8B_GATE(usb1, HHI_GCLK_MPEG1, 22);
+static MESON8B_GATE(reset, HHI_GCLK_MPEG1, 23);
+static MESON8B_GATE(nand, HHI_GCLK_MPEG1, 24);
+static MESON8B_GATE(dos_parser, HHI_GCLK_MPEG1, 25);
+static MESON8B_GATE(usb, HHI_GCLK_MPEG1, 26);
+static MESON8B_GATE(vdin1, HHI_GCLK_MPEG1, 28);
+static MESON8B_GATE(ahb_arb0, HHI_GCLK_MPEG1, 29);
+static MESON8B_GATE(efuse, HHI_GCLK_MPEG1, 30);
+static MESON8B_GATE(boot_rom, HHI_GCLK_MPEG1, 31);
+
+static MESON8B_GATE(ahb_data_bus, HHI_GCLK_MPEG2, 1);
+static MESON8B_GATE(ahb_ctrl_bus, HHI_GCLK_MPEG2, 2);
+static MESON8B_GATE(hdmi_intr_sync, HHI_GCLK_MPEG2, 3);
+static MESON8B_GATE(hdmi_pclk, HHI_GCLK_MPEG2, 4);
+static MESON8B_GATE(usb1_ddr_bridge, HHI_GCLK_MPEG2, 8);
+static MESON8B_GATE(usb0_ddr_bridge, HHI_GCLK_MPEG2, 9);
+static MESON8B_GATE(mmc_pclk, HHI_GCLK_MPEG2, 11);
+static MESON8B_GATE(dvin, HHI_GCLK_MPEG2, 12);
+static MESON8B_GATE(uart2, HHI_GCLK_MPEG2, 15);
+static MESON8B_GATE(sana, HHI_GCLK_MPEG2, 22);
+static MESON8B_GATE(vpu_intr, HHI_GCLK_MPEG2, 25);
+static MESON8B_GATE(sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26);
+static MESON8B_GATE(clk81_a9, HHI_GCLK_MPEG2, 29);
+
+static MESON8B_GATE(vclk2_venci0, HHI_GCLK_OTHER, 1);
+static MESON8B_GATE(vclk2_venci1, HHI_GCLK_OTHER, 2);
+static MESON8B_GATE(vclk2_vencp0, HHI_GCLK_OTHER, 3);
+static MESON8B_GATE(vclk2_vencp1, HHI_GCLK_OTHER, 4);
+static MESON8B_GATE(gclk_venci_int, HHI_GCLK_OTHER, 8);
+static MESON8B_GATE(gclk_vencp_int, HHI_GCLK_OTHER, 9);
+static MESON8B_GATE(dac_clk, HHI_GCLK_OTHER, 10);
+static MESON8B_GATE(aoclk_gate, HHI_GCLK_OTHER, 14);
+static MESON8B_GATE(iec958_gate, HHI_GCLK_OTHER, 16);
+static MESON8B_GATE(enc480p, HHI_GCLK_OTHER, 20);
+static MESON8B_GATE(rng1, HHI_GCLK_OTHER, 21);
+static MESON8B_GATE(gclk_vencl_int, HHI_GCLK_OTHER, 22);
+static MESON8B_GATE(vclk2_venclmcc, HHI_GCLK_OTHER, 24);
+static MESON8B_GATE(vclk2_vencl, HHI_GCLK_OTHER, 25);
+static MESON8B_GATE(vclk2_other, HHI_GCLK_OTHER, 26);
+static MESON8B_GATE(edp, HHI_GCLK_OTHER, 31);
+
+/* Always On (AO) domain gates */
+
+static MESON8B_GATE(ao_media_cpu, HHI_GCLK_AO, 0);
+static MESON8B_GATE(ao_ahb_sram, HHI_GCLK_AO, 1);
+static MESON8B_GATE(ao_ahb_bus, HHI_GCLK_AO, 2);
+static MESON8B_GATE(ao_iface, HHI_GCLK_AO, 3);
+
 static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
 	.hws = {
 		[CLKID_XTAL] = &meson8b_xtal.hw,
@@ -327,6 +427,83 @@ static struct clk_hw_onecell_data meson8b_hw_onecell_data = {
 		[CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw,
 		[CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw,
 		[CLKID_CLK81] = &meson8b_clk81.hw,
+		[CLKID_DDR]		    = &meson8b_ddr.hw,
+		[CLKID_DOS]		    = &meson8b_dos.hw,
+		[CLKID_ISA]		    = &meson8b_isa.hw,
+		[CLKID_PL301]		    = &meson8b_pl301.hw,
+		[CLKID_PERIPHS]		    = &meson8b_periphs.hw,
+		[CLKID_SPICC]		    = &meson8b_spicc.hw,
+		[CLKID_I2C]		    = &meson8b_i2c.hw,
+		[CLKID_SAR_ADC]		    = &meson8b_sar_adc.hw,
+		[CLKID_SMART_CARD]	    = &meson8b_smart_card.hw,
+		[CLKID_RNG0]		    = &meson8b_rng0.hw,
+		[CLKID_UART0]		    = &meson8b_uart0.hw,
+		[CLKID_SDHC]		    = &meson8b_sdhc.hw,
+		[CLKID_STREAM]		    = &meson8b_stream.hw,
+		[CLKID_ASYNC_FIFO]	    = &meson8b_async_fifo.hw,
+		[CLKID_SDIO]		    = &meson8b_sdio.hw,
+		[CLKID_ABUF]		    = &meson8b_abuf.hw,
+		[CLKID_HIU_IFACE]	    = &meson8b_hiu_iface.hw,
+		[CLKID_ASSIST_MISC]	    = &meson8b_assist_misc.hw,
+		[CLKID_SPI]		    = &meson8b_spi.hw,
+		[CLKID_I2S_SPDIF]	    = &meson8b_i2s_spdif.hw,
+		[CLKID_ETH]		    = &meson8b_eth.hw,
+		[CLKID_DEMUX]		    = &meson8b_demux.hw,
+		[CLKID_AIU_GLUE]	    = &meson8b_aiu_glue.hw,
+		[CLKID_IEC958]		    = &meson8b_iec958.hw,
+		[CLKID_I2S_OUT]		    = &meson8b_i2s_out.hw,
+		[CLKID_AMCLK]		    = &meson8b_amclk.hw,
+		[CLKID_AIFIFO2]		    = &meson8b_aififo2.hw,
+		[CLKID_MIXER]		    = &meson8b_mixer.hw,
+		[CLKID_MIXER_IFACE]	    = &meson8b_mixer_iface.hw,
+		[CLKID_ADC]		    = &meson8b_adc.hw,
+		[CLKID_BLKMV]		    = &meson8b_blkmv.hw,
+		[CLKID_AIU]		    = &meson8b_aiu.hw,
+		[CLKID_UART1]		    = &meson8b_uart1.hw,
+		[CLKID_G2D]		    = &meson8b_g2d.hw,
+		[CLKID_USB0]		    = &meson8b_usb0.hw,
+		[CLKID_USB1]		    = &meson8b_usb1.hw,
+		[CLKID_RESET]		    = &meson8b_reset.hw,
+		[CLKID_NAND]		    = &meson8b_nand.hw,
+		[CLKID_DOS_PARSER]	    = &meson8b_dos_parser.hw,
+		[CLKID_USB]		    = &meson8b_usb.hw,
+		[CLKID_VDIN1]		    = &meson8b_vdin1.hw,
+		[CLKID_AHB_ARB0]	    = &meson8b_ahb_arb0.hw,
+		[CLKID_EFUSE]		    = &meson8b_efuse.hw,
+		[CLKID_BOOT_ROM]	    = &meson8b_boot_rom.hw,
+		[CLKID_AHB_DATA_BUS]	    = &meson8b_ahb_data_bus.hw,
+		[CLKID_AHB_CTRL_BUS]	    = &meson8b_ahb_ctrl_bus.hw,
+		[CLKID_HDMI_INTR_SYNC]	    = &meson8b_hdmi_intr_sync.hw,
+		[CLKID_HDMI_PCLK]	    = &meson8b_hdmi_pclk.hw,
+		[CLKID_USB1_DDR_BRIDGE]	    = &meson8b_usb1_ddr_bridge.hw,
+		[CLKID_USB0_DDR_BRIDGE]	    = &meson8b_usb0_ddr_bridge.hw,
+		[CLKID_MMC_PCLK]	    = &meson8b_mmc_pclk.hw,
+		[CLKID_DVIN]		    = &meson8b_dvin.hw,
+		[CLKID_UART2]		    = &meson8b_uart2.hw,
+		[CLKID_SANA]		    = &meson8b_sana.hw,
+		[CLKID_VPU_INTR]	    = &meson8b_vpu_intr.hw,
+		[CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw,
+		[CLKID_CLK81_A9]	    = &meson8b_clk81_a9.hw,
+		[CLKID_VCLK2_VENCI0]	    = &meson8b_vclk2_venci0.hw,
+		[CLKID_VCLK2_VENCI1]	    = &meson8b_vclk2_venci1.hw,
+		[CLKID_VCLK2_VENCP0]	    = &meson8b_vclk2_vencp0.hw,
+		[CLKID_VCLK2_VENCP1]	    = &meson8b_vclk2_vencp1.hw,
+		[CLKID_GCLK_VENCI_INT]	    = &meson8b_gclk_venci_int.hw,
+		[CLKID_GCLK_VENCI_INT]	    = &meson8b_gclk_vencp_int.hw,
+		[CLKID_DAC_CLK]		    = &meson8b_dac_clk.hw,
+		[CLKID_AOCLK_GATE]	    = &meson8b_aoclk_gate.hw,
+		[CLKID_IEC958_GATE]	    = &meson8b_iec958_gate.hw,
+		[CLKID_ENC480P]		    = &meson8b_enc480p.hw,
+		[CLKID_RNG1]		    = &meson8b_rng1.hw,
+		[CLKID_GCLK_VENCL_INT]	    = &meson8b_gclk_vencl_int.hw,
+		[CLKID_VCLK2_VENCLMCC]	    = &meson8b_vclk2_venclmcc.hw,
+		[CLKID_VCLK2_VENCL]	    = &meson8b_vclk2_vencl.hw,
+		[CLKID_VCLK2_OTHER]	    = &meson8b_vclk2_other.hw,
+		[CLKID_EDP]		    = &meson8b_edp.hw,
+		[CLKID_AO_MEDIA_CPU]	    = &meson8b_ao_media_cpu.hw,
+		[CLKID_AO_AHB_SRAM]	    = &meson8b_ao_ahb_sram.hw,
+		[CLKID_AO_AHB_BUS]	    = &meson8b_ao_ahb_bus.hw,
+		[CLKID_AO_IFACE]	    = &meson8b_ao_iface.hw,
 	},
 	.num = CLK_NR_CLKS,
 };
@@ -337,6 +514,87 @@ static struct meson_clk_pll *const meson8b_clk_plls[] = {
 	&meson8b_sys_pll,
 };
 
+static struct clk_gate *meson8b_clk_gates[] = {
+	&meson8b_clk81,
+	&meson8b_ddr,
+	&meson8b_dos,
+	&meson8b_isa,
+	&meson8b_pl301,
+	&meson8b_periphs,
+	&meson8b_spicc,
+	&meson8b_i2c,
+	&meson8b_sar_adc,
+	&meson8b_smart_card,
+	&meson8b_rng0,
+	&meson8b_uart0,
+	&meson8b_sdhc,
+	&meson8b_stream,
+	&meson8b_async_fifo,
+	&meson8b_sdio,
+	&meson8b_abuf,
+	&meson8b_hiu_iface,
+	&meson8b_assist_misc,
+	&meson8b_spi,
+	&meson8b_i2s_spdif,
+	&meson8b_eth,
+	&meson8b_demux,
+	&meson8b_aiu_glue,
+	&meson8b_iec958,
+	&meson8b_i2s_out,
+	&meson8b_amclk,
+	&meson8b_aififo2,
+	&meson8b_mixer,
+	&meson8b_mixer_iface,
+	&meson8b_adc,
+	&meson8b_blkmv,
+	&meson8b_aiu,
+	&meson8b_uart1,
+	&meson8b_g2d,
+	&meson8b_usb0,
+	&meson8b_usb1,
+	&meson8b_reset,
+	&meson8b_nand,
+	&meson8b_dos_parser,
+	&meson8b_usb,
+	&meson8b_vdin1,
+	&meson8b_ahb_arb0,
+	&meson8b_efuse,
+	&meson8b_boot_rom,
+	&meson8b_ahb_data_bus,
+	&meson8b_ahb_ctrl_bus,
+	&meson8b_hdmi_intr_sync,
+	&meson8b_hdmi_pclk,
+	&meson8b_usb1_ddr_bridge,
+	&meson8b_usb0_ddr_bridge,
+	&meson8b_mmc_pclk,
+	&meson8b_dvin,
+	&meson8b_uart2,
+	&meson8b_sana,
+	&meson8b_vpu_intr,
+	&meson8b_sec_ahb_ahb3_bridge,
+	&meson8b_clk81_a9,
+	&meson8b_vclk2_venci0,
+	&meson8b_vclk2_venci1,
+	&meson8b_vclk2_vencp0,
+	&meson8b_vclk2_vencp1,
+	&meson8b_gclk_venci_int,
+	&meson8b_gclk_vencp_int,
+	&meson8b_dac_clk,
+	&meson8b_aoclk_gate,
+	&meson8b_iec958_gate,
+	&meson8b_enc480p,
+	&meson8b_rng1,
+	&meson8b_gclk_vencl_int,
+	&meson8b_vclk2_venclmcc,
+	&meson8b_vclk2_vencl,
+	&meson8b_vclk2_other,
+	&meson8b_edp,
+	&meson8b_ao_media_cpu,
+	&meson8b_ao_ahb_sram,
+	&meson8b_ao_ahb_bus,
+	&meson8b_ao_iface,
+};
+
 static int meson8b_clkc_probe(struct platform_device *pdev)
 {
 	void __iomem *clk_base;
@@ -364,6 +622,11 @@ static int meson8b_clkc_probe(struct platform_device *pdev)
 	meson8b_mpeg_clk_div.reg = clk_base + (u32)meson8b_mpeg_clk_div.reg;
 	meson8b_clk81.reg = clk_base + (u32)meson8b_clk81.reg;
 
+	/* Populate base address for gates */
+	for (i = 0; i < ARRAY_SIZE(meson8b_clk_gates); i++)
+		meson8b_clk_gates[i]->reg = clk_base +
+			(u32)meson8b_clk_gates[i]->reg;
+
 	/*
 	 * register all clks
 	 * CLKID_UNUSED = 0, so skip it and start with CLKID_XTAL = 1
drivers/clk/meson/meson8b.h +5 -0
index b2f29f7..8dffae0 100644
@@ -30,6 +30,11 @@
  *
  * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf
  */
+#define HHI_GCLK_MPEG0			0x140 /* 0x50 offset in data sheet */
+#define HHI_GCLK_MPEG1			0x144 /* 0x51 offset in data sheet */
+#define HHI_GCLK_MPEG2			0x148 /* 0x52 offset in data sheet */
+#define HHI_GCLK_OTHER			0x150 /* 0x54 offset in data sheet */
+#define HHI_GCLK_AO			0x154 /* 0x55 offset in data sheet */
 #define HHI_SYS_CPU_CLK_CNTL1		0x15c /* 0x57 offset in data sheet */
 #define HHI_MPEG_CLK_CNTL		0x174 /* 0x5d offset in data sheet */
 #define HHI_MPLL_CNTL			0x280 /* 0xa0 offset in data sheet */
Signature · 1 line
2.5.0
#14 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Quoted 6 lines · Alexander M?ller

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

Signature · 2 lines
Ben Dooks				http://www.codethink.co.uk/
Senior Engineer				Codethink - Providing Genius
#15 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Hi Ben,

Quoting Ben Dooks (2016-07-05 11:01:14)

Quoted 5 lines · Alexander M?ller
Quoted 4 lines

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

Quoted 7 lines
Quoted 2 lines

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

We want the real clocks registered so that we can disable spuriously enabled at late_initcall time with clk_disable_unused.

Furthermore, I'd like to not represent all of these gates in the DT binding description (see my response to the earlier patches in this series), since it becomes ABI (and a maintenance nightmare).

Regards,
Mike

Quoted 4 lines
Signature · 3 lines
-- 
Ben Dooks                               http://www.codethink.co.uk/
Senior Engineer                         Codethink - Providing Genius
#16 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Quoted 16 lines · Michael Turquette

Hi Ben,

Quoting Ben Dooks (2016-07-05 11:01:14)

Quoted 5 lines · Alexander M?ller
Quoted 4 lines

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

Quoted 7 lines
Quoted 2 lines

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

Quoted 6 lines

We want the real clocks registered so that we can disable spuriously enabled at late_initcall time with clk_disable_unused.

Furthermore, I'd like to not represent all of these gates in the DT binding description (see my response to the earlier patches in this series), since it becomes ABI (and a maintenance nightmare).

Erm, so writing /more/ code and having them defined in /two/ places is a nightmare? Sounds more of a nightmare of having the ID in the DT represent the register/bit offset and then having them created at lookup time.

Signature · 2 lines
Ben Dooks				http://www.codethink.co.uk/
Senior Engineer				Codethink - Providing Genius
#17 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Quoting Ben Dooks (2016-07-06 00:35:28)

Quoted 20 lines · Michael Turquette
Quoted 19 lines

Hi Ben,

Quoting Ben Dooks (2016-07-05 11:01:14)

Quoted 5 lines · Alexander M?ller
Quoted 4 lines

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

Quoted 7 lines
Quoted 2 lines

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

We want the real clocks registered so that we can disable spuriously enabled at late_initcall time with clk_disable_unused.

Quoted 8 lines
Quoted 3 lines

Furthermore, I'd like to not represent all of these gates in the DT binding description (see my response to the earlier patches in this series), since it becomes ABI (and a maintenance nightmare).

Erm, so writing /more/ code and having them defined in /two/ places is a nightmare? Sounds more of a nightmare of having the ID in the DT represent the register/bit offset and then having them created at lookup time.

I apologize, but I really don't understand what side of the argument that you are pushing for based on the above text. Something is a nightmare, but I'm not sure which design pattern you are attributing nightmare status too.

Anyways, clock string name is required always, so even if you encode register and bitfield in DT cleverly, you've still got data in C, assuming your point was to remove stuff from C. That might change some day, but not today. Memory footprint should remain the same with either implementation.

If you have an alternative implementation, patches are always welcome.

Best regards,
Mike

Quoted 7 lines
Signature · 3 lines
-- 
Ben Dooks                               http://www.codethink.co.uk/
Senior Engineer                         Codethink - Providing Genius
#18 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Quoted 35 lines · Michael Turquette

Quoting Ben Dooks (2016-07-06 00:35:28)

Quoted 20 lines · Michael Turquette
Quoted 19 lines

Hi Ben,

Quoting Ben Dooks (2016-07-05 11:01:14)

Quoted 5 lines · Alexander M?ller
Quoted 4 lines

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

Quoted 7 lines
Quoted 2 lines

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

We want the real clocks registered so that we can disable spuriously enabled at late_initcall time with clk_disable_unused.

Quoted 8 lines
Quoted 3 lines

Furthermore, I'd like to not represent all of these gates in the DT binding description (see my response to the earlier patches in this series), since it becomes ABI (and a maintenance nightmare).

Erm, so writing /more/ code and having them defined in /two/ places is a nightmare? Sounds more of a nightmare of having the ID in the DT represent the register/bit offset and then having them created at lookup time.

I apologize, but I really don't understand what side of the argument that you are pushing for based on the above text. Something is a nightmare, but I'm not sure which design pattern you are attributing nightmare status too.

Quoted 5 lines

Anyways, clock string name is required always, so even if you encode register and bitfield in DT cleverly, you've still got data in C, assuming your point was to remove stuff from C. That might change some day, but not today. Memory footprint should remain the same with either implementation.

Is that actually useful for anything other than debug?

Quoted 1 line

If you have an alternative implementation, patches are always welcome.

I can think of a few ways we could do this, depending on how much code is to be added either to the meson-clk driver or to something that is more generic.

If we add gate support to the meson clkock driver, we could have two implementations, we can either encode the reg/bit into the ID and have a valid bitmask fro the clock registers to define which are valid:

#define CLK81_GATE_BASE (0x10000)
#define CLK81_GATE(__reg, __bit) (CLK81_GATE_BASE + ((__reg) * 32) +
(__bit))

	clks: meson-clock-driver at xxx {
		valid-clk-masks = <...>, <...>, <...>;
	};

We could even have one sub-node for each 32bit gate

	clks: meson-clock-driver at xxx {
		clk81_gate0: {
			compatible = "meson,meson-gate-reg";
			valid-clk-mask = <0x1f1>;
		}
	};

Both of these allow easy changing of the bitmask or number of clock gates in the DT. It also means the work is done in one place, and is re-usable by other operating systems.

In this case, you could also have a generic clock gate driver which could be define. I'll try and dig out my previous implementation of this which may need a bit of updating.

clk81_gate0: clk-gate at regaddr {
	reg = <regaddr>;
	compatible = "clock,clock-32git-gate";
	valid-clocks = <0x1f1>;
	clk-parent = <&clk81>;
	has-single-parent;
};

Note, all these could be extended with a clk-names = "a", "b", "c"; and there is already precedent for having a list of valid clock as an array of integers if bitmasks are not acceptable.

My side comes down to:

1) We end up with an ID to register mapping which is not clear to see from the DT to the actual register and bit combination being used.

2) If the DT is updated, then we have to update the kernel too if we are using the ID scheme suggested originally.

3) Some of the drivers would provide a generic solution to other SoCs

4) We could even re-use a generic clk-gate driver outside of AMLogic

5) This makes it easier to port to other operating systems as all the data is available in the DT. See also #1

A second note, if we don't want to register n*32 clocks then adding a clk_unused callback called at the end of the initcalls could use the mask/list of clocks to mask out the unused clocks so we don't end up with unused clk structures lying aroudn (could even be a cmdline or kconfig config)

Signature · 2 lines
Ben Dooks				http://www.codethink.co.uk/
Senior Engineer				Codethink - Providing Genius
#19 lore raw

PATCH 6/7 meson: clk: Add support for clock gates

Quoting Ben Dooks (2016-07-06 01:50:49)

Quoted 36 lines · Michael Turquette
Quoted 35 lines

Quoting Ben Dooks (2016-07-06 00:35:28)

Quoted 20 lines · Michael Turquette
Quoted 19 lines

Hi Ben,

Quoting Ben Dooks (2016-07-05 11:01:14)

Quoted 5 lines · Alexander M?ller
Quoted 4 lines

This patch adds support for the meson8b clock gates. Most of them are disabled by Amlogic U-Boot, but need to be enabled for ethernet, USB and many other components.

Quoted 7 lines
Quoted 2 lines

---

This seems to be a lot of structures for clocks that may never be use. I think it would be better to provide a custom lookup function that creates these as needed and use the ID in the dt as a offset+bit id.

We want the real clocks registered so that we can disable spuriously enabled at late_initcall time with clk_disable_unused.

Quoted 8 lines
Quoted 3 lines

Furthermore, I'd like to not represent all of these gates in the DT binding description (see my response to the earlier patches in this series), since it becomes ABI (and a maintenance nightmare).

Erm, so writing /more/ code and having them defined in /two/ places is a nightmare? Sounds more of a nightmare of having the ID in the DT represent the register/bit offset and then having them created at lookup time.

I apologize, but I really don't understand what side of the argument that you are pushing for based on the above text. Something is a nightmare, but I'm not sure which design pattern you are attributing nightmare status too.

Quoted 7 lines
Quoted 5 lines

Anyways, clock string name is required always, so even if you encode register and bitfield in DT cleverly, you've still got data in C, assuming your point was to remove stuff from C. That might change some day, but not today. Memory footprint should remain the same with either implementation.

Is that actually useful for anything other than debug?

It predates DT adoption by ARM, and we use it internally in the framework to resolve parent-child relationships. We have better possible ways to do this now after 5 years of development, but the legacy drivers will still need this. And so will current drivers, without a replacement mechanism (which I'm working on in my spare time).

Quoted 38 lines
Quoted 2 lines

If you have an alternative implementation, patches are always welcome.

I can think of a few ways we could do this, depending on how much code is to be added either to the meson-clk driver or to something that is more generic.

If we add gate support to the meson clkock driver, we could have two implementations, we can either encode the reg/bit into the ID and have a valid bitmask fro the clock registers to define which are valid:

#define CLK81_GATE_BASE (0x10000)
#define CLK81_GATE(__reg, __bit) (CLK81_GATE_BASE + ((__reg) * 32) +
(__bit))

        clks: meson-clock-driver at xxx {
                valid-clk-masks = <...>, <...>, <...>;
        };

We could even have one sub-node for each 32bit gate

        clks: meson-clock-driver at xxx {
                clk81_gate0: {
                        compatible = "meson,meson-gate-reg";
                        valid-clk-mask = <0x1f1>;
                }
        };

Both of these allow easy changing of the bitmask or number of clock gates in the DT. It also means the work is done in one place, and is re-usable by other operating systems.

In this case, you could also have a generic clock gate driver which could be define. I'll try and dig out my previous implementation of this which may need a bit of updating.

Quoted 7 lines
clk81_gate0: clk-gate at regaddr {
        reg = <regaddr>;
        compatible = "clock,clock-32git-gate";
        valid-clocks = <0x1f1>;
        clk-parent = <&clk81>;
        has-single-parent;
};

Nak. We've worked hard to move away from defining individual clock nodes in DT. We want to express clock controllers as nodes, not individual clock signals.

Putting per-clock data into DT is literally the opposite of the direction that we've been trying to go.

This kind of stuff always sounds good until you start to have quirks, and then you either need to put Linux-specific flags into DT (bad) or come up with dozens of compatible strings to handle those quirks (not good).

Regards,
Mike

Quoted 30 lines

Note, all these could be extended with a clk-names = "a", "b", "c"; and there is already precedent for having a list of valid clock as an array of integers if bitmasks are not acceptable.

My side comes down to:

1) We end up with an ID to register mapping which is not clear to see from the DT to the actual register and bit combination being used.

2) If the DT is updated, then we have to update the kernel too if we are using the ID scheme suggested originally.

3) Some of the drivers would provide a generic solution to other SoCs

4) We could even re-use a generic clk-gate driver outside of AMLogic

5) This makes it easier to port to other operating systems as all the data is available in the DT. See also #1

A second note, if we don't want to register n*32 clocks then adding a clk_unused callback called at the end of the initcalls could use the mask/list of clocks to mask out the unused clocks so we don't end up with unused clk structures lying aroudn (could even be a cmdline or kconfig config)

Signature · 2 lines
Ben Dooks                               http://www.codethink.co.uk/
Senior Engineer                         Codethink - Providing Genius
#20 lore raw

PATCH 7/7 arm: amlogic: select meson8b clk driver

In reply to Alexander Müller

Select the Amlogic clk code for meson SoCs and the more specific meson8b clk driver for Amlogic meson8b.

---
 arch/arm/mach-meson/Kconfig | 2 ++
 1 file changed, 2 insertions(+)
arch/arm/mach-meson/Kconfig +2 -0
index 31bdd91..b3add39 100644
@@ -7,6 +7,7 @@ menuconfig ARCH_MESON
 	select CACHE_L2X0
 	select PINCTRL
 	select PINCTRL_MESON
+	select COMMON_CLK_AMLOGIC
 
 if ARCH_MESON
 
@@ -24,5 +25,6 @@ config MACH_MESON8B
 	bool "Amlogic Meson8b SoCs support"
 	default ARCH_MESON
 	select MESON6_TIMER
+	select COMMON_CLK_MESON8B
 
 endif
Signature · 1 line
2.5.0
#21 lore raw

PATCH 7/7 arm: amlogic: select meson8b clk driver

Hi Alex,

Quoting Alexander M?ller (2016-07-05 10:56:31)

Quoted 4 lines

Select the Amlogic clk code for meson SoCs and the more specific meson8b clk driver for Amlogic meson8b.

This patch isn't necessary as an alternative is already queued. See:
https://git.kernel.org/cgit/linux/kernel/git/mturquette/linux.git/commit/?h=gxbb-dt-clk&id=bae5d70ba6f8726ea6306aa07b7d2eb4357d3c81

However, if you're basing on top of clk-next (or clk-s905) then you won't see the three patches linked above because they are queued through Kevin & Carlo via the amlogic tree.

Regards,
Mike

Quoted 26 lines
---
 arch/arm/mach-meson/Kconfig | 2 ++
 1 file changed, 2 insertions(+)
arch/arm/mach-meson/Kconfig +2 -0
index 31bdd91..b3add39 100644
@@ -7,6 +7,7 @@ menuconfig ARCH_MESON
        select CACHE_L2X0
        select PINCTRL
        select PINCTRL_MESON
+       select COMMON_CLK_AMLOGIC
 
 if ARCH_MESON
 
@@ -24,5 +25,6 @@ config MACH_MESON8B
        bool "Amlogic Meson8b SoCs support"
        default ARCH_MESON
        select MESON6_TIMER
+       select COMMON_CLK_MESON8B
 
 endif
Signature · 1 line
2.5.0
maintainer
#22 lore raw

PATCH 7/7 arm: amlogic: select meson8b clk driver

Quoted 6 lines · Michael Turquette

Hi Alex,

Quoting Alexander M?ller (2016-07-05 10:56:31)

Quoted 3 lines

Select the Amlogic clk code for meson SoCs and the more specific meson8b clk driver for Amlogic meson8b.

Quoted 8 lines
Quoted 1 line

This patch isn't necessary as an alternative is already queued. See:
https://git.kernel.org/cgit/linux/kernel/git/mturquette/linux.git/commit/?h=gxbb-dt-clk&id=bae5d70ba6f8726ea6306aa07b7d2eb4357d3c81

However, if you're basing on top of clk-next (or clk-s905) then you won't see the three patches linked above because they are queued through Kevin & Carlo via the amlogic tree.

...which you can find here[1] and specifically, the "integ" branch where I'm keeping the latest queued versions of various things merged together for easier testing.

Kevin

[1] https://git.kernel.org/cgit/linux/kernel/git/khilman/linux-amlogic.git/

#23 lore raw

PATCH 7/7 arm: amlogic: select meson8b clk driver

Hi Kevin,

I did the proposed changes and rebased to integ.

Please review and let me know if I missed something.

Alex

Quoted 26 lines · Kevin Hilman
Quoted 6 lines · Michael Turquette

Hi Alex,

Quoting Alexander M?ller (2016-07-05 10:56:31)

Quoted 3 lines

Select the Amlogic clk code for meson SoCs and the more specific meson8b clk driver for Amlogic meson8b.

Quoted 8 lines
Quoted 1 line

This patch isn't necessary as an alternative is already queued. See:
https://git.kernel.org/cgit/linux/kernel/git/mturquette/linux.git/commit/?h=gxbb-dt-clk&id=bae5d70ba6f8726ea6306aa07b7d2eb4357d3c81

However, if you're basing on top of clk-next (or clk-s905) then you won't see the three patches linked above because they are queued through Kevin & Carlo via the amlogic tree.

...which you can find here[1] and specifically, the "integ" branch where I'm keeping the latest queued versions of various things merged together for easier testing.

Kevin

[1] https://git.kernel.org/cgit/linux/kernel/git/khilman/linux-amlogic.git/