linux/arch/mn10300/lib/bitops.c
<<
>>
Prefs
   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