u-boot/arch/arm/mach-zynqmp/psu_spl_init.c
Michal Simek e82024def6 arm64: zynqmp: Do not assing MIO34 that early on zcu100
MIO34 is connected to POWER_KILL signal. When MIO configuration is done in
psu_init() and this pin is assigned to PMU but PMU configuration is not
loaded yet. PMU gpio output is high that means board is powered off
immediately.
The patch is fixing this sequence that MIO34 stays assing to ps gpio IP.
PMU config is loaded in SPL and then pin assigned to PMU through
psu_post_config_data().

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
2020-01-14 09:05:53 +01:00

88 lines
1.6 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright 2018 Xilinx, Inc.
*
* Michal Simek <michal.simek@xilinx.com>
*/
#include <common.h>
#include <asm/io.h>
#include <asm/arch/psu_init_gpl.h>
#define PSU_MASK_POLL_TIME 1100000
int __maybe_unused mask_pollonvalue(unsigned long add, u32 mask, u32 value)
{
int i = 0;
while ((__raw_readl(add) & mask) != value) {
if (i == PSU_MASK_POLL_TIME)
return 0;
i++;
}
return 1;
}
__weak int mask_poll(u32 add, u32 mask)
{
int i = 0;
unsigned long addr = add;
while (!(__raw_readl(addr) & mask)) {
if (i == PSU_MASK_POLL_TIME)
return 0;
i++;
}
return 1;
}
__weak u32 mask_read(u32 add, u32 mask)
{
unsigned long addr = add;
return __raw_readl(addr) & mask;
}
__weak void mask_delay(u32 delay)
{
udelay(delay);
}
__weak void psu_mask_write(unsigned long offset, unsigned long mask,
unsigned long val)
{
unsigned long regval = 0;
regval = readl(offset);
regval &= ~(mask);
regval |= (val & mask);
writel(regval, offset);
}
__weak void prog_reg(unsigned long addr, unsigned long mask,
unsigned long shift, unsigned long value)
{
int rdata = 0;
rdata = readl(addr);
rdata = rdata & (~mask);
rdata = rdata | (value << shift);
writel(rdata, addr);
}
__weak int psu_init(void)
{
/*
* This function is overridden by the one in
* board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
*/
return -1;
}
__weak unsigned long psu_post_config_data(void)
{
/*
* This function is overridden by the one in
* board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
*/
return 0;
}