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