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