[PATCH] AVR32: Implement and export __raw_{read,write}s[bwl]
Haavard Skinnemoen [Tue, 24 Oct 2006 08:12:44 +0000 (10:12 +0200)]
Implement __raw_readsb and __raw_writesb. Export __raw_reads[bwl]
and __raw_writes[bwl] for use by modules.

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

arch/avr32/kernel/avr32_ksyms.c
arch/avr32/lib/Makefile
arch/avr32/lib/io-readsb.S [new file with mode: 0644]
arch/avr32/lib/io-writesb.S [new file with mode: 0644]

index 04f767a..372e3f8 100644 (file)
@@ -7,6 +7,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#include <linux/io.h>
 #include <linux/module.h>
 
 #include <asm/checksum.h>
@@ -53,3 +54,11 @@ EXPORT_SYMBOL(find_next_zero_bit);
 EXPORT_SYMBOL(find_first_bit);
 EXPORT_SYMBOL(find_next_bit);
 EXPORT_SYMBOL(generic_find_next_zero_le_bit);
+
+/* I/O primitives (lib/io-*.S) */
+EXPORT_SYMBOL(__raw_readsb);
+EXPORT_SYMBOL(__raw_readsw);
+EXPORT_SYMBOL(__raw_readsl);
+EXPORT_SYMBOL(__raw_writesb);
+EXPORT_SYMBOL(__raw_writesw);
+EXPORT_SYMBOL(__raw_writesl);
index 09ac43e..084d95b 100644 (file)
@@ -7,4 +7,5 @@ lib-y   += strncpy_from_user.o strnlen_user.o
 lib-y  += delay.o memset.o memcpy.o findbit.o
 lib-y  += csum_partial.o csum_partial_copy_generic.o
 lib-y  += io-readsw.o io-readsl.o io-writesw.o io-writesl.o
+lib-y  += io-readsb.o io-writesb.o
 lib-y  += __avr32_lsl64.o __avr32_lsr64.o __avr32_asr64.o
diff --git a/arch/avr32/lib/io-readsb.S b/arch/avr32/lib/io-readsb.S
new file mode 100644 (file)
index 0000000..b319d5e
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+       .text
+.Lnot_word_aligned:
+1:     ld.ub   r8, r12[0]
+       sub     r10, 1
+       st.b    r11++, r8
+       reteq   r12
+       tst     r11, r9
+       brne    1b
+
+       /* fall through */
+
+       .global __raw_readsb
+       .type   __raw_readsb,@function
+__raw_readsb:
+       cp.w    r10, 0
+       mov     r9, 3
+       reteq   r12
+
+       tst     r11, r9
+       brne    .Lnot_word_aligned
+
+       sub     r10, 4
+       brlt    2f
+
+1:     ldins.b r8:t, r12[0]
+       ldins.b r8:u, r12[0]
+       ldins.b r8:l, r12[0]
+       ldins.b r8:b, r12[0]
+       st.w    r11++, r8
+       sub     r10, 4
+       brge    1b
+
+2:     sub     r10, -4
+       reteq   r12
+
+3:     ld.uh   r8, r12[0]
+       sub     r10, 1
+       st.b    r11++, r8
+       brne    3b
diff --git a/arch/avr32/lib/io-writesb.S b/arch/avr32/lib/io-writesb.S
new file mode 100644 (file)
index 0000000..b4ebaac
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+       .text
+.Lnot_word_aligned:
+1:     ld.ub   r8, r11++
+       sub     r10, 1
+       st.b    r12[0], r8
+       reteq   r12
+       tst     r11, r9
+       brne    1b
+
+       /* fall through */
+
+       .global __raw_writesb
+       .type   __raw_writesb,@function
+__raw_writesb:
+       cp.w    r10, 0
+       mov     r9, 3
+       reteq   r12
+
+       tst     r11, r9
+       brne    .Lnot_word_aligned
+
+       sub     r10, 4
+       brlt    2f
+
+1:     ld.w    r8, r11++
+       bfextu  r9, r8, 24, 8
+       st.b    r12[0], r9
+       bfextu  r9, r8, 16, 8
+       st.b    r12[0], r9
+       bfextu  r9, r8, 8, 8
+       st.b    r12[0], r9
+       st.b    r12[0], r8
+       sub     r10, 4
+       brge    1b
+
+2:     sub     r10, -4
+       reteq   r12
+
+3:     ld.ub   r8, r11++
+       sub     r10, 1
+       st.b    r12[0], r8
+       brne    3b
+
+       retal   r12