Loading...
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Little-endian bitops for U-Boot
 *
 * Based on Linux include/asm-generic/bitops/le.h
 */
#ifndef _ASM_GENERIC_BITOPS_LE_H
#define _ASM_GENERIC_BITOPS_LE_H

#include <asm/bitops.h>

/*
 * Little-endian bit operations.
 * These operate on byte boundaries regardless of CPU endianness.
 */

#define find_next_zero_bit_le(addr, size, offset) \
	find_next_zero_bit((void *)(addr), (size), (offset))

#define find_next_bit_le(addr, size, offset) \
	ext4_find_next_bit_le((addr), (size), (offset))

static inline int test_bit_le(int nr, const void *addr)
{
	return test_bit(nr, addr);
}

static inline void __set_bit_le(int nr, void *addr)
{
	set_bit(nr, addr);
}

static inline void __clear_bit_le(int nr, void *addr)
{
	clear_bit(nr, addr);
}

static inline int __test_and_set_bit_le(int nr, void *addr)
{
	int old = test_bit(nr, addr);

	set_bit(nr, addr);
	return old;
}

static inline int __test_and_clear_bit_le(int nr, void *addr)
{
	int old = test_bit(nr, addr);

	clear_bit(nr, addr);
	return old;
}

/*
 * ext4_find_next_bit_le - find next set bit in little-endian bitmap
 * @addr: bitmap address
 * @size: bitmap size in bits
 * @offset: starting bit position
 *
 * Return: bit position of next set bit, or @size if none found
 */
static inline unsigned long ext4_find_next_bit_le(const void *addr,
						  unsigned long size,
						  unsigned long offset)
{
	const unsigned char *p = addr;
	unsigned long bit;

	for (bit = offset; bit < size; bit++) {
		if (p[bit >> 3] & (1 << (bit & 7)))
			return bit;
	}
	return size;
}

#endif /* _ASM_GENERIC_BITOPS_LE_H */