Message ID | 20211222082349.30378-6-arnaud.pouliquen@foss.st.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | remoteproc: restructure the remoteproc VirtIO device | expand |
Hi Arnaud, On Wed, Dec 22, 2021 at 09:23:48AM +0100, Arnaud Pouliquen wrote: > Add capability to create platform device for the rproc virtio. > This is a step to move forward the management of the rproc virtio > as an independent device. > > Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> > --- > drivers/remoteproc/remoteproc_internal.h | 3 ++ > drivers/remoteproc/remoteproc_virtio.c | 36 ++++++++++++++++++++++++ > 2 files changed, 39 insertions(+) > > diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h > index 6f511c50a15d..3007d29a26e1 100644 > --- a/drivers/remoteproc/remoteproc_internal.h > +++ b/drivers/remoteproc/remoteproc_internal.h > @@ -37,6 +37,9 @@ int rproc_of_parse_firmware(struct device *dev, int index, > > /* from remoteproc_virtio.c */ > int rproc_rvdev_add_device(struct rproc_vdev *rvdev); > +struct platform_device * > +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_pdata *vdev_data); > +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev); > irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); > void rproc_vdev_release(struct kref *ref); > > diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c > index 5f8005caeb6e..5eef679cc520 100644 > --- a/drivers/remoteproc/remoteproc_virtio.c > +++ b/drivers/remoteproc/remoteproc_virtio.c > @@ -578,6 +578,42 @@ void rproc_vdev_release(struct kref *ref) > rproc_rvdev_remove_device(rvdev); > } > > +/** > + * rproc_virtio_register_device() - register a remoteproc virtio device > + * @rproc: rproc handle to add the remoteproc virtio device to > + * @vdev_data: platform device data > + * > + * Return: 0 on success, and an appropriate error value otherwise > + */ > +struct platform_device * > +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_pdata *vdev_data) > +{ > + struct device *dev = &rproc->dev; > + struct platform_device *pdev; > + > + pdev = platform_device_register_data(dev, "rproc-virtio", vdev_data->index, vdev_data, > + sizeof(*vdev_data)); > + if (PTR_ERR_OR_ZERO(pdev)) { Can you expand on the reason to use PTR_ERR_OR_ZERO() rather than IS_ERR()? Looking at the documentation for platform_device_register_data(), it should not return 0... > + dev_err(rproc->dev.parent, > + "failed to create rproc-virtio device\n"); > + } > + > + return pdev; > +} > +EXPORT_SYMBOL(rproc_virtio_register_device); > + > +/** > + * rproc_virtio_unregister_device() - unregister a remoteproc virtio device > + * @rvdev: remote proc virtio handle to unregister > + * > + */ > +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev) > +{ > + if (rvdev->pdev) > + platform_device_unregister(rvdev->pdev); > +} > +EXPORT_SYMBOL(rproc_virtio_unregister_device); > + > static int rproc_virtio_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > -- > 2.17.1 >
diff --git a/drivers/remoteproc/remoteproc_internal.h b/drivers/remoteproc/remoteproc_internal.h index 6f511c50a15d..3007d29a26e1 100644 --- a/drivers/remoteproc/remoteproc_internal.h +++ b/drivers/remoteproc/remoteproc_internal.h @@ -37,6 +37,9 @@ int rproc_of_parse_firmware(struct device *dev, int index, /* from remoteproc_virtio.c */ int rproc_rvdev_add_device(struct rproc_vdev *rvdev); +struct platform_device * +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_pdata *vdev_data); +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev); irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id); void rproc_vdev_release(struct kref *ref); diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index 5f8005caeb6e..5eef679cc520 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c @@ -578,6 +578,42 @@ void rproc_vdev_release(struct kref *ref) rproc_rvdev_remove_device(rvdev); } +/** + * rproc_virtio_register_device() - register a remoteproc virtio device + * @rproc: rproc handle to add the remoteproc virtio device to + * @vdev_data: platform device data + * + * Return: 0 on success, and an appropriate error value otherwise + */ +struct platform_device * +rproc_virtio_register_device(struct rproc *rproc, struct rproc_vdev_pdata *vdev_data) +{ + struct device *dev = &rproc->dev; + struct platform_device *pdev; + + pdev = platform_device_register_data(dev, "rproc-virtio", vdev_data->index, vdev_data, + sizeof(*vdev_data)); + if (PTR_ERR_OR_ZERO(pdev)) { + dev_err(rproc->dev.parent, + "failed to create rproc-virtio device\n"); + } + + return pdev; +} +EXPORT_SYMBOL(rproc_virtio_register_device); + +/** + * rproc_virtio_unregister_device() - unregister a remoteproc virtio device + * @rvdev: remote proc virtio handle to unregister + * + */ +void rproc_virtio_unregister_device(struct rproc_vdev *rvdev) +{ + if (rvdev->pdev) + platform_device_unregister(rvdev->pdev); +} +EXPORT_SYMBOL(rproc_virtio_unregister_device); + static int rproc_virtio_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev;
Add capability to create platform device for the rproc virtio. This is a step to move forward the management of the rproc virtio as an independent device. Signed-off-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> --- drivers/remoteproc/remoteproc_internal.h | 3 ++ drivers/remoteproc/remoteproc_virtio.c | 36 ++++++++++++++++++++++++ 2 files changed, 39 insertions(+)