[PATCH v4 2/2] clk: meson-g12a: Add EE Clock controller driver

2018-11-08 Thread Jian Hu
Add a Clock driver for the Everything-Else part
of the Amlogic Meson-G12A SoC.

Signed-off-by: Jian Hu 
---
 drivers/clk/meson/Kconfig  |   10 +
 drivers/clk/meson/Makefile |1 +
 drivers/clk/meson/g12a.c   | 1134 
 drivers/clk/meson/g12a.h   |  128 +
 4 files changed, 1273 insertions(+)
 create mode 100644 drivers/clk/meson/g12a.c
 create mode 100644 drivers/clk/meson/g12a.h

diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
index efaa70f..16edad8 100644
--- a/drivers/clk/meson/Kconfig
+++ b/drivers/clk/meson/Kconfig
@@ -54,3 +54,13 @@ config COMMON_CLK_AXG_AUDIO
help
  Support for the audio clock controller on AmLogic A113D devices,
  aka axg, Say Y if you want audio subsystem to work.
+
+config COMMON_CLK_G12A
+   bool
+   depends on COMMON_CLK_AMLOGIC
+   select RESET_CONTROLLER
+   select COMMON_CLK_REGMAP_MESON
+   select MFD_SYSCON
+   help
+ Support for the clock controller on Amlogic S905D2 devices, aka g12a.
+ Say Y if you want peripherals and CPU frequency scaling to work.
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
index 72ec8c4..2b1a562 100644
--- a/drivers/clk/meson/Makefile
+++ b/drivers/clk/meson/Makefile
@@ -9,4 +9,5 @@ obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
 obj-$(CONFIG_COMMON_CLK_GXBB)   += gxbb.o gxbb-aoclk.o gxbb-aoclk-32k.o
 obj-$(CONFIG_COMMON_CLK_AXG)+= axg.o axg-aoclk.o
 obj-$(CONFIG_COMMON_CLK_AXG_AUDIO) += axg-audio.o
+obj-$(CONFIG_COMMON_CLK_G12A)   += g12a.o
 obj-$(CONFIG_COMMON_CLK_REGMAP_MESON)  += clk-regmap.o
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
new file mode 100644
index 000..84df081
--- /dev/null
+++ b/drivers/clk/meson/g12a.c
@@ -0,0 +1,1134 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Amlogic Meson-G12A Clock Controller Driver
+ *
+ * Copyright (c) 2016 Baylibre SAS.
+ * Author: Michael Turquette 
+ *
+ * Copyright (c) 2018 Amlogic, inc.
+ * Author: Qiufang Dai 
+ * Author: Jian Hu 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "clkc.h"
+#include "g12a.h"
+
+static DEFINE_SPINLOCK(meson_clk_lock);
+
+static struct clk_regmap g12a_fixed_pll_dco = {
+   .data = &(struct meson_clk_pll_data){
+   .en = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 28,
+   .width   = 1,
+   },
+   .m = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 0,
+   .width   = 8,
+   },
+   .n = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 10,
+   .width   = 5,
+   },
+   .frac = {
+   .reg_off = HHI_FIX_PLL_CNTL1,
+   .shift   = 0,
+   .width   = 19,
+   },
+   .l = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 31,
+   .width   = 1,
+   },
+   .rst = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 29,
+   .width   = 1,
+   },
+   },
+   .hw.init = &(struct clk_init_data){
+   .name = "fixed_pll_dco",
+   .ops = _clk_pll_ro_ops,
+   .parent_names = (const char *[]){ "xtal" },
+   .num_parents = 1,
+   },
+};
+
+static struct clk_regmap g12a_fixed_pll = {
+   .data = &(struct clk_regmap_div_data){
+   .offset = HHI_FIX_PLL_CNTL0,
+   .shift = 16,
+   .width = 2,
+   .flags = CLK_DIVIDER_POWER_OF_TWO,
+   },
+   .hw.init = &(struct clk_init_data){
+   .name = "fixed_pll",
+   .ops = _regmap_divider_ro_ops,
+   .parent_names = (const char *[]){ "fixed_pll_dco" },
+   .num_parents = 1,
+   /*
+* This clock won't ever change at runtime so
+* CLK_SET_RATE_PARENT is not required
+*/
+   },
+};
+
+static const struct reg_sequence g12a_sys_init_regs[] = {
+   { .reg = HHI_SYS_PLL_CNTL1, .def = 0x },
+   { .reg = HHI_SYS_PLL_CNTL2, .def = 0x },
+   { .reg = HHI_SYS_PLL_CNTL3, .def = 0x48681c00 },
+   { .reg = HHI_SYS_PLL_CNTL4, .def = 0x88770290 },
+   { .reg = HHI_SYS_PLL_CNTL5, .def = 0x39272000 },
+   { .reg = HHI_SYS_PLL_CNTL6, .def = 0x5654 },
+};
+
+static struct clk_regmap g12a_sys_pll_dco = {
+   .data = &(struct meson_clk_pll_data){
+   .en = {
+   .reg_off = HHI_SYS_PLL_CNTL0,
+   .shift   = 28,
+   .width   = 1,
+   },
+   .m = {
+   

[PATCH v4 2/2] clk: meson-g12a: Add EE Clock controller driver

2018-11-08 Thread Jian Hu
Add a Clock driver for the Everything-Else part
of the Amlogic Meson-G12A SoC.

Signed-off-by: Jian Hu 
---
 drivers/clk/meson/Kconfig  |   10 +
 drivers/clk/meson/Makefile |1 +
 drivers/clk/meson/g12a.c   | 1134 
 drivers/clk/meson/g12a.h   |  128 +
 4 files changed, 1273 insertions(+)
 create mode 100644 drivers/clk/meson/g12a.c
 create mode 100644 drivers/clk/meson/g12a.h

diff --git a/drivers/clk/meson/Kconfig b/drivers/clk/meson/Kconfig
index efaa70f..16edad8 100644
--- a/drivers/clk/meson/Kconfig
+++ b/drivers/clk/meson/Kconfig
@@ -54,3 +54,13 @@ config COMMON_CLK_AXG_AUDIO
help
  Support for the audio clock controller on AmLogic A113D devices,
  aka axg, Say Y if you want audio subsystem to work.
+
+config COMMON_CLK_G12A
+   bool
+   depends on COMMON_CLK_AMLOGIC
+   select RESET_CONTROLLER
+   select COMMON_CLK_REGMAP_MESON
+   select MFD_SYSCON
+   help
+ Support for the clock controller on Amlogic S905D2 devices, aka g12a.
+ Say Y if you want peripherals and CPU frequency scaling to work.
diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile
index 72ec8c4..2b1a562 100644
--- a/drivers/clk/meson/Makefile
+++ b/drivers/clk/meson/Makefile
@@ -9,4 +9,5 @@ obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o
 obj-$(CONFIG_COMMON_CLK_GXBB)   += gxbb.o gxbb-aoclk.o gxbb-aoclk-32k.o
 obj-$(CONFIG_COMMON_CLK_AXG)+= axg.o axg-aoclk.o
 obj-$(CONFIG_COMMON_CLK_AXG_AUDIO) += axg-audio.o
+obj-$(CONFIG_COMMON_CLK_G12A)   += g12a.o
 obj-$(CONFIG_COMMON_CLK_REGMAP_MESON)  += clk-regmap.o
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
new file mode 100644
index 000..84df081
--- /dev/null
+++ b/drivers/clk/meson/g12a.c
@@ -0,0 +1,1134 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Amlogic Meson-G12A Clock Controller Driver
+ *
+ * Copyright (c) 2016 Baylibre SAS.
+ * Author: Michael Turquette 
+ *
+ * Copyright (c) 2018 Amlogic, inc.
+ * Author: Qiufang Dai 
+ * Author: Jian Hu 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "clkc.h"
+#include "g12a.h"
+
+static DEFINE_SPINLOCK(meson_clk_lock);
+
+static struct clk_regmap g12a_fixed_pll_dco = {
+   .data = &(struct meson_clk_pll_data){
+   .en = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 28,
+   .width   = 1,
+   },
+   .m = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 0,
+   .width   = 8,
+   },
+   .n = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 10,
+   .width   = 5,
+   },
+   .frac = {
+   .reg_off = HHI_FIX_PLL_CNTL1,
+   .shift   = 0,
+   .width   = 19,
+   },
+   .l = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 31,
+   .width   = 1,
+   },
+   .rst = {
+   .reg_off = HHI_FIX_PLL_CNTL0,
+   .shift   = 29,
+   .width   = 1,
+   },
+   },
+   .hw.init = &(struct clk_init_data){
+   .name = "fixed_pll_dco",
+   .ops = _clk_pll_ro_ops,
+   .parent_names = (const char *[]){ "xtal" },
+   .num_parents = 1,
+   },
+};
+
+static struct clk_regmap g12a_fixed_pll = {
+   .data = &(struct clk_regmap_div_data){
+   .offset = HHI_FIX_PLL_CNTL0,
+   .shift = 16,
+   .width = 2,
+   .flags = CLK_DIVIDER_POWER_OF_TWO,
+   },
+   .hw.init = &(struct clk_init_data){
+   .name = "fixed_pll",
+   .ops = _regmap_divider_ro_ops,
+   .parent_names = (const char *[]){ "fixed_pll_dco" },
+   .num_parents = 1,
+   /*
+* This clock won't ever change at runtime so
+* CLK_SET_RATE_PARENT is not required
+*/
+   },
+};
+
+static const struct reg_sequence g12a_sys_init_regs[] = {
+   { .reg = HHI_SYS_PLL_CNTL1, .def = 0x },
+   { .reg = HHI_SYS_PLL_CNTL2, .def = 0x },
+   { .reg = HHI_SYS_PLL_CNTL3, .def = 0x48681c00 },
+   { .reg = HHI_SYS_PLL_CNTL4, .def = 0x88770290 },
+   { .reg = HHI_SYS_PLL_CNTL5, .def = 0x39272000 },
+   { .reg = HHI_SYS_PLL_CNTL6, .def = 0x5654 },
+};
+
+static struct clk_regmap g12a_sys_pll_dco = {
+   .data = &(struct meson_clk_pll_data){
+   .en = {
+   .reg_off = HHI_SYS_PLL_CNTL0,
+   .shift   = 28,
+   .width   = 1,
+   },
+   .m = {
+