1/* 2 * (C) Copyright 2000, 2001 3 * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com. 4 * base on code by 5 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 6 * 7 * SPDX-License-Identifier: GPL-2.0+ 8 */ 9 10#include <ppc_asm.tmpl> 11#include <ppc_defs.h> 12#include <config.h> 13#include <watchdog.h> 14 15/* 16 * unsigned long long get_ticks(void); 17 * 18 * read timebase as "long long" 19 */ 20 .globl get_ticks 21get_ticks: 221: mftbu r3 23 mftb r4 24 mftbu r5 25 cmp 0,r3,r5 26 bne 1b 27 blr 28 29/* 30 * Delay for a number of ticks 31 */ 32 .globl wait_ticks 33wait_ticks: 34 stwu r1, -16(r1) 35 mflr r0 /* save link register */ 36 stw r0, 20(r1) /* Use r0 or GDB will be unhappy */ 37 stw r14, 12(r1) /* save used registers */ 38 stw r15, 8(r1) 39 mr r14, r3 /* save tick count */ 40 bl get_ticks /* Get start time */ 41 42 /* Calculate end time */ 43 addc r14, r4, r14 /* Compute end time lower */ 44 addze r15, r3 /* and end time upper */ 45 46 WATCHDOG_RESET /* Trigger watchdog, if needed */ 471: bl get_ticks /* Get current time */ 48 subfc r4, r4, r14 /* Subtract current time from end time */ 49 subfe. r3, r3, r15 50 bge 1b /* Loop until time expired */ 51 52 lwz r15, 8(r1) /* restore saved registers */ 53 lwz r14, 12(r1) 54 lwz r0, 20(r1) 55 addi r1,r1,16 56 mtlr r0 57 blr 58