linux/arch/c6x/include/asm/delay.h
<<
>>
Prefs
   1/*
   2 *  Port on Texas Instruments TMS320C6x architecture
   3 *
   4 *  Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated
   5 *  Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com)
   6 *
   7 *  This program is free software; you can redistribute it and/or modify
   8 *  it under the terms of the GNU General Public License version 2 as
   9 *  published by the Free Software Foundation.
  10 */
  11#ifndef _ASM_C6X_DELAY_H
  12#define _ASM_C6X_DELAY_H
  13
  14#include <linux/kernel.h>
  15
  16extern unsigned int ticks_per_ns_scaled;
  17
  18static inline void __delay(unsigned long loops)
  19{
  20        uint32_t tmp;
  21
  22        /* 6 cycles per loop */
  23        asm volatile ("        mv    .s1  %0,%1\n"
  24                      "0: [%1] b     .s1  0b\n"
  25                      "        add   .l1  -6,%0,%0\n"
  26                      "        cmplt .l1  1,%0,%1\n"
  27                      "        nop   3\n"
  28                      : "+a"(loops), "=A"(tmp));
  29}
  30
  31static inline void _c6x_tickdelay(unsigned int x)
  32{
  33        uint32_t cnt, endcnt;
  34
  35        asm volatile ("        mvc   .s2   TSCL,%0\n"
  36                      "        add   .s2x  %0,%1,%2\n"
  37                      " ||     mvk   .l2   1,B0\n"
  38                      "0: [B0] b     .s2   0b\n"
  39                      "        mvc   .s2   TSCL,%0\n"
  40                      "        sub   .s2   %0,%2,%0\n"
  41                      "        cmpgt .l2   0,%0,B0\n"
  42                      "        nop   2\n"
  43                      : "=b"(cnt), "+a"(x), "=b"(endcnt) : : "B0");
  44}
  45
  46/* use scaled math to avoid slow division */
  47#define C6X_NDELAY_SCALE 10
  48
  49static inline void _ndelay(unsigned int n)
  50{
  51        _c6x_tickdelay((ticks_per_ns_scaled * n) >> C6X_NDELAY_SCALE);
  52}
  53
  54static inline void _udelay(unsigned int n)
  55{
  56        while (n >= 10) {
  57                _ndelay(10000);
  58                n -= 10;
  59        }
  60        while (n-- > 0)
  61                _ndelay(1000);
  62}
  63
  64#define udelay(x) _udelay((unsigned int)(x))
  65#define ndelay(x) _ndelay((unsigned int)(x))
  66
  67#endif /* _ASM_C6X_DELAY_H */
  68