1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Renesas RPC-IF core driver 4 * 5 * Copyright (C) 2018~2019 Renesas Solutions Corp. 6 * Copyright (C) 2019 Macronix International Co., Ltd. 7 * Copyright (C) 2019-2020 Cogent Embedded, Inc. 8 */ 9 10 #ifndef __RENESAS_RPC_IF_H 11 #define __RENESAS_RPC_IF_H 12 13 #include <linux/pm_runtime.h> 14 #include <linux/types.h> 15 16 enum rpcif_data_dir { 17 RPCIF_NO_DATA, 18 RPCIF_DATA_IN, 19 RPCIF_DATA_OUT, 20 }; 21 22 struct rpcif_op { 23 struct { 24 u8 buswidth; 25 u8 opcode; 26 bool ddr; 27 } cmd, ocmd; 28 29 struct { 30 u8 nbytes; 31 u8 buswidth; 32 bool ddr; 33 u64 val; 34 } addr; 35 36 struct { 37 u8 ncycles; 38 u8 buswidth; 39 } dummy; 40 41 struct { 42 u8 nbytes; 43 u8 buswidth; 44 bool ddr; 45 u32 val; 46 } option; 47 48 struct { 49 u8 buswidth; 50 unsigned int nbytes; 51 enum rpcif_data_dir dir; 52 bool ddr; 53 union { 54 void *in; 55 const void *out; 56 } buf; 57 } data; 58 }; 59 60 enum rpcif_type { 61 RPCIF_RCAR_GEN3, 62 RPCIF_RCAR_GEN4, 63 RPCIF_RZ_G2L, 64 }; 65 66 struct rpcif { 67 struct device *dev; 68 void __iomem *base; 69 void __iomem *dirmap; 70 struct regmap *regmap; 71 struct reset_control *rstc; 72 size_t size; 73 enum rpcif_type type; 74 enum rpcif_data_dir dir; 75 u8 bus_size; 76 u8 xfer_size; 77 void *buffer; 78 u32 xferlen; 79 u32 smcr; 80 u32 smadr; 81 u32 command; /* DRCMR or SMCMR */ 82 u32 option; /* DROPR or SMOPR */ 83 u32 enable; /* DRENR or SMENR */ 84 u32 dummy; /* DRDMCR or SMDMCR */ 85 u32 ddr; /* DRDRENR or SMDRENR */ 86 }; 87 88 int rpcif_sw_init(struct rpcif *rpc, struct device *dev); 89 int rpcif_hw_init(struct rpcif *rpc, bool hyperflash); 90 void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs, 91 size_t *len); 92 int rpcif_manual_xfer(struct rpcif *rpc); 93 ssize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf); 94 95 static inline void rpcif_enable_rpm(struct rpcif *rpc) 96 { 97 pm_runtime_enable(rpc->dev); 98 } 99 100 static inline void rpcif_disable_rpm(struct rpcif *rpc) 101 { 102 pm_runtime_disable(rpc->dev); 103 } 104 105 #endif // __RENESAS_RPC_IF_H 106