Re: [PATCH v2 08/15] clock: milbeaut: Add Milbeaut M10V clock controller

2019-02-25 Thread Sugaya, Taichi

Hi,

Thank you for your comments.

On 2019/02/23 8:57, Stephen Boyd wrote:

Quoting Sugaya Taichi (2019-02-08 04:27:17)

diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
new file mode 100644
index 000..f798939
--- /dev/null
+++ b/drivers/clk/clk-milbeaut.c
@@ -0,0 +1,626 @@

[]

+struct m10v_clk_div_fixed_data {
+   const char  *name;
+   const char  *parent_name;
+   u8  div;
+   u8  mult;
+   int onecell_idx;
+};
+struct m10v_clk_mux_factors {
+   const char  *name;
+   const char * const  *parent_names;
+   u8  num_parents;
+   u32 offset;
+   u8  shift;
+   u8  mask;
+   u32 *table;
+   unsigned long   mux_flags;
+   int onecell_idx;
+};


Please add newlines between struct definitions. It also wouldn't hurt to
have kernel-doc on these.



I got it.


+
+static const struct clk_div_table emmcclk_table[] = {
+   { .val = 0, .div = 8 },
+   { .val = 1, .div = 9 },
+   { .val = 2, .div = 10 },
+   { .val = 3, .div = 15 },
+   { .div = 0 },
+};
+static const struct clk_div_table mclk400_table[] = {
+   { .val = 1, .div = 2 },
+   { .val = 3, .div = 4 },
+   { .div = 0 },
+};
+static const struct clk_div_table mclk200_table[] = {
+   { .val = 3, .div = 4 },
+   { .val = 7, .div = 8 },
+   { .div = 0 },
+};
+static const struct clk_div_table aclk400_table[] = {
+   { .val = 1, .div = 2 },
+   { .val = 3, .div = 4 },
+   { .div = 0 },
+};
+static const struct clk_div_table aclk300_table[] = {
+   { .val = 0, .div = 2 },
+   { .val = 1, .div = 3 },
+   { .div = 0 },
+};
+static const struct clk_div_table aclk_table[] = {
+   { .val = 3, .div = 4 },
+   { .val = 7, .div = 8 },
+   { .div = 0 },
+};
+static const struct clk_div_table aclkexs_table[] = {
+   { .val = 3, .div = 4 },
+   { .val = 4, .div = 5 },
+   { .val = 5, .div = 6 },
+   { .val = 7, .div = 8 },
+   { .div = 0 },
+};
+static const struct clk_div_table hclk_table[] = {
+   { .val = 7, .div = 8 },
+   { .val = 15, .div = 16 },
+   { .div = 0 },
+};
+static const struct clk_div_table hclkbmh_table[] = {
+   { .val = 3, .div = 4 },
+   { .val = 7, .div = 8 },
+   { .div = 0 },
+};
+static const struct clk_div_table pclk_table[] = {
+   { .val = 15, .div = 16 },
+   { .val = 31, .div = 32 },
+   { .div = 0 },
+};
+static const struct clk_div_table rclk_table[] = {
+   { .val = 0, .div = 8 },
+   { .val = 1, .div = 16 },
+   { .val = 2, .div = 24 },
+   { .val = 3, .div = 32 },
+   { .div = 0 },
+};
+static const struct clk_div_table uhs1clk0_table[] = {
+   { .val = 0, .div = 2 },
+   { .val = 1, .div = 3 },
+   { .val = 2, .div = 4 },
+   { .val = 3, .div = 8 },
+   { .val = 4, .div = 16 },
+   { .div = 0 },
+};
+static const struct clk_div_table uhs2clk_table[] = {
+   { .val = 0, .div = 9 },
+   { .val = 1, .div = 10 },
+   { .val = 2, .div = 11 },
+   { .val = 3, .div = 12 },
+   { .val = 4, .div = 13 },
+   { .val = 5, .div = 14 },
+   { .val = 6, .div = 16 },
+   { .val = 7, .div = 18 },
+   { .div = 0 },
+};


Same comment applies here. Newlines between tables please.



OK.


+
+static u32 spi_mux_table[] = {0, 1, 2};
+static const char * const spi_mux_names[] = {
+   M10V_SPI_PARENT0, M10V_SPI_PARENT1, M10V_SPI_PARENT2
+};
+
+static u32 uhs1clk2_mux_table[] = {2, 3, 4, 8};
+static const char * const uhs1clk2_mux_names[] = {
+   M10V_UHS1CLK2_PARENT0, M10V_UHS1CLK2_PARENT1,
+   M10V_UHS1CLK2_PARENT2, M10V_PLL6DIV2
+};
+
+static u32 uhs1clk1_mux_table[] = {3, 4, 8};
+static const char * const uhs1clk1_mux_names[] = {
+   M10V_UHS1CLK1_PARENT0, M10V_UHS1CLK1_PARENT1, M10V_PLL6DIV2
+};
+

[...]

+
+static const struct m10v_clk_mux_factors m10v_mux_factor_data[] = {
+   {"spi", spi_mux_names, ARRAY_SIZE(spi_mux_names),
+   CLKSEL(8), 3, 7, spi_mux_table, 0, M10V_SPICLK_ID},
+   {"uhs1clk2", uhs1clk2_mux_names, ARRAY_SIZE(uhs1clk2_mux_names),
+   CLKSEL(1), 13, 31, uhs1clk2_mux_table, 0, -1},
+   {"uhs1clk1", uhs1clk1_mux_names, ARRAY_SIZE(uhs1clk1_mux_names),
+   CLKSEL(1), 8, 31, uhs1clk1_mux_table, 0, -1},
+   {"nfclk", nfclk_mux_names, ARRAY_SIZE(nfclk_mux_names),
+   CLKSEL(1), 22, 127, nfclk_mux_table, 0, M10V_NFCLK_ID},
+};
+
+static u8 m10v_mux_get_parent(struct clk_hw *hw)
+{
+   struct clk_mux *mux = to_clk_mux(hw);
+   u32 val;
+
+   val = clk_readl(mux->reg) >> mux->shift;


Please don't use clk_readl() unless you absolutely need it.



OK, I try to use "readl()" simply.


+   val &= mux->mask;
+
+   return clk_mux_val_to_index(hw, mux->table, mux->flags, 

Re: [PATCH v2 08/15] clock: milbeaut: Add Milbeaut M10V clock controller

2019-02-22 Thread Stephen Boyd
Quoting Sugaya Taichi (2019-02-08 04:27:17)
> diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
> new file mode 100644
> index 000..f798939
> --- /dev/null
> +++ b/drivers/clk/clk-milbeaut.c
> @@ -0,0 +1,626 @@
[]
> +struct m10v_clk_div_fixed_data {
> +   const char  *name;
> +   const char  *parent_name;
> +   u8  div;
> +   u8  mult;
> +   int onecell_idx;
> +};
> +struct m10v_clk_mux_factors {
> +   const char  *name;
> +   const char * const  *parent_names;
> +   u8  num_parents;
> +   u32 offset;
> +   u8  shift;
> +   u8  mask;
> +   u32 *table;
> +   unsigned long   mux_flags;
> +   int onecell_idx;
> +};

Please add newlines between struct definitions. It also wouldn't hurt to
have kernel-doc on these.

> +
> +static const struct clk_div_table emmcclk_table[] = {
> +   { .val = 0, .div = 8 },
> +   { .val = 1, .div = 9 },
> +   { .val = 2, .div = 10 },
> +   { .val = 3, .div = 15 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table mclk400_table[] = {
> +   { .val = 1, .div = 2 },
> +   { .val = 3, .div = 4 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table mclk200_table[] = {
> +   { .val = 3, .div = 4 },
> +   { .val = 7, .div = 8 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table aclk400_table[] = {
> +   { .val = 1, .div = 2 },
> +   { .val = 3, .div = 4 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table aclk300_table[] = {
> +   { .val = 0, .div = 2 },
> +   { .val = 1, .div = 3 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table aclk_table[] = {
> +   { .val = 3, .div = 4 },
> +   { .val = 7, .div = 8 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table aclkexs_table[] = {
> +   { .val = 3, .div = 4 },
> +   { .val = 4, .div = 5 },
> +   { .val = 5, .div = 6 },
> +   { .val = 7, .div = 8 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table hclk_table[] = {
> +   { .val = 7, .div = 8 },
> +   { .val = 15, .div = 16 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table hclkbmh_table[] = {
> +   { .val = 3, .div = 4 },
> +   { .val = 7, .div = 8 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table pclk_table[] = {
> +   { .val = 15, .div = 16 },
> +   { .val = 31, .div = 32 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table rclk_table[] = {
> +   { .val = 0, .div = 8 },
> +   { .val = 1, .div = 16 },
> +   { .val = 2, .div = 24 },
> +   { .val = 3, .div = 32 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table uhs1clk0_table[] = {
> +   { .val = 0, .div = 2 },
> +   { .val = 1, .div = 3 },
> +   { .val = 2, .div = 4 },
> +   { .val = 3, .div = 8 },
> +   { .val = 4, .div = 16 },
> +   { .div = 0 },
> +};
> +static const struct clk_div_table uhs2clk_table[] = {
> +   { .val = 0, .div = 9 },
> +   { .val = 1, .div = 10 },
> +   { .val = 2, .div = 11 },
> +   { .val = 3, .div = 12 },
> +   { .val = 4, .div = 13 },
> +   { .val = 5, .div = 14 },
> +   { .val = 6, .div = 16 },
> +   { .val = 7, .div = 18 },
> +   { .div = 0 },
> +};

Same comment applies here. Newlines between tables please.

> +
> +static u32 spi_mux_table[] = {0, 1, 2};
> +static const char * const spi_mux_names[] = {
> +   M10V_SPI_PARENT0, M10V_SPI_PARENT1, M10V_SPI_PARENT2
> +};
> +
> +static u32 uhs1clk2_mux_table[] = {2, 3, 4, 8};
> +static const char * const uhs1clk2_mux_names[] = {
> +   M10V_UHS1CLK2_PARENT0, M10V_UHS1CLK2_PARENT1,
> +   M10V_UHS1CLK2_PARENT2, M10V_PLL6DIV2
> +};
> +
> +static u32 uhs1clk1_mux_table[] = {3, 4, 8};
> +static const char * const uhs1clk1_mux_names[] = {
> +   M10V_UHS1CLK1_PARENT0, M10V_UHS1CLK1_PARENT1, M10V_PLL6DIV2
> +};
> +
[...]
> +
> +static const struct m10v_clk_mux_factors m10v_mux_factor_data[] = {
> +   {"spi", spi_mux_names, ARRAY_SIZE(spi_mux_names),
> +   CLKSEL(8), 3, 7, spi_mux_table, 0, M10V_SPICLK_ID},
> +   {"uhs1clk2", uhs1clk2_mux_names, ARRAY_SIZE(uhs1clk2_mux_names),
> +   CLKSEL(1), 13, 31, uhs1clk2_mux_table, 0, -1},
> +   {"uhs1clk1", uhs1clk1_mux_names, ARRAY_SIZE(uhs1clk1_mux_names),
> +   CLKSEL(1), 8, 31, uhs1clk1_mux_table, 0, -1},
> +   {"nfclk", nfclk_mux_names, ARRAY_SIZE(nfclk_mux_names),
> +   CLKSEL(1), 22, 127, nfclk_mux_table, 0, M10V_NFCLK_ID},
> +};
> +
> +static u8 m10v_mux_get_parent(struct clk_hw *hw)
> +{
> +   struct clk_mux *mux = to_clk_mux(hw);
> +   u32 val;
> +
> +   val = clk_readl(mux->reg) >> mux->shift;

Please don't use 

[PATCH v2 08/15] clock: milbeaut: Add Milbeaut M10V clock controller

2019-02-08 Thread Sugaya Taichi
The M10V of the Milbeaut SoCs has an on-chip controller that derive
mostly clocks from a single external clock, using PLLs, dividers,
multiplexers and gates. Since the PLLs have already been started and
will not stop / restart, they are fixed factor. Gates will be added in
later patch (all gates are off state).

Signed-off-by: Sugaya Taichi 
---
 drivers/clk/Makefile   |   1 +
 drivers/clk/clk-milbeaut.c | 626 +
 2 files changed, 627 insertions(+)
 create mode 100644 drivers/clk/clk-milbeaut.c

diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
index 8a9440a..84a78e8 100644
--- a/drivers/clk/Makefile
+++ b/drivers/clk/Makefile
@@ -31,6 +31,7 @@ obj-$(CONFIG_COMMON_CLK_GEMINI)   += clk-gemini.o
 obj-$(CONFIG_COMMON_CLK_ASPEED)+= clk-aspeed.o
 obj-$(CONFIG_ARCH_HIGHBANK)+= clk-highbank.o
 obj-$(CONFIG_CLK_HSDK) += clk-hsdk-pll.o
+obj-$(CONFIG_ARCH_MILBEAUT_M10V)   += clk-milbeaut.o
 obj-$(CONFIG_COMMON_CLK_MAX77686)  += clk-max77686.o
 obj-$(CONFIG_COMMON_CLK_MAX9485)   += clk-max9485.o
 obj-$(CONFIG_ARCH_MOXART)  += clk-moxart.o
diff --git a/drivers/clk/clk-milbeaut.c b/drivers/clk/clk-milbeaut.c
new file mode 100644
index 000..f798939
--- /dev/null
+++ b/drivers/clk/clk-milbeaut.c
@@ -0,0 +1,626 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Socionext Inc.
+ * Copyright (C) 2016 Linaro Ltd.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define M10V_CLKSEL1   0x0
+#define CLKSEL(n)  (((n) - 1) * 4 + M10V_CLKSEL1)
+
+#define M10V_PLL1  "pll1"
+#define M10V_PLL1DIV2  "pll1-2"
+#define M10V_PLL2  "pll2"
+#define M10V_PLL2DIV2  "pll2-2"
+#define M10V_PLL6  "pll6"
+#define M10V_PLL6DIV2  "pll6-2"
+#define M10V_PLL6DIV3  "pll6-3"
+#define M10V_PLL7  "pll7"
+#define M10V_PLL7DIV2  "pll7-2"
+#define M10V_PLL7DIV5  "pll7-5"
+#define M10V_PLL9  "pll9"
+#define M10V_PLL10 "pll10"
+#define M10V_PLL10DIV2 "pll10-2"
+#define M10V_PLL11 "pll11"
+
+#define M10V_SPI_PARENT0   "spi-parent0"
+#define M10V_SPI_PARENT1   "spi-parent1"
+#define M10V_SPI_PARENT2   "spi-parent2"
+#define M10V_UHS1CLK2_PARENT0  "uhs1clk2-parent0"
+#define M10V_UHS1CLK2_PARENT1  "uhs1clk2-parent1"
+#define M10V_UHS1CLK2_PARENT2  "uhs1clk2-parent2"
+#define M10V_UHS1CLK1_PARENT0  "uhs1clk1-parent0"
+#define M10V_UHS1CLK1_PARENT1  "uhs1clk1-parent1"
+#define M10V_NFCLK_PARENT0 "nfclk-parent0"
+#define M10V_NFCLK_PARENT1 "nfclk-parent1"
+#define M10V_NFCLK_PARENT2 "nfclk-parent2"
+#define M10V_NFCLK_PARENT3 "nfclk-parent3"
+#define M10V_NFCLK_PARENT4 "nfclk-parent4"
+#define M10V_NFCLK_PARENT5 "nfclk-parent5"
+
+#define M10V_DCHREQ1
+#define M10V_UPOLL_RATE1
+#define M10V_UTIMEOUT  250
+
+#define M10V_EMMCCLK_ID0
+#define M10V_ACLK_ID   1
+#define M10V_HCLK_ID   2
+#define M10V_PCLK_ID   3
+#define M10V_RCLK_ID   4
+#define M10V_SPICLK_ID 5
+#define M10V_NFCLK_ID  6
+#define M10V_NUM_CLKS  7
+
+#define to_m10v_div(_hw)container_of(_hw, struct m10v_clk_divider, hw)
+
+static struct clk_hw_onecell_data *m10v_clk_data;
+
+static DEFINE_SPINLOCK(m10v_crglock);
+
+struct m10v_clk_pll_factors {
+   const char  *name;
+   const char  *parent_name;
+   u32 div;
+   u32 mult;
+};
+struct m10v_clk_div_factors {
+   const char  *name;
+   const char  *parent_name;
+   u32 offset;
+   u8  shift;
+   u8  width;
+   const struct clk_div_table  *table;
+   unsigned long   div_flags;
+   int onecell_idx;
+};
+struct m10v_clk_div_fixed_data {
+   const char  *name;
+   const char  *parent_name;
+   u8  div;
+   u8  mult;
+   int onecell_idx;
+};
+struct m10v_clk_mux_factors {
+   const char  *name;
+   const char * const  *parent_names;
+   u8  num_parents;
+   u32 offset;
+   u8  shift;
+   u8  mask;
+   u32 *table;
+   unsigned long   mux_flags;
+   int onecell_idx;
+};
+
+static const struct clk_div_table emmcclk_table[] = {
+   { .val = 0, .div = 8 },
+   { .val = 1, .div = 9 },
+   { .val = 2, .div = 10 },
+   { .val = 3, .div = 15 },
+   { .div = 0 },
+};
+static const struct clk_div_table mclk400_table[] = {
+   { .val = 1, .div = 2 },
+   {