On 31/10/2022 09:38, MD Danish Anwar wrote: > From: Tero Kristo <t-kristo@xxxxxx> > > 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@xxxxxx> > Signed-off-by: Suman Anna <s-anna@xxxxxx> > Signed-off-by: Tero Kristo <t-kristo@xxxxxx> > Co-developed-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@xxxxxxxxxx> > Signed-off-by: Grzegorz Jaszczyk <grzegorz.jaszczyk@xxxxxxxxxx> > Signed-off-by: Puranjay Mohan <p-mohan@xxxxxx> > Signed-off-by: MD Danish Anwar <danishanwar@xxxxxx> > --- > 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@xxxxxxxxxx> -- cheers, -roger