18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/module.h> 38c2ecf20Sopenharmony_ci#include <linux/types.h> 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <asm/io.h> 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci/* 88c2ecf20Sopenharmony_ci * Copy data from IO memory space to "real" memory space. 98c2ecf20Sopenharmony_ci * This needs to be optimized. 108c2ecf20Sopenharmony_ci */ 118c2ecf20Sopenharmony_civoid memcpy_fromio(void *to, const volatile void __iomem *from, long count) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci char *dst = to; 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci while (count) { 168c2ecf20Sopenharmony_ci count--; 178c2ecf20Sopenharmony_ci *dst++ = readb(from++); 188c2ecf20Sopenharmony_ci } 198c2ecf20Sopenharmony_ci} 208c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memcpy_fromio); 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* 238c2ecf20Sopenharmony_ci * Copy data from "real" memory space to IO memory space. 248c2ecf20Sopenharmony_ci * This needs to be optimized. 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_civoid memcpy_toio(volatile void __iomem *to, const void *from, long count) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci const char *src = from; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci while (count) { 318c2ecf20Sopenharmony_ci count--; 328c2ecf20Sopenharmony_ci writeb(*src++, to++); 338c2ecf20Sopenharmony_ci } 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memcpy_toio); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci/* 388c2ecf20Sopenharmony_ci * "memset" on IO memory space. 398c2ecf20Sopenharmony_ci * This needs to be optimized. 408c2ecf20Sopenharmony_ci */ 418c2ecf20Sopenharmony_civoid memset_io(volatile void __iomem *dst, int c, long count) 428c2ecf20Sopenharmony_ci{ 438c2ecf20Sopenharmony_ci unsigned char ch = (char)(c & 0xff); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci while (count) { 468c2ecf20Sopenharmony_ci count--; 478c2ecf20Sopenharmony_ci writeb(ch, dst); 488c2ecf20Sopenharmony_ci dst++; 498c2ecf20Sopenharmony_ci } 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ciEXPORT_SYMBOL(memset_io); 52