Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mn10300/lib/bitops.c
10817 views
1
/* MN10300 Non-trivial bit operations
2
*
3
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells ([email protected])
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
*/
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
*/
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
53