linux/arch/sh/lib/io.c
<<
>>
Prefs
   1/*
   2 * arch/sh/lib/io.c - SH32 optimized I/O routines
   3 *
   4 * Copyright (C) 2000  Stuart Menefy
   5 * Copyright (C) 2005  Paul Mundt
   6 *
   7 * Provide real functions which expand to whatever the header file defined.
   8 * Also definitions of machine independent IO functions.
   9 *
  10 * This file is subject to the terms and conditions of the GNU General Public
  11 * License.  See the file "COPYING" in the main directory of this archive
  12 * for more details.
  13 */
  14#include <linux/module.h>
  15#include <linux/io.h>
  16
  17void __raw_readsl(const void __iomem *addr, void *datap, int len)
  18{
  19        u32 *data;
  20
  21        for (data = datap; (len != 0) && (((u32)data & 0x1f) != 0); len--)
  22                *data++ = __raw_readl(addr);
  23
  24        if (likely(len >= (0x20 >> 2))) {
  25                int tmp2, tmp3, tmp4, tmp5, tmp6;
  26
  27                __asm__ __volatile__(
  28                        "1:                     \n\t"
  29                        "mov.l  @%7, r0         \n\t"
  30                        "mov.l  @%7, %2         \n\t"
  31#ifdef CONFIG_CPU_SH4
  32                        "movca.l r0, @%0        \n\t"
  33#else
  34                        "mov.l  r0, @%0         \n\t"
  35#endif
  36                        "mov.l  @%7, %3         \n\t"
  37                        "mov.l  @%7, %4         \n\t"
  38                        "mov.l  @%7, %5         \n\t"
  39                        "mov.l  @%7, %6         \n\t"
  40                        "mov.l  @%7, r7         \n\t"
  41                        "mov.l  @%7, r0         \n\t"
  42                        "mov.l  %2, @(0x04,%0)  \n\t"
  43                        "mov    #0x20>>2, %2    \n\t"
  44                        "mov.l  %3, @(0x08,%0)  \n\t"
  45                        "sub    %2, %1          \n\t"
  46                        "mov.l  %4, @(0x0c,%0)  \n\t"
  47                        "cmp/hi %1, %2          ! T if 32 > len \n\t"
  48                        "mov.l  %5, @(0x10,%0)  \n\t"
  49                        "mov.l  %6, @(0x14,%0)  \n\t"
  50                        "mov.l  r7, @(0x18,%0)  \n\t"
  51                        "mov.l  r0, @(0x1c,%0)  \n\t"
  52                        "bf.s   1b              \n\t"
  53                        " add   #0x20, %0       \n\t"
  54                        : "=&r" (data), "=&r" (len),
  55                          "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4),
  56                          "=&r" (tmp5), "=&r" (tmp6)
  57                        : "r"(addr), "0" (data), "1" (len)
  58                        : "r0", "r7", "t", "memory");
  59        }
  60
  61        for (; len != 0; len--)
  62                *data++ = __raw_readl(addr);
  63}
  64EXPORT_SYMBOL(__raw_readsl);
  65
  66void __raw_writesl(void __iomem *addr, const void *data, int len)
  67{
  68        if (likely(len != 0)) {
  69                int tmp1;
  70
  71                __asm__ __volatile__ (
  72                        "1:                             \n\t"
  73                        "mov.l  @%0+, %1        \n\t"
  74                        "dt             %3              \n\t"
  75                        "bf.s           1b              \n\t"
  76                        " mov.l %1, @%4         \n\t"
  77                        : "=&r" (data), "=&r" (tmp1)
  78                        : "0" (data), "r" (len), "r"(addr)
  79                        : "t", "memory");
  80        }
  81}
  82EXPORT_SYMBOL(__raw_writesl);
  83