Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * Copyright 2024 Kalray, Inc.  All Rights Reserved.
  4 */
  5
  6#include <linux/align.h>
  7#include <linux/export.h>
  8#include <linux/io.h>
  9#include <linux/types.h>
 10#include <linux/unaligned.h>
 11
 12#ifndef memset_io
 13/**
 14 * memset_io() - Set a range of I/O memory to a constant value
 15 * @addr: The beginning of the I/O-memory range to set
 16 * @val: The value to set the memory to
 17 * @count: The number of bytes to set
 18 *
 19 * Set a range of I/O memory to a given value.
 20 */
 21void memset_io(volatile void __iomem *addr, int val, size_t count)
 22{
 23	long qc = (u8)val;
 24
 25	qc *= ~0UL / 0xff;
 26
 27	while (count && !IS_ALIGNED((long)addr, sizeof(long))) {
 28		__raw_writeb(val, addr);
 29		addr++;
 30		count--;
 31	}
 32
 33	while (count >= sizeof(long)) {
 34#ifdef CONFIG_64BIT
 35		__raw_writeq(qc, addr);
 36#else
 37		__raw_writel(qc, addr);
 38#endif
 39
 40		addr += sizeof(long);
 41		count -= sizeof(long);
 42	}
 43
 44	while (count) {
 45		__raw_writeb(val, addr);
 46		addr++;
 47		count--;
 48	}
 49}
 50EXPORT_SYMBOL(memset_io);
 51#endif
 52
 53#ifndef memcpy_fromio
 54/**
 55 * memcpy_fromio() - Copy a block of data from I/O memory
 56 * @dst: The (RAM) destination for the copy
 57 * @src: The (I/O memory) source for the data
 58 * @count: The number of bytes to copy
 59 *
 60 * Copy a block of data from I/O memory.
 61 */
 62void memcpy_fromio(void *dst, const volatile void __iomem *src, size_t count)
 63{
 64	while (count && !IS_ALIGNED((long)src, sizeof(long))) {
 65		*(u8 *)dst = __raw_readb(src);
 66		src++;
 67		dst++;
 68		count--;
 69	}
 70
 71	while (count >= sizeof(long)) {
 72#ifdef CONFIG_64BIT
 73		long val = __raw_readq(src);
 74#else
 75		long val = __raw_readl(src);
 76#endif
 77		put_unaligned(val, (long *)dst);
 78
 79
 80		src += sizeof(long);
 81		dst += sizeof(long);
 82		count -= sizeof(long);
 83	}
 84
 85	while (count) {
 86		*(u8 *)dst = __raw_readb(src);
 87		src++;
 88		dst++;
 89		count--;
 90	}
 91}
 92EXPORT_SYMBOL(memcpy_fromio);
 93#endif
 94
 95#ifndef memcpy_toio
 96/**
 97 * memcpy_toio() -Copy a block of data into I/O memory
 98 * @dst: The (I/O memory) destination for the copy
 99 * @src: The (RAM) source for the data
100 * @count: The number of bytes to copy
101 *
102 * Copy a block of data to I/O memory.
103 */
104void memcpy_toio(volatile void __iomem *dst, const void *src, size_t count)
105{
106	while (count && !IS_ALIGNED((long)dst, sizeof(long))) {
107		__raw_writeb(*(u8 *)src, dst);
108		src++;
109		dst++;
110		count--;
111	}
112
113	while (count >= sizeof(long)) {
114		long val = get_unaligned((long *)src);
115#ifdef CONFIG_64BIT
116		__raw_writeq(val, dst);
117#else
118		__raw_writel(val, dst);
119#endif
120
121		src += sizeof(long);
122		dst += sizeof(long);
123		count -= sizeof(long);
124	}
125
126	while (count) {
127		__raw_writeb(*(u8 *)src, dst);
128		src++;
129		dst++;
130		count--;
131	}
132}
133EXPORT_SYMBOL(memcpy_toio);
134#endif
135
136