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 */ 18void change_bit(unsigned long nr, volatile void *addr) 19{ 20 if (test_bit(nr, addr)) 21 goto try_clear_bit; 22 23try_set_bit: 24 if (!test_and_set_bit(nr, addr)) 25 return; 26 27try_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 */ 37int test_and_change_bit(unsigned long nr, volatile void *addr) 38{ 39 if (test_bit(nr, addr)) 40 goto try_clear_bit; 41 42try_set_bit: 43 if (!test_and_set_bit(nr, addr)) 44 return 0; 45 46try_clear_bit: 47 if (test_and_clear_bit(nr, addr)) 48 return 1; 49 50 goto try_set_bit; 51} 52