1*08dbd0f8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2013bf24cSRichard Kuo /* 3013bf24cSRichard Kuo * I/O access functions for Hexagon 4013bf24cSRichard Kuo * 5e1858b2aSRichard Kuo * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 6013bf24cSRichard Kuo */ 7013bf24cSRichard Kuo 8013bf24cSRichard Kuo #include <asm/io.h> 9013bf24cSRichard Kuo 10013bf24cSRichard Kuo /* These are all FIFO routines! */ 11013bf24cSRichard Kuo 12013bf24cSRichard Kuo /* 13013bf24cSRichard Kuo * __raw_readsw - read words a short at a time 14013bf24cSRichard Kuo * @addr: source address 15013bf24cSRichard Kuo * @data: data address 16013bf24cSRichard Kuo * @len: number of shorts to read 17013bf24cSRichard Kuo */ 18013bf24cSRichard Kuo void __raw_readsw(const void __iomem *addr, void *data, int len) 19013bf24cSRichard Kuo { 20013bf24cSRichard Kuo const volatile short int *src = (short int *) addr; 21013bf24cSRichard Kuo short int *dst = (short int *) data; 22013bf24cSRichard Kuo 23013bf24cSRichard Kuo if ((u32)data & 0x1) 24013bf24cSRichard Kuo panic("unaligned pointer to readsw"); 25013bf24cSRichard Kuo 26013bf24cSRichard Kuo while (len-- > 0) 27013bf24cSRichard Kuo *dst++ = *src; 28013bf24cSRichard Kuo 29013bf24cSRichard Kuo } 30013bf24cSRichard Kuo 31013bf24cSRichard Kuo /* 32013bf24cSRichard Kuo * __raw_writesw - read words a short at a time 33013bf24cSRichard Kuo * @addr: source address 34013bf24cSRichard Kuo * @data: data address 35013bf24cSRichard Kuo * @len: number of shorts to read 36013bf24cSRichard Kuo */ 37013bf24cSRichard Kuo void __raw_writesw(void __iomem *addr, const void *data, int len) 38013bf24cSRichard Kuo { 39013bf24cSRichard Kuo const short int *src = (short int *)data; 40013bf24cSRichard Kuo volatile short int *dst = (short int *)addr; 41013bf24cSRichard Kuo 42013bf24cSRichard Kuo if ((u32)data & 0x1) 43013bf24cSRichard Kuo panic("unaligned pointer to writesw"); 44013bf24cSRichard Kuo 45013bf24cSRichard Kuo while (len-- > 0) 46013bf24cSRichard Kuo *dst = *src++; 47013bf24cSRichard Kuo 48013bf24cSRichard Kuo 49013bf24cSRichard Kuo } 50013bf24cSRichard Kuo 51013bf24cSRichard Kuo /* Pretty sure len is pre-adjusted for the length of the access already */ 52013bf24cSRichard Kuo void __raw_readsl(const void __iomem *addr, void *data, int len) 53013bf24cSRichard Kuo { 54013bf24cSRichard Kuo const volatile long *src = (long *) addr; 55013bf24cSRichard Kuo long *dst = (long *) data; 56013bf24cSRichard Kuo 57013bf24cSRichard Kuo if ((u32)data & 0x3) 58013bf24cSRichard Kuo panic("unaligned pointer to readsl"); 59013bf24cSRichard Kuo 60013bf24cSRichard Kuo while (len-- > 0) 61013bf24cSRichard Kuo *dst++ = *src; 62013bf24cSRichard Kuo 63013bf24cSRichard Kuo 64013bf24cSRichard Kuo } 65013bf24cSRichard Kuo 66013bf24cSRichard Kuo void __raw_writesl(void __iomem *addr, const void *data, int len) 67013bf24cSRichard Kuo { 68013bf24cSRichard Kuo const long *src = (long *)data; 69013bf24cSRichard Kuo volatile long *dst = (long *)addr; 70013bf24cSRichard Kuo 71013bf24cSRichard Kuo if ((u32)data & 0x3) 72013bf24cSRichard Kuo panic("unaligned pointer to writesl"); 73013bf24cSRichard Kuo 74013bf24cSRichard Kuo while (len-- > 0) 75013bf24cSRichard Kuo *dst = *src++; 76013bf24cSRichard Kuo 77013bf24cSRichard Kuo 78013bf24cSRichard Kuo } 79