/* SPDX-License-Identifier: GPL-2.0-only */ /* * PRU-ICSS sub-system specific definitions * * Copyright (C) 2014-2020 Texas Instruments Incorporated - http://www.ti.com/ * Suman Anna <s-anna@ti.com> */ #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 */ enum pruss_mem { PRUSS_MEM_DRAM0 = 0, PRUSS_MEM_DRAM1, PRUSS_MEM_SHRD_RAM2, PRUSS_MEM_MAX, }; /** * struct pruss_mem_region - PRUSS memory region structure * @va: kernel virtual address of the PRUSS memory region * @pa: physical (bus) address of the PRUSS memory region * @size: size of the PRUSS memory region */ struct pruss_mem_region { void __iomem *va; phys_addr_t pa; size_t size; }; /** * struct pruss - PRUSS parent structure * @dev: pruss device pointer * @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 */ struct pruss { struct device *dev; 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_ */