1819833afSPeter Tyser /* 2819833afSPeter Tyser * include/asm-microblaze/byteorder.h -- Endian id and conversion ops 3819833afSPeter Tyser * 4819833afSPeter Tyser * Copyright (C) 2003 John Williams <jwilliams@itee.uq.edu.au> 5819833afSPeter Tyser * Copyright (C) 2001 NEC Corporation 6819833afSPeter Tyser * Copyright (C) 2001 Miles Bader <miles@gnu.org> 7819833afSPeter Tyser * 8819833afSPeter Tyser * This file is subject to the terms and conditions of the GNU General 9819833afSPeter Tyser * Public License. See the file COPYING in the main directory of this 10819833afSPeter Tyser * archive for more details. 11819833afSPeter Tyser * 12819833afSPeter Tyser * Written by Miles Bader <miles@gnu.org> 13819833afSPeter Tyser * Microblaze port by John Williams 14819833afSPeter Tyser */ 15819833afSPeter Tyser 16819833afSPeter Tyser #ifndef __MICROBLAZE_BYTEORDER_H__ 17819833afSPeter Tyser #define __MICROBLAZE_BYTEORDER_H__ 18819833afSPeter Tyser 19819833afSPeter Tyser #include <asm/types.h> 20819833afSPeter Tyser 21819833afSPeter Tyser #ifdef __GNUC__ 22819833afSPeter Tyser 23819833afSPeter Tyser /* This is effectively a dupe of the arch-independent byteswap 24819833afSPeter Tyser code in include/linux/byteorder/swab.h, however we force a cast 25819833afSPeter Tyser of the result up to 32 bits. This in turn forces the compiler 26819833afSPeter Tyser to explicitly clear the high 16 bits, which it wasn't doing otherwise. 27819833afSPeter Tyser 28819833afSPeter Tyser I think this is a symptom of a bug in mb-gcc. JW 20040303 29819833afSPeter Tyser */ 30819833afSPeter Tyser 31819833afSPeter Tyser 32819833afSPeter Tyser static __inline__ __u16 ___arch__swab16 (__u16 half_word) 33819833afSPeter Tyser { 34819833afSPeter Tyser /* 32 bit temp to cast result, forcing clearing of high word */ 35819833afSPeter Tyser __u32 temp; 36819833afSPeter Tyser 37819833afSPeter Tyser temp = ((half_word & 0x00FFU) << 8) | ((half_word & 0xFF00U) >> 8); 38819833afSPeter Tyser 39819833afSPeter Tyser return (__u16) temp; 40819833afSPeter Tyser } 41819833afSPeter Tyser 42819833afSPeter Tyser #define __arch__swab16(x) ___arch__swab16(x) 43819833afSPeter Tyser 44819833afSPeter Tyser /* Microblaze has no arch-specific endian conversion insns */ 45819833afSPeter Tyser 46819833afSPeter Tyser #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) 47819833afSPeter Tyser # define __BYTEORDER_HAS_U64__ 48819833afSPeter Tyser # define __SWAB_64_THRU_32__ 49819833afSPeter Tyser #endif 50819833afSPeter Tyser 51819833afSPeter Tyser #endif /* __GNUC__ */ 52819833afSPeter Tyser 53*b98cba09SMichal Simek #ifdef __MICROBLAZEEL__ 54*b98cba09SMichal Simek #include <linux/byteorder/little_endian.h> 55*b98cba09SMichal Simek #else 56819833afSPeter Tyser #include <linux/byteorder/big_endian.h> 57*b98cba09SMichal Simek #endif 58819833afSPeter Tyser 59819833afSPeter Tyser #endif /* __MICROBLAZE_BYTEORDER_H__ */ 60