Commit c27a0d75b33c030965cc97d3d7f571107a673fb4

Authored by Bryan O'Sullivan
Committed by Linus Torvalds
1 parent f7589f28d7

[PATCH] Introduce __iowrite32_copy

This arch-independent routine copies data to a memory-mapped I/O region,
using 32-bit accesses.  The naming is double-underscored to make it clear
that it does not guarantee write ordering, nor does it perform a memory
barrier afterwards; the kernel doc also explicitly states this.  This style
of access is required by some devices.

This change also introduces include/linux/io.h, at Andrew's suggestion.  It
only has one occupant at the moment, but is a logical destination for
oft-replicated contents of include/asm-*/{io,iomap}.h to migrate to.

Signed-off-by: Bryan O'Sullivan <bos@pathscale.com>
Cc: Andi Kleen <ak@muc.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 3 changed files with 68 additions and 1 deletions Side-by-side Diff

  1 +/*
  2 + * Copyright 2006 PathScale, Inc. All Rights Reserved.
  3 + *
  4 + * This file is free software; you can redistribute it and/or modify
  5 + * it under the terms of version 2 of the GNU General Public License
  6 + * as published by the Free Software Foundation.
  7 + *
  8 + * This program is distributed in the hope that it will be useful,
  9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11 + * GNU General Public License for more details.
  12 + *
  13 + * You should have received a copy of the GNU General Public License
  14 + * along with this program; if not, write to the Free Software Foundation,
  15 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  16 + */
  17 +
  18 +#ifndef _LINUX_IO_H
  19 +#define _LINUX_IO_H
  20 +
  21 +#include <asm/io.h>
  22 +
  23 +void __iowrite32_copy(void __iomem *to, const void *from, size_t count);
  24 +
  25 +#endif /* _LINUX_IO_H */
... ... @@ -9,7 +9,7 @@
9 9  
10 10 lib-y += kobject.o kref.o kobject_uevent.o klist.o
11 11  
12   -obj-y += sort.o parser.o halfmd4.o
  12 +obj-y += sort.o parser.o halfmd4.o iomap_copy.o
13 13  
14 14 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
15 15 CFLAGS_kobject.o += -DDEBUG
  1 +/*
  2 + * Copyright 2006 PathScale, Inc. All Rights Reserved.
  3 + *
  4 + * This file is free software; you can redistribute it and/or modify
  5 + * it under the terms of version 2 of the GNU General Public License
  6 + * as published by the Free Software Foundation.
  7 + *
  8 + * This program is distributed in the hope that it will be useful,
  9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11 + * GNU General Public License for more details.
  12 + *
  13 + * You should have received a copy of the GNU General Public License
  14 + * along with this program; if not, write to the Free Software Foundation,
  15 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
  16 + */
  17 +
  18 +#include <linux/io.h>
  19 +#include <linux/module.h>
  20 +
  21 +/**
  22 + * __iowrite32_copy - copy data to MMIO space, in 32-bit units
  23 + * @to: destination, in MMIO space (must be 32-bit aligned)
  24 + * @from: source (must be 32-bit aligned)
  25 + * @count: number of 32-bit quantities to copy
  26 + *
  27 + * Copy data from kernel space to MMIO space, in units of 32 bits at a
  28 + * time. Order of access is not guaranteed, nor is a memory barrier
  29 + * performed afterwards.
  30 + */
  31 +void __attribute__((weak)) __iowrite32_copy(void __iomem *to,
  32 + const void *from,
  33 + size_t count)
  34 +{
  35 + u32 __iomem *dst = to;
  36 + const u32 *src = from;
  37 + const u32 *end = src + count;
  38 +
  39 + while (src < end)
  40 + __raw_writel(*src++, dst++);
  41 +}
  42 +EXPORT_SYMBOL_GPL(__iowrite32_copy);