Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef _LINUX_BITOPS_H
  2 #define _LINUX_BITOPS_H
  3 #include <asm/types.h>
  4 
  5 #ifdef  __KERNEL__
  6 #define BIT(nr)                 (1UL << (nr))
  7 #define BIT_MASK(nr)            (1UL << ((nr) % BITS_PER_LONG))
  8 #define BIT_WORD(nr)            ((nr) / BITS_PER_LONG)
  9 #define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_LONG)
 10 #define BITS_PER_BYTE           8
 11 #endif
 12 
 13 /*
 14  * Include this here because some architectures need generic_ffs/fls in
 15  * scope
 16  */
 17 #include <asm/bitops.h>
 18 
 19 #define for_each_bit(bit, addr, size) \
 20         for ((bit) = find_first_bit((addr), (size)); \
 21              (bit) < (size); \
 22              (bit) = find_next_bit((addr), (size), (bit) + 1))
 23 
 24 
 25 static __inline__ int get_bitmask_order(unsigned int count)
 26 {
 27         int order;
 28         
 29         order = fls(count);
 30         return order;   /* We could be slightly more clever with -1 here... */
 31 }
 32 
 33 static __inline__ int get_count_order(unsigned int count)
 34 {
 35         int order;
 36         
 37         order = fls(count) - 1;
 38         if (count & (count - 1))
 39                 order++;
 40         return order;
 41 }
 42 
 43 static inline unsigned long hweight_long(unsigned long w)
 44 {
 45         return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
 46 }
 47 
 48 /**
 49  * rol32 - rotate a 32-bit value left
 50  * @word: value to rotate
 51  * @shift: bits to roll
 52  */
 53 static inline __u32 rol32(__u32 word, unsigned int shift)
 54 {
 55         return (word << shift) | (word >> (32 - shift));
 56 }
 57 
 58 /**
 59  * ror32 - rotate a 32-bit value right
 60  * @word: value to rotate
 61  * @shift: bits to roll
 62  */
 63 static inline __u32 ror32(__u32 word, unsigned int shift)
 64 {
 65         return (word >> shift) | (word << (32 - shift));
 66 }
 67 
 68 /**
 69  * rol16 - rotate a 16-bit value left
 70  * @word: value to rotate
 71  * @shift: bits to roll
 72  */
 73 static inline __u16 rol16(__u16 word, unsigned int shift)
 74 {
 75         return (word << shift) | (word >> (16 - shift));
 76 }
 77 
 78 /**
 79  * ror16 - rotate a 16-bit value right
 80  * @word: value to rotate
 81  * @shift: bits to roll
 82  */
 83 static inline __u16 ror16(__u16 word, unsigned int shift)
 84 {
 85         return (word >> shift) | (word << (16 - shift));
 86 }
 87 
 88 /**
 89  * rol8 - rotate an 8-bit value left
 90  * @word: value to rotate
 91  * @shift: bits to roll
 92  */
 93 static inline __u8 rol8(__u8 word, unsigned int shift)
 94 {
 95         return (word << shift) | (word >> (8 - shift));
 96 }
 97 
 98 /**
 99  * ror8 - rotate an 8-bit value right
100  * @word: value to rotate
101  * @shift: bits to roll
102  */
103 static inline __u8 ror8(__u8 word, unsigned int shift)
104 {
105         return (word >> shift) | (word << (8 - shift));
106 }
107 
108 static inline unsigned fls_long(unsigned long l)
109 {
110         if (sizeof(l) == 4)
111                 return fls(l);
112         return fls64(l);
113 }
114 
115 #endif
116 
  This page was automatically generated by the LXR engine.