Commit db08bf08 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic

* git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic:
  asm-generic/io.h: allow people to override individual funcs
  bitops: remove duplicated extern declarations
  bitops: make asm-generic/bitops/find.h more generic
  asm-generic: kdebug.h: Checkpatch cleanup
  asm-generic: fcntl: make exported headers use strict posix types
  asm-generic: cmpxchg does not handle non-long arguments
  asm-generic: make atomic_add_unless a function
parents 092e0e7e 35dbc0e0
...@@ -120,6 +120,7 @@ static inline unsigned long __arch_hweight64(__u64 w) ...@@ -120,6 +120,7 @@ static inline unsigned long __arch_hweight64(__u64 w)
#include <asm-generic/bitops/const_hweight.h> #include <asm-generic/bitops/const_hweight.h>
#include <asm-generic/bitops/lock.h> #include <asm-generic/bitops/lock.h>
#include <asm-generic/bitops/find.h>
#include <asm-generic/bitops/sched.h> #include <asm-generic/bitops/sched.h>
#include <asm-generic/bitops/ext2-non-atomic.h> #include <asm-generic/bitops/ext2-non-atomic.h>
#include <asm-generic/bitops/minix.h> #include <asm-generic/bitops/minix.h>
......
...@@ -440,6 +440,8 @@ static inline int fls(int x) ...@@ -440,6 +440,8 @@ static inline int fls(int x)
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm-generic/bitops/find.h>
#include <asm-generic/bitops/sched.h> #include <asm-generic/bitops/sched.h>
#define ARCH_HAS_FAST_MULTIPLIER 1 #define ARCH_HAS_FAST_MULTIPLIER 1
......
...@@ -120,14 +120,23 @@ static inline void atomic_dec(atomic_t *v) ...@@ -120,14 +120,23 @@ static inline void atomic_dec(atomic_t *v)
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0) #define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
#define atomic_add_unless(v, a, u) \ #define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v)))
({ \ #define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
int c, old; \
c = atomic_read(v); \ #define cmpxchg_local(ptr, o, n) \
while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ ((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\
c = old; \ (unsigned long)(n), sizeof(*(ptr))))
c != (u); \
}) #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
static inline int atomic_add_unless(atomic_t *v, int a, int u)
{
int c, old;
c = atomic_read(v);
while (c != u && (old = atomic_cmpxchg(v, c, c + a)) != c)
c = old;
return c != u;
}
#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
...@@ -141,15 +150,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr) ...@@ -141,15 +150,6 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
} }
#define atomic_xchg(ptr, v) (xchg(&(ptr)->counter, (v)))
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
#define cmpxchg_local(ptr, o, n) \
((__typeof__(*(ptr)))__cmpxchg_local_generic((ptr), (unsigned long)(o),\
(unsigned long)(n), sizeof(*(ptr))))
#define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))
/* Assume that atomic operations are already serializing */ /* Assume that atomic operations are already serializing */
#define smp_mb__before_atomic_dec() barrier() #define smp_mb__before_atomic_dec() barrier()
#define smp_mb__after_atomic_dec() barrier() #define smp_mb__after_atomic_dec() barrier()
......
#ifndef _ASM_GENERIC_BITOPS_FIND_H_ #ifndef _ASM_GENERIC_BITOPS_FIND_H_
#define _ASM_GENERIC_BITOPS_FIND_H_ #define _ASM_GENERIC_BITOPS_FIND_H_
#ifndef CONFIG_GENERIC_FIND_NEXT_BIT /**
* find_next_bit - find the next set bit in a memory region
* @addr: The address to base the search on
* @offset: The bitnumber to start searching at
* @size: The bitmap size in bits
*/
extern unsigned long find_next_bit(const unsigned long *addr, unsigned long extern unsigned long find_next_bit(const unsigned long *addr, unsigned long
size, unsigned long offset); size, unsigned long offset);
/**
* find_next_zero_bit - find the next cleared bit in a memory region
* @addr: The address to base the search on
* @offset: The bitnumber to start searching at
* @size: The bitmap size in bits
*/
extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned extern unsigned long find_next_zero_bit(const unsigned long *addr, unsigned
long size, unsigned long offset); long size, unsigned long offset);
#endif
#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
/**
* find_first_bit - find the first set bit in a memory region
* @addr: The address to start the search at
* @size: The maximum size to search
*
* Returns the bit number of the first set bit.
*/
extern unsigned long find_first_bit(const unsigned long *addr,
unsigned long size);
/**
* find_first_zero_bit - find the first cleared bit in a memory region
* @addr: The address to start the search at
* @size: The maximum size to search
*
* Returns the bit number of the first cleared bit.
*/
extern unsigned long find_first_zero_bit(const unsigned long *addr,
unsigned long size);
#else /* CONFIG_GENERIC_FIND_FIRST_BIT */
#define find_first_bit(addr, size) find_next_bit((addr), (size), 0) #define find_first_bit(addr, size) find_next_bit((addr), (size), 0)
#define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0) #define find_first_zero_bit(addr, size) find_next_zero_bit((addr), (size), 0)
#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
#endif /*_ASM_GENERIC_BITOPS_FIND_H_ */ #endif /*_ASM_GENERIC_BITOPS_FIND_H_ */
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
struct f_owner_ex { struct f_owner_ex {
int type; int type;
pid_t pid; __kernel_pid_t pid;
}; };
/* for F_[GET|SET]FL */ /* for F_[GET|SET]FL */
......
...@@ -19,7 +19,9 @@ ...@@ -19,7 +19,9 @@
#include <asm-generic/iomap.h> #include <asm-generic/iomap.h>
#endif #endif
#ifndef mmiowb
#define mmiowb() do {} while (0) #define mmiowb() do {} while (0)
#endif
/*****************************************************************************/ /*****************************************************************************/
/* /*
...@@ -28,39 +30,51 @@ ...@@ -28,39 +30,51 @@
* differently. On the simple architectures, we just read/write the * differently. On the simple architectures, we just read/write the
* memory location directly. * memory location directly.
*/ */
#ifndef __raw_readb
static inline u8 __raw_readb(const volatile void __iomem *addr) static inline u8 __raw_readb(const volatile void __iomem *addr)
{ {
return *(const volatile u8 __force *) addr; return *(const volatile u8 __force *) addr;
} }
#endif
#ifndef __raw_readw
static inline u16 __raw_readw(const volatile void __iomem *addr) static inline u16 __raw_readw(const volatile void __iomem *addr)
{ {
return *(const volatile u16 __force *) addr; return *(const volatile u16 __force *) addr;
} }
#endif
#ifndef __raw_readl
static inline u32 __raw_readl(const volatile void __iomem *addr) static inline u32 __raw_readl(const volatile void __iomem *addr)
{ {
return *(const volatile u32 __force *) addr; return *(const volatile u32 __force *) addr;
} }
#endif
#define readb __raw_readb #define readb __raw_readb
#define readw(addr) __le16_to_cpu(__raw_readw(addr)) #define readw(addr) __le16_to_cpu(__raw_readw(addr))
#define readl(addr) __le32_to_cpu(__raw_readl(addr)) #define readl(addr) __le32_to_cpu(__raw_readl(addr))
#ifndef __raw_writeb
static inline void __raw_writeb(u8 b, volatile void __iomem *addr) static inline void __raw_writeb(u8 b, volatile void __iomem *addr)
{ {
*(volatile u8 __force *) addr = b; *(volatile u8 __force *) addr = b;
} }
#endif
#ifndef __raw_writew
static inline void __raw_writew(u16 b, volatile void __iomem *addr) static inline void __raw_writew(u16 b, volatile void __iomem *addr)
{ {
*(volatile u16 __force *) addr = b; *(volatile u16 __force *) addr = b;
} }
#endif
#ifndef __raw_writel
static inline void __raw_writel(u32 b, volatile void __iomem *addr) static inline void __raw_writel(u32 b, volatile void __iomem *addr)
{ {
*(volatile u32 __force *) addr = b; *(volatile u32 __force *) addr = b;
} }
#endif
#define writeb __raw_writeb #define writeb __raw_writeb
#define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr) #define writew(b,addr) __raw_writew(__cpu_to_le16(b),addr)
...@@ -122,6 +136,7 @@ static inline void outl(u32 b, unsigned long addr) ...@@ -122,6 +136,7 @@ static inline void outl(u32 b, unsigned long addr)
#define outw_p(x, addr) outw((x), (addr)) #define outw_p(x, addr) outw((x), (addr))
#define outl_p(x, addr) outl((x), (addr)) #define outl_p(x, addr) outl((x), (addr))
#ifndef insb
static inline void insb(unsigned long addr, void *buffer, int count) static inline void insb(unsigned long addr, void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -132,7 +147,9 @@ static inline void insb(unsigned long addr, void *buffer, int count) ...@@ -132,7 +147,9 @@ static inline void insb(unsigned long addr, void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef insw
static inline void insw(unsigned long addr, void *buffer, int count) static inline void insw(unsigned long addr, void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -143,7 +160,9 @@ static inline void insw(unsigned long addr, void *buffer, int count) ...@@ -143,7 +160,9 @@ static inline void insw(unsigned long addr, void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef insl
static inline void insl(unsigned long addr, void *buffer, int count) static inline void insl(unsigned long addr, void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -154,7 +173,9 @@ static inline void insl(unsigned long addr, void *buffer, int count) ...@@ -154,7 +173,9 @@ static inline void insl(unsigned long addr, void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef outsb
static inline void outsb(unsigned long addr, const void *buffer, int count) static inline void outsb(unsigned long addr, const void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -164,7 +185,9 @@ static inline void outsb(unsigned long addr, const void *buffer, int count) ...@@ -164,7 +185,9 @@ static inline void outsb(unsigned long addr, const void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef outsw
static inline void outsw(unsigned long addr, const void *buffer, int count) static inline void outsw(unsigned long addr, const void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -174,7 +197,9 @@ static inline void outsw(unsigned long addr, const void *buffer, int count) ...@@ -174,7 +197,9 @@ static inline void outsw(unsigned long addr, const void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef outsl
static inline void outsl(unsigned long addr, const void *buffer, int count) static inline void outsl(unsigned long addr, const void *buffer, int count)
{ {
if (count) { if (count) {
...@@ -184,6 +209,7 @@ static inline void outsl(unsigned long addr, const void *buffer, int count) ...@@ -184,6 +209,7 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)
} while (--count); } while (--count);
} }
} }
#endif
#ifndef CONFIG_GENERIC_IOMAP #ifndef CONFIG_GENERIC_IOMAP
#define ioread8(addr) readb(addr) #define ioread8(addr) readb(addr)
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
enum die_val { enum die_val {
DIE_UNUSED, DIE_UNUSED,
DIE_OOPS=1 DIE_OOPS = 1,
}; };
#endif /* _ASM_GENERIC_KDEBUG_H */ #endif /* _ASM_GENERIC_KDEBUG_H */
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/irqflags.h> #include <linux/irqflags.h>
#include <asm/cmpxchg-local.h> #include <asm/cmpxchg-local.h>
#include <asm/cmpxchg.h>
struct task_struct; struct task_struct;
...@@ -136,25 +137,6 @@ unsigned long __xchg(unsigned long x, volatile void *ptr, int size) ...@@ -136,25 +137,6 @@ unsigned long __xchg(unsigned long x, volatile void *ptr, int size)
#define xchg(ptr, x) \ #define xchg(ptr, x) \
((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) ((__typeof__(*(ptr))) __xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
static inline unsigned long __cmpxchg(volatile unsigned long *m,
unsigned long old, unsigned long new)
{
unsigned long retval;
unsigned long flags;
local_irq_save(flags);
retval = *m;
if (retval == old)
*m = new;
local_irq_restore(flags);
return retval;
}
#define cmpxchg(ptr, o, n) \
((__typeof__(*(ptr))) __cmpxchg((unsigned long *)(ptr), \
(unsigned long)(o), \
(unsigned long)(n)))
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
...@@ -136,28 +136,6 @@ static inline unsigned long __ffs64(u64 word) ...@@ -136,28 +136,6 @@ static inline unsigned long __ffs64(u64 word)
} }
#ifdef __KERNEL__ #ifdef __KERNEL__
#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
/**
* find_first_bit - find the first set bit in a memory region
* @addr: The address to start the search at
* @size: The maximum size to search
*
* Returns the bit number of the first set bit.
*/
extern unsigned long find_first_bit(const unsigned long *addr,
unsigned long size);
/**
* find_first_zero_bit - find the first cleared bit in a memory region
* @addr: The address to start the search at
* @size: The maximum size to search
*
* Returns the bit number of the first cleared bit.
*/
extern unsigned long find_first_zero_bit(const unsigned long *addr,
unsigned long size);
#endif /* CONFIG_GENERIC_FIND_FIRST_BIT */
#ifdef CONFIG_GENERIC_FIND_LAST_BIT #ifdef CONFIG_GENERIC_FIND_LAST_BIT
/** /**
...@@ -171,28 +149,5 @@ extern unsigned long find_last_bit(const unsigned long *addr, ...@@ -171,28 +149,5 @@ extern unsigned long find_last_bit(const unsigned long *addr,
unsigned long size); unsigned long size);
#endif /* CONFIG_GENERIC_FIND_LAST_BIT */ #endif /* CONFIG_GENERIC_FIND_LAST_BIT */
#ifdef CONFIG_GENERIC_FIND_NEXT_BIT
/**
* find_next_bit - find the next set bit in a memory region
* @addr: The address to base the search on
* @offset: The bitnumber to start searching at
* @size: The bitmap size in bits
*/
extern unsigned long find_next_bit(const unsigned long *addr,
unsigned long size, unsigned long offset);
/**
* find_next_zero_bit - find the next cleared bit in a memory region
* @addr: The address to base the search on
* @offset: The bitnumber to start searching at
* @size: The bitmap size in bits
*/
extern unsigned long find_next_zero_bit(const unsigned long *addr,
unsigned long size,
unsigned long offset);
#endif /* CONFIG_GENERIC_FIND_NEXT_BIT */
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment