diff mbox series

[1/1] platform: implement K210 system reset

Message ID 20210226004119.17716-1-xypron.glpk@gmx.de
State Superseded
Headers show
Series [1/1] platform: implement K210 system reset | expand

Commit Message

Heinrich Schuchardt Feb. 26, 2021, 12:41 a.m. UTC
Implement rebooting the K210 via the system reset extension.

All reset types are treated in the same way.
A request for shutdown results in a reboot.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 platform/kendryte/k210/platform.c | 19 +++++++++++++++++++
 platform/kendryte/k210/platform.h |  6 ++++++
 2 files changed, 25 insertions(+)

--
2.30.0

Comments

Damien Le Moal Feb. 26, 2021, 12:52 a.m. UTC | #1
On 2021/02/26 9:41, Heinrich Schuchardt wrote:
> Implement rebooting the K210 via the system reset extension.
> 
> All reset types are treated in the same way.
> A request for shutdown results in a reboot.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  platform/kendryte/k210/platform.c | 19 +++++++++++++++++++
>  platform/kendryte/k210/platform.h |  6 ++++++
>  2 files changed, 25 insertions(+)
> 
> diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
> index 944b388..cba8c7d 100644
> --- a/platform/kendryte/k210/platform.c
> +++ b/platform/kendryte/k210/platform.c
> @@ -129,6 +129,22 @@ static int k210_timer_init(bool cold_boot)
>  	return clint_warm_timer_init();
>  }
> 
> +static int k210_system_reset_check(u32 type, u32 reason)
> +{
> +	return 1;
> +}
> +
> +static void k210_system_reset(u32 type, u32 reason)
> +{
> +	u32 val;
> +
> +	val = k210_read_sysreg(K210_RESET);
> +	val |= 1;

Instead of the magic value, can you define a macro for it ? E.g.

#define K210_RESET_ROM	(1 << 0)

There lots of other reset lines, so this way it is clear which one is being used.

> +	k210_write_sysreg(val, K210_RESET);
> +
> +	while(1);
> +}
> +
>  const struct sbi_platform_operations platform_ops = {
>  	.final_init	= k210_final_init,
> 
> @@ -142,6 +158,9 @@ const struct sbi_platform_operations platform_ops = {
>  	.ipi_send  = clint_ipi_send,
>  	.ipi_clear = clint_ipi_clear,
> 
> +	.system_reset_check = k210_system_reset_check,
> +	.system_reset = k210_system_reset,
> +
>  	.timer_init	   = k210_timer_init,
>  	.timer_value	   = clint_timer_value,
>  	.timer_event_stop  = clint_timer_event_stop,
> diff --git a/platform/kendryte/k210/platform.h b/platform/kendryte/k210/platform.h
> index 5269bc4..2946928 100644
> --- a/platform/kendryte/k210/platform.h
> +++ b/platform/kendryte/k210/platform.h
> @@ -27,10 +27,16 @@
>  /* Registers */
>  #define K210_PLL0		0x08
>  #define K210_CLKSEL0		0x20
> +#define K210_RESET		0x30
> 
>  static inline u32 k210_read_sysreg(u32 reg)
>  {
>  	return readl((volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
>  }
> 
> +static inline void k210_write_sysreg(u32 val, u32 reg)
> +{
> +	writel(val, (volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
> +}
> +
>  #endif /* _K210_PLATFORM_H_ */
> --
> 2.30.0
> 
> 

With the above comment addressed, looks good to me. Feel free to add:

Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
diff mbox series

Patch

diff --git a/platform/kendryte/k210/platform.c b/platform/kendryte/k210/platform.c
index 944b388..cba8c7d 100644
--- a/platform/kendryte/k210/platform.c
+++ b/platform/kendryte/k210/platform.c
@@ -129,6 +129,22 @@  static int k210_timer_init(bool cold_boot)
 	return clint_warm_timer_init();
 }

+static int k210_system_reset_check(u32 type, u32 reason)
+{
+	return 1;
+}
+
+static void k210_system_reset(u32 type, u32 reason)
+{
+	u32 val;
+
+	val = k210_read_sysreg(K210_RESET);
+	val |= 1;
+	k210_write_sysreg(val, K210_RESET);
+
+	while(1);
+}
+
 const struct sbi_platform_operations platform_ops = {
 	.final_init	= k210_final_init,

@@ -142,6 +158,9 @@  const struct sbi_platform_operations platform_ops = {
 	.ipi_send  = clint_ipi_send,
 	.ipi_clear = clint_ipi_clear,

+	.system_reset_check = k210_system_reset_check,
+	.system_reset = k210_system_reset,
+
 	.timer_init	   = k210_timer_init,
 	.timer_value	   = clint_timer_value,
 	.timer_event_stop  = clint_timer_event_stop,
diff --git a/platform/kendryte/k210/platform.h b/platform/kendryte/k210/platform.h
index 5269bc4..2946928 100644
--- a/platform/kendryte/k210/platform.h
+++ b/platform/kendryte/k210/platform.h
@@ -27,10 +27,16 @@ 
 /* Registers */
 #define K210_PLL0		0x08
 #define K210_CLKSEL0		0x20
+#define K210_RESET		0x30

 static inline u32 k210_read_sysreg(u32 reg)
 {
 	return readl((volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
 }

+static inline void k210_write_sysreg(u32 val, u32 reg)
+{
+	writel(val, (volatile void *)(K210_SYSCTL_BASE_ADDR + reg));
+}
+
 #endif /* _K210_PLATFORM_H_ */