Commit | Line | Data |
---|---|---|
dc112956 SA |
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 | ||
b789ca1e | 12 | #include <linux/mutex.h> |
67d1b0a1 | 13 | #include <linux/remoteproc/pruss.h> |
dc112956 | 14 | #include <linux/types.h> |
67d1b0a1 | 15 | #include <linux/err.h> |
dc112956 | 16 | |
51b5760e SA |
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 | */ | |
26 | enum 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 | ||
0211cc1e SA |
35 | /* |
36 | * enum pruss_gpi_mode - PRUSS GPI configuration modes, used | |
37 | * to program the PRUSS_GPCFG0/1 registers | |
38 | */ | |
39 | enum 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 | */ | |
55 | enum pru_type { | |
56 | PRU_TYPE_PRU, | |
57 | PRU_TYPE_RTU, | |
58 | PRU_TYPE_TX_PRU, | |
59 | PRU_TYPE_MAX, | |
60 | }; | |
61 | ||
dc112956 SA |
62 | /* |
63 | * enum pruss_mem - PRUSS memory range identifiers | |
64 | */ | |
65 | enum 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 | */ | |
78 | struct 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 | |
ba59c9b4 | 87 | * @cfg_base: base iomap for CFG region |
dc112956 SA |
88 | * @cfg_regmap: regmap for config region |
89 | * @mem_regions: data for each of the PRUSS memory regions | |
b789ca1e AD |
90 | * @mem_in_use: to indicate if memory resource is in use |
91 | * @lock: mutex to serialize access to resources | |
ba59c9b4 GJ |
92 | * @core_clk_mux: clk handle for PRUSS CORE_CLK_MUX |
93 | * @iep_clk_mux: clk handle for PRUSS IEP_CLK_MUX | |
dc112956 SA |
94 | */ |
95 | struct pruss { | |
96 | struct device *dev; | |
ba59c9b4 | 97 | void __iomem *cfg_base; |
dc112956 SA |
98 | struct regmap *cfg_regmap; |
99 | struct pruss_mem_region mem_regions[PRUSS_MEM_MAX]; | |
b789ca1e AD |
100 | struct pruss_mem_region *mem_in_use[PRUSS_MEM_MAX]; |
101 | struct mutex lock; /* PRU resource lock */ | |
ba59c9b4 GJ |
102 | struct clk *core_clk_mux; |
103 | struct clk *iep_clk_mux; | |
dc112956 SA |
104 | }; |
105 | ||
67d1b0a1 TK |
106 | #if IS_ENABLED(CONFIG_TI_PRUSS) |
107 | ||
108 | struct pruss *pruss_get(struct rproc *rproc); | |
109 | void pruss_put(struct pruss *pruss); | |
b789ca1e AD |
110 | int pruss_request_mem_region(struct pruss *pruss, enum pruss_mem mem_id, |
111 | struct pruss_mem_region *region); | |
112 | int pruss_release_mem_region(struct pruss *pruss, | |
113 | struct pruss_mem_region *region); | |
51b5760e SA |
114 | int pruss_cfg_get_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 *mux); |
115 | int pruss_cfg_set_gpmux(struct pruss *pruss, enum pruss_pru_id pru_id, u8 mux); | |
0211cc1e SA |
116 | int pruss_cfg_gpimode(struct pruss *pruss, enum pruss_pru_id pru_id, |
117 | enum pruss_gpi_mode mode); | |
118 | int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable); | |
119 | int pruss_cfg_xfr_enable(struct pruss *pruss, enum pru_type pru_type, | |
120 | bool enable); | |
67d1b0a1 TK |
121 | |
122 | #else | |
123 | ||
124 | static inline struct pruss *pruss_get(struct rproc *rproc) | |
125 | { | |
126 | return ERR_PTR(-EOPNOTSUPP); | |
127 | } | |
128 | ||
129 | static inline void pruss_put(struct pruss *pruss) { } | |
130 | ||
b789ca1e AD |
131 | static 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 | ||
138 | static inline int pruss_release_mem_region(struct pruss *pruss, | |
139 | struct pruss_mem_region *region) | |
140 | { | |
141 | return -EOPNOTSUPP; | |
142 | } | |
143 | ||
51b5760e SA |
144 | static 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 | ||
150 | static 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 | ||
0211cc1e SA |
156 | static 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 | ||
163 | static inline int pruss_cfg_miirt_enable(struct pruss *pruss, bool enable) | |
164 | { | |
165 | return ERR_PTR(-EOPNOTSUPP); | |
166 | } | |
167 | ||
168 | static 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 | ||
67d1b0a1 TK |
175 | #endif /* CONFIG_TI_PRUSS */ |
176 | ||
dc112956 | 177 | #endif /* _PRUSS_DRIVER_H_ */ |