[U-Boot] [PATCH v1 4/4] ARM: DRA7: fastboot: Implement reboot-bootloader command - Implemented fb_set_reboot_flag() for DRA7 - Defined a weak function, fb_check_reboot_flag() - Implemented for DRA7

Dileep Katta
2015-03-03T11:10:44Z

Signed-off-by: Angela Stegmaier <angelabaker@ti.com>
Signed-off-by: Dileep Katta <dileep.katta@linaro.org>
---
board/ti/dra7xx/Makefile | 1 +
board/ti/dra7xx/fastboot.c | 45 ++++++++++++++++++++++++++++++++++++
common/cmd_bootm.c | 5 ++++
drivers/usb/gadget/f_fastboot.c | 5 ++++
include/configs/dra7xx_evm_android.h | 14 +++++++++++
5 files changed, 70 insertions(+)
create mode 100644 board/ti/dra7xx/fastboot.c

diff --git a/board/ti/dra7xx/Makefile b/board/ti/dra7xx/Makefile
index 434e8d1..ae730ae 100644
--- a/board/ti/dra7xx/Makefile
+++ b/board/ti/dra7xx/Makefile
@@ -6,3 +6,4 @@
#

obj-y := evm.o
+obj-$(CONFIG_CMD_FASTBOOT) += fastboot.o
diff --git a/board/ti/dra7xx/fastboot.c b/board/ti/dra7xx/fastboot.c
new file mode 100644
index 0000000..e05010d
--- /dev/null
+++ b/board/ti/dra7xx/fastboot.c
@@ -0,0 +1,45 @@
+/*
+ * (C) Copyright 2013
+ * Texas Instruments Incorporated, <www.ti.com>
+ *
+ * Lokesh Vutla <lokeshvutla@ti.com>
+ *
+ * Based on previous work by:
+ * Aneesh V <aneesh@ti.com>
+ * Steve Sakoman <steve@sakoman.com>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+#include <common.h>
+#include <asm/io.h>
+#include <asm-generic/gpio.h>
+#include <config.h>
+
+
+int fb_set_reboot_flag(void)
+{
+ /* clear all reset events */
+ __raw_writel(DRA7XX_PRM_RSTST_CLR, PRM_RSTST);
+ strncpy((char *)DRA7XX_PUBLIC_SAR_RAM_1_FREE, "bootloader",
+ DRA7XX_REBOOT_REASON_SIZE - 1);
+ *(((char *)DRA7XX_PUBLIC_SAR_RAM_1_FREE) +
+ DRA7XX_REBOOT_REASON_SIZE - 1) = '\0';
+ /* trigger warm reset */
+ __raw_writel(DRA7XX_PRM_RSTCTRL_RESET_WARM_BIT, DRA7XX_PRM_RSTCTRL);
+
+ return 0;
+}
+
+int fb_check_reboot_flag(void)
+{
+ /* Check if we are coming from a warm reset */
+ if (__raw_readl(DRA7XX_PRM_RSTST) & DRA7XX_PRM_RSTST_RESET_WARM_BIT)
+ if (!strncmp((const char *)DRA7XX_PUBLIC_SAR_RAM_1_FREE,
+ "bootloader", DRA7XX_REBOOT_REASON_SIZE)) {
+ strncpy((char *)DRA7XX_PUBLIC_SAR_RAM_1_FREE, "",
+ DRA7XX_REBOOT_REASON_SIZE);
+ return 0;
+ }
+
+ return 1;
+}
diff --git a/common/cmd_bootm.c b/common/cmd_bootm.c
index 48199bf..00791be 100644
--- a/common/cmd_bootm.c
+++ b/common/cmd_bootm.c
@@ -729,6 +729,11 @@ int do_booti(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int ret;

+#if defined(CONFIG_CMD_FASTBOOT)
+ if (!fb_check_reboot_flag())
+ do_fastboot(cmdtp, flag, argc, argv);
+#endif
+
/* Consume 'booti' */
argc--; argv++;

diff --git a/drivers/usb/gadget/f_fastboot.c b/drivers/usb/gadget/f_fastboot.c
index 206b6d1..a450357 100644
--- a/drivers/usb/gadget/f_fastboot.c
+++ b/drivers/usb/gadget/f_fastboot.c
@@ -332,6 +332,11 @@ int __weak fb_set_reboot_flag(void)
return -ENOSYS;
}

+int __weak fb_check_reboot_flag(void)
+{
+ return -ENOSYS;
+}
+
static void cb_reboot(struct usb_ep *ep, struct usb_request *req)
{
char *cmd = req->buf;
diff --git a/include/configs/dra7xx_evm_android.h b/include/configs/dra7xx_evm_android.h
index 68e7eec..2038e00 100644
--- a/include/configs/dra7xx_evm_android.h
+++ b/include/configs/dra7xx_evm_android.h
@@ -310,4 +310,18 @@
#endif
#endif /* NOR support */

+#define DRA7XX_PUBLIC_SAR_RAM_1_FREE (0x4AE26000 + 0xFE0)
+#define DRA7XX_PRM_RSTCTRL_RESET_WARM_BIT (1<<0)
+#define DRA7XX_PRM_RSTST_RESET_WARM_BIT (1<<1)
+#define DRA7XX_PRM_RSTST 0x4AE07D04
+#define DRA7XX_PRM_RSTCTRL 0x4AE07D00
+#define DRA7XX_PRM_RSTST_CLR 0xfff
+#define DRA7XX_REBOOT_REASON_SIZE 0xf
+
+#define CONFIG_BOARD_MACH_TYPE 4070
+#define MEMORY_BASE 0x80000000
+#define CONFIG_ADDR_ATAGS (MEMORY_BASE + 0x100)
+#define CONFIG_ADDR_DOWNLOAD (MEMORY_BASE + 0x02000000)
+#define DEVICE_TREE 0x82f80000
+
#endif /* __CONFIG_DRA7XX_EVM_ANDROID_H */
--
1.8.3.2