@@ -110,6 +110,7 @@ struct pru_private_data {
110
110
* @dbg_single_step: debug state variable to set PRU into single step mode
111
111
* @dbg_continuous: debug state variable to restore PRU execution mode
112
112
* @evt_count: number of mapped events
113
+ * @gpmux_save: saved value for gpmux config
113
114
*/
114
115
struct pru_rproc {
115
116
int id ;
@@ -128,6 +129,7 @@ struct pru_rproc {
128
129
u32 dbg_single_step ;
129
130
u32 dbg_continuous ;
130
131
u8 evt_count ;
132
+ u8 gpmux_save ;
131
133
};
132
134
133
135
static inline u32 pru_control_read_reg (struct pru_rproc * pru , unsigned int reg )
@@ -229,6 +231,7 @@ struct rproc *pru_rproc_get(struct device_node *np, int index,
229
231
struct device * dev ;
230
232
const char * fw_name ;
231
233
int ret ;
234
+ u32 mux ;
232
235
233
236
rproc = __pru_rproc_get (np , index );
234
237
if (IS_ERR (rproc ))
@@ -253,6 +256,23 @@ struct rproc *pru_rproc_get(struct device_node *np, int index,
253
256
if (pru_id )
254
257
* pru_id = pru -> id ;
255
258
259
+ ret = pruss_cfg_get_gpmux (pru -> pruss , pru -> id , & pru -> gpmux_save );
260
+ if (ret ) {
261
+ dev_err (dev , "failed to get cfg gpmux: %d\n" , ret );
262
+ goto err ;
263
+ }
264
+
265
+ /* An error here is acceptable for backward compatibility */
266
+ ret = of_property_read_u32_index (np , "ti,pruss-gp-mux-sel" , index ,
267
+ & mux );
268
+ if (!ret ) {
269
+ ret = pruss_cfg_set_gpmux (pru -> pruss , pru -> id , mux );
270
+ if (ret ) {
271
+ dev_err (dev , "failed to set cfg gpmux: %d\n" , ret );
272
+ goto err ;
273
+ }
274
+ }
275
+
256
276
ret = of_property_read_string_index (np , "firmware-name" , index ,
257
277
& fw_name );
258
278
if (!ret ) {
@@ -291,6 +311,8 @@ void pru_rproc_put(struct rproc *rproc)
291
311
292
312
pru = rproc -> priv ;
293
313
314
+ pruss_cfg_set_gpmux (pru -> pruss , pru -> id , pru -> gpmux_save );
315
+
294
316
pru_rproc_set_firmware (rproc , NULL );
295
317
296
318
mutex_lock (& pru -> lock );
0 commit comments