xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv7/syslib.c (revision 87d98d3b8ef855c9ce1c09ddb1b7ea884a1d4ec6)
1*87d98d3bSStefano Babic /*
2*87d98d3bSStefano Babic  * (C) Copyright 2008
3*87d98d3bSStefano Babic  * Texas Instruments, <www.ti.com>
4*87d98d3bSStefano Babic  *
5*87d98d3bSStefano Babic  * Richard Woodruff <r-woodruff2@ti.com>
6*87d98d3bSStefano Babic  * Syed Mohammed Khasim <khasim@ti.com>
7*87d98d3bSStefano Babic  *
8*87d98d3bSStefano Babic  * This program is free software; you can redistribute it and/or
9*87d98d3bSStefano Babic  * modify it under the terms of the GNU General Public License as
10*87d98d3bSStefano Babic  * published by the Free Software Foundation; either version 2 of
11*87d98d3bSStefano Babic  * the License, or (at your option) any later version.
12*87d98d3bSStefano Babic  *
13*87d98d3bSStefano Babic  * This program is distributed in the hope that it will be useful,
14*87d98d3bSStefano Babic  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15*87d98d3bSStefano Babic  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*87d98d3bSStefano Babic  * GNU General Public License for more details.
17*87d98d3bSStefano Babic  *
18*87d98d3bSStefano Babic  * You should have received a copy of the GNU General Public License
19*87d98d3bSStefano Babic  * along with this program; if not, write to the Free Software
20*87d98d3bSStefano Babic  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21*87d98d3bSStefano Babic  * MA 02111-1307 USA
22*87d98d3bSStefano Babic  */
23*87d98d3bSStefano Babic 
24*87d98d3bSStefano Babic #include <common.h>
25*87d98d3bSStefano Babic #include <asm/io.h>
26*87d98d3bSStefano Babic #include <asm/arch/sys_proto.h>
27*87d98d3bSStefano Babic 
28*87d98d3bSStefano Babic /************************************************************
29*87d98d3bSStefano Babic  * sdelay() - simple spin loop.  Will be constant time as
30*87d98d3bSStefano Babic  *  its generally used in bypass conditions only.  This
31*87d98d3bSStefano Babic  *  is necessary until timers are accessible.
32*87d98d3bSStefano Babic  *
33*87d98d3bSStefano Babic  *  not inline to increase chances its in cache when called
34*87d98d3bSStefano Babic  *************************************************************/
35*87d98d3bSStefano Babic void sdelay(unsigned long loops)
36*87d98d3bSStefano Babic {
37*87d98d3bSStefano Babic 	__asm__ volatile ("1:\n" "subs %0, %1, #1\n"
38*87d98d3bSStefano Babic 			  "bne 1b":"=r" (loops):"0"(loops));
39*87d98d3bSStefano Babic }
40*87d98d3bSStefano Babic 
41*87d98d3bSStefano Babic /*****************************************************************
42*87d98d3bSStefano Babic  * sr32 - clear & set a value in a bit range for a 32 bit address
43*87d98d3bSStefano Babic  *****************************************************************/
44*87d98d3bSStefano Babic void sr32(void *addr, u32 start_bit, u32 num_bits, u32 value)
45*87d98d3bSStefano Babic {
46*87d98d3bSStefano Babic 	u32 tmp, msk = 0;
47*87d98d3bSStefano Babic 	msk = 1 << num_bits;
48*87d98d3bSStefano Babic 	--msk;
49*87d98d3bSStefano Babic 	tmp = readl((u32)addr) & ~(msk << start_bit);
50*87d98d3bSStefano Babic 	tmp |= value << start_bit;
51*87d98d3bSStefano Babic 	writel(tmp, (u32)addr);
52*87d98d3bSStefano Babic }
53*87d98d3bSStefano Babic 
54*87d98d3bSStefano Babic /*********************************************************************
55*87d98d3bSStefano Babic  * wait_on_value() - common routine to allow waiting for changes in
56*87d98d3bSStefano Babic  *   volatile regs.
57*87d98d3bSStefano Babic  *********************************************************************/
58*87d98d3bSStefano Babic u32 wait_on_value(u32 read_bit_mask, u32 match_value, void *read_addr,
59*87d98d3bSStefano Babic 		  u32 bound)
60*87d98d3bSStefano Babic {
61*87d98d3bSStefano Babic 	u32 i = 0, val;
62*87d98d3bSStefano Babic 	do {
63*87d98d3bSStefano Babic 		++i;
64*87d98d3bSStefano Babic 		val = readl((u32)read_addr) & read_bit_mask;
65*87d98d3bSStefano Babic 		if (val == match_value)
66*87d98d3bSStefano Babic 			return 1;
67*87d98d3bSStefano Babic 		if (i == bound)
68*87d98d3bSStefano Babic 			return 0;
69*87d98d3bSStefano Babic 	} while (1);
70*87d98d3bSStefano Babic }
71