/* SPDX-License-Identifier: GPL-2.0 */
/*
 * ddbridge-io.h: Digital Devices bridge I/O inline functions
 *
 * Copyright (C) 2010-2017 Digital Devices GmbH
 *                         Ralph Metzler <rjkm@metzlerbros.de>
 *                         Marcus Metzler <mocm@metzlerbros.de>
 */

#ifndef __DDBRIDGE_IO_H__
#define __DDBRIDGE_IO_H__

#include <linux/io.h>

#include "ddbridge.h"

/******************************************************************************/

static inline u32 ddblreadl(struct ddb_link *link, u32 adr)
{
	return readl(link->dev->regs + adr);
}

static inline void ddblwritel(struct ddb_link *link, u32 val, u32 adr)
{
	writel(val, link->dev->regs + adr);
}

static inline u32 ddbreadl(struct ddb *dev, u32 adr)
{
	return readl(dev->regs + adr);
}

static inline void ddbwritel(struct ddb *dev, u32 val, u32 adr)
{
	writel(val, dev->regs + adr);
}

static inline void ddbcpyto(struct ddb *dev, u32 adr, void *src, long count)
{
	memcpy_toio(dev->regs + adr, src, count);
}

static inline void ddbcpyfrom(struct ddb *dev, void *dst, u32 adr, long count)
{
	memcpy_fromio(dst, dev->regs + adr, count);
}

static inline u32 safe_ddbreadl(struct ddb *dev, u32 adr)
{
	u32 val = ddbreadl(dev, adr);

	/* (ddb)readl returns (uint)-1 (all bits set) on failure, catch that */
	if (val == ~0) {
		dev_err(&dev->pdev->dev, "ddbreadl failure, adr=%08x\n", adr);
		return 0;
	}

	return val;
}

#endif /* __DDBRIDGE_IO_H__ */
