Message ID | 20221031073801.130541-6-danishanwar@ti.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce PRU remoteproc consumer API | expand |
On 31/10/2022 09:38, MD Danish Anwar wrote: > From: Tero Kristo <t-kristo@ti.com> > > Client device node property firmware-name is now used to configure > firmware for the PRU instances. The default firmware is also > restored once releasing the PRU resource. > > Co-developed-by: Suman Anna <s-anna@ti.com> > Signed-off-by: Suman Anna <s-anna@ti.com> > Signed-off-by: Tero Kristo <t-kristo@ti.com> > Co-developed-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org> > Signed-off-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@linaro.org> > Signed-off-by: Puranjay Mohan <p-mohan@ti.com> > Signed-off-by: MD Danish Anwar <danishanwar@ti.com> > --- > drivers/remoteproc/pru_rproc.c | 34 ++++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c > index 3d1870e6b13b..15ffaeddd963 100644 > --- a/drivers/remoteproc/pru_rproc.c > +++ b/drivers/remoteproc/pru_rproc.c > @@ -172,6 +172,23 @@ void pru_control_set_reg(struct pru_rproc *pru, unsigned int reg, > spin_unlock_irqrestore(&pru->rmw_lock, flags); > } > > +/** > + * pru_rproc_set_firmware() - set firmware for a pru core s/pru/PRU > + * @rproc: the rproc instance of the PRU > + * @fw_name: the new firmware name, or NULL if default is desired > + * > + * Return: 0 on success, or errno in error case. > + */ > +static int pru_rproc_set_firmware(struct rproc *rproc, const char *fw_name) > +{ > + struct pru_rproc *pru = rproc->priv; > + > + if (!fw_name) > + fw_name = pru->fw_name; > + > + return rproc_set_firmware(rproc, fw_name); > +} > + > static struct rproc *__pru_rproc_get(struct device_node *np, int index) > { > struct rproc *rproc; > @@ -230,6 +247,7 @@ struct rproc *pru_rproc_get(struct device_node *np, int index, > struct rproc *rproc; > struct pru_rproc *pru; > struct device *dev; > + const char *fw_name; > int ret; > > rproc = __pru_rproc_get(np, index); > @@ -256,11 +274,25 @@ struct rproc *pru_rproc_get(struct device_node *np, int index, > if (pru_id) > *pru_id = pru->id; > > + ret = of_property_read_string_index(np, "firmware-name", index, > + &fw_name); > + if (!ret) { > + ret = pru_rproc_set_firmware(rproc, fw_name); > + if (ret) { > + dev_err(dev, "failed to set firmware: %d\n", ret); > + goto err; > + } > + } > + > return rproc; > > err_no_rproc_handle: > rproc_put(rproc); > return ERR_PTR(ret); > + > +err: > + pru_rproc_put(rproc); > + return ERR_PTR(ret); > } > EXPORT_SYMBOL_GPL(pru_rproc_get); > > @@ -280,6 +312,8 @@ void pru_rproc_put(struct rproc *rproc) > > pru = rproc->priv; > > + pru_rproc_set_firmware(rproc, NULL); > + > mutex_lock(&pru->lock); > > if (!pru->client_np) { Reviewed-by: Roger Quadros <rogerq@kernel.org> -- cheers, -roger
diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c index 3d1870e6b13b..15ffaeddd963 100644 --- a/drivers/remoteproc/pru_rproc.c +++ b/drivers/remoteproc/pru_rproc.c @@ -172,6 +172,23 @@ void pru_control_set_reg(struct pru_rproc *pru, unsigned int reg, spin_unlock_irqrestore(&pru->rmw_lock, flags); } +/** + * pru_rproc_set_firmware() - set firmware for a pru core + * @rproc: the rproc instance of the PRU + * @fw_name: the new firmware name, or NULL if default is desired + * + * Return: 0 on success, or errno in error case. + */ +static int pru_rproc_set_firmware(struct rproc *rproc, const char *fw_name) +{ + struct pru_rproc *pru = rproc->priv; + + if (!fw_name) + fw_name = pru->fw_name; + + return rproc_set_firmware(rproc, fw_name); +} + static struct rproc *__pru_rproc_get(struct device_node *np, int index) { struct rproc *rproc; @@ -230,6 +247,7 @@ struct rproc *pru_rproc_get(struct device_node *np, int index, struct rproc *rproc; struct pru_rproc *pru; struct device *dev; + const char *fw_name; int ret; rproc = __pru_rproc_get(np, index); @@ -256,11 +274,25 @@ struct rproc *pru_rproc_get(struct device_node *np, int index, if (pru_id) *pru_id = pru->id; + ret = of_property_read_string_index(np, "firmware-name", index, + &fw_name); + if (!ret) { + ret = pru_rproc_set_firmware(rproc, fw_name); + if (ret) { + dev_err(dev, "failed to set firmware: %d\n", ret); + goto err; + } + } + return rproc; err_no_rproc_handle: rproc_put(rproc); return ERR_PTR(ret); + +err: + pru_rproc_put(rproc); + return ERR_PTR(ret); } EXPORT_SYMBOL_GPL(pru_rproc_get); @@ -280,6 +312,8 @@ void pru_rproc_put(struct rproc *rproc) pru = rproc->priv; + pru_rproc_set_firmware(rproc, NULL); + mutex_lock(&pru->lock); if (!pru->client_np) {