18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Renesas RPC-IF core driver 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2018~2019 Renesas Solutions Corp. 68c2ecf20Sopenharmony_ci * Copyright (C) 2019 Macronix International Co., Ltd. 78c2ecf20Sopenharmony_ci * Copyright (C) 2019-2020 Cogent Embedded, Inc. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef __RENESAS_RPC_IF_H 118c2ecf20Sopenharmony_ci#define __RENESAS_RPC_IF_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/types.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cienum rpcif_data_dir { 168c2ecf20Sopenharmony_ci RPCIF_NO_DATA, 178c2ecf20Sopenharmony_ci RPCIF_DATA_IN, 188c2ecf20Sopenharmony_ci RPCIF_DATA_OUT, 198c2ecf20Sopenharmony_ci}; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cistruct rpcif_op { 228c2ecf20Sopenharmony_ci struct { 238c2ecf20Sopenharmony_ci u8 buswidth; 248c2ecf20Sopenharmony_ci u8 opcode; 258c2ecf20Sopenharmony_ci bool ddr; 268c2ecf20Sopenharmony_ci } cmd, ocmd; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci struct { 298c2ecf20Sopenharmony_ci u8 nbytes; 308c2ecf20Sopenharmony_ci u8 buswidth; 318c2ecf20Sopenharmony_ci bool ddr; 328c2ecf20Sopenharmony_ci u64 val; 338c2ecf20Sopenharmony_ci } addr; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci struct { 368c2ecf20Sopenharmony_ci u8 ncycles; 378c2ecf20Sopenharmony_ci u8 buswidth; 388c2ecf20Sopenharmony_ci } dummy; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci struct { 418c2ecf20Sopenharmony_ci u8 nbytes; 428c2ecf20Sopenharmony_ci u8 buswidth; 438c2ecf20Sopenharmony_ci bool ddr; 448c2ecf20Sopenharmony_ci u32 val; 458c2ecf20Sopenharmony_ci } option; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci struct { 488c2ecf20Sopenharmony_ci u8 buswidth; 498c2ecf20Sopenharmony_ci unsigned int nbytes; 508c2ecf20Sopenharmony_ci enum rpcif_data_dir dir; 518c2ecf20Sopenharmony_ci bool ddr; 528c2ecf20Sopenharmony_ci union { 538c2ecf20Sopenharmony_ci void *in; 548c2ecf20Sopenharmony_ci const void *out; 558c2ecf20Sopenharmony_ci } buf; 568c2ecf20Sopenharmony_ci } data; 578c2ecf20Sopenharmony_ci}; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistruct rpcif { 608c2ecf20Sopenharmony_ci struct device *dev; 618c2ecf20Sopenharmony_ci void __iomem *base; 628c2ecf20Sopenharmony_ci void __iomem *dirmap; 638c2ecf20Sopenharmony_ci struct regmap *regmap; 648c2ecf20Sopenharmony_ci struct reset_control *rstc; 658c2ecf20Sopenharmony_ci size_t size; 668c2ecf20Sopenharmony_ci enum rpcif_data_dir dir; 678c2ecf20Sopenharmony_ci u8 bus_size; 688c2ecf20Sopenharmony_ci u8 xfer_size; 698c2ecf20Sopenharmony_ci void *buffer; 708c2ecf20Sopenharmony_ci u32 xferlen; 718c2ecf20Sopenharmony_ci u32 smcr; 728c2ecf20Sopenharmony_ci u32 smadr; 738c2ecf20Sopenharmony_ci u32 command; /* DRCMR or SMCMR */ 748c2ecf20Sopenharmony_ci u32 option; /* DROPR or SMOPR */ 758c2ecf20Sopenharmony_ci u32 enable; /* DRENR or SMENR */ 768c2ecf20Sopenharmony_ci u32 dummy; /* DRDMCR or SMDMCR */ 778c2ecf20Sopenharmony_ci u32 ddr; /* DRDRENR or SMDRENR */ 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ciint rpcif_sw_init(struct rpcif *rpc, struct device *dev); 818c2ecf20Sopenharmony_civoid rpcif_hw_init(struct rpcif *rpc, bool hyperflash); 828c2ecf20Sopenharmony_civoid rpcif_enable_rpm(struct rpcif *rpc); 838c2ecf20Sopenharmony_civoid rpcif_disable_rpm(struct rpcif *rpc); 848c2ecf20Sopenharmony_civoid rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs, 858c2ecf20Sopenharmony_ci size_t *len); 868c2ecf20Sopenharmony_ciint rpcif_manual_xfer(struct rpcif *rpc); 878c2ecf20Sopenharmony_cissize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf); 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci#endif // __RENESAS_RPC_IF_H 90