• William Breathitt Gray's avatar
    bitops: introduce the for_each_set_clump8 macro · f6df8d7c
    William Breathitt Gray authored
    Pach series "Introduce the for_each_set_clump8 macro", v18.
    
    While adding GPIO get_multiple/set_multiple callback support for various
    drivers, I noticed a pattern of looping manifesting that would be useful
    standardized as a macro.
    
    This patchset introduces the for_each_set_clump8 macro and utilizes it in
    several GPIO drivers.  The for_each_set_clump macro8 facilitates a
    for-loop syntax that iterates over a memory region entire groups of set
    bits at a time.
    
    For example, suppose you would like to iterate over a 32-bit integer 8
    bits at a time, skipping over 8-bit groups with no set bit, where XXXXXXXX
    represents the current 8-bit group:
    
        Example:        10111110 00000000 11111111 00110011
        First loop:     10111110 00000000 11111111 XXXXXXXX
        Second loop:    10111110 00000000 XXXXXXXX 00110011
        Third loop:     XXXXXXXX 00000000 11111111 00110011
    
    Each iteration of the loop returns the next 8-bit group that has at
    least one set bit.
    
    The for_each_set_clump8 macro has four parameters:
    
        * start: set to the bit offset of the current clump
        * clump: set to the current clump value
        * bits: bitmap to search within
        * size: bitmap size in number of bits
    
    In this version of the patchset, the for_each_set_clump macro has been
    reimplemented and simplified based on the suggestions provided by Rasmus
    Villemoes and Andy Shevchenko in the version 4 submission.
    
    In particular, the function of the for_each_set_clump macro has been
    restricted to handle only 8-bit clumps; the drivers that use the
    for_each_set_clump macro only handle 8-bit ports so a generic
    for_each_set_clump implementation is not necessary.  Thus, a solution for
    large clumps (i.e.  those larger than the width of a bitmap word) can be
    postponed until a driver appears that actually requires such a generic
    for_each_set_clump implementation.
    
    For what it's worth, a semi-generic for_each_set_clump (i.e.  for clumps
    smaller than the width of a bitmap word) can be implemented by simply
    replacing the hardcoded '8' and '0xFF' instances with respective
    variables.  I have not yet had a need for such an implementation, and
    since it falls short of a true generic for_each_set_clump function, I have
    decided to forgo such an implementation for now.
    
    In addition, the bitmap_get_value8 and bitmap_set_value8 functions are
    introduced to get and set 8-bit values respectively.  Their use is based
    on the behavior suggested in the patchset version 4 review.
    
    This patch (of 14):
    
    This macro iterates for each 8-bit group of bits (clump) with set bits,
    within a bitmap memory region.  For each iteration, "start" is set to the
    bit offset of the found clump, while the respective clump value is stored
    to the location pointed by "clump".  Additionally, the bitmap_get_value8
    and bitmap_set_value8 functions are introduced to respectively get and set
    an 8-bit value in a bitmap memory region.
    
    Link: http://lkml.kernel.org/r/893c3b4f03266c9496137cc98ac2b1bd27f92c73.1570641097.git.vilhelm.gray@gmail.comSigned-off-by: default avatarWilliam Breathitt Gray <vilhelm.gray@gmail.com>
    Suggested-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Suggested-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
    Suggested-by: default avatarLukas Wunner <lukas@wunner.de>
    Tested-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Bartosz Golaszewski <bgolaszewski@baylibre.com>
    Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Phil Reid <preid@electromag.com.au>
    Cc: Geert Uytterhoeven <geert+renesas@glider.be>
    Cc: Mathias Duckeck <m.duckeck@kunbus.de>
    Cc: Morten Hein Tiljeset <morten.tiljeset@prevas.dk>
    Cc: Sean Nyekjaer <sean.nyekjaer@prevas.dk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
    f6df8d7c
Name
Last commit
Last update
..
bitops Loading commit data...
vdso Loading commit data...
4level-fixup.h Loading commit data...
5level-fixup.h Loading commit data...
Kbuild Loading commit data...
asm-offsets.h Loading commit data...
asm-prototypes.h Loading commit data...
atomic-instrumented.h Loading commit data...
atomic-long.h Loading commit data...
atomic.h Loading commit data...
atomic64.h Loading commit data...
audit_change_attr.h Loading commit data...
audit_dir_write.h Loading commit data...
audit_read.h Loading commit data...
audit_signal.h Loading commit data...
audit_write.h Loading commit data...
barrier.h Loading commit data...
bitops-instrumented.h Loading commit data...
bitops.h Loading commit data...
bitsperlong.h Loading commit data...
bug.h Loading commit data...
bugs.h Loading commit data...
cache.h Loading commit data...
cacheflush.h Loading commit data...
checksum.h Loading commit data...
cmpxchg-local.h Loading commit data...
cmpxchg.h Loading commit data...
compat.h Loading commit data...
current.h Loading commit data...
delay.h Loading commit data...
device.h Loading commit data...
div64.h Loading commit data...
dma-contiguous.h Loading commit data...
dma-mapping.h Loading commit data...
dma.h Loading commit data...
early_ioremap.h Loading commit data...
emergency-restart.h Loading commit data...
error-injection.h Loading commit data...
exec.h Loading commit data...
export.h Loading commit data...
extable.h Loading commit data...
fb.h Loading commit data...
fixmap.h Loading commit data...
flat.h Loading commit data...
ftrace.h Loading commit data...
futex.h Loading commit data...
getorder.h Loading commit data...
gpio.h Loading commit data...
hardirq.h Loading commit data...
hugetlb.h Loading commit data...
hw_irq.h Loading commit data...
ide_iops.h Loading commit data...
int-ll64.h Loading commit data...
io.h Loading commit data...
ioctl.h Loading commit data...
iomap.h Loading commit data...
irq.h Loading commit data...
irq_regs.h Loading commit data...
irq_work.h Loading commit data...
irqflags.h Loading commit data...
kdebug.h Loading commit data...
kmap_types.h Loading commit data...
kprobes.h Loading commit data...
kvm_para.h Loading commit data...
linkage.h Loading commit data...
local.h Loading commit data...
local64.h Loading commit data...
mcs_spinlock.h Loading commit data...
memory_model.h Loading commit data...
mm-arch-hooks.h Loading commit data...
mm_hooks.h Loading commit data...
mmiowb.h Loading commit data...
mmiowb_types.h Loading commit data...
mmu.h Loading commit data...
mmu_context.h Loading commit data...
module.h Loading commit data...
mshyperv.h Loading commit data...
msi.h Loading commit data...
page.h Loading commit data...
param.h Loading commit data...
parport.h Loading commit data...
pci.h Loading commit data...
pci_iomap.h Loading commit data...
percpu.h Loading commit data...
pgalloc.h Loading commit data...
pgtable-nop4d-hack.h Loading commit data...
pgtable-nop4d.h Loading commit data...
pgtable-nopmd.h Loading commit data...
pgtable-nopud.h Loading commit data...
pgtable.h Loading commit data...
preempt.h Loading commit data...
qrwlock.h Loading commit data...
qrwlock_types.h Loading commit data...
qspinlock.h Loading commit data...
qspinlock_types.h Loading commit data...
resource.h Loading commit data...
seccomp.h Loading commit data...
sections.h Loading commit data...
serial.h Loading commit data...
set_memory.h Loading commit data...
shmparam.h Loading commit data...
signal.h Loading commit data...
simd.h Loading commit data...
spinlock.h Loading commit data...
statfs.h Loading commit data...
string.h Loading commit data...
switch_to.h Loading commit data...
syscall.h Loading commit data...
syscalls.h Loading commit data...
termios-base.h Loading commit data...
termios.h Loading commit data...
timex.h Loading commit data...
tlb.h Loading commit data...
tlbflush.h Loading commit data...
topology.h Loading commit data...
trace_clock.h Loading commit data...
uaccess.h Loading commit data...
unaligned.h Loading commit data...
user.h Loading commit data...
vga.h Loading commit data...
vmlinux.lds.h Loading commit data...
vtime.h Loading commit data...
word-at-a-time.h Loading commit data...
xor.h Loading commit data...