Linux Audio

Check our new training course

Loading...
v3.15
  1#include <asm/unwind.h>
  2
  3#if __LINUX_ARM_ARCH__ >= 6
  4	.macro	bitop, name, instr
  5ENTRY(	\name		)
  6UNWIND(	.fnstart	)
  7	ands	ip, r1, #3
  8	strneb	r1, [ip]		@ assert word-aligned
  9	mov	r2, #1
 10	and	r3, r0, #31		@ Get bit offset
 11	mov	r0, r0, lsr #5
 12	add	r1, r1, r0, lsl #2	@ Get word offset
 13#if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
 14	.arch_extension	mp
 15	ALT_SMP(W(pldw)	[r1])
 16	ALT_UP(W(nop))
 17#endif
 18	mov	r3, r2, lsl r3
 191:	ldrex	r2, [r1]
 20	\instr	r2, r2, r3
 21	strex	r0, r2, [r1]
 22	cmp	r0, #0
 23	bne	1b
 24	bx	lr
 25UNWIND(	.fnend		)
 26ENDPROC(\name		)
 27	.endm
 28
 29	.macro	testop, name, instr, store
 30ENTRY(	\name		)
 31UNWIND(	.fnstart	)
 32	ands	ip, r1, #3
 33	strneb	r1, [ip]		@ assert word-aligned
 34	mov	r2, #1
 35	and	r3, r0, #31		@ Get bit offset
 36	mov	r0, r0, lsr #5
 37	add	r1, r1, r0, lsl #2	@ Get word offset
 38	mov	r3, r2, lsl r3		@ create mask
 39	smp_dmb
 40#if __LINUX_ARM_ARCH__ >= 7 && defined(CONFIG_SMP)
 41	.arch_extension	mp
 42	ALT_SMP(W(pldw)	[r1])
 43	ALT_UP(W(nop))
 44#endif
 451:	ldrex	r2, [r1]
 46	ands	r0, r2, r3		@ save old value of bit
 47	\instr	r2, r2, r3		@ toggle bit
 48	strex	ip, r2, [r1]
 49	cmp	ip, #0
 50	bne	1b
 51	smp_dmb
 52	cmp	r0, #0
 53	movne	r0, #1
 542:	bx	lr
 55UNWIND(	.fnend		)
 56ENDPROC(\name		)
 57	.endm
 58#else
 59	.macro	bitop, name, instr
 60ENTRY(	\name		)
 61UNWIND(	.fnstart	)
 62	ands	ip, r1, #3
 63	strneb	r1, [ip]		@ assert word-aligned
 64	and	r2, r0, #31
 65	mov	r0, r0, lsr #5
 66	mov	r3, #1
 67	mov	r3, r3, lsl r2
 68	save_and_disable_irqs ip
 69	ldr	r2, [r1, r0, lsl #2]
 70	\instr	r2, r2, r3
 71	str	r2, [r1, r0, lsl #2]
 72	restore_irqs ip
 73	mov	pc, lr
 74UNWIND(	.fnend		)
 75ENDPROC(\name		)
 76	.endm
 77
 78/**
 79 * testop - implement a test_and_xxx_bit operation.
 80 * @instr: operational instruction
 81 * @store: store instruction
 82 *
 83 * Note: we can trivially conditionalise the store instruction
 84 * to avoid dirtying the data cache.
 85 */
 86	.macro	testop, name, instr, store
 87ENTRY(	\name		)
 88UNWIND(	.fnstart	)
 89	ands	ip, r1, #3
 90	strneb	r1, [ip]		@ assert word-aligned
 91	and	r3, r0, #31
 92	mov	r0, r0, lsr #5
 93	save_and_disable_irqs ip
 94	ldr	r2, [r1, r0, lsl #2]!
 95	mov	r0, #1
 96	tst	r2, r0, lsl r3
 97	\instr	r2, r2, r0, lsl r3
 98	\store	r2, [r1]
 99	moveq	r0, #0
100	restore_irqs ip
101	mov	pc, lr
102UNWIND(	.fnend		)
103ENDPROC(\name		)
104	.endm
105#endif
v3.5.6
 1#include <asm/unwind.h>
 2
 3#if __LINUX_ARM_ARCH__ >= 6
 4	.macro	bitop, name, instr
 5ENTRY(	\name		)
 6UNWIND(	.fnstart	)
 7	ands	ip, r1, #3
 8	strneb	r1, [ip]		@ assert word-aligned
 9	mov	r2, #1
10	and	r3, r0, #31		@ Get bit offset
11	mov	r0, r0, lsr #5
12	add	r1, r1, r0, lsl #2	@ Get word offset
 
 
 
 
 
13	mov	r3, r2, lsl r3
141:	ldrex	r2, [r1]
15	\instr	r2, r2, r3
16	strex	r0, r2, [r1]
17	cmp	r0, #0
18	bne	1b
19	bx	lr
20UNWIND(	.fnend		)
21ENDPROC(\name		)
22	.endm
23
24	.macro	testop, name, instr, store
25ENTRY(	\name		)
26UNWIND(	.fnstart	)
27	ands	ip, r1, #3
28	strneb	r1, [ip]		@ assert word-aligned
29	mov	r2, #1
30	and	r3, r0, #31		@ Get bit offset
31	mov	r0, r0, lsr #5
32	add	r1, r1, r0, lsl #2	@ Get word offset
33	mov	r3, r2, lsl r3		@ create mask
34	smp_dmb
 
 
 
 
 
351:	ldrex	r2, [r1]
36	ands	r0, r2, r3		@ save old value of bit
37	\instr	r2, r2, r3		@ toggle bit
38	strex	ip, r2, [r1]
39	cmp	ip, #0
40	bne	1b
41	smp_dmb
42	cmp	r0, #0
43	movne	r0, #1
442:	bx	lr
45UNWIND(	.fnend		)
46ENDPROC(\name		)
47	.endm
48#else
49	.macro	bitop, name, instr
50ENTRY(	\name		)
51UNWIND(	.fnstart	)
52	ands	ip, r1, #3
53	strneb	r1, [ip]		@ assert word-aligned
54	and	r2, r0, #31
55	mov	r0, r0, lsr #5
56	mov	r3, #1
57	mov	r3, r3, lsl r2
58	save_and_disable_irqs ip
59	ldr	r2, [r1, r0, lsl #2]
60	\instr	r2, r2, r3
61	str	r2, [r1, r0, lsl #2]
62	restore_irqs ip
63	mov	pc, lr
64UNWIND(	.fnend		)
65ENDPROC(\name		)
66	.endm
67
68/**
69 * testop - implement a test_and_xxx_bit operation.
70 * @instr: operational instruction
71 * @store: store instruction
72 *
73 * Note: we can trivially conditionalise the store instruction
74 * to avoid dirtying the data cache.
75 */
76	.macro	testop, name, instr, store
77ENTRY(	\name		)
78UNWIND(	.fnstart	)
79	ands	ip, r1, #3
80	strneb	r1, [ip]		@ assert word-aligned
81	and	r3, r0, #31
82	mov	r0, r0, lsr #5
83	save_and_disable_irqs ip
84	ldr	r2, [r1, r0, lsl #2]!
85	mov	r0, #1
86	tst	r2, r0, lsl r3
87	\instr	r2, r2, r0, lsl r3
88	\store	r2, [r1]
89	moveq	r0, #0
90	restore_irqs ip
91	mov	pc, lr
92UNWIND(	.fnend		)
93ENDPROC(\name		)
94	.endm
95#endif