162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * I/O access functions for Hexagon 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <asm/io.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* These are all FIFO routines! */ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* 1362306a36Sopenharmony_ci * __raw_readsw - read words a short at a time 1462306a36Sopenharmony_ci * @addr: source address 1562306a36Sopenharmony_ci * @data: data address 1662306a36Sopenharmony_ci * @len: number of shorts to read 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_civoid __raw_readsw(const void __iomem *addr, void *data, int len) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci const volatile short int *src = (short int *) addr; 2162306a36Sopenharmony_ci short int *dst = (short int *) data; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci if ((u32)data & 0x1) 2462306a36Sopenharmony_ci panic("unaligned pointer to readsw"); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci while (len-- > 0) 2762306a36Sopenharmony_ci *dst++ = *src; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ciEXPORT_SYMBOL(__raw_readsw); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * __raw_writesw - read words a short at a time 3462306a36Sopenharmony_ci * @addr: source address 3562306a36Sopenharmony_ci * @data: data address 3662306a36Sopenharmony_ci * @len: number of shorts to read 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_civoid __raw_writesw(void __iomem *addr, const void *data, int len) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci const short int *src = (short int *)data; 4162306a36Sopenharmony_ci volatile short int *dst = (short int *)addr; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci if ((u32)data & 0x1) 4462306a36Sopenharmony_ci panic("unaligned pointer to writesw"); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci while (len-- > 0) 4762306a36Sopenharmony_ci *dst = *src++; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ciEXPORT_SYMBOL(__raw_writesw); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* Pretty sure len is pre-adjusted for the length of the access already */ 5462306a36Sopenharmony_civoid __raw_readsl(const void __iomem *addr, void *data, int len) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci const volatile long *src = (long *) addr; 5762306a36Sopenharmony_ci long *dst = (long *) data; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci if ((u32)data & 0x3) 6062306a36Sopenharmony_ci panic("unaligned pointer to readsl"); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci while (len-- > 0) 6362306a36Sopenharmony_ci *dst++ = *src; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ciEXPORT_SYMBOL(__raw_readsl); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_civoid __raw_writesl(void __iomem *addr, const void *data, int len) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci const long *src = (long *)data; 7262306a36Sopenharmony_ci volatile long *dst = (long *)addr; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci if ((u32)data & 0x3) 7562306a36Sopenharmony_ci panic("unaligned pointer to writesl"); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci while (len-- > 0) 7862306a36Sopenharmony_ci *dst = *src++; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ciEXPORT_SYMBOL(__raw_writesl); 83