xref: /kernel/linux/linux-6.6/arch/hexagon/lib/io.c (revision 62306a36)
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