1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright 2018 Xilinx, Inc.
4  *
5  * Michal Simek <michal.simek@xilinx.com>
6  */
7 #include <common.h>
8 #include <asm/io.h>
9 #include <asm/arch/psu_init_gpl.h>
10 
11 #define PSU_MASK_POLL_TIME 1100000
12 
13 int __maybe_unused mask_pollonvalue(unsigned long add, u32 mask, u32 value)
14 {
15 	int i = 0;
16 
17 	while ((__raw_readl(add) & mask) != value) {
18 		if (i == PSU_MASK_POLL_TIME)
19 			return 0;
20 		i++;
21 	}
22 	return 1;
23 }
24 
25 __weak int mask_poll(u32 add, u32 mask)
26 {
27 	int i = 0;
28 	unsigned long addr = add;
29 
30 	while (!(__raw_readl(addr) & mask)) {
31 		if (i == PSU_MASK_POLL_TIME)
32 			return 0;
33 		i++;
34 	}
35 	return 1;
36 }
37 
38 __weak u32 mask_read(u32 add, u32 mask)
39 {
40 	unsigned long addr = add;
41 
42 	return __raw_readl(addr) & mask;
43 }
44 
45 __weak void mask_delay(u32 delay)
46 {
47 	udelay(delay);
48 }
49 
50 __weak void psu_mask_write(unsigned long offset, unsigned long mask,
51 			   unsigned long val)
52 {
53 	unsigned long regval = 0;
54 
55 	regval = readl(offset);
56 	regval &= ~(mask);
57 	regval |= (val & mask);
58 	writel(regval, offset);
59 }
60 
61 __weak void prog_reg(unsigned long addr, unsigned long mask,
62 		     unsigned long shift, unsigned long value)
63 {
64 	int rdata = 0;
65 
66 	rdata = readl(addr);
67 	rdata = rdata & (~mask);
68 	rdata = rdata | (value << shift);
69 	writel(rdata, addr);
70 }
71 
72 __weak int psu_init(void)
73 {
74 	/*
75 	 * This function is overridden by the one in
76 	 * board/xilinx/zynqmp/(platform)/psu_init_gpl.c, if it exists.
77 	 */
78 	return -1;
79 }
80