]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/commitdiff
remoteproc/pru: add support for configuring GPMUX based on client setup
authorTero Kristo <t-kristo@ti.com>
Mon, 29 Jan 2018 15:53:49 +0000 (17:53 +0200)
committerSuman Anna <s-anna@ti.com>
Sun, 24 Feb 2019 01:20:52 +0000 (19:20 -0600)
Client device node property ti,pruss-gp-mux-sel can now be used to
configure the GPMUX config value for PRU.

Signed-off-by: Tero Kristo <t-kristo@ti.com>
[s-anna@ti.com: simplify the pru id usage]
Signed-off-by: Suman Anna <s-anna@ti.com>
drivers/remoteproc/pru_rproc.c

index 7ec23b0474030e70f6d6671ddeceb4793ed97768..8d1bb5151f0f8ef97a09c0f40ed4067c512b9339 100644 (file)
@@ -76,6 +76,7 @@ enum pru_iomem {
  * @shrdram_da: device address of shared Data RAM
  * @fw_name: name of firmware image used during loading
  * @dt_irqs: number of irqs configured from DT
+ * @gpmux_save: saved value for gpmux config
  * @lock: mutex to protect client usage
  * @dbg_single_step: debug state variable to set PRU into single step mode
  * @dbg_continuous: debug state variable to restore PRU execution mode
@@ -99,6 +100,7 @@ struct pru_rproc {
        u32 shrdram_da;
        const char *fw_name;
        int dt_irqs;
+       u8 gpmux_save;
        struct mutex lock; /* client access lock */
        u32 dbg_single_step;
        u32 dbg_continuous;
@@ -305,6 +307,7 @@ struct rproc *pru_rproc_get(struct device_node *np, int index)
        const char *fw_name;
        struct device *dev;
        int ret;
+       u32 mux;
 
        rproc = __pru_rproc_get(np, index);
        if (IS_ERR(rproc))
@@ -326,6 +329,22 @@ struct rproc *pru_rproc_get(struct device_node *np, int index)
 
        mutex_unlock(&pru->lock);
 
+       ret = pruss_cfg_get_gpmux(pru->pruss, pru->id, &pru->gpmux_save);
+       if (ret) {
+               dev_err(dev, "failed to get cfg gpmux: %d\n", ret);
+               goto err;
+       }
+
+       ret = of_property_read_u32_index(np, "ti,pruss-gp-mux-sel", index,
+                                        &mux);
+       if (!ret) {
+               ret = pruss_cfg_set_gpmux(pru->pruss, pru->id, mux);
+               if (ret) {
+                       dev_err(dev, "failed to set cfg gpmux: %d\n", ret);
+                       goto err;
+               }
+       }
+
        ret = of_property_read_string_index(np, "firmware-name", index,
                                            &fw_name);
        if (!ret) {
@@ -370,6 +389,8 @@ void pru_rproc_put(struct rproc *rproc)
        if (!pru->client_np)
                return;
 
+       pruss_cfg_set_gpmux(pru->pruss, pru->id, pru->gpmux_save);
+
        if (pru->dt_irqs)
                pruss_intc_unconfigure(pru->pruss, &pru->intc_config);