Re: [U-Boot] [PATCH 1/2] MSCC: Add sysreset drivers for MSCC Socs

2019-01-16 Thread Horatiu Vultur
Hi Daniel,

The 01/16/2019 15:22, Daniel Schwierzeck wrote:
> 
> 
> Am 15.01.19 um 17:33 schrieb Horatiu Vultur:
> > Add sysreset driver for Luton, Ocelot and Jaguar2 SoCs.
> > 
> > Signed-off-by: Horatiu Vultur 
> > ---
> >  MAINTAINERS  |   1 +
> >  arch/mips/dts/mscc,jr2.dtsi  |   7 +-
> >  arch/mips/dts/mscc,luton.dtsi|  10 +++
> >  arch/mips/dts/mscc,ocelot.dtsi   |   5 ++
> >  board/mscc/ocelot/ocelot.c   |  20 +
> >  configs/mscc_jr2_defconfig   |   2 +
> >  configs/mscc_luton_defconfig |   2 +
> >  configs/mscc_ocelot_defconfig|   2 +
> >  drivers/sysreset/Kconfig |   6 ++
> >  drivers/sysreset/Makefile|   1 +
> >  drivers/sysreset/sysreset_mscc.c | 157 
> > +++
> >  11 files changed, 212 insertions(+), 1 deletion(-)
> >  create mode 100644 drivers/sysreset/sysreset_mscc.c
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 3fa5d3e..fb1b69b 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -527,6 +527,7 @@ F:  board/mscc/
> >  F: configs/mscc*
> >  F: drivers/gpio/mscc_sgpio.c
> >  F: drivers/spi/mscc_bb_spi.c
> > +F: drivers/sysreset/sysreset_mscc.c
> >  F: include/configs/vcoreiii.h
> >  F: drivers/pinctrl/mscc/
> >  
> > diff --git a/arch/mips/dts/mscc,jr2.dtsi b/arch/mips/dts/mscc,jr2.dtsi
> > index 0900926..86d1378 100644
> > --- a/arch/mips/dts/mscc,jr2.dtsi
> > +++ b/arch/mips/dts/mscc,jr2.dtsi
> > @@ -52,7 +52,12 @@
> > interrupt-parent = <>;
> >  
> > cpu_ctrl: syscon@0 {
> > -   compatible = "mscc,jr2-cpu-syscon", "syscon";
> > +   compatible = "mscc,jaguar2-cpu-syscon", "syscon";
> > +   reg = <0x0 0x2c>;
> > +   };
> > +
> > +   sysreset: sysreset@0 {
> > +   compatible = "mscc,jaguar2-chip-reset";
> > reg = <0x0 0x2c>;
> > };
> >  
> > diff --git a/arch/mips/dts/mscc,luton.dtsi b/arch/mips/dts/mscc,luton.dtsi
> > index d11ec48..7cbb53b 100644
> > --- a/arch/mips/dts/mscc,luton.dtsi
> > +++ b/arch/mips/dts/mscc,luton.dtsi
> > @@ -42,6 +42,16 @@
> > #size-cells = <1>;
> > ranges = <0 0x6000 0x1020>;
> >  
> > +   cpu_ctrl: syscon@0 {
> > +   compatible = "mscc,luton-cpu-syscon", "syscon";
> > +   reg = <0x0 0x2c>;
> > +   };
> > +
> > +   sysreset: sysreset@70090 {
> > +   compatible = "mscc,luton-chip-reset";
> > +   reg = <0x70090 0x2c>;
> > +   };
> > +
> > uart0: serial@1010 {
> > pinctrl-0 = <_pins>;
> > pinctrl-names = "default";
> > diff --git a/arch/mips/dts/mscc,ocelot.dtsi b/arch/mips/dts/mscc,ocelot.dtsi
> > index 2592003..4287117 100644
> > --- a/arch/mips/dts/mscc,ocelot.dtsi
> > +++ b/arch/mips/dts/mscc,ocelot.dtsi
> > @@ -62,6 +62,11 @@
> > reg = <0x0 0x2c>;
> > };
> >  
> > +   sysreset: sysreset@1070008 {
> > +   compatible = "mscc,ocelot-chip-reset";
> > +   reg = <0x1070008 0x4>;
> > +   };
> > +
> > intc: interrupt-controller@70 {
> > compatible = "mscc,ocelot-icpu-intr";
> > reg = <0x70 0x70>;
> > diff --git a/board/mscc/ocelot/ocelot.c b/board/mscc/ocelot/ocelot.c
> > index 0f7a532..ae5eb4d 100644
> > --- a/board/mscc/ocelot/ocelot.c
> > +++ b/board/mscc/ocelot/ocelot.c
> > @@ -10,6 +10,7 @@
> >  #include 
> >  #include 
> >  #include 
> > +#include 
> >  
> >  DECLARE_GLOBAL_DATA_PTR;
> >  
> > @@ -25,6 +26,25 @@ void board_debug_uart_init(void)
> > mscc_gpio_set_alternate(7, 1);
> >  }
> >  
> > +__weak int ocelot_sysreset_request(struct udevice *dev,
> > +  enum sysreset_t type)
> > +{
> > +   u32 resetbits = PERF_SOFT_RST_SOFT_CHIP_RST;
> > +   (void)readl(BASE_DEVCPU_GCB + PERF_SOFT_RST);
> > +
> > +   /* Make sure VCore is NOT protected from reset */
> > +   clrbits_le32(BASE_CFG + ICPU_RESET, ICPU_RESET_CORE_RST_PROTECT);
> > +
> > +   /* Change to SPI bitbang for SPI reset workaround... */
> > +   writel(ICPU_SW_MODE_SW_SPI_CS_OE(1) | ICPU_SW_MODE_SW_SPI_CS(1) |
> > +  ICPU_SW_MODE_SW_PIN_CTRL_MODE, BASE_CFG + ICPU_SW_MODE);
> > +
> > +   /* Do the global reset */
> > +   writel(resetbits, BASE_DEVCPU_GCB + PERF_SOFT_RST);
> > +
> > +   return -EINPROGRESS;
> > +}
> 
> is this a difference between Luton and Ocelot or only for one board
> based on Ocelot platform? I'm asking because you register the same
> sysreset_request for Luton and Ocelot but for Ocelot you override it
> again with an Ocelot board-specific function. This looks a little bit
> strange ;)
> 

There is no difference between the Luton and Ocelot regarding reset, but
there is an issue on boards based on Ocelot platform. So that's the
reason I marked the function as weak and overwrite it in 

Re: [U-Boot] [PATCH 1/2] MSCC: Add sysreset drivers for MSCC Socs

2019-01-16 Thread Daniel Schwierzeck


Am 15.01.19 um 17:33 schrieb Horatiu Vultur:
> Add sysreset driver for Luton, Ocelot and Jaguar2 SoCs.
> 
> Signed-off-by: Horatiu Vultur 
> ---
>  MAINTAINERS  |   1 +
>  arch/mips/dts/mscc,jr2.dtsi  |   7 +-
>  arch/mips/dts/mscc,luton.dtsi|  10 +++
>  arch/mips/dts/mscc,ocelot.dtsi   |   5 ++
>  board/mscc/ocelot/ocelot.c   |  20 +
>  configs/mscc_jr2_defconfig   |   2 +
>  configs/mscc_luton_defconfig |   2 +
>  configs/mscc_ocelot_defconfig|   2 +
>  drivers/sysreset/Kconfig |   6 ++
>  drivers/sysreset/Makefile|   1 +
>  drivers/sysreset/sysreset_mscc.c | 157 
> +++
>  11 files changed, 212 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/sysreset/sysreset_mscc.c
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 3fa5d3e..fb1b69b 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -527,6 +527,7 @@ F:board/mscc/
>  F:   configs/mscc*
>  F:   drivers/gpio/mscc_sgpio.c
>  F:   drivers/spi/mscc_bb_spi.c
> +F:   drivers/sysreset/sysreset_mscc.c
>  F:   include/configs/vcoreiii.h
>  F:   drivers/pinctrl/mscc/
>  
> diff --git a/arch/mips/dts/mscc,jr2.dtsi b/arch/mips/dts/mscc,jr2.dtsi
> index 0900926..86d1378 100644
> --- a/arch/mips/dts/mscc,jr2.dtsi
> +++ b/arch/mips/dts/mscc,jr2.dtsi
> @@ -52,7 +52,12 @@
>   interrupt-parent = <>;
>  
>   cpu_ctrl: syscon@0 {
> - compatible = "mscc,jr2-cpu-syscon", "syscon";
> + compatible = "mscc,jaguar2-cpu-syscon", "syscon";
> + reg = <0x0 0x2c>;
> + };
> +
> + sysreset: sysreset@0 {
> + compatible = "mscc,jaguar2-chip-reset";
>   reg = <0x0 0x2c>;
>   };
>  
> diff --git a/arch/mips/dts/mscc,luton.dtsi b/arch/mips/dts/mscc,luton.dtsi
> index d11ec48..7cbb53b 100644
> --- a/arch/mips/dts/mscc,luton.dtsi
> +++ b/arch/mips/dts/mscc,luton.dtsi
> @@ -42,6 +42,16 @@
>   #size-cells = <1>;
>   ranges = <0 0x6000 0x1020>;
>  
> + cpu_ctrl: syscon@0 {
> + compatible = "mscc,luton-cpu-syscon", "syscon";
> + reg = <0x0 0x2c>;
> + };
> +
> + sysreset: sysreset@70090 {
> + compatible = "mscc,luton-chip-reset";
> + reg = <0x70090 0x2c>;
> + };
> +
>   uart0: serial@1010 {
>   pinctrl-0 = <_pins>;
>   pinctrl-names = "default";
> diff --git a/arch/mips/dts/mscc,ocelot.dtsi b/arch/mips/dts/mscc,ocelot.dtsi
> index 2592003..4287117 100644
> --- a/arch/mips/dts/mscc,ocelot.dtsi
> +++ b/arch/mips/dts/mscc,ocelot.dtsi
> @@ -62,6 +62,11 @@
>   reg = <0x0 0x2c>;
>   };
>  
> + sysreset: sysreset@1070008 {
> + compatible = "mscc,ocelot-chip-reset";
> + reg = <0x1070008 0x4>;
> + };
> +
>   intc: interrupt-controller@70 {
>   compatible = "mscc,ocelot-icpu-intr";
>   reg = <0x70 0x70>;
> diff --git a/board/mscc/ocelot/ocelot.c b/board/mscc/ocelot/ocelot.c
> index 0f7a532..ae5eb4d 100644
> --- a/board/mscc/ocelot/ocelot.c
> +++ b/board/mscc/ocelot/ocelot.c
> @@ -10,6 +10,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -25,6 +26,25 @@ void board_debug_uart_init(void)
>   mscc_gpio_set_alternate(7, 1);
>  }
>  
> +__weak int ocelot_sysreset_request(struct udevice *dev,
> +enum sysreset_t type)
> +{
> + u32 resetbits = PERF_SOFT_RST_SOFT_CHIP_RST;
> + (void)readl(BASE_DEVCPU_GCB + PERF_SOFT_RST);
> +
> + /* Make sure VCore is NOT protected from reset */
> + clrbits_le32(BASE_CFG + ICPU_RESET, ICPU_RESET_CORE_RST_PROTECT);
> +
> + /* Change to SPI bitbang for SPI reset workaround... */
> + writel(ICPU_SW_MODE_SW_SPI_CS_OE(1) | ICPU_SW_MODE_SW_SPI_CS(1) |
> +ICPU_SW_MODE_SW_PIN_CTRL_MODE, BASE_CFG + ICPU_SW_MODE);
> +
> + /* Do the global reset */
> + writel(resetbits, BASE_DEVCPU_GCB + PERF_SOFT_RST);
> +
> + return -EINPROGRESS;
> +}

is this a difference between Luton and Ocelot or only for one board
based on Ocelot platform? I'm asking because you register the same
sysreset_request for Luton and Ocelot but for Ocelot you override it
again with an Ocelot board-specific function. This looks a little bit
strange ;)

> +
>  int board_early_init_r(void)
>  {
>   /* Prepare SPI controller to be used in master mode */
> diff --git a/configs/mscc_jr2_defconfig b/configs/mscc_jr2_defconfig
> index b215754..0992185 100644
> --- a/configs/mscc_jr2_defconfig
> +++ b/configs/mscc_jr2_defconfig
> @@ -57,3 +57,5 @@ CONFIG_SPI=y
>  CONFIG_DM_SPI=y
>  CONFIG_LZMA=y
>  CONFIG_XZ=y
> +CONFIG_SYSRESET=y
> +CONFIG_SYSRESET_MSCC=y
> diff --git 

[U-Boot] [PATCH 1/2] MSCC: Add sysreset drivers for MSCC Socs

2019-01-15 Thread Horatiu Vultur
Add sysreset driver for Luton, Ocelot and Jaguar2 SoCs.

Signed-off-by: Horatiu Vultur 
---
 MAINTAINERS  |   1 +
 arch/mips/dts/mscc,jr2.dtsi  |   7 +-
 arch/mips/dts/mscc,luton.dtsi|  10 +++
 arch/mips/dts/mscc,ocelot.dtsi   |   5 ++
 board/mscc/ocelot/ocelot.c   |  20 +
 configs/mscc_jr2_defconfig   |   2 +
 configs/mscc_luton_defconfig |   2 +
 configs/mscc_ocelot_defconfig|   2 +
 drivers/sysreset/Kconfig |   6 ++
 drivers/sysreset/Makefile|   1 +
 drivers/sysreset/sysreset_mscc.c | 157 +++
 11 files changed, 212 insertions(+), 1 deletion(-)
 create mode 100644 drivers/sysreset/sysreset_mscc.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 3fa5d3e..fb1b69b 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -527,6 +527,7 @@ F:  board/mscc/
 F: configs/mscc*
 F: drivers/gpio/mscc_sgpio.c
 F: drivers/spi/mscc_bb_spi.c
+F: drivers/sysreset/sysreset_mscc.c
 F: include/configs/vcoreiii.h
 F: drivers/pinctrl/mscc/
 
diff --git a/arch/mips/dts/mscc,jr2.dtsi b/arch/mips/dts/mscc,jr2.dtsi
index 0900926..86d1378 100644
--- a/arch/mips/dts/mscc,jr2.dtsi
+++ b/arch/mips/dts/mscc,jr2.dtsi
@@ -52,7 +52,12 @@
interrupt-parent = <>;
 
cpu_ctrl: syscon@0 {
-   compatible = "mscc,jr2-cpu-syscon", "syscon";
+   compatible = "mscc,jaguar2-cpu-syscon", "syscon";
+   reg = <0x0 0x2c>;
+   };
+
+   sysreset: sysreset@0 {
+   compatible = "mscc,jaguar2-chip-reset";
reg = <0x0 0x2c>;
};
 
diff --git a/arch/mips/dts/mscc,luton.dtsi b/arch/mips/dts/mscc,luton.dtsi
index d11ec48..7cbb53b 100644
--- a/arch/mips/dts/mscc,luton.dtsi
+++ b/arch/mips/dts/mscc,luton.dtsi
@@ -42,6 +42,16 @@
#size-cells = <1>;
ranges = <0 0x6000 0x1020>;
 
+   cpu_ctrl: syscon@0 {
+   compatible = "mscc,luton-cpu-syscon", "syscon";
+   reg = <0x0 0x2c>;
+   };
+
+   sysreset: sysreset@70090 {
+   compatible = "mscc,luton-chip-reset";
+   reg = <0x70090 0x2c>;
+   };
+
uart0: serial@1010 {
pinctrl-0 = <_pins>;
pinctrl-names = "default";
diff --git a/arch/mips/dts/mscc,ocelot.dtsi b/arch/mips/dts/mscc,ocelot.dtsi
index 2592003..4287117 100644
--- a/arch/mips/dts/mscc,ocelot.dtsi
+++ b/arch/mips/dts/mscc,ocelot.dtsi
@@ -62,6 +62,11 @@
reg = <0x0 0x2c>;
};
 
+   sysreset: sysreset@1070008 {
+   compatible = "mscc,ocelot-chip-reset";
+   reg = <0x1070008 0x4>;
+   };
+
intc: interrupt-controller@70 {
compatible = "mscc,ocelot-icpu-intr";
reg = <0x70 0x70>;
diff --git a/board/mscc/ocelot/ocelot.c b/board/mscc/ocelot/ocelot.c
index 0f7a532..ae5eb4d 100644
--- a/board/mscc/ocelot/ocelot.c
+++ b/board/mscc/ocelot/ocelot.c
@@ -10,6 +10,7 @@
 #include 
 #include 
 #include 
+#include 
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -25,6 +26,25 @@ void board_debug_uart_init(void)
mscc_gpio_set_alternate(7, 1);
 }
 
+__weak int ocelot_sysreset_request(struct udevice *dev,
+  enum sysreset_t type)
+{
+   u32 resetbits = PERF_SOFT_RST_SOFT_CHIP_RST;
+   (void)readl(BASE_DEVCPU_GCB + PERF_SOFT_RST);
+
+   /* Make sure VCore is NOT protected from reset */
+   clrbits_le32(BASE_CFG + ICPU_RESET, ICPU_RESET_CORE_RST_PROTECT);
+
+   /* Change to SPI bitbang for SPI reset workaround... */
+   writel(ICPU_SW_MODE_SW_SPI_CS_OE(1) | ICPU_SW_MODE_SW_SPI_CS(1) |
+  ICPU_SW_MODE_SW_PIN_CTRL_MODE, BASE_CFG + ICPU_SW_MODE);
+
+   /* Do the global reset */
+   writel(resetbits, BASE_DEVCPU_GCB + PERF_SOFT_RST);
+
+   return -EINPROGRESS;
+}
+
 int board_early_init_r(void)
 {
/* Prepare SPI controller to be used in master mode */
diff --git a/configs/mscc_jr2_defconfig b/configs/mscc_jr2_defconfig
index b215754..0992185 100644
--- a/configs/mscc_jr2_defconfig
+++ b/configs/mscc_jr2_defconfig
@@ -57,3 +57,5 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_LZMA=y
 CONFIG_XZ=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_MSCC=y
diff --git a/configs/mscc_luton_defconfig b/configs/mscc_luton_defconfig
index 7154e97..7c94a76 100644
--- a/configs/mscc_luton_defconfig
+++ b/configs/mscc_luton_defconfig
@@ -69,3 +69,5 @@ CONFIG_SPI=y
 CONFIG_DM_SPI=y
 CONFIG_MSCC_BB_SPI=y
 CONFIG_LZMA=y
+CONFIG_SYSRESET=y
+CONFIG_SYSRESET_MSCC=y
diff --git a/configs/mscc_ocelot_defconfig b/configs/mscc_ocelot_defconfig
index fb6a5bd..7d9abb6 100644
--- a/configs/mscc_ocelot_defconfig
+++ b/configs/mscc_ocelot_defconfig
@@ -69,3 +69,5 @@ CONFIG_SYS_NS16550=y