162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Renesas RPC-IF core driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2018~2019 Renesas Solutions Corp.
662306a36Sopenharmony_ci * Copyright (C) 2019 Macronix International Co., Ltd.
762306a36Sopenharmony_ci * Copyright (C) 2019-2020 Cogent Embedded, Inc.
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __RENESAS_RPC_IF_H
1162306a36Sopenharmony_ci#define __RENESAS_RPC_IF_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/pm_runtime.h>
1462306a36Sopenharmony_ci#include <linux/types.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cienum rpcif_data_dir {
1762306a36Sopenharmony_ci	RPCIF_NO_DATA,
1862306a36Sopenharmony_ci	RPCIF_DATA_IN,
1962306a36Sopenharmony_ci	RPCIF_DATA_OUT,
2062306a36Sopenharmony_ci};
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct rpcif_op {
2362306a36Sopenharmony_ci	struct {
2462306a36Sopenharmony_ci		u8 buswidth;
2562306a36Sopenharmony_ci		u8 opcode;
2662306a36Sopenharmony_ci		bool ddr;
2762306a36Sopenharmony_ci	} cmd, ocmd;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	struct {
3062306a36Sopenharmony_ci		u8 nbytes;
3162306a36Sopenharmony_ci		u8 buswidth;
3262306a36Sopenharmony_ci		bool ddr;
3362306a36Sopenharmony_ci		u64 val;
3462306a36Sopenharmony_ci	} addr;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci	struct {
3762306a36Sopenharmony_ci		u8 ncycles;
3862306a36Sopenharmony_ci		u8 buswidth;
3962306a36Sopenharmony_ci	} dummy;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	struct {
4262306a36Sopenharmony_ci		u8 nbytes;
4362306a36Sopenharmony_ci		u8 buswidth;
4462306a36Sopenharmony_ci		bool ddr;
4562306a36Sopenharmony_ci		u32 val;
4662306a36Sopenharmony_ci	} option;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	struct {
4962306a36Sopenharmony_ci		u8 buswidth;
5062306a36Sopenharmony_ci		unsigned int nbytes;
5162306a36Sopenharmony_ci		enum rpcif_data_dir dir;
5262306a36Sopenharmony_ci		bool ddr;
5362306a36Sopenharmony_ci		union {
5462306a36Sopenharmony_ci			void *in;
5562306a36Sopenharmony_ci			const void *out;
5662306a36Sopenharmony_ci		} buf;
5762306a36Sopenharmony_ci	} data;
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cienum rpcif_type {
6162306a36Sopenharmony_ci	RPCIF_RCAR_GEN3,
6262306a36Sopenharmony_ci	RPCIF_RCAR_GEN4,
6362306a36Sopenharmony_ci	RPCIF_RZ_G2L,
6462306a36Sopenharmony_ci};
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistruct rpcif {
6762306a36Sopenharmony_ci	struct device *dev;
6862306a36Sopenharmony_ci	void __iomem *dirmap;
6962306a36Sopenharmony_ci	size_t size;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciint rpcif_sw_init(struct rpcif *rpc, struct device *dev);
7362306a36Sopenharmony_ciint rpcif_hw_init(struct device *dev, bool hyperflash);
7462306a36Sopenharmony_civoid rpcif_prepare(struct device *dev, const struct rpcif_op *op, u64 *offs,
7562306a36Sopenharmony_ci		   size_t *len);
7662306a36Sopenharmony_ciint rpcif_manual_xfer(struct device *dev);
7762306a36Sopenharmony_cissize_t rpcif_dirmap_read(struct device *dev, u64 offs, size_t len, void *buf);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#endif // __RENESAS_RPC_IF_H
80