Hi Bjorn, On 11/11/2019 11:04 PM, Bjorn Andersson wrote: > On Mon 07 Oct 00:39 PDT 2019, Fabien Dessenne wrote: > >> If the rproc driver is probed before the mailbox driver and if the rproc >> Device Tree node has some mailbox properties, the rproc driver probe >> shall be deferred instead of being probed without mailbox support. >> >> Signed-off-by: Fabien Dessenne <fabien.dessenne@xxxxxx> >> --- >> Changes since v1: test IS_ERR() before checking PTR_ERR() >> --- >> drivers/remoteproc/stm32_rproc.c | 10 ++++++++-- >> 1 file changed, 8 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c >> index 2cf4b29..a507332 100644 >> --- a/drivers/remoteproc/stm32_rproc.c >> +++ b/drivers/remoteproc/stm32_rproc.c >> @@ -310,7 +310,7 @@ static const struct stm32_mbox stm32_rproc_mbox[MBOX_NB_MBX] = { >> } >> }; >> >> -static void stm32_rproc_request_mbox(struct rproc *rproc) >> +static int stm32_rproc_request_mbox(struct rproc *rproc) >> { >> struct stm32_rproc *ddata = rproc->priv; >> struct device *dev = &rproc->dev; >> @@ -329,10 +329,14 @@ static void stm32_rproc_request_mbox(struct rproc *rproc) >> >> ddata->mb[i].chan = mbox_request_channel_byname(cl, name); >> if (IS_ERR(ddata->mb[i].chan)) { >> + if (PTR_ERR(ddata->mb[i].chan) == -EPROBE_DEFER) >> + return -EPROBE_DEFER; > If for some reason you get EPROBE_DEFER when i > 0 you need to > mbox_free_channel() channels [0..i) before returning. The mailbox framework returns EPROBE_DIFFER to inform that the mailbox provider has not registered yet. I do not expected to have a success followed by a EPROBE_DEFER error. But in the very special case where we use two different mailbox providers this may happen. I will send an updated version, thanks for pointing this. BR Fabien > > Regards, > Bjorn > >> dev_warn(dev, "cannot get %s mbox\n", name); >> ddata->mb[i].chan = NULL; >> } >> } >> + >> + return 0; >> } >> >> static int stm32_rproc_set_hold_boot(struct rproc *rproc, bool hold) >> @@ -596,7 +600,9 @@ static int stm32_rproc_probe(struct platform_device *pdev) >> if (ret) >> goto free_rproc; >> >> - stm32_rproc_request_mbox(rproc); >> + ret = stm32_rproc_request_mbox(rproc); >> + if (ret) >> + goto free_rproc; >> >> ret = rproc_add(rproc); >> if (ret) >> -- >> 2.7.4 >>