2005-04-17 02:20:36 +04:00
# ifndef __ASM_SH_BITOPS_H
# define __ASM_SH_BITOPS_H
# ifdef __KERNEL__
# include <asm/system.h>
/* For __swab32 */
# include <asm/byteorder.h>
2006-09-27 07:31:01 +04:00
static inline void set_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
* a | = mask ;
local_irq_restore ( flags ) ;
}
/*
* clear_bit ( ) doesn ' t provide any barrier for the compiler .
*/
# define smp_mb__before_clear_bit() barrier()
# define smp_mb__after_clear_bit() barrier()
2006-09-27 07:31:01 +04:00
static inline void clear_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
* a & = ~ mask ;
local_irq_restore ( flags ) ;
}
2006-09-27 07:31:01 +04:00
static inline void change_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
* a ^ = mask ;
local_irq_restore ( flags ) ;
}
2006-09-27 07:31:01 +04:00
static inline int test_and_set_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask , retval ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
retval = ( mask & * a ) ! = 0 ;
* a | = mask ;
local_irq_restore ( flags ) ;
return retval ;
}
2006-09-27 07:31:01 +04:00
static inline int test_and_clear_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask , retval ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
retval = ( mask & * a ) ! = 0 ;
* a & = ~ mask ;
local_irq_restore ( flags ) ;
return retval ;
}
2006-09-27 07:31:01 +04:00
static inline int test_and_change_bit ( int nr , volatile void * addr )
2005-04-17 02:20:36 +04:00
{
int mask , retval ;
volatile unsigned int * a = addr ;
unsigned long flags ;
a + = nr > > 5 ;
mask = 1 < < ( nr & 0x1f ) ;
local_irq_save ( flags ) ;
retval = ( mask & * a ) ! = 0 ;
* a ^ = mask ;
local_irq_restore ( flags ) ;
return retval ;
}
[PATCH] bitops: sh: use generic bitops
- remove __{,test_and_}{set,clear,change}_bit() and test_bit()
- remove find_{next,first}{,_zero}_bit()
- remove generic_ffs()
- remove generic_hweight{32,16,8}()
- remove sched_find_first_bit()
- remove ext2_{set,clear,test,find_first_zero,find_next_zero}_bit()
- remove ext2_{set,clear}_bit_atomic()
- remove minix_{test,set,test_and_clear,test,find_first_zero}_bit()
- remove generic_fls()
- remove generic_fls64()
Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-03-26 13:39:35 +04:00
# include <asm-generic/bitops/non-atomic.h>
2005-04-17 02:20:36 +04:00
2006-09-27 07:31:01 +04:00
static inline unsigned long ffz ( unsigned long word )
2005-04-17 02:20:36 +04:00
{
unsigned long result ;
__asm__ ( " 1: \n \t "
" shlr %1 \n \t "
" bt/s 1b \n \t "
" add #1, %0 "
: " =r " ( result ) , " =r " ( word )
: " 0 " ( ~ 0L ) , " 1 " ( word )
: " t " ) ;
return result ;
}
/**
* __ffs - find first bit in word .
* @ word : The word to search
*
* Undefined if no bit exists , so code should check against 0 first .
*/
2006-09-27 07:31:01 +04:00
static inline unsigned long __ffs ( unsigned long word )
2005-04-17 02:20:36 +04:00
{
unsigned long result ;
__asm__ ( " 1: \n \t "
" shlr %1 \n \t "
" bf/s 1b \n \t "
" add #1, %0 "
: " =r " ( result ) , " =r " ( word )
: " 0 " ( ~ 0L ) , " 1 " ( word )
: " t " ) ;
return result ;
}
[PATCH] bitops: sh: use generic bitops
- remove __{,test_and_}{set,clear,change}_bit() and test_bit()
- remove find_{next,first}{,_zero}_bit()
- remove generic_ffs()
- remove generic_hweight{32,16,8}()
- remove sched_find_first_bit()
- remove ext2_{set,clear,test,find_first_zero,find_next_zero}_bit()
- remove ext2_{set,clear}_bit_atomic()
- remove minix_{test,set,test_and_clear,test,find_first_zero}_bit()
- remove generic_fls()
- remove generic_fls64()
Signed-off-by: Akinobu Mita <mita@miraclelinux.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-03-26 13:39:35 +04:00
# include <asm-generic/bitops/find.h>
# include <asm-generic/bitops/ffs.h>
# include <asm-generic/bitops/hweight.h>
# include <asm-generic/bitops/sched.h>
# include <asm-generic/bitops/ext2-non-atomic.h>
# include <asm-generic/bitops/ext2-atomic.h>
# include <asm-generic/bitops/minix.h>
# include <asm-generic/bitops/fls.h>
# include <asm-generic/bitops/fls64.h>
2005-04-17 02:20:36 +04:00
# endif /* __KERNEL__ */
# endif /* __ASM_SH_BITOPS_H */