xref: /openbmc/linux/include/linux/pruss_driver.h (revision 0211cc1e)
1dc112956SSuman Anna /* SPDX-License-Identifier: GPL-2.0-only */
2dc112956SSuman Anna /*
3dc112956SSuman Anna  * PRU-ICSS sub-system specific definitions
4dc112956SSuman Anna  *
5dc112956SSuman Anna  * Copyright (C) 2014-2020 Texas Instruments Incorporated - http://www.ti.com/
6dc112956SSuman Anna  *	Suman Anna <s-anna@ti.com>
7dc112956SSuman Anna  */
8dc112956SSuman Anna 
9dc112956SSuman Anna #ifndef _PRUSS_DRIVER_H_
10dc112956SSuman Anna #define _PRUSS_DRIVER_H_
11dc112956SSuman Anna 
12b789ca1eSAndrew F. Davis #include <linux/mutex.h>
1367d1b0a1STero Kristo #include <linux/remoteproc/pruss.h>
14dc112956SSuman Anna #include <linux/types.h>
1567d1b0a1STero Kristo #include <linux/err.h>
16dc112956SSuman Anna 
17dc112956SSuman Anna /*
1851b5760eSSuman Anna  * enum pruss_gp_mux_sel - PRUSS GPI/O Mux modes for the
1951b5760eSSuman Anna  * PRUSS_GPCFG0/1 registers
2051b5760eSSuman Anna  *
2151b5760eSSuman Anna  * NOTE: The below defines are the most common values, but there
2251b5760eSSuman Anna  * are some exceptions like on 66AK2G, where the RESERVED and MII2
2351b5760eSSuman Anna  * values are interchanged. Also, this bit-field does not exist on
2451b5760eSSuman Anna  * AM335x SoCs
2551b5760eSSuman Anna  */
2651b5760eSSuman Anna enum pruss_gp_mux_sel {
2751b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_GP,
2851b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_ENDAT,
2951b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_RESERVED,
3051b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_SD,
3151b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_MII2,
3251b5760eSSuman Anna 	PRUSS_GP_MUX_SEL_MAX,
3351b5760eSSuman Anna };
3451b5760eSSuman Anna 
3551b5760eSSuman Anna /*
36*0211cc1eSSuman Anna  * enum pruss_gpi_mode - PRUSS GPI configuration modes, used
37*0211cc1eSSuman Anna  *			 to program the PRUSS_GPCFG0/1 registers
38*0211cc1eSSuman Anna  */
39*0211cc1eSSuman Anna enum pruss_gpi_mode {
40*0211cc1eSSuman Anna 	PRUSS_GPI_MODE_DIRECT,
41*0211cc1eSSuman Anna 	PRUSS_GPI_MODE_PARALLEL,
42*0211cc1eSSuman Anna 	PRUSS_GPI_MODE_28BIT_SHIFT,
43*0211cc1eSSuman Anna 	PRUSS_GPI_MODE_MII,
44*0211cc1eSSuman Anna 	PRUSS_GPI_MODE_MAX,
45*0211cc1eSSuman Anna };
46*0211cc1eSSuman Anna 
47*0211cc1eSSuman Anna /**
48*0211cc1eSSuman Anna  * enum pru_type - PRU core type identifier
49*0211cc1eSSuman Anna  *
50*0211cc1eSSuman Anna  * @PRU_TYPE_PRU: Programmable Real-time Unit
51*0211cc1eSSuman Anna  * @PRU_TYPE_RTU: Auxiliary Programmable Real-Time Unit
52*0211cc1eSSuman Anna  * @PRU_TYPE_TX_PRU: Transmit Programmable Real-Time Unit
53*0211cc1eSSuman Anna  * @PRU_TYPE_MAX: just keep this one at the end
54*0211cc1eSSuman Anna  */
55*0211cc1eSSuman Anna enum pru_type {
56*0211cc1eSSuman Anna 	PRU_TYPE_PRU,
57*0211cc1eSSuman Anna 	PRU_TYPE_RTU,
58*0211cc1eSSuman Anna 	PRU_TYPE_TX_PRU,
59*0211cc1eSSuman Anna 	PRU_TYPE_MAX,
60*0211cc1eSSuman Anna };
61*0211cc1eSSuman Anna 
62*0211cc1eSSuman Anna /*
63dc112956SSuman Anna  * enum pruss_mem - PRUSS memory range identifiers
64dc112956SSuman Anna  */
65dc112956SSuman Anna enum pruss_mem {
66dc112956SSuman Anna 	PRUSS_MEM_DRAM0 = 0,
67dc112956SSuman Anna 	PRUSS_MEM_DRAM1,
68dc112956SSuman Anna 	PRUSS_MEM_SHRD_RAM2,
69dc112956SSuman Anna 	PRUSS_MEM_MAX,
70dc112956SSuman Anna };
71dc112956SSuman Anna 
72dc112956SSuman Anna /**
73dc112956SSuman Anna  * struct pruss_mem_region - PRUSS memory region structure
74dc112956SSuman Anna  * @va: kernel virtual address of the PRUSS memory region
75dc112956SSuman Anna  * @pa: physical (bus) address of the PRUSS memory region
76dc112956SSuman Anna  * @size: size of the PRUSS memory region
77dc112956SSuman Anna  */
78dc112956SSuman Anna struct pruss_mem_region {
79dc112956SSuman Anna 	void __iomem *va;
80dc112956SSuman Anna 	phys_addr_t pa;
81dc112956SSuman Anna 	size_t size;
82dc112956SSuman Anna };
83dc112956SSuman Anna 
84dc112956SSuman Anna /**
85dc112956SSuman Anna  * struct pruss - PRUSS parent structure
86dc112956SSuman Anna  * @dev: pruss device pointer
87ba59c9b4SGrzegorz Jaszczyk  * @cfg_base: base iomap for CFG region
88dc112956SSuman Anna  * @cfg_regmap: regmap for config region
89dc112956SSuman Anna  * @mem_regions: data for each of the PRUSS memory regions
90b789ca1eSAndrew F. Davis  * @mem_in_use: to indicate if memory resource is in use
91b789ca1eSAndrew F. Davis  * @lock: mutex to serialize access to resources
92ba59c9b4SGrzegorz Jaszczyk  * @core_clk_mux: clk handle for PRUSS CORE_CLK_MUX
93ba59c9b4SGrzegorz Jaszczyk  * @iep_clk_mux: clk handle for PRUSS IEP_CLK_MUX
94dc112956SSuman Anna  */
95dc112956SSuman Anna struct pruss {
96dc112956SSuman Anna 	struct device *dev;
97ba59c9b4SGrzegorz Jaszczyk 	void __iomem *cfg_base;
98dc112956SSuman Anna 	struct regmap *cfg_regmap;
99dc112956SSuman Anna 	struct pruss_mem_region mem_regions[PRUSS_MEM_MAX];
100b789ca1eSAndrew F. Davis 	struct pruss_mem_region *mem_in_use[PRUSS_MEM_MAX];
101b789ca1eSAndrew F. Davis 	struct mutex lock; /* PRU resource lock */
102ba59c9b4SGrzegorz Jaszczyk 	struct clk *core_clk_mux;
103ba59c9b4SGrzegorz Jaszczyk 	struct clk *iep_clk_mux;
104dc112956SSuman Anna };
105dc112956SSuman Anna 
10667d1b0a1STero Kristo #if IS_ENABLED(CONFIG_TI_PRUSS)
10767d1b0a1STero Kristo 
10867d1b0a1STero Kristo struct pruss *pruss_get(struct rproc *rproc);
10967d1b0a1STero Kristo void pruss_put(struct pruss *pruss);
110b789ca1eSAndrew F. Davis int pruss_request_mem_region(struct pruss *pruss, enum pruss_mem mem_id,
111b789ca1eSAndrew F. Davis 			     struct pruss_mem_region *region);
112b789ca1eSAndrew F. Davis int pruss_release_mem_region(struct pruss *pruss,
113b789ca1eSAndrew F. Davis 			     struct pruss_mem_region *region);
11451b5760eSSuman Anna int pruss_cfg_get_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 *mux);
11551b5760eSSuman Anna int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux);
116*0211cc1eSSuman Anna int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id,
117*0211cc1eSSuman Anna 		      enum pruss_gpi_mode mode);
118*0211cc1eSSuman Anna int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable);
119*0211cc1eSSuman Anna int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type,
120*0211cc1eSSuman Anna 			 bool enable);
12167d1b0a1STero Kristo 
12267d1b0a1STero Kristo #else
12367d1b0a1STero Kristo 
pruss_get(struct rproc * rproc)12467d1b0a1STero Kristo static inline struct pruss *pruss_get(struct rproc *rproc)
12567d1b0a1STero Kristo {
12667d1b0a1STero Kristo 	return ERR_PTR(-EOPNOTSUPP);
12767d1b0a1STero Kristo }
12867d1b0a1STero Kristo 
pruss_put(struct pruss * pruss)12967d1b0a1STero Kristo static inline void pruss_put(struct pruss *pruss) { }
13067d1b0a1STero Kristo 
pruss_request_mem_region(struct pruss * pruss,enum pruss_mem mem_id,struct pruss_mem_region * region)131b789ca1eSAndrew F. Davis static inline int pruss_request_mem_region(struct pruss *pruss,
132b789ca1eSAndrew F. Davis 					   enum pruss_mem mem_id,
133b789ca1eSAndrew F. Davis 					   struct pruss_mem_region *region)
134b789ca1eSAndrew F. Davis {
135b789ca1eSAndrew F. Davis 	return -EOPNOTSUPP;
136b789ca1eSAndrew F. Davis }
137b789ca1eSAndrew F. Davis 
pruss_release_mem_region(struct pruss * pruss,struct pruss_mem_region * region)138b789ca1eSAndrew F. Davis static inline int pruss_release_mem_region(struct pruss *pruss,
139b789ca1eSAndrew F. Davis 					   struct pruss_mem_region *region)
140b789ca1eSAndrew F. Davis {
141b789ca1eSAndrew F. Davis 	return -EOPNOTSUPP;
142b789ca1eSAndrew F. Davis }
143b789ca1eSAndrew F. Davis 
pruss_cfg_get_gpmux(struct pruss * pruss,enum pruss_pru_id pru_id,u8 * mux)14451b5760eSSuman Anna static inline int pruss_cfg_get_gpmux(struct pruss *pruss,
14551b5760eSSuman Anna 				      enum pruss_pru_id pru_id, u8 *mux)
14651b5760eSSuman Anna {
14751b5760eSSuman Anna 	return ERR_PTR(-EOPNOTSUPP);
14851b5760eSSuman Anna }
14951b5760eSSuman Anna 
pruss_cfg_set_gpmux(struct pruss * pruss,enum pruss_pru_id pru_id,u8 mux)15051b5760eSSuman Anna static inline int pruss_cfg_set_gpmux(struct pruss *pruss,
15151b5760eSSuman Anna 				      enum pruss_pru_id pru_id, u8 mux)
15251b5760eSSuman Anna {
15351b5760eSSuman Anna 	return ERR_PTR(-EOPNOTSUPP);
15451b5760eSSuman Anna }
15551b5760eSSuman Anna 
pruss_cfg_gpimode(struct pruss * pruss,enum pruss_pru_id pru_id,enum pruss_gpi_mode mode)156*0211cc1eSSuman Anna static inline int pruss_cfg_gpimode(struct pruss *pruss,
157*0211cc1eSSuman Anna 				    enum pruss_pru_id pru_id,
158*0211cc1eSSuman Anna 				    enum pruss_gpi_mode mode)
159*0211cc1eSSuman Anna {
160*0211cc1eSSuman Anna 	return ERR_PTR(-EOPNOTSUPP);
161*0211cc1eSSuman Anna }
162*0211cc1eSSuman Anna 
pruss_cfg_miirt_enable(struct pruss * pruss,bool enable)163*0211cc1eSSuman Anna static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable)
164*0211cc1eSSuman Anna {
165*0211cc1eSSuman Anna 	return ERR_PTR(-EOPNOTSUPP);
166*0211cc1eSSuman Anna }
167*0211cc1eSSuman Anna 
168*0211cc1eSSuman Anna static inline int pruss_cfg_xfr_enable(struct pruss *pruss,
169*0211cc1eSSuman Anna 				       enum pru_type pru_type,
170*0211cc1eSSuman Anna 				       bool enable);
171*0211cc1eSSuman Anna {
172*0211cc1eSSuman Anna 	return ERR_PTR(-EOPNOTSUPP);
173*0211cc1eSSuman Anna }
174*0211cc1eSSuman Anna 
17567d1b0a1STero Kristo #endif /* CONFIG_TI_PRUSS */
17667d1b0a1STero Kristo 
177dc112956SSuman Anna #endif	/* _PRUSS_DRIVER_H_ */
178