1 /* MN10300 Non-trivial bit operations
2  *
3  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  */
11 #include <linux/module.h>
12 #include <asm/bitops.h>
13 #include <asm/system.h>
14 
15 /*
16  * try flipping a bit using BSET and BCLR
17  */
change_bit(unsigned long nr,volatile void * addr)18 void change_bit(unsigned long nr, volatile void *addr)
19 {
20 	if (test_bit(nr, addr))
21 		goto try_clear_bit;
22 
23 try_set_bit:
24 	if (!test_and_set_bit(nr, addr))
25 		return;
26 
27 try_clear_bit:
28 	if (test_and_clear_bit(nr, addr))
29 		return;
30 
31 	goto try_set_bit;
32 }
33 
34 /*
35  * try flipping a bit using BSET and BCLR and returning the old value
36  */
test_and_change_bit(unsigned long nr,volatile void * addr)37 int test_and_change_bit(unsigned long nr, volatile void *addr)
38 {
39 	if (test_bit(nr, addr))
40 		goto try_clear_bit;
41 
42 try_set_bit:
43 	if (!test_and_set_bit(nr, addr))
44 		return 0;
45 
46 try_clear_bit:
47 	if (test_and_clear_bit(nr, addr))
48 		return 1;
49 
50 	goto try_set_bit;
51 }
52