diff options
Diffstat (limited to 'include/linux/pruss_driver.h')
| -rw-r--r-- | include/linux/pruss_driver.h | 123 | 
1 files changed, 123 insertions, 0 deletions
| diff --git a/include/linux/pruss_driver.h b/include/linux/pruss_driver.h index ecfded30ed05..c9a31c567e85 100644 --- a/include/linux/pruss_driver.h +++ b/include/linux/pruss_driver.h @@ -9,7 +9,55 @@  #ifndef _PRUSS_DRIVER_H_  #define _PRUSS_DRIVER_H_ +#include <linux/mutex.h> +#include <linux/remoteproc/pruss.h>  #include <linux/types.h> +#include <linux/err.h> + +/* + * enum pruss_gp_mux_sel - PRUSS GPI/O Mux modes for the + * PRUSS_GPCFG0/1 registers + * + * NOTE: The below defines are the most common values, but there + * are some exceptions like on 66AK2G, where the RESERVED and MII2 + * values are interchanged. Also, this bit-field does not exist on + * AM335x SoCs + */ +enum pruss_gp_mux_sel { +	PRUSS_GP_MUX_SEL_GP, +	PRUSS_GP_MUX_SEL_ENDAT, +	PRUSS_GP_MUX_SEL_RESERVED, +	PRUSS_GP_MUX_SEL_SD, +	PRUSS_GP_MUX_SEL_MII2, +	PRUSS_GP_MUX_SEL_MAX, +}; + +/* + * enum pruss_gpi_mode - PRUSS GPI configuration modes, used + *			 to program the PRUSS_GPCFG0/1 registers + */ +enum pruss_gpi_mode { +	PRUSS_GPI_MODE_DIRECT, +	PRUSS_GPI_MODE_PARALLEL, +	PRUSS_GPI_MODE_28BIT_SHIFT, +	PRUSS_GPI_MODE_MII, +	PRUSS_GPI_MODE_MAX, +}; + +/** + * enum pru_type - PRU core type identifier + * + * @PRU_TYPE_PRU: Programmable Real-time Unit + * @PRU_TYPE_RTU: Auxiliary Programmable Real-Time Unit + * @PRU_TYPE_TX_PRU: Transmit Programmable Real-Time Unit + * @PRU_TYPE_MAX: just keep this one at the end + */ +enum pru_type { +	PRU_TYPE_PRU, +	PRU_TYPE_RTU, +	PRU_TYPE_TX_PRU, +	PRU_TYPE_MAX, +};  /*   * enum pruss_mem - PRUSS memory range identifiers @@ -39,6 +87,8 @@ struct pruss_mem_region {   * @cfg_base: base iomap for CFG region   * @cfg_regmap: regmap for config region   * @mem_regions: data for each of the PRUSS memory regions + * @mem_in_use: to indicate if memory resource is in use + * @lock: mutex to serialize access to resources   * @core_clk_mux: clk handle for PRUSS CORE_CLK_MUX   * @iep_clk_mux: clk handle for PRUSS IEP_CLK_MUX   */ @@ -47,8 +97,81 @@ struct pruss {  	void __iomem *cfg_base;  	struct regmap *cfg_regmap;  	struct pruss_mem_region mem_regions[PRUSS_MEM_MAX]; +	struct pruss_mem_region *mem_in_use[PRUSS_MEM_MAX]; +	struct mutex lock; /* PRU resource lock */  	struct clk *core_clk_mux;  	struct clk *iep_clk_mux;  }; +#if IS_ENABLED(CONFIG_TI_PRUSS) + +struct pruss *pruss_get(struct rproc *rproc); +void pruss_put(struct pruss *pruss); +int pruss_request_mem_region(struct pruss *pruss, enum pruss_mem mem_id, +			     struct pruss_mem_region *region); +int pruss_release_mem_region(struct pruss *pruss, +			     struct pruss_mem_region *region); +int pruss_cfg_get_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 *mux); +int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux); +int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id, +		      enum pruss_gpi_mode mode); +int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable); +int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type, +			 bool enable); + +#else + +static inline struct pruss *pruss_get(struct rproc *rproc) +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +static inline void pruss_put(struct pruss *pruss) { } + +static inline int pruss_request_mem_region(struct pruss *pruss, +					   enum pruss_mem mem_id, +					   struct pruss_mem_region *region) +{ +	return -EOPNOTSUPP; +} + +static inline int pruss_release_mem_region(struct pruss *pruss, +					   struct pruss_mem_region *region) +{ +	return -EOPNOTSUPP; +} + +static inline int pruss_cfg_get_gpmux(struct pruss *pruss, +				      enum pruss_pru_id pru_id, u8 *mux) +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +static inline int pruss_cfg_set_gpmux(struct pruss *pruss, +				      enum pruss_pru_id pru_id, u8 mux) +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +static inline int pruss_cfg_gpimode(struct pruss *pruss, +				    enum pruss_pru_id pru_id, +				    enum pruss_gpi_mode mode) +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable) +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +static inline int pruss_cfg_xfr_enable(struct pruss *pruss, +				       enum pru_type pru_type, +				       bool enable); +{ +	return ERR_PTR(-EOPNOTSUPP); +} + +#endif /* CONFIG_TI_PRUSS */ +  #endif	/* _PRUSS_DRIVER_H_ */ |