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