On Sab, 2017-02-25 at 22:28 +0100, Marek Vasut wrote: > On 02/22/2017 10:47 AM, Ley Foon Tan wrote: > > > > Add reset driver support for Arria 10. > > > > Signed-off-by: Tien Fong Chee <tien.fong.c...@intel.com> > > Signed-off-by: Ley Foon Tan <ley.foon....@intel.com> > > --- > > arch/arm/mach-socfpga/Makefile | 2 + > > arch/arm/mach-socfpga/include/mach/reset_manager.h | 4 +- > > .../include/mach/reset_manager_arria10.h | 144 ++++++++ > > arch/arm/mach-socfpga/reset_manager_arria10.c | 406 > > +++++++++++++++++++++ > > include/dt-bindings/reset/altr,rst-mgr-a10.h | 103 ++++++ > > 5 files changed, 658 insertions(+), 1 deletion(-) > > create mode 100755 arch/arm/mach- > > socfpga/include/mach/reset_manager_arria10.h > > create mode 100644 arch/arm/mach-socfpga/reset_manager_arria10.c > > create mode 100644 include/dt-bindings/reset/altr,rst-mgr-a10.h > > > > diff --git a/arch/arm/mach-socfpga/Makefile b/arch/arm/mach- > > socfpga/Makefile > > index e83da2e..d81f003 100644 > > --- a/arch/arm/mach-socfpga/Makefile > > +++ b/arch/arm/mach-socfpga/Makefile > > @@ -10,6 +10,8 @@ > > obj-y += misc.o timer.o reset_manager.o clock_manager.o \ > > fpga_manager.o board.o > > > > +obj-$(CONFIG_TARGET_SOCFPGA_ARRIA10) += reset_manager_arria10.o > > + > > obj-$(CONFIG_SPL_BUILD) += spl.o freeze_controller.o > > > > # QTS-generated config file wrappers > > diff --git a/arch/arm/mach-socfpga/include/mach/reset_manager.h > > b/arch/arm/mach-socfpga/include/mach/reset_manager.h > > index 9e253bf..64526b6 100644 > > --- a/arch/arm/mach-socfpga/include/mach/reset_manager.h > > +++ b/arch/arm/mach-socfpga/include/mach/reset_manager.h > > @@ -43,7 +43,9 @@ void socfpga_per_reset_all(void); > > /* Create a human-readable reference to SoCFPGA reset. */ > > #define SOCFPGA_RESET(_name) RSTMGR_##_name > > > > -#if defined(CONFIG_TARGET_SOCFPGA_GEN5) > > +#if defined(CONFIG_TARGET_SOCFPGA_ARRIA10) > > +#include <asm/arch/reset_manager_arria10.h> > > +#elif defined(CONFIG_TARGET_SOCFPGA_GEN5) > You can use #elif defined(CONFIG_TARGET_SOCFPGA_ARRIA10) instead to > keep > this list sorted. You want sort with GEN5, ARRIA10 or sorted alphanumerically ARRIA10 then GEN5? > > > > > #include <asm/arch/reset_manager_gen5.h> > > #endif > > > > diff --git a/arch/arm/mach- > > socfpga/include/mach/reset_manager_arria10.h b/arch/arm/mach- > > socfpga/include/mach/reset_manager_arria10.h > > new file mode 100755 > > index 0000000..2668a86 > > --- /dev/null > > +++ b/arch/arm/mach-socfpga/include/mach/reset_manager_arria10.h > > @@ -0,0 +1,144 @@ > > +/* > > + * Copyright (C) 2012-2017 Altera Corporation <www.altera.com> > > + * > > + * SPDX-License-Identifier: GPL-2.0+ > > + */ > > + > > +#ifndef _RESET_MANAGER_ARRIA10_H_ > > +#define _RESET_MANAGER_ARRIA10_H_ > Use #ifdef[space]FOO and #define[space]FOO Okay > > > > > +void watchdog_disable(void); > > +void reset_deassert_noc_ddr_scheduler(void); > > +int is_wdt_in_reset(void); > > +void emac_manage_reset(ulong emacbase, uint state); > > +int reset_deassert_bridges_handoff(void); > > +void reset_assert_fpga_connected_peripherals(void); > > +void reset_deassert_osc1wd0(void); > > +void reset_assert_uart(void); > > +void reset_deassert_uart(void); > [...] > > > > > +#endif /* _RESET_MANAGER_ARRIA10_H_ */ > > diff --git a/arch/arm/mach-socfpga/reset_manager_arria10.c > > b/arch/arm/mach-socfpga/reset_manager_arria10.c > > new file mode 100644 > > index 0000000..01156de > > --- /dev/null > > +++ b/arch/arm/mach-socfpga/reset_manager_arria10.c > > @@ -0,0 +1,406 @@ > > +/* > > + * Copyright (C) 2016-2017 Intel Corporation > > + * > > + * SPDX-License-Identifier: GPL-2.0 > > + */ > > + > > +#include <common.h> > > +#include <asm/io.h> > > +#include <asm/arch/fpga_manager.h> > > +#include <asm/arch/misc.h> > > +#include <asm/arch/reset_manager.h> > > +#include <asm/arch/system_manager.h> > > +#include <fdtdec.h> > > +#include <errno.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; > Use the tabs consistently, one or two, but pick one. Okay. > > > > > +static int get_bridge_init_val(const void *blob, int compat_id); > > + > > +#define ECC_MASK (ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK|\ > > + ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK|\ > > + ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK|\ > > + ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK|\ > > + ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK|\ > > + ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK) > MSK | \ > > Keep the spacing please. Okay. > > > > > +void reset_assert_uart(void) > > +{ > > + u32 mask = 0; > > + unsigned int com_port; > > + > > + com_port = uart_com_port(gd->fdt_blob); > What's this function , is it defined later in the patchset ? Oh ya, it is in later patch [misc]. I will try to rearrange this. > > > > > + if (SOCFPGA_UART1_ADDRESS == com_port) > > + mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK; > > + else if (SOCFPGA_UART0_ADDRESS == com_port) > > + mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK; > Use if (foo == VALUE) please, not the other way around. Fix globally. Okay. > > > > > + setbits_le32(&reset_manager_base->per1modrst, mask); > You can combine this with the deassert_uart() function and use > clrsetbits instead to avoid duplication of the if () else () logic > above. Okay. > > > > > +} > > + > > +void reset_deassert_uart(void) > > +{ > > + u32 mask = 0; > > + unsigned int com_port; > > + > > + com_port = uart_com_port(gd->fdt_blob); > > + > > + if (SOCFPGA_UART1_ADDRESS == com_port) > > + mask |= ALT_RSTMGR_PER1MODRST_UART1_SET_MSK; > > + else if (SOCFPGA_UART0_ADDRESS == com_port) > > + mask |= ALT_RSTMGR_PER1MODRST_UART0_SET_MSK; > > + > > + clrbits_le32(&reset_manager_base->per1modrst, mask); > > +} > [...] > > > > > +static int get_bridge_init_val(const void *blob, int compat_id) > > +{ > > + int rval = 0; > > + int node; > > + u32 val; > > + > > + node = fdtdec_next_compatible(blob, 0, compat_id); > > + if (node >= 0) { > Invert the conditions here to make the indent flat ... Okay. > > > > > + if (!fdtdec_get_int_array(blob, node, "init-val", > > &val, 1)) { > > + if (val == 1) > > + rval = val; > > + } > > + } > > + return rval; > > +} > > + > > +/* Enable bridges (hps2fpga, lwhps2fpga, fpga2hps, fpga2sdram) per > > handoff */ > > +int reset_deassert_bridges_handoff(void) > > +{ > > + u32 mask_noc = 0, mask_rstmgr = 0; > > + int i; > > + unsigned start = get_timer(0); > > + > > + for (i = 0; i < ARRAY_SIZE(bridge_cfg_tbl); i++) { > > + if (get_bridge_init_val(gd->fdt_blob, > > + bridge_cfg_tbl[i].compat_i > > d)) { > > + mask_noc |= bridge_cfg_tbl[i].mask_noc; > > + mask_rstmgr |= > > bridge_cfg_tbl[i].mask_rstmgr; > > + } > > + } > > + > > + /* clear idle request to all bridges */ > > + setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc); > > + > > + /* Release bridges from reset state per handoff value */ > > + clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr); > > + > > + /* Poll until all idleack to 0, timeout at 1000ms */ > > + while (readl(&sysmgr_regs->noc_idleack) & mask_noc) { > wait_for_bit() ? Yes, can use wait_for_bit()/ > > > > > + if (get_timer(start) > 1000) { > > + printf("Fail: noc_idleack = 0x%08x > > mask_noc = 0x%08x\n", > > + readl(&sysmgr_regs->noc_idleack), > > + mask_noc); > > + return -ETIMEDOUT; > > + } > > + } > > + return 0; > > +} > [...] >
Thanks. Regards Ley Foon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot