* [PATCH v9 2/6] remoteproc: Change typo FW_CONFIG to FW_LOADER for REMOTEPROC [not found] ` <1364521307-1219-3-git-send-email-rtivy@ti.com> @ 2013-04-07 12:13 ` Ohad Ben-Cohen 0 siblings, 0 replies; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-07 12:13 UTC (permalink / raw) To: linux-arm-kernel On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: > Fix obvious typo introduced in commit e121aefa7d9f10eee5cf26ed47129237a05d940b > ("remoteproc: fix missing CONFIG_FW_LOADER configurations"). > > Signed-off-by: Robert Tivy <rtivy@ti.com> Applied, thanks. BTW - we don't usually want to directly cc stable at vger.kernel.org. Instead we just add a Cc tag in the commit log (fixed before applying). ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <1364521307-1219-4-git-send-email-rtivy@ti.com>]
* [PATCH v9 3/6] remoteproc: Add support to rproc_alloc() for a default firmware name [not found] ` <1364521307-1219-4-git-send-email-rtivy@ti.com> @ 2013-04-07 12:39 ` Ohad Ben-Cohen 0 siblings, 0 replies; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-07 12:39 UTC (permalink / raw) To: linux-arm-kernel On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: > Signed-off-by: Robert Tivy <rtivy@ti.com> Applied with the following changes: - add commit log - document change in function description - use snprintf instead - minor style change Thanks! ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <1364521307-1219-2-git-send-email-rtivy@ti.com>]
* [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback [not found] ` <1364521307-1219-2-git-send-email-rtivy@ti.com> @ 2013-04-07 12:50 ` Ohad Ben-Cohen 2013-04-08 22:56 ` Tivy, Robert 0 siblings, 1 reply; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-07 12:50 UTC (permalink / raw) To: linux-arm-kernel On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: > Change virtqueue callback function rpmsg_recv_done() to process all > available messages instead of just one message. > > Signed-off-by: Robert Tivy <rtivy@ti.com> I'm thinking instead of adding an indentation level, let's split the _recv function. This is what I have in mind - let me know if it works for you - thanks: diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index a59684b..42b9872 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -776,22 +776,11 @@ out: } EXPORT_SYMBOL(rpmsg_send_offchannel_raw); -/* called when an rx buffer is used, and it's time to digest a message */ -static void rpmsg_recv_done(struct virtqueue *rvq) +static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, + struct rpmsg_hdr *msg, unsigned int len) { - struct rpmsg_hdr *msg; - unsigned int len; struct rpmsg_endpoint *ept; struct scatterlist sg; - struct virtproc_info *vrp = rvq->vdev->priv; - struct device *dev = &rvq->vdev->dev; - int err; - - msg = virtqueue_get_buf(rvq, &len); - if (!msg) { - dev_err(dev, "uhm, incoming signal, but no used buffer ?\n"); - return; - } dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", msg->src, msg->dst, msg->len, @@ -806,7 +795,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq) if (len > RPMSG_BUF_SIZE || msg->len > (len - sizeof(struct rpmsg_hdr))) { dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len); - return; + return -EINVAL; } /* use the dst addr to fetch the callback of the appropriate user */ @@ -842,9 +831,39 @@ static void rpmsg_recv_done(struct virtqueue *rvq) err = virtqueue_add_buf(vrp->rvq, &sg, 0, 1, msg, GFP_KERNEL); if (err < 0) { dev_err(dev, "failed to add a virtqueue buffer: %d\n", err); + return err; + } + + return 0; +} + +/* called when an rx buffer is used, and it's time to digest a message */ +static void rpmsg_recv_done(struct virtqueue *rvq) +{ + struct virtproc_info *vrp = rvq->vdev->priv; + struct device *dev = &rvq->vdev->dev; + struct rpmsg_hdr *msg; + unsigned int len, msgs_received = 0; + int err; + + msg = virtqueue_get_buf(rvq, &len); + if (!msg) { + dev_err(dev, "uhm, incoming signal, but no used buffer ?\n"); return; } + while (msg) { + err = rpmsg_recv_single(vrp, dev, msg, len); + if (err) + break; + + msgs_received++; + + msg = virtqueue_get_buf(rvq, &len); + }; + + dev_dbg(dev, "Received %u messages\n", msgs_received); + /* tell the remote processor we added another available rx buffer */ virtqueue_kick(vrp->rvq); } ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback 2013-04-07 12:50 ` [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback Ohad Ben-Cohen @ 2013-04-08 22:56 ` Tivy, Robert 2013-04-09 8:25 ` Ohad Ben-Cohen 0 siblings, 1 reply; 15+ messages in thread From: Tivy, Robert @ 2013-04-08 22:56 UTC (permalink / raw) To: linux-arm-kernel > -----Original Message----- > From: Ohad Ben-Cohen [mailto:ohad at wizery.com] > Sent: Sunday, April 07, 2013 5:51 AM > > On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: > > Change virtqueue callback function rpmsg_recv_done() to process all > > available messages instead of just one message. > > > > Signed-off-by: Robert Tivy <rtivy@ti.com> > > I'm thinking instead of adding an indentation level, let's split the > _recv function. > > This is what I have in mind - let me know if it works for you - thanks: > > diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c > b/drivers/rpmsg/virtio_rpmsg_bus.c > index a59684b..42b9872 100644 > --- a/drivers/rpmsg/virtio_rpmsg_bus.c > +++ b/drivers/rpmsg/virtio_rpmsg_bus.c > @@ -776,22 +776,11 @@ out: > } > EXPORT_SYMBOL(rpmsg_send_offchannel_raw); > > -/* called when an rx buffer is used, and it's time to digest a message > */ > -static void rpmsg_recv_done(struct virtqueue *rvq) > +static int rpmsg_recv_single(struct virtproc_info *vrp, struct device > *dev, > + struct rpmsg_hdr *msg, unsigned int len) > { > - struct rpmsg_hdr *msg; > - unsigned int len; > struct rpmsg_endpoint *ept; > struct scatterlist sg; > - struct virtproc_info *vrp = rvq->vdev->priv; > - struct device *dev = &rvq->vdev->dev; > - int err; > - > - msg = virtqueue_get_buf(rvq, &len); > - if (!msg) { > - dev_err(dev, "uhm, incoming signal, but no used buffer > ?\n"); > - return; > - } > > dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, > Reserved: %d\n", > msg->src, msg->dst, msg->len, > @@ -806,7 +795,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq) > if (len > RPMSG_BUF_SIZE || > msg->len > (len - sizeof(struct rpmsg_hdr))) { > dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, > msg->len); > - return; > + return -EINVAL; > } > > /* use the dst addr to fetch the callback of the appropriate > user */ > @@ -842,9 +831,39 @@ static void rpmsg_recv_done(struct virtqueue *rvq) > err = virtqueue_add_buf(vrp->rvq, &sg, 0, 1, msg, GFP_KERNEL); > if (err < 0) { > dev_err(dev, "failed to add a virtqueue buffer: %d\n", > err); > + return err; > + } > + > + return 0; > +} > + > +/* called when an rx buffer is used, and it's time to digest a message > */ > +static void rpmsg_recv_done(struct virtqueue *rvq) > +{ > + struct virtproc_info *vrp = rvq->vdev->priv; > + struct device *dev = &rvq->vdev->dev; > + struct rpmsg_hdr *msg; > + unsigned int len, msgs_received = 0; > + int err; > + > + msg = virtqueue_get_buf(rvq, &len); > + if (!msg) { > + dev_err(dev, "uhm, incoming signal, but no used buffer > ?\n"); > return; > } > > + while (msg) { > + err = rpmsg_recv_single(vrp, dev, msg, len); > + if (err) > + break; > + > + msgs_received++; > + > + msg = virtqueue_get_buf(rvq, &len); > + }; > + > + dev_dbg(dev, "Received %u messages\n", msgs_received); > + > /* tell the remote processor we added another available rx > buffer */ > virtqueue_kick(vrp->rvq); > } Shouldn't the virtqueue_kick() be called only when we successfully added a buffer with virtqueue_add_buf()? If so, we should make it: if (msgs_received) /* tell the remote processor we added another available rx buffer */ virtqueue_kick(vrp->rvp); } Thanks for the rewrite, looks better. I'll give it a try and let you know how it goes. Regards, - Rob ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback 2013-04-08 22:56 ` Tivy, Robert @ 2013-04-09 8:25 ` Ohad Ben-Cohen 2013-04-09 20:56 ` Tivy, Robert 0 siblings, 1 reply; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-09 8:25 UTC (permalink / raw) To: linux-arm-kernel On Tue, Apr 9, 2013 at 1:56 AM, Tivy, Robert <rtivy@ti.com> wrote: > Shouldn't the virtqueue_kick() be called only when we successfully added a buffer with virtqueue_add_buf()? Definitely, thanks for noticing! Take 2: diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index a59684b..4ade672 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c @@ -776,22 +776,11 @@ out: } EXPORT_SYMBOL(rpmsg_send_offchannel_raw); -/* called when an rx buffer is used, and it's time to digest a message */ -static void rpmsg_recv_done(struct virtqueue *rvq) +static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, + struct rpmsg_hdr *msg, unsigned int len) { - struct rpmsg_hdr *msg; - unsigned int len; struct rpmsg_endpoint *ept; struct scatterlist sg; - struct virtproc_info *vrp = rvq->vdev->priv; - struct device *dev = &rvq->vdev->dev; - int err; - - msg = virtqueue_get_buf(rvq, &len); - if (!msg) { - dev_err(dev, "uhm, incoming signal, but no used buffer ?\n"); - return; - } dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, Reserved: %d\n", msg->src, msg->dst, msg->len, @@ -806,7 +795,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq) if (len > RPMSG_BUF_SIZE || msg->len > (len - sizeof(struct rpmsg_hdr))) { dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, msg->len); - return; + return -EINVAL; } /* use the dst addr to fetch the callback of the appropriate user */ @@ -842,11 +831,42 @@ static void rpmsg_recv_done(struct virtqueue *rvq) err = virtqueue_add_buf(vrp->rvq, &sg, 0, 1, msg, GFP_KERNEL); if (err < 0) { dev_err(dev, "failed to add a virtqueue buffer: %d\n", err); + return err; + } + + return 0; +} + +/* called when an rx buffer is used, and it's time to digest a message */ +static void rpmsg_recv_done(struct virtqueue *rvq) +{ + struct virtproc_info *vrp = rvq->vdev->priv; + struct device *dev = &rvq->vdev->dev; + struct rpmsg_hdr *msg; + unsigned int len, msgs_received = 0; + int err; + + msg = virtqueue_get_buf(rvq, &len); + if (!msg) { + dev_err(dev, "uhm, incoming signal, but no used buffer ?\n"); return; } + while (msg) { + err = rpmsg_recv_single(vrp, dev, msg, len); + if (err) + break; + + msgs_received++; + + msg = virtqueue_get_buf(rvq, &len); + }; + + dev_dbg(dev, "Received %u messages\n", msgs_received); + /* tell the remote processor we added another available rx buffer */ - virtqueue_kick(vrp->rvq); + if (msgs_received) + virtqueue_kick(vrp->rvq); } /* > Thanks for the rewrite, looks better. I'll give it a try and let you know how it goes. Thanks! Ohad. ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback 2013-04-09 8:25 ` Ohad Ben-Cohen @ 2013-04-09 20:56 ` Tivy, Robert 2013-04-15 6:11 ` Ohad Ben-Cohen 0 siblings, 1 reply; 15+ messages in thread From: Tivy, Robert @ 2013-04-09 20:56 UTC (permalink / raw) To: linux-arm-kernel Just one small fix needed (see below) and it's good-to-go. > -----Original Message----- > From: Ohad Ben-Cohen [mailto:ohad at wizery.com] > Sent: Tuesday, April 09, 2013 1:26 AM > > On Tue, Apr 9, 2013 at 1:56 AM, Tivy, Robert <rtivy@ti.com> wrote: > > Shouldn't the virtqueue_kick() be called only when we successfully > added a buffer with virtqueue_add_buf()? > > Definitely, thanks for noticing! > > Take 2: > > diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c > b/drivers/rpmsg/virtio_rpmsg_bus.c > index a59684b..4ade672 100644 > --- a/drivers/rpmsg/virtio_rpmsg_bus.c > +++ b/drivers/rpmsg/virtio_rpmsg_bus.c > @@ -776,22 +776,11 @@ out: > } > EXPORT_SYMBOL(rpmsg_send_offchannel_raw); > > -/* called when an rx buffer is used, and it's time to digest a message > */ > -static void rpmsg_recv_done(struct virtqueue *rvq) > +static int rpmsg_recv_single(struct virtproc_info *vrp, struct device > *dev, > + struct rpmsg_hdr *msg, unsigned int len) > { > - struct rpmsg_hdr *msg; > - unsigned int len; > struct rpmsg_endpoint *ept; > struct scatterlist sg; > - struct virtproc_info *vrp = rvq->vdev->priv; > - struct device *dev = &rvq->vdev->dev; > - int err; This new function also uses an 'int err;', so the above line should not be removed. > - > - msg = virtqueue_get_buf(rvq, &len); > - if (!msg) { > - dev_err(dev, "uhm, incoming signal, but no used buffer > ?\n"); > - return; > - } > > dev_dbg(dev, "From: 0x%x, To: 0x%x, Len: %d, Flags: %d, > Reserved: %d\n", > msg->src, msg->dst, msg->len, > @@ -806,7 +795,7 @@ static void rpmsg_recv_done(struct virtqueue *rvq) > if (len > RPMSG_BUF_SIZE || > msg->len > (len - sizeof(struct rpmsg_hdr))) { > dev_warn(dev, "inbound msg too big: (%d, %d)\n", len, > msg->len); > - return; > + return -EINVAL; > } > > /* use the dst addr to fetch the callback of the appropriate > user */ > @@ -842,11 +831,42 @@ static void rpmsg_recv_done(struct virtqueue > *rvq) > err = virtqueue_add_buf(vrp->rvq, &sg, 0, 1, msg, GFP_KERNEL); > if (err < 0) { > dev_err(dev, "failed to add a virtqueue buffer: %d\n", > err); > + return err; > + } > + > + return 0; > +} > + > +/* called when an rx buffer is used, and it's time to digest a message > */ > +static void rpmsg_recv_done(struct virtqueue *rvq) > +{ > + struct virtproc_info *vrp = rvq->vdev->priv; > + struct device *dev = &rvq->vdev->dev; > + struct rpmsg_hdr *msg; > + unsigned int len, msgs_received = 0; > + int err; > + > + msg = virtqueue_get_buf(rvq, &len); > + if (!msg) { > + dev_err(dev, "uhm, incoming signal, but no used buffer > ?\n"); > return; > } > > + while (msg) { > + err = rpmsg_recv_single(vrp, dev, msg, len); > + if (err) > + break; > + > + msgs_received++; > + > + msg = virtqueue_get_buf(rvq, &len); > + }; > + > + dev_dbg(dev, "Received %u messages\n", msgs_received); > + > /* tell the remote processor we added another available rx > buffer */ > - virtqueue_kick(vrp->rvq); > + if (msgs_received) > + virtqueue_kick(vrp->rvq); > } > > /* > > > Thanks for the rewrite, looks better. I'll give it a try and let you > know how it goes. > > Thanks! > Ohad. I added the above-mentioned 'int err;' to my tree's rpmsg_recv_single() and tested it out, it worked well. So once that is corrected, you can add: Acked-by: Robert Tivy <rtivy@ti.com> Regards, - Rob ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback 2013-04-09 20:56 ` Tivy, Robert @ 2013-04-15 6:11 ` Ohad Ben-Cohen 0 siblings, 0 replies; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-15 6:11 UTC (permalink / raw) To: linux-arm-kernel On Tue, Apr 9, 2013 at 11:56 PM, Tivy, Robert <rtivy@ti.com> wrote: > This new function also uses an 'int err;', so the above line should not be removed. Added, thanks! > I added the above-mentioned 'int err;' to my tree's rpmsg_recv_single() and tested it out, it worked well. So once that is corrected, you can add: > Acked-by: Robert Tivy <rtivy@ti.com> No need to add your Acked-by as you are the author :) Applied - will show up in linux next soon, please check it out there. Thanks, Ohad. ^ permalink raw reply [flat|nested] 15+ messages in thread
[parent not found: <1364521307-1219-5-git-send-email-rtivy@ti.com>]
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP [not found] ` <1364521307-1219-5-git-send-email-rtivy@ti.com> @ 2013-04-07 13:02 ` Ohad Ben-Cohen 2013-04-07 17:55 ` Sergei Shtylyov 2013-04-08 22:02 ` Tivy, Robert 0 siblings, 2 replies; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-07 13:02 UTC (permalink / raw) To: linux-arm-kernel Hi Rob, On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote:> + > +static int da8xx_rproc_probe(struct platform_device *pdev) > +{ > + struct device *dev = &pdev->dev; > + struct da8xx_rproc *drproc; > + struct rproc *rproc; > + struct irq_data *irq_data; > + struct resource *bootreg_res; > + struct resource *chipsig_res; > + struct clk *dsp_clk; > + void __iomem *chipsig; > + void __iomem *bootreg; > + int irq; > + int ret; > + > + irq = platform_get_irq(pdev, 0); > + if (irq < 0) { > + dev_err(dev, "platform_get_irq(pdev, 0) error: %d\n", irq); > + return irq; > + } > + > + irq_data = irq_get_irq_data(irq); > + if (!irq_data) { > + dev_err(dev, "irq_get_irq_data(%d): NULL\n", irq); > + return -EINVAL; > + } > + > + bootreg_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (!bootreg_res) { > + dev_err(dev, > + "platform_get_resource(IORESOURCE_MEM, 0): NULL\n"); > + return -EADDRNOTAVAIL; > + } > + > + chipsig_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > + if (!chipsig_res) { > + dev_err(dev, > + "platform_get_resource(IORESOURCE_MEM, 1): NULL\n"); > + return -EADDRNOTAVAIL; > + } > + > + bootreg = devm_request_and_ioremap(dev, bootreg_res); > + if (!bootreg) { > + dev_err(dev, "unable to map boot register\n"); > + return -EADDRNOTAVAIL; > + } > + > + chipsig = devm_request_and_ioremap(dev, chipsig_res); > + if (!chipsig) { > + dev_err(dev, "unable to map CHIPSIG register\n"); > + return -EADDRNOTAVAIL; > + } > + > + dsp_clk = devm_clk_get(dev, NULL); > + if (IS_ERR(dsp_clk)) { > + dev_err(dev, "clk_get error: %ld\n", PTR_ERR(dsp_clk)); > + > + return PTR_RET(dsp_clk); > + } > + > + rproc = rproc_alloc(dev, "dsp", &da8xx_rproc_ops, da8xx_fw_name, > + sizeof(*drproc)); > + if (!rproc) > + return -ENOMEM; > + > + drproc = rproc->priv; > + drproc->rproc = rproc; > + > + platform_set_drvdata(pdev, rproc); > + > + /* everything the ISR needs is now setup, so hook it up */ > + ret = devm_request_threaded_irq(dev, irq, da8xx_rproc_callback, > + handle_event, 0, "da8xx-remoteproc", rproc); > + if (ret) { > + dev_err(dev, "devm_request_threaded_irq error: %d\n", ret); > + goto free_rproc; > + } > + > + /* > + * rproc_add() can end up enabling the DSP's clk with the DSP > + * *not* in reset, but da8xx_rproc_start() needs the DSP to be > + * held in reset at the time it is called. > + */ > + ret = reset_assert(dev); > + if (ret) > + goto free_rproc; > + > + ret = rproc_add(rproc); > + if (ret) { > + dev_err(dev, "rproc_add failed: %d\n", ret); > + goto free_rproc; > + } > + > + drproc->chipsig = chipsig; > + drproc->bootreg = bootreg; > + drproc->ack_fxn = irq_data->chip->irq_ack; > + drproc->irq_data = irq_data; > + drproc->irq = irq; > + drproc->dsp_clk = dsp_clk; > + > + return 0; > + > +free_rproc: > + rproc_put(rproc); > + > + return ret; > +} Two small changes please: - could you please fix the error path of probe? it seems that some resources are taken but not freed in case a failure shows up subsequently - seems like it's safer to set drproc before calling rproc_add otherwise you have a small race there If you could respin this one quickly it'd be great, thanks! Ohad. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP 2013-04-07 13:02 ` [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP Ohad Ben-Cohen @ 2013-04-07 17:55 ` Sergei Shtylyov 2013-04-08 23:55 ` Tivy, Robert 2013-04-08 22:02 ` Tivy, Robert 1 sibling, 1 reply; 15+ messages in thread From: Sergei Shtylyov @ 2013-04-07 17:55 UTC (permalink / raw) To: linux-arm-kernel Hello. On 04/07/2013 05:02 PM, Ohad Ben-Cohen wrote: > >> +static int da8xx_rproc_probe(struct platform_device *pdev) >> +{ >> + struct device *dev = &pdev->dev; >> + struct da8xx_rproc *drproc; >> + struct rproc *rproc; >> + struct irq_data *irq_data; >> + struct resource *bootreg_res; >> + struct resource *chipsig_res; >> + struct clk *dsp_clk; >> + void __iomem *chipsig; >> + void __iomem *bootreg; >> + int irq; >> + int ret; >> + [...] >> + bootreg = devm_request_and_ioremap(dev, bootreg_res); >> + if (!bootreg) { >> + dev_err(dev, "unable to map boot register\n"); >> + return -EADDRNOTAVAIL; >> + } >> + >> + chipsig = devm_request_and_ioremap(dev, chipsig_res); I suggest that you use more modern (yes, already a newer interface :-) devm_ioremap_resource() instead -- it returns the error code (as a pointer) in case of error, and it certainly doesn't require you to print error messages. >> + if (!chipsig) { >> + dev_err(dev, "unable to map CHIPSIG register\n"); >> + return -EADDRNOTAVAIL; >> + } >> WBR, Sergei ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP 2013-04-07 17:55 ` Sergei Shtylyov @ 2013-04-08 23:55 ` Tivy, Robert 2013-04-09 13:49 ` Sergei Shtylyov 0 siblings, 1 reply; 15+ messages in thread From: Tivy, Robert @ 2013-04-08 23:55 UTC (permalink / raw) To: linux-arm-kernel Hi Sergei, > -----Original Message----- > From: Sergei Shtylyov [mailto:sergei.shtylyov at cogentembedded.com] > Sent: Sunday, April 07, 2013 10:55 AM > > Hello. > > On 04/07/2013 05:02 PM, Ohad Ben-Cohen wrote: > > > > >> +static int da8xx_rproc_probe(struct platform_device *pdev) > >> +{ > >> + struct device *dev = &pdev->dev; > >> + struct da8xx_rproc *drproc; > >> + struct rproc *rproc; > >> + struct irq_data *irq_data; > >> + struct resource *bootreg_res; > >> + struct resource *chipsig_res; > >> + struct clk *dsp_clk; > >> + void __iomem *chipsig; > >> + void __iomem *bootreg; > >> + int irq; > >> + int ret; > >> + > [...] > >> + bootreg = devm_request_and_ioremap(dev, bootreg_res); > >> + if (!bootreg) { > >> + dev_err(dev, "unable to map boot register\n"); > >> + return -EADDRNOTAVAIL; > >> + } > >> + > >> + chipsig = devm_request_and_ioremap(dev, chipsig_res); > > I suggest that you use more modern (yes, already a newer interface > :-) > devm_ioremap_resource() instead -- it returns the error code (as a > pointer) > in case of error, and it certainly doesn't require you to print error > messages. Thanks, will do. I appreciate the notice of a more modern function, it's really tough to keep up with the flurry of activity to the kernel. Regarding this change, should the code use return PTR_ERR(bootreg); or return PTR_RET(bootreg); I ask because PTR_ERR() returns 'long' whereas PTR_RET() returns 'int' (and probe returns 'int'), but I see that the majority of existing code uses "return PTR_ERR()" in probe functions. > > >> + if (!chipsig) { > >> + dev_err(dev, "unable to map CHIPSIG register\n"); > >> + return -EADDRNOTAVAIL; > >> + } > >> > > WBR, Sergei Regards, - Rob ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP 2013-04-08 23:55 ` Tivy, Robert @ 2013-04-09 13:49 ` Sergei Shtylyov 0 siblings, 0 replies; 15+ messages in thread From: Sergei Shtylyov @ 2013-04-09 13:49 UTC (permalink / raw) To: linux-arm-kernel Hello. On 09-04-2013 3:55, Tivy, Robert wrote: >>>> +static int da8xx_rproc_probe(struct platform_device *pdev) >>>> +{ >>>> + struct device *dev = &pdev->dev; >>>> + struct da8xx_rproc *drproc; >>>> + struct rproc *rproc; >>>> + struct irq_data *irq_data; >>>> + struct resource *bootreg_res; >>>> + struct resource *chipsig_res; >>>> + struct clk *dsp_clk; >>>> + void __iomem *chipsig; >>>> + void __iomem *bootreg; >>>> + int irq; >>>> + int ret; >>>> + >> [...] >>>> + bootreg = devm_request_and_ioremap(dev, bootreg_res); >>>> + if (!bootreg) { >>>> + dev_err(dev, "unable to map boot register\n"); >>>> + return -EADDRNOTAVAIL; >>>> + } >>>> + >>>> + chipsig = devm_request_and_ioremap(dev, chipsig_res); >> I suggest that you use more modern (yes, already a newer interface >> :-) >> devm_ioremap_resource() instead -- it returns the error code (as a >> pointer) >> in case of error, and it certainly doesn't require you to print error >> messages. > Thanks, will do. > I appreciate the notice of a more modern function, it's really tough to keep up with the flurry of activity to the kernel. > Regarding this change, should the code use > return PTR_ERR(bootreg); > or > return PTR_RET(bootreg); The former, to avoid duplicate IS_ERR() check. > I ask because PTR_ERR() returns 'long' whereas PTR_RET() returns 'int' (and probe returns 'int'), but I see that the majority of existing code uses "return PTR_ERR()" in probe functions. But PTR_RET() uses PTR_ERR() internally anyway. >>>> + if (!chipsig) { >>>> + dev_err(dev, "unable to map CHIPSIG register\n"); >>>> + return -EADDRNOTAVAIL; >>>> + } WBR, Sergei ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP 2013-04-07 13:02 ` [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP Ohad Ben-Cohen 2013-04-07 17:55 ` Sergei Shtylyov @ 2013-04-08 22:02 ` Tivy, Robert 2013-04-09 9:03 ` Ohad Ben-Cohen 1 sibling, 1 reply; 15+ messages in thread From: Tivy, Robert @ 2013-04-08 22:02 UTC (permalink / raw) To: linux-arm-kernel Hi Ohad, > -----Original Message----- > From: Ohad Ben-Cohen [mailto:ohad at wizery.com] > Sent: Sunday, April 07, 2013 6:03 AM > To: Tivy, Robert > Cc: davinci-linux-open-source; linux-arm; Nori, Sekhar; Rob Landley; > linux-doc at vger.kernel.org; Grosen, Mark; Ring, Chris > Subject: Re: [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver > implementation for OMAP-L13x DSP > > Hi Rob, > > On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote:> + > > +static int da8xx_rproc_probe(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct da8xx_rproc *drproc; > > + struct rproc *rproc; > > + struct irq_data *irq_data; > > + struct resource *bootreg_res; > > + struct resource *chipsig_res; > > + struct clk *dsp_clk; > > + void __iomem *chipsig; > > + void __iomem *bootreg; > > + int irq; > > + int ret; > > + > > + irq = platform_get_irq(pdev, 0); > > + if (irq < 0) { > > + dev_err(dev, "platform_get_irq(pdev, 0) error: %d\n", > irq); > > + return irq; > > + } > > + > > + irq_data = irq_get_irq_data(irq); > > + if (!irq_data) { > > + dev_err(dev, "irq_get_irq_data(%d): NULL\n", irq); > > + return -EINVAL; > > + } > > + > > + bootreg_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + if (!bootreg_res) { > > + dev_err(dev, > > + "platform_get_resource(IORESOURCE_MEM, 0): > NULL\n"); > > + return -EADDRNOTAVAIL; > > + } > > + > > + chipsig_res = platform_get_resource(pdev, IORESOURCE_MEM, 1); > > + if (!chipsig_res) { > > + dev_err(dev, > > + "platform_get_resource(IORESOURCE_MEM, 1): > NULL\n"); > > + return -EADDRNOTAVAIL; > > + } > > + > > + bootreg = devm_request_and_ioremap(dev, bootreg_res); > > + if (!bootreg) { > > + dev_err(dev, "unable to map boot register\n"); > > + return -EADDRNOTAVAIL; > > + } > > + > > + chipsig = devm_request_and_ioremap(dev, chipsig_res); > > + if (!chipsig) { > > + dev_err(dev, "unable to map CHIPSIG register\n"); > > + return -EADDRNOTAVAIL; > > + } > > + > > + dsp_clk = devm_clk_get(dev, NULL); > > + if (IS_ERR(dsp_clk)) { > > + dev_err(dev, "clk_get error: %ld\n", > PTR_ERR(dsp_clk)); > > + > > + return PTR_RET(dsp_clk); > > + } > > + > > + rproc = rproc_alloc(dev, "dsp", &da8xx_rproc_ops, > da8xx_fw_name, > > + sizeof(*drproc)); > > + if (!rproc) > > + return -ENOMEM; > > + > > + drproc = rproc->priv; > > + drproc->rproc = rproc; > > + > > + platform_set_drvdata(pdev, rproc); > > + > > + /* everything the ISR needs is now setup, so hook it up */ > > + ret = devm_request_threaded_irq(dev, irq, > da8xx_rproc_callback, > > + handle_event, 0, "da8xx-remoteproc", rproc); > > + if (ret) { > > + dev_err(dev, "devm_request_threaded_irq error: %d\n", > ret); > > + goto free_rproc; > > + } > > + > > + /* > > + * rproc_add() can end up enabling the DSP's clk with the DSP > > + * *not* in reset, but da8xx_rproc_start() needs the DSP to > be > > + * held in reset at the time it is called. > > + */ > > + ret = reset_assert(dev); > > + if (ret) > > + goto free_rproc; > > + > > + ret = rproc_add(rproc); > > + if (ret) { > > + dev_err(dev, "rproc_add failed: %d\n", ret); > > + goto free_rproc; > > + } > > + > > + drproc->chipsig = chipsig; > > + drproc->bootreg = bootreg; > > + drproc->ack_fxn = irq_data->chip->irq_ack; > > + drproc->irq_data = irq_data; > > + drproc->irq = irq; > > + drproc->dsp_clk = dsp_clk; > > + > > + return 0; > > + > > +free_rproc: > > + rproc_put(rproc); > > + > > + return ret; > > +} > > Two small changes please: > > - could you please fix the error path of probe? it seems that some > resources are taken but not freed in case a failure shows up > subsequently I'm not sure what resources you mean? The platform_get_irq()/irq_get_irq_data()/platform_get_resource() calls don't have "put" counterparts. The "devm_*" calls get automatically cleaned up (and I wasn't able to find any existing example of some code that actually does the cleanup explicitly). > - seems like it's safer to set drproc before calling rproc_add > otherwise you have a small race there Agreed, will change. > > If you could respin this one quickly it'd be great, thanks! > > Ohad. Sergei had a comment to change devm_request_and_ioremap() to devm_ioremap_resource(), so I will submit a new patch with your and Sergei's comments applied. Regards, - Rob ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP 2013-04-08 22:02 ` Tivy, Robert @ 2013-04-09 9:03 ` Ohad Ben-Cohen 0 siblings, 0 replies; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-09 9:03 UTC (permalink / raw) To: linux-arm-kernel On Tue, Apr 9, 2013 at 1:02 AM, Tivy, Robert <rtivy@ti.com> wrote: > The platform_get_irq()/irq_get_irq_data()/platform_get_resource() calls don't have "put" counterparts. The "devm_*" calls get automatically cleaned up (and I wasn't able to find any existing example of some code that actually does the cleanup explicitly). Fair enough, thanks for looking. > Sergei had a comment to change devm_request_and_ioremap() to devm_ioremap_resource(), so I will submit a new patch with your and Sergei's comments applied. Thanks! ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 0/6] ARM: davinci: remoteproc support [not found] <1364521307-1219-1-git-send-email-rtivy@ti.com> ` (3 preceding siblings ...) [not found] ` <1364521307-1219-5-git-send-email-rtivy@ti.com> @ 2013-04-07 13:07 ` Ohad Ben-Cohen 2013-04-08 8:08 ` Sekhar Nori 4 siblings, 1 reply; 15+ messages in thread From: Ohad Ben-Cohen @ 2013-04-07 13:07 UTC (permalink / raw) To: linux-arm-kernel Hi Rob, On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: > This patch series adds remoteproc support for OMAP-L13x, along with needed > supporting mach-davinci infrastructure. Patches look good, thanks for pushing. I'm applying 2 and 3 now. Please ack the change I've done for 1 and I'll apply it too. No. 4 just needs a small change, if you could please respin quickly I'll apply it immediately. I prefer patches 5 and 6 go through Sekhar, guess after I'll have no. 4 applied in an immutable branch Sekhar could pull it and apply 5 and 6. Thanks, Ohad. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v9 0/6] ARM: davinci: remoteproc support 2013-04-07 13:07 ` [PATCH v9 0/6] ARM: davinci: remoteproc support Ohad Ben-Cohen @ 2013-04-08 8:08 ` Sekhar Nori 0 siblings, 0 replies; 15+ messages in thread From: Sekhar Nori @ 2013-04-08 8:08 UTC (permalink / raw) To: linux-arm-kernel On 4/7/2013 6:37 PM, Ohad Ben-Cohen wrote: > Hi Rob, > > On Fri, Mar 29, 2013 at 4:41 AM, Robert Tivy <rtivy@ti.com> wrote: >> This patch series adds remoteproc support for OMAP-L13x, along with needed >> supporting mach-davinci infrastructure. > > Patches look good, thanks for pushing. > > I'm applying 2 and 3 now. Please ack the change I've done for 1 and > I'll apply it too. No. 4 just needs a small change, if you could > please respin quickly I'll apply it immediately. > > I prefer patches 5 and 6 go through Sekhar, guess after I'll have no. > 4 applied in an immutable branch Sekhar could pull it and apply 5 and > 6. That should be fine. Please let me know once you have the immutable branch. Thanks, Sekhar ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2013-04-15 6:11 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <1364521307-1219-1-git-send-email-rtivy@ti.com> [not found] ` <1364521307-1219-3-git-send-email-rtivy@ti.com> 2013-04-07 12:13 ` [PATCH v9 2/6] remoteproc: Change typo FW_CONFIG to FW_LOADER for REMOTEPROC Ohad Ben-Cohen [not found] ` <1364521307-1219-4-git-send-email-rtivy@ti.com> 2013-04-07 12:39 ` [PATCH v9 3/6] remoteproc: Add support to rproc_alloc() for a default firmware name Ohad Ben-Cohen [not found] ` <1364521307-1219-2-git-send-email-rtivy@ti.com> 2013-04-07 12:50 ` [PATCH v9 1/6] rpmsg: Process all available messages in virtqueue callback Ohad Ben-Cohen 2013-04-08 22:56 ` Tivy, Robert 2013-04-09 8:25 ` Ohad Ben-Cohen 2013-04-09 20:56 ` Tivy, Robert 2013-04-15 6:11 ` Ohad Ben-Cohen [not found] ` <1364521307-1219-5-git-send-email-rtivy@ti.com> 2013-04-07 13:02 ` [PATCH v9 4/6] ARM: davinci: Add a remoteproc driver implementation for OMAP-L13x DSP Ohad Ben-Cohen 2013-04-07 17:55 ` Sergei Shtylyov 2013-04-08 23:55 ` Tivy, Robert 2013-04-09 13:49 ` Sergei Shtylyov 2013-04-08 22:02 ` Tivy, Robert 2013-04-09 9:03 ` Ohad Ben-Cohen 2013-04-07 13:07 ` [PATCH v9 0/6] ARM: davinci: remoteproc support Ohad Ben-Cohen 2013-04-08 8:08 ` Sekhar Nori
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).