Restructure reset manager driver in the preparation to support A10. Move the Gen5 specific code to gen5 files. Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com>master
parent
de77811589
commit
2b09ea48dd
@ -0,0 +1,50 @@ |
||||
/*
|
||||
* Copyright (C) 2012-2017 Altera Corporation <www.altera.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#ifndef _RESET_MANAGER_GEN5_H_ |
||||
#define _RESET_MANAGER_GEN5_H_ |
||||
|
||||
#include <dt-bindings/reset/altr,rst-mgr.h> |
||||
|
||||
void reset_deassert_peripherals_handoff(void); |
||||
void socfpga_bridges_reset(int enable); |
||||
|
||||
struct socfpga_reset_manager { |
||||
u32 status; |
||||
u32 ctrl; |
||||
u32 counts; |
||||
u32 padding1; |
||||
u32 mpu_mod_reset; |
||||
u32 per_mod_reset; |
||||
u32 per2_mod_reset; |
||||
u32 brg_mod_reset; |
||||
u32 misc_mod_reset; |
||||
u32 padding2[12]; |
||||
u32 tstscratch; |
||||
}; |
||||
|
||||
/*
|
||||
* SocFPGA Cyclone V/Arria V reset IDs, bank mapping is as follows: |
||||
* 0 ... mpumodrst |
||||
* 1 ... permodrst |
||||
* 2 ... per2modrst |
||||
* 3 ... brgmodrst |
||||
* 4 ... miscmodrst |
||||
*/ |
||||
#define RSTMGR_EMAC0 RSTMGR_DEFINE(1, 0) |
||||
#define RSTMGR_EMAC1 RSTMGR_DEFINE(1, 1) |
||||
#define RSTMGR_NAND RSTMGR_DEFINE(1, 4) |
||||
#define RSTMGR_QSPI RSTMGR_DEFINE(1, 5) |
||||
#define RSTMGR_L4WD0 RSTMGR_DEFINE(1, 6) |
||||
#define RSTMGR_OSC1TIMER0 RSTMGR_DEFINE(1, 8) |
||||
#define RSTMGR_UART0 RSTMGR_DEFINE(1, 16) |
||||
#define RSTMGR_SPIM0 RSTMGR_DEFINE(1, 18) |
||||
#define RSTMGR_SPIM1 RSTMGR_DEFINE(1, 19) |
||||
#define RSTMGR_SDMMC RSTMGR_DEFINE(1, 22) |
||||
#define RSTMGR_DMA RSTMGR_DEFINE(1, 28) |
||||
#define RSTMGR_SDR RSTMGR_DEFINE(1, 29) |
||||
|
||||
#endif /* _RESET_MANAGER_GEN5_H_ */ |
@ -0,0 +1,116 @@ |
||||
/*
|
||||
* Copyright (C) 2013 Altera Corporation <www.altera.com> |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
|
||||
#include <common.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/fpga_manager.h> |
||||
#include <asm/arch/reset_manager.h> |
||||
#include <asm/arch/system_manager.h> |
||||
|
||||
DECLARE_GLOBAL_DATA_PTR; |
||||
|
||||
static const struct socfpga_reset_manager *reset_manager_base = |
||||
(void *)SOCFPGA_RSTMGR_ADDRESS; |
||||
static const struct socfpga_system_manager *sysmgr_regs = |
||||
(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS; |
||||
|
||||
/* Assert or de-assert SoCFPGA reset manager reset. */ |
||||
void socfpga_per_reset(u32 reset, int set) |
||||
{ |
||||
const u32 *reg; |
||||
u32 rstmgr_bank = RSTMGR_BANK(reset); |
||||
|
||||
switch (rstmgr_bank) { |
||||
case 0: |
||||
reg = &reset_manager_base->mpu_mod_reset; |
||||
break; |
||||
case 1: |
||||
reg = &reset_manager_base->per_mod_reset; |
||||
break; |
||||
case 2: |
||||
reg = &reset_manager_base->per2_mod_reset; |
||||
break; |
||||
case 3: |
||||
reg = &reset_manager_base->brg_mod_reset; |
||||
break; |
||||
case 4: |
||||
reg = &reset_manager_base->misc_mod_reset; |
||||
break; |
||||
|
||||
default: |
||||
return; |
||||
} |
||||
|
||||
if (set) |
||||
setbits_le32(reg, 1 << RSTMGR_RESET(reset)); |
||||
else |
||||
clrbits_le32(reg, 1 << RSTMGR_RESET(reset)); |
||||
} |
||||
|
||||
/*
|
||||
* Assert reset on every peripheral but L4WD0. |
||||
* Watchdog must be kept intact to prevent glitches |
||||
* and/or hangs. |
||||
*/ |
||||
void socfpga_per_reset_all(void) |
||||
{ |
||||
const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)); |
||||
|
||||
writel(~l4wd0, &reset_manager_base->per_mod_reset); |
||||
writel(0xffffffff, &reset_manager_base->per2_mod_reset); |
||||
} |
||||
|
||||
/*
|
||||
* Release peripherals from reset based on handoff |
||||
*/ |
||||
void reset_deassert_peripherals_handoff(void) |
||||
{ |
||||
writel(0, &reset_manager_base->per_mod_reset); |
||||
} |
||||
|
||||
#if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET) |
||||
void socfpga_bridges_reset(int enable) |
||||
{ |
||||
/* For SoCFPGA-VT, this is NOP. */ |
||||
return; |
||||
} |
||||
#else |
||||
|
||||
#define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10 |
||||
#define L3REGS_REMAP_HPS2FPGA_MASK 0x08 |
||||
#define L3REGS_REMAP_OCRAM_MASK 0x01 |
||||
|
||||
void socfpga_bridges_reset(int enable) |
||||
{ |
||||
const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK | |
||||
L3REGS_REMAP_HPS2FPGA_MASK | |
||||
L3REGS_REMAP_OCRAM_MASK; |
||||
|
||||
if (enable) { |
||||
/* brdmodrst */ |
||||
writel(0xffffffff, &reset_manager_base->brg_mod_reset); |
||||
} else { |
||||
writel(0, &sysmgr_regs->iswgrp_handoff[0]); |
||||
writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]); |
||||
|
||||
/* Check signal from FPGA. */ |
||||
if (!fpgamgr_test_fpga_ready()) { |
||||
/* FPGA not ready, do nothing. We allow system to boot
|
||||
* without FPGA ready. So, return 0 instead of error. */ |
||||
printf("%s: FPGA not ready, aborting.\n", __func__); |
||||
return; |
||||
} |
||||
|
||||
/* brdmodrst */ |
||||
writel(0, &reset_manager_base->brg_mod_reset); |
||||
|
||||
/* Remap the bridges into memory map */ |
||||
writel(l3mask, SOCFPGA_L3REGS_ADDRESS); |
||||
} |
||||
return; |
||||
} |
||||
#endif |
Loading…
Reference in new issue