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#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