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 14/* 15 * try flipping a bit using BSET and BCLR 16 */ 17void change_bit(unsigned long nr, volatile void *addr) 18{ 19 if (test_bit(nr, addr)) 20 goto try_clear_bit; 21 22try_set_bit: 23 if (!test_and_set_bit(nr, addr)) 24 return; 25 26try_clear_bit: 27 if (test_and_clear_bit(nr, addr)) 28 return; 29 30 goto try_set_bit; 31} 32 33/* 34 * try flipping a bit using BSET and BCLR and returning the old value 35 */ 36int test_and_change_bit(unsigned long nr, volatile void *addr) 37{ 38 if (test_bit(nr, addr)) 39 goto try_clear_bit; 40 41try_set_bit: 42 if (!test_and_set_bit(nr, addr)) 43 return 0; 44 45try_clear_bit: 46 if (test_and_clear_bit(nr, addr)) 47 return 1; 48 49 goto try_set_bit; 50} 51