18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * I/O access functions for Hexagon 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <asm/io.h> 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* These are all FIFO routines! */ 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci/* 138c2ecf20Sopenharmony_ci * __raw_readsw - read words a short at a time 148c2ecf20Sopenharmony_ci * @addr: source address 158c2ecf20Sopenharmony_ci * @data: data address 168c2ecf20Sopenharmony_ci * @len: number of shorts to read 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_civoid __raw_readsw(const void __iomem *addr, void *data, int len) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci const volatile short int *src = (short int *) addr; 218c2ecf20Sopenharmony_ci short int *dst = (short int *) data; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci if ((u32)data & 0x1) 248c2ecf20Sopenharmony_ci panic("unaligned pointer to readsw"); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci while (len-- > 0) 278c2ecf20Sopenharmony_ci *dst++ = *src; 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__raw_readsw); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci/* 338c2ecf20Sopenharmony_ci * __raw_writesw - read words a short at a time 348c2ecf20Sopenharmony_ci * @addr: source address 358c2ecf20Sopenharmony_ci * @data: data address 368c2ecf20Sopenharmony_ci * @len: number of shorts to read 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_civoid __raw_writesw(void __iomem *addr, const void *data, int len) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci const short int *src = (short int *)data; 418c2ecf20Sopenharmony_ci volatile short int *dst = (short int *)addr; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci if ((u32)data & 0x1) 448c2ecf20Sopenharmony_ci panic("unaligned pointer to writesw"); 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci while (len-- > 0) 478c2ecf20Sopenharmony_ci *dst = *src++; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci} 518c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__raw_writesw); 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* Pretty sure len is pre-adjusted for the length of the access already */ 548c2ecf20Sopenharmony_civoid __raw_readsl(const void __iomem *addr, void *data, int len) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci const volatile long *src = (long *) addr; 578c2ecf20Sopenharmony_ci long *dst = (long *) data; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci if ((u32)data & 0x3) 608c2ecf20Sopenharmony_ci panic("unaligned pointer to readsl"); 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci while (len-- > 0) 638c2ecf20Sopenharmony_ci *dst++ = *src; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci} 678c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__raw_readsl); 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_civoid __raw_writesl(void __iomem *addr, const void *data, int len) 708c2ecf20Sopenharmony_ci{ 718c2ecf20Sopenharmony_ci const long *src = (long *)data; 728c2ecf20Sopenharmony_ci volatile long *dst = (long *)addr; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci if ((u32)data & 0x3) 758c2ecf20Sopenharmony_ci panic("unaligned pointer to writesl"); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci while (len-- > 0) 788c2ecf20Sopenharmony_ci *dst = *src++; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__raw_writesl); 83