microblaze: Convert generic platform to DM gpio
authorMichal Simek <michal.simek@xilinx.com>
Fri, 13 Jul 2018 06:26:28 +0000 (08:26 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 19 Jul 2018 08:49:55 +0000 (10:49 +0200)
Converting GPIO to DM requires to do changes in reset subsystem
that's why support for Microblaze soft reset via sysreset and GPIO
sysreset support was added.
These two patches enables enabling GPIO DM.
Microblaze soft reset is bind at last reset method.

GPIO reset is handled via sysreset with adding this fragment to DT.

gpio-restart {
compatible = "gpio-restart";
gpios = <&reset_gpio 0 0 0>;
/* 3rd cell ACTIVE_HIGH = 0, ACTIVE_LOW = 1 */
};

hard-reset-gpio property is not documented and also handled.
Conversion is required.

Unfortunately do_reset is required for SPL that's why use only soft
microblaze reset for now.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/microblaze/Kconfig
arch/microblaze/cpu/spl.c
arch/microblaze/include/asm/gpio.h
board/xilinx/microblaze-generic/microblaze-generic.c
board/xilinx/microblaze-generic/xparameters.h
configs/microblaze-generic_defconfig
drivers/gpio/Kconfig
include/configs/microblaze-generic.h

index f791c0081eab3e12aba3d6b30b9fc6b23e1b9635..dcc502b1ff7a1e67a85b4170fb4f2b440b0b6f07 100644 (file)
@@ -16,6 +16,7 @@ config TARGET_MICROBLAZE_GENERIC
        select DM
        select DM_SERIAL
        select ENV_IS_IN_FLASH
+       select SYSRESET
 
 endchoice
 
index d3c523d3874a8f3c0d8301dee7a4860c7b0b64b9..070c12cce9ecc1c9e9a60503ff6530f337b1f3b6 100644 (file)
@@ -47,3 +47,11 @@ int spl_start_uboot(void)
 
        return 1;
 }
+
+int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       __asm__ __volatile__ ("mts rmsr, r0;" \
+                             "bra r0");
+
+       return 0;
+}
index 4762de0243862c836034677a05b93c69ab08a33b..306ab4c9f2aa3c73f2e3c710807e08787e845c04 100644 (file)
@@ -1,14 +1 @@
-#ifndef _ASM_MICROBLAZE_GPIO_H_
-#define _ASM_MICROBLAZE_GPIO_H_
-
 #include <asm-generic/gpio.h>
-
-/* Allocation functions */
-extern int gpio_alloc_dual(u32 baseaddr, const char *name, u32 gpio_no0,
-                          u32 gpio_no1);
-extern int gpio_alloc(u32 baseaddr, const char *name, u32 gpio_no);
-
-#define gpio_status()  gpio_info()
-extern void gpio_info(void);
-
-#endif
index 556d0de7f14304ac58773f61b8ec0dddb7e4f93c..44fb48b347a5dfe6717014c5bfbcbfa53fbd1a47 100644 (file)
@@ -1,8 +1,8 @@
 // SPDX-License-Identifier: GPL-2.0+
 /*
- * (C) Copyright 2007 Michal Simek
+ * (C) Copyright 2007-2018 Michal Simek
  *
- * Michal  SIMEK <monstr@monstr.eu>
+ * Michal SIMEK <monstr@monstr.eu>
  */
 
 /*
@@ -12,6 +12,8 @@
 
 #include <common.h>
 #include <config.h>
+#include <dm.h>
+#include <dm/lists.h>
 #include <fdtdec.h>
 #include <asm/processor.h>
 #include <asm/microblaze_intc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#ifdef CONFIG_XILINX_GPIO
-static int reset_pin = -1;
-#endif
-
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
 static struct udevice *watchdog_dev;
 #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */
@@ -66,33 +64,6 @@ int dram_init(void)
        return 0;
 };
 
-#if !defined(CONFIG_SYSRESET) || defined(CONFIG_SPL_BUILD)
-int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
-{
-#ifndef CONFIG_SPL_BUILD
-#ifdef CONFIG_XILINX_GPIO
-       if (reset_pin != -1)
-               gpio_direction_output(reset_pin, 1);
-#endif
-#endif
-       puts("Resetting board\n");
-       __asm__ __volatile__ (" mts rmsr, r0;" \
-                               "bra r0");
-
-       return 0;
-}
-#endif
-
-static int gpio_init(void)
-{
-#ifdef CONFIG_XILINX_GPIO
-       reset_pin = gpio_alloc(CONFIG_SYS_GPIO_0_ADDR, "reset", 1);
-       if (reset_pin != -1)
-               gpio_request(reset_pin, "reset_pin");
-#endif
-       return 0;
-}
-
 #ifdef CONFIG_WDT
 /* Called by macro WATCHDOG_RESET */
 void watchdog_reset(void)
@@ -117,8 +88,6 @@ void watchdog_reset(void)
 
 int board_late_init(void)
 {
-       gpio_init();
-
 #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_WDT)
        watchdog_dev = NULL;
 
@@ -133,6 +102,13 @@ int board_late_init(void)
        wdt_start(watchdog_dev, 0, 0);
        puts("Watchdog: Started\n");
 #endif /* !CONFIG_SPL_BUILD && CONFIG_WDT */
+#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_SYSRESET_MICROBLAZE)
+       int ret;
 
+       ret = device_bind_driver(gd->dm_root, "mb_soft_reset",
+                                "reset_soft", NULL);
+       if (ret)
+               printf("Warning: No reset driver: ret=%d\n", ret);
+#endif
        return 0;
 }
index 01116d827c63cbd98b61fc2b23db3192f7e4e0fb..5e0911faf6331ed9e1f193d0b2602af8a67bf8b4 100644 (file)
@@ -13,9 +13,6 @@
 /* Microblaze is microblaze_0 */
 #define XILINX_FSL_NUMBER      3
 
-/* GPIO is LEDs_4Bit*/
-#define XILINX_GPIO_BASEADDR   0x40000000
-
 /* Flash Memory is FLASH_2Mx32 */
 #define XILINX_FLASH_START     0x2c000000
 #define XILINX_FLASH_SIZE      0x00800000
index c366a80ed62810e78dfecdce789240c941c8cb4d..b1d01933939d9c936ee2348a29bdb72e6d3fc685 100644 (file)
@@ -39,6 +39,7 @@ CONFIG_SPL_OF_CONTROL=y
 CONFIG_OF_EMBED=y
 CONFIG_NETCONSOLE=y
 CONFIG_SPL_DM=y
+CONFIG_DM_GPIO=y
 CONFIG_XILINX_GPIO=y
 CONFIG_MTD_NOR_FLASH=y
 CONFIG_PHY_ATHEROS=y
@@ -56,5 +57,7 @@ CONFIG_XILINX_AXIEMAC=y
 CONFIG_XILINX_EMACLITE=y
 CONFIG_SYS_NS16550=y
 CONFIG_XILINX_UARTLITE=y
+CONFIG_SYSRESET_GPIO=y
+CONFIG_SYSRESET_MICROBLAZE=y
 CONFIG_WDT=y
 CONFIG_XILINX_TB_WATCHDOG=y
index 29af22ecc70c76fcce2863063098e7e6df051ea7..5699a71b231f3c33d1bf1880c9cb4442b8d99360 100644 (file)
@@ -185,6 +185,7 @@ config SANDBOX_GPIO_COUNT
 
 config XILINX_GPIO
        bool "Xilinx GPIO driver"
+       depends on DM_GPIO
        help
          This config enable the Xilinx GPIO driver for Microblaze.
 
index 6a049cf2af6b5b99798c260a768958f6b0699292..5eab2e5a3881b26ccaaa2402f75385fecfb6a095 100644 (file)
 /* setting reset address */
 /*#define      CONFIG_SYS_RESET_ADDRESS        CONFIG_SYS_TEXT_BASE*/
 
-/* gpio */
-#ifdef XILINX_GPIO_BASEADDR
-# define CONFIG_SYS_GPIO_0_ADDR                XILINX_GPIO_BASEADDR
-#endif
-
 #define CONFIG_SYS_MALLOC_LEN  0xC0000
 
 /* Stack location before relocation */