From cdebb15c61b355c3ada070726f161ed0edaea322 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Sat, 14 Nov 2015 21:43:00 +0100 Subject: [PATCH] Rework code related with CPU reset, plus minor fixes --- u-boot/board/ar7240/common/common.c | 8 +++ u-boot/cpu/mips/ar7240/qca_common.c | 17 +++++++ u-boot/cpu/mips/cpu.c | 79 +++++++---------------------- u-boot/include/common.h | 1 + 4 files changed, 45 insertions(+), 60 deletions(-) diff --git a/u-boot/board/ar7240/common/common.c b/u-boot/board/ar7240/common/common.c index 1f1e2df..ffb9949 100644 --- a/u-boot/board/ar7240/common/common.c +++ b/u-boot/board/ar7240/common/common.c @@ -126,3 +126,11 @@ u32 main_cpu_clk(void) return cpu_clk; } + +/* + * Calls full chip reset + */ +void full_reset(void) +{ + qca_full_chip_reset(); +} diff --git a/u-boot/cpu/mips/ar7240/qca_common.c b/u-boot/cpu/mips/ar7240/qca_common.c index 6e10620..e1f9d9a 100644 --- a/u-boot/cpu/mips/ar7240/qca_common.c +++ b/u-boot/cpu/mips/ar7240/qca_common.c @@ -41,6 +41,9 @@ void qca_soc_name_rev(char *buf) u32 major; u32 rev = 0; + if (buf == NULL) + return; + /* Get revision ID value */ id = qca_soc_reg_read(QCA_RST_REVISION_ID_REG); @@ -84,3 +87,17 @@ void qca_soc_name_rev(char *buf) break; } } + +/* + * Performs full chip reset + */ +void qca_full_chip_reset(void) +{ + volatile u32 i = 1; + + do { + qca_soc_reg_write(QCA_RST_RST_REG, + QCA_RST_RESET_FULL_CHIP_RST_MASK + | QCA_RST_RESET_DDR_RST_MASK); + } while (i); +} diff --git a/u-boot/cpu/mips/cpu.c b/u-boot/cpu/mips/cpu.c index 12e16cc..f8eeec8 100644 --- a/u-boot/cpu/mips/cpu.c +++ b/u-boot/cpu/mips/cpu.c @@ -1,75 +1,31 @@ /* - * (C) Copyright 2003 - * Wolfgang Denk, DENX Software Engineering, + * Copyright (C) 2015 Piotr Dymacz + * Copyright (C) 2003 Wolfgang Denk, DENX Software Engineering, * - * See file CREDITS for list of people who contributed to this - * project. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, - * MA 02111-1307 USA + * SPDX-License-Identifier:GPL-2.0 */ #include #include #include -#if defined(CONFIG_AR7100) -#include -#include -#endif - -#if defined(CONFIG_AR7240) -#include -#include -#endif +extern void dcache_flush_range(u32 a, u32 end); -int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){ -#if defined(CONFIG_AR7100) - for(;;){ - ar7100_reg_wr(AR7100_RESET, (AR7100_RESET_FULL_CHIP | AR7100_RESET_DDR)); - } -#elif defined(CONFIG_AR7240) -#ifndef COMPRESSED_UBOOT - fprintf(stdout, "\nResetting the board...\n"); +int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + printf("Resetting the board..."); milisecdelay(500); -#endif /* #ifndef COMPRESSED_UBOOT */ - for(;;){ - #ifdef CONFIG_WASP - if(ar7240_reg_rd(AR7240_REV_ID) & 0xf){ - ar7240_reg_wr(AR7240_RESET, (AR7240_RESET_FULL_CHIP | AR7240_RESET_DDR)); - } else { - /* - * WAR for full chip reset spi vs. boot-rom selection - * bug in wasp 1.0 - */ - ar7240_reg_wr(AR7240_GPIO_OE, ar7240_reg_rd(AR7240_GPIO_OE) & (~(1 << 17))); - } - #else - ar7240_reg_wr(AR7240_RESET, (AR7240_RESET_FULL_CHIP | AR7240_RESET_DDR)); - #endif - } -#endif -#ifndef COMPRESSED_UBOOT - fprintf(stderr, "\n*** ERROR: RESET FAILED! ***\n"); -#endif /* #ifndef COMPRESSED_UBOOT */ - return(0); -} -extern void dcache_flush_range(u32 a, u32 end); + full_reset(); -void flush_cache(ulong start_addr, ulong size){ + /* After full chip reset we should not reach next step... */ + printf("\n## Error: RESET FAILED!\n"); + + return 0; +} + +void flush_cache(ulong start_addr, ulong size) +{ u32 end, a; a = start_addr & ~(CFG_CACHELINE_SIZE - 1); @@ -88,6 +44,9 @@ void cpu_name(char *name) { u32 cpu_id = read_c0_prid(); + if (name == NULL) + return; + switch (cpu_id & PRID_IMP_MASK) { case PRID_IMP_24K: sprintf(name, "MIPS 24Kc"); diff --git a/u-boot/include/common.h b/u-boot/include/common.h index f601b4a..a8a4440 100644 --- a/u-boot/include/common.h +++ b/u-boot/include/common.h @@ -167,6 +167,7 @@ void hang(void) __attribute__ ((noreturn)); long int dram_init(void); int timer_init(void); int gpio_init(void); +void full_reset(void); void all_led_on(void); void all_led_off(void); void print_size(ulong, const char *); -- 2.25.1