Re: [PATCH v2 2/2] clk: qcom: gcc: Add global clock controller driver for SC8180x

2021-02-08 Thread Stephen Boyd
Quoting Bjorn Andersson (2021-01-25 20:31:55)
> Add clocks, resets and some of the GDSC provided by the global clock
> controller found in the Qualcomm SC8180x platform.
> 
> Signed-off-by: Bjorn Andersson 
> ---

Applied to clk-next


[PATCH v2 2/2] clk: qcom: gcc: Add global clock controller driver for SC8180x

2021-01-26 Thread Bjorn Andersson
Add clocks, resets and some of the GDSC provided by the global clock
controller found in the Qualcomm SC8180x platform.

Signed-off-by: Bjorn Andersson 
---

Changes since v1:
- Fixes all gdsc addresses (missed to fold the fixup that subtracted gcc base
  in v1)

 drivers/clk/qcom/Kconfig   |9 +
 drivers/clk/qcom/Makefile  |1 +
 drivers/clk/qcom/gcc-sc8180x.c | 4629 
 3 files changed, 4639 insertions(+)
 create mode 100644 drivers/clk/qcom/gcc-sc8180x.c

diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
index d32bb12cd8d0..efd2e97f56ef 100644
--- a/drivers/clk/qcom/Kconfig
+++ b/drivers/clk/qcom/Kconfig
@@ -317,6 +317,15 @@ config SC_GCC_7180
  Say Y if you want to use peripheral devices such as UART, SPI,
  I2C, USB, UFS, SDCC, etc.
 
+config SC_GCC_8180X
+   tristate "SC8180X Global Clock Controller"
+   select QCOM_GDSC
+   depends on COMMON_CLK_QCOM
+   help
+ Support for the global clock controller on SC8180X devices.
+ Say Y if you want to use peripheral devices such as UART, SPI,
+ I2C, USB, UFS, SDCC, etc.
+
 config SC_LPASS_CORECC_7180
tristate "SC7180 LPASS Core Clock Controller"
select SC_GCC_7180
diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
index 9e5e0e3cb7b4..2ff4c4b462e2 100644
--- a/drivers/clk/qcom/Makefile
+++ b/drivers/clk/qcom/Makefile
@@ -55,6 +55,7 @@ obj-$(CONFIG_QCS_TURING_404) += turingcc-qcs404.o
 obj-$(CONFIG_SC_CAMCC_7180) += camcc-sc7180.o
 obj-$(CONFIG_SC_DISPCC_7180) += dispcc-sc7180.o
 obj-$(CONFIG_SC_GCC_7180) += gcc-sc7180.o
+obj-$(CONFIG_SC_GCC_8180X) += gcc-sc8180x.o
 obj-$(CONFIG_SC_GPUCC_7180) += gpucc-sc7180.o
 obj-$(CONFIG_SC_LPASS_CORECC_7180) += lpasscorecc-sc7180.o
 obj-$(CONFIG_SC_MSS_7180) += mss-sc7180.o
diff --git a/drivers/clk/qcom/gcc-sc8180x.c b/drivers/clk/qcom/gcc-sc8180x.c
new file mode 100644
index ..d84ca5063b65
--- /dev/null
+++ b/drivers/clk/qcom/gcc-sc8180x.c
@@ -0,0 +1,4629 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2020-2021, Linaro Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include "common.h"
+#include "clk-alpha-pll.h"
+#include "clk-branch.h"
+#include "clk-pll.h"
+#include "clk-rcg.h"
+#include "clk-regmap.h"
+#include "gdsc.h"
+#include "reset.h"
+
+#define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
+
+enum {
+   P_AUD_REF_CLK,
+   P_BI_TCXO,
+   P_GPLL0_OUT_EVEN,
+   P_GPLL0_OUT_MAIN,
+   P_GPLL1_OUT_MAIN,
+   P_GPLL2_OUT_MAIN,
+   P_GPLL4_OUT_MAIN,
+   P_GPLL5_OUT_MAIN,
+   P_GPLL7_OUT_MAIN,
+   P_GPLL9_OUT_MAIN,
+   P_SLEEP_CLK,
+};
+
+static struct pll_vco trion_vco[] = {
+   { 24960, 20, 0 },
+};
+
+static struct clk_alpha_pll gpll0 = {
+   .offset = 0x0,
+   .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TRION],
+   .vco_table = trion_vco,
+   .num_vco = ARRAY_SIZE(trion_vco),
+   .clkr = {
+   .enable_reg = 0x52000,
+   .enable_mask = BIT(0),
+   .hw.init = &(struct clk_init_data){
+   .name = "gpll0",
+   .parent_data = &(const struct clk_parent_data){
+   .fw_name = "bi_tcxo",
+   },
+   .num_parents = 1,
+   .ops = &clk_alpha_pll_fixed_trion_ops,
+   },
+   },
+};
+
+static const struct clk_div_table post_div_table_trion_even[] = {
+   { 0x0, 1 },
+   { 0x1, 2 },
+   { 0x3, 4 },
+   { 0x7, 8 },
+   { }
+};
+
+static struct clk_alpha_pll_postdiv gpll0_out_even = {
+   .offset = 0x0,
+   .post_div_shift = 8,
+   .post_div_table = post_div_table_trion_even,
+   .num_post_div = ARRAY_SIZE(post_div_table_trion_even),
+   .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TRION],
+   .width = 4,
+   .clkr.hw.init = &(struct clk_init_data){
+   .name = "gpll0_out_even",
+   .parent_hws = (const struct clk_hw *[]){ &gpll0.clkr.hw },
+   .num_parents = 1,
+   .ops = &clk_alpha_pll_postdiv_trion_ops,
+   },
+};
+
+static struct clk_alpha_pll gpll1 = {
+   .offset = 0x1000,
+   .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_TRION],
+   .vco_table = trion_vco,
+   .num_vco = ARRAY_SIZE(trion_vco),
+   .clkr = {
+   .enable_reg = 0x52000,
+   .enable_mask = BIT(1),
+   .hw.init = &(struct clk_init_data){
+   .name = "gpll1",
+   .parent_data = &(const struct clk_parent_data){
+   .fw_name = "bi_tcxo",
+   },
+   .num_parents = 1,
+   .ops = &clk_alpha_pll_fix