1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * PRU-ICSS sub-system specific definitions 4 * 5 * Copyright (C) 2014-2020 Texas Instruments Incorporated - http://www.ti.com/ 6 * Suman Anna <s-anna@ti.com> 7 */ 8 9#ifndef _PRUSS_DRIVER_H_ 10#define _PRUSS_DRIVER_H_ 11 12#include <linux/mutex.h> 13#include <linux/remoteproc/pruss.h> 14#include <linux/types.h> 15#include <linux/err.h> 16 17/* 18 * enum pruss_gp_mux_sel - PRUSS GPI/O Mux modes for the 19 * PRUSS_GPCFG0/1 registers 20 * 21 * NOTE: The below defines are the most common values, but there 22 * are some exceptions like on 66AK2G, where the RESERVED and MII2 23 * values are interchanged. Also, this bit-field does not exist on 24 * AM335x SoCs 25 */ 26enum pruss_gp_mux_sel { 27 PRUSS_GP_MUX_SEL_GP, 28 PRUSS_GP_MUX_SEL_ENDAT, 29 PRUSS_GP_MUX_SEL_RESERVED, 30 PRUSS_GP_MUX_SEL_SD, 31 PRUSS_GP_MUX_SEL_MII2, 32 PRUSS_GP_MUX_SEL_MAX, 33}; 34 35/* 36 * enum pruss_gpi_mode - PRUSS GPI configuration modes, used 37 * to program the PRUSS_GPCFG0/1 registers 38 */ 39enum pruss_gpi_mode { 40 PRUSS_GPI_MODE_DIRECT, 41 PRUSS_GPI_MODE_PARALLEL, 42 PRUSS_GPI_MODE_28BIT_SHIFT, 43 PRUSS_GPI_MODE_MII, 44 PRUSS_GPI_MODE_MAX, 45}; 46 47/** 48 * enum pru_type - PRU core type identifier 49 * 50 * @PRU_TYPE_PRU: Programmable Real-time Unit 51 * @PRU_TYPE_RTU: Auxiliary Programmable Real-Time Unit 52 * @PRU_TYPE_TX_PRU: Transmit Programmable Real-Time Unit 53 * @PRU_TYPE_MAX: just keep this one at the end 54 */ 55enum pru_type { 56 PRU_TYPE_PRU, 57 PRU_TYPE_RTU, 58 PRU_TYPE_TX_PRU, 59 PRU_TYPE_MAX, 60}; 61 62/* 63 * enum pruss_mem - PRUSS memory range identifiers 64 */ 65enum pruss_mem { 66 PRUSS_MEM_DRAM0 = 0, 67 PRUSS_MEM_DRAM1, 68 PRUSS_MEM_SHRD_RAM2, 69 PRUSS_MEM_MAX, 70}; 71 72/** 73 * struct pruss_mem_region - PRUSS memory region structure 74 * @va: kernel virtual address of the PRUSS memory region 75 * @pa: physical (bus) address of the PRUSS memory region 76 * @size: size of the PRUSS memory region 77 */ 78struct pruss_mem_region { 79 void __iomem *va; 80 phys_addr_t pa; 81 size_t size; 82}; 83 84/** 85 * struct pruss - PRUSS parent structure 86 * @dev: pruss device pointer 87 * @cfg_base: base iomap for CFG region 88 * @cfg_regmap: regmap for config region 89 * @mem_regions: data for each of the PRUSS memory regions 90 * @mem_in_use: to indicate if memory resource is in use 91 * @lock: mutex to serialize access to resources 92 * @core_clk_mux: clk handle for PRUSS CORE_CLK_MUX 93 * @iep_clk_mux: clk handle for PRUSS IEP_CLK_MUX 94 */ 95struct pruss { 96 struct device *dev; 97 void __iomem *cfg_base; 98 struct regmap *cfg_regmap; 99 struct pruss_mem_region mem_regions[PRUSS_MEM_MAX]; 100 struct pruss_mem_region *mem_in_use[PRUSS_MEM_MAX]; 101 struct mutex lock; /* PRU resource lock */ 102 struct clk *core_clk_mux; 103 struct clk *iep_clk_mux; 104}; 105 106#if IS_ENABLED(CONFIG_TI_PRUSS) 107 108struct pruss *pruss_get(struct rproc *rproc); 109void pruss_put(struct pruss *pruss); 110int pruss_request_mem_region(struct pruss *pruss, enum pruss_mem mem_id, 111 struct pruss_mem_region *region); 112int pruss_release_mem_region(struct pruss *pruss, 113 struct pruss_mem_region *region); 114int pruss_cfg_get_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 *mux); 115int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux); 116int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id, 117 enum pruss_gpi_mode mode); 118int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable); 119int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type, 120 bool enable); 121 122#else 123 124static inline struct pruss *pruss_get(struct rproc *rproc) 125{ 126 return ERR_PTR(-EOPNOTSUPP); 127} 128 129static inline void pruss_put(struct pruss *pruss) { } 130 131static inline int pruss_request_mem_region(struct pruss *pruss, 132 enum pruss_mem mem_id, 133 struct pruss_mem_region *region) 134{ 135 return -EOPNOTSUPP; 136} 137 138static inline int pruss_release_mem_region(struct pruss *pruss, 139 struct pruss_mem_region *region) 140{ 141 return -EOPNOTSUPP; 142} 143 144static inline int pruss_cfg_get_gpmux(struct pruss *pruss, 145 enum pruss_pru_id pru_id, u8 *mux) 146{ 147 return ERR_PTR(-EOPNOTSUPP); 148} 149 150static inline int pruss_cfg_set_gpmux(struct pruss *pruss, 151 enum pruss_pru_id pru_id, u8 mux) 152{ 153 return ERR_PTR(-EOPNOTSUPP); 154} 155 156static inline int pruss_cfg_gpimode(struct pruss *pruss, 157 enum pruss_pru_id pru_id, 158 enum pruss_gpi_mode mode) 159{ 160 return ERR_PTR(-EOPNOTSUPP); 161} 162 163static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable) 164{ 165 return ERR_PTR(-EOPNOTSUPP); 166} 167 168static inline int pruss_cfg_xfr_enable(struct pruss *pruss, 169 enum pru_type pru_type, 170 bool enable); 171{ 172 return ERR_PTR(-EOPNOTSUPP); 173} 174 175#endif /* CONFIG_TI_PRUSS */ 176 177#endif /* _PRUSS_DRIVER_H_ */ 178