Blame view

arch/parisc/lib/bitops.c 1.74 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  // SPDX-License-Identifier: GPL-2.0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
6
7
8
  /*
   * bitops.c: atomic operations which got too long to be inlined all over
   *      the place.
   * 
   * Copyright 1999 Philipp Rumpf (prumpf@tux.org)
   * Copyright 2000 Grant Grundler (grundler@cup.hp.com)
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
  #include <linux/kernel.h>
  #include <linux/spinlock.h>
60063497a   Arun Sharma   atomic: use <linu...
11
  #include <linux/atomic.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
12
13
  
  #ifdef CONFIG_SMP
445c89514   Thomas Gleixner   locking: Convert ...
14
  arch_spinlock_t __atomic_hash[ATOMIC_HASH_SIZE] __lock_aligned = {
edc35bd72   Thomas Gleixner   locking: Rename _...
15
  	[0 ... (ATOMIC_HASH_SIZE-1)]  = __ARCH_SPIN_LOCK_UNLOCKED
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
  };
  #endif
a8f44e388   Helge Deller   [PARISC] use CONF...
18
  #ifdef CONFIG_64BIT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  unsigned long __xchg64(unsigned long x, unsigned long *ptr)
  {
  	unsigned long temp, flags;
  
  	_atomic_spin_lock_irqsave(ptr, flags);
  	temp = *ptr;
  	*ptr = x;
  	_atomic_spin_unlock_irqrestore(ptr, flags);
  	return temp;
  }
  #endif
  
  unsigned long __xchg32(int x, int *ptr)
  {
  	unsigned long flags;
  	long temp;
  
  	_atomic_spin_lock_irqsave(ptr, flags);
  	temp = (long) *ptr;	/* XXX - sign extension wanted? */
  	*ptr = x;
  	_atomic_spin_unlock_irqrestore(ptr, flags);
  	return (unsigned long)temp;
  }
  
  
  unsigned long __xchg8(char x, char *ptr)
  {
  	unsigned long flags;
  	long temp;
  
  	_atomic_spin_lock_irqsave(ptr, flags);
  	temp = (long) *ptr;	/* XXX - sign extension wanted? */
  	*ptr = x;
  	_atomic_spin_unlock_irqrestore(ptr, flags);
  	return (unsigned long)temp;
  }
54b668009   Helge Deller   parisc: Add nativ...
55
  u64 __cmpxchg_u64(volatile u64 *ptr, u64 old, u64 new)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
  {
  	unsigned long flags;
54b668009   Helge Deller   parisc: Add nativ...
58
  	u64 prev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
61
62
63
64
65
  
  	_atomic_spin_lock_irqsave(ptr, flags);
  	if ((prev = *ptr) == old)
  		*ptr = new;
  	_atomic_spin_unlock_irqrestore(ptr, flags);
  	return prev;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
72
73
74
75
76
77
  
  unsigned long __cmpxchg_u32(volatile unsigned int *ptr, unsigned int old, unsigned int new)
  {
  	unsigned long flags;
  	unsigned int prev;
  
  	_atomic_spin_lock_irqsave(ptr, flags);
  	if ((prev = *ptr) == old)
  		*ptr = new;
  	_atomic_spin_unlock_irqrestore(ptr, flags);
  	return (unsigned long)prev;
  }