[10/14] media: atomisp: Register /dev/* nodes at the end of atomisp_pci_probe()
Commit Message
Register /dev/* nodes at the end of atomisp_pci_probe(), this is
a prerequisite for dropping the loading mutex + ready flag kludge
for delaying open() calls on the /dev/* nodes .
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
.../staging/media/atomisp/pci/atomisp_v4l2.c | 40 +++++++++++++------
1 file changed, 28 insertions(+), 12 deletions(-)
Comments
On Thu, Sep 01, 2022 at 11:46:22AM +0200, Hans de Goede wrote:
> Register /dev/* nodes at the end of atomisp_pci_probe(), this is
> a prerequisite for dropping the loading mutex + ready flag kludge
> for delaying open() calls on the /dev/* nodes .
...
> for (; i > 0; i--)
> atomisp_subdev_unregister_entities(
> &isp->asd[i - 1]);
This...
> + for (i = 0; i < isp->num_of_streams; i++) {
> + err = atomisp_subdev_register_video_nodes(&isp->asd[i], &isp->v4l2_dev);
> + if (err)
> + return err;
> + }
...and this looks like a dup.
Perhaps a helper?
Hi,
Thank you for reviewing this series.
On 9/1/22 21:56, Andy Shevchenko wrote:
> On Thu, Sep 01, 2022 at 11:46:22AM +0200, Hans de Goede wrote:
>> Register /dev/* nodes at the end of atomisp_pci_probe(), this is
>> a prerequisite for dropping the loading mutex + ready flag kludge
>> for delaying open() calls on the /dev/* nodes .
>
> ...
>
>> for (; i > 0; i--)
>> atomisp_subdev_unregister_entities(
>> &isp->asd[i - 1]);
>
> This...
I presume you mean the few lines above that actually:
@@ -1194,11 +1194,8 @@ static int atomisp_register_entities(struct atomisp_device *isp)
struct atomisp_sub_device *asd = &isp->asd[i];
ret = atomisp_subdev_register_subdev(asd, &isp->v4l2_dev);
- if (ret == 0)
- ret = atomisp_subdev_register_video_nodes(asd, &isp->v4l2_dev);
if (ret < 0) {
- dev_err(isp->dev,
- "atomisp_subdev_register_entities fail\n");
+ dev_err(isp->dev, "atomisp_subdev_register_subdev fail\n");
for (; i > 0; i--)
atomisp_subdev_unregister_entities(
&isp->asd[i - 1]);
Notice the atomisp_subdev_register_video_nodes() call is removed there,
leaving only atomisp_subdev_register_subdev() (which is also why the dev_err
msg is changed).
Actually moving that call (+ a few others) to later is the whole
purpose of this patch.
>
>> + for (i = 0; i < isp->num_of_streams; i++) {
>> + err = atomisp_subdev_register_video_nodes(&isp->asd[i], &isp->v4l2_dev);
>> + if (err)
>> + return err;
>> + }
>
> ...and this looks like a dup.
Where as this time while looping over the stream the code is calling
atomisp_subdev_register_video_nodes().
So yes we have 2 "for (i = 0; i < isp->num_of_streams; i++) {}"
loops, but:
Loop 1 does: atomisp_subdev_register_subdev()
Loop 2 does: atomisp_subdev_register_video_nodes()
So I see no duplication here?
Regards,
Hans
On Fri, Sep 2, 2022 at 12:04 PM Hans de Goede <hdegoede@redhat.com> wrote:
> On 9/1/22 21:56, Andy Shevchenko wrote:
> > On Thu, Sep 01, 2022 at 11:46:22AM +0200, Hans de Goede wrote:
...
> >> for (; i > 0; i--)
> >> atomisp_subdev_unregister_entities(
> >> &isp->asd[i - 1]);
> >
> > This...
>
> I presume you mean the few lines above that actually:
No, I cited a not modified code in the upper part. That said, it's a
remark for further improvements, but a helper can be introduced in
this patch due to the below part.
> >> + for (i = 0; i < isp->num_of_streams; i++) {
> >> + err = atomisp_subdev_register_video_nodes(&isp->asd[i], &isp->v4l2_dev);
> >> + if (err)
> >> + return err;
> >> + }
> >
> > ...and this looks like a dup.
On Fri, Sep 2, 2022 at 12:10 PM Andy Shevchenko
<andy.shevchenko@gmail.com> wrote:
> On Fri, Sep 2, 2022 at 12:04 PM Hans de Goede <hdegoede@redhat.com> wrote:
> > On 9/1/22 21:56, Andy Shevchenko wrote:
> > > On Thu, Sep 01, 2022 at 11:46:22AM +0200, Hans de Goede wrote:
>
> ...
>
> > >> for (; i > 0; i--)
> > >> atomisp_subdev_unregister_entities(
> > >> &isp->asd[i - 1]);
> > >
> > > This...
> >
> > I presume you mean the few lines above that actually:
>
> No, I cited a not modified code in the upper part. That said, it's a
> remark for further improvements, but a helper can be introduced in
> this patch due to the below part.
>
> > >> + for (i = 0; i < isp->num_of_streams; i++) {
> > >> + err = atomisp_subdev_register_video_nodes(&isp->asd[i], &isp->v4l2_dev);
> > >> + if (err)
> > >> + return err;
> > >> + }
> > >
> > > ...and this looks like a dup.
Pushed "enter" too early to send.
But with your explanation I see the difference now.
@@ -1194,11 +1194,8 @@ static int atomisp_register_entities(struct atomisp_device *isp)
struct atomisp_sub_device *asd = &isp->asd[i];
ret = atomisp_subdev_register_subdev(asd, &isp->v4l2_dev);
- if (ret == 0)
- ret = atomisp_subdev_register_video_nodes(asd, &isp->v4l2_dev);
if (ret < 0) {
- dev_err(isp->dev,
- "atomisp_subdev_register_entities fail\n");
+ dev_err(isp->dev, "atomisp_subdev_register_subdev fail\n");
for (; i > 0; i--)
atomisp_subdev_unregister_entities(
&isp->asd[i - 1]);
@@ -1248,11 +1245,7 @@ static int atomisp_register_entities(struct atomisp_device *isp)
dev_warn(isp->dev, "too many atomisp inputs, TPG ignored.\n");
}
- ret = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
- if (ret < 0)
- goto link_failed;
-
- return media_device_register(&isp->media_dev);
+ return 0;
link_failed:
for (i = 0; i < isp->num_of_streams; i++)
@@ -1275,6 +1268,27 @@ static int atomisp_register_entities(struct atomisp_device *isp)
return ret;
}
+static int atomisp_register_device_nodes(struct atomisp_device *isp)
+{
+ int i, err;
+
+ for (i = 0; i < isp->num_of_streams; i++) {
+ err = atomisp_subdev_register_video_nodes(&isp->asd[i], &isp->v4l2_dev);
+ if (err)
+ return err;
+ }
+
+ err = atomisp_create_pads_links(isp);
+ if (err)
+ return err;
+
+ err = v4l2_device_register_subdev_nodes(&isp->v4l2_dev);
+ if (err)
+ return err;
+
+ return media_device_register(&isp->media_dev);
+}
+
static int atomisp_initialize_modules(struct atomisp_device *isp)
{
int ret;
@@ -1687,9 +1701,6 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
dev_err(&pdev->dev, "atomisp_register_entities failed (%d)\n", err);
goto register_entities_fail;
}
- err = atomisp_create_pads_links(isp);
- if (err < 0)
- goto register_entities_fail;
/* init atomisp wdts */
err = init_atomisp_wdts(isp);
if (err != 0)
@@ -1727,8 +1738,13 @@ static int atomisp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *i
isp->firmware = NULL;
isp->css_env.isp_css_fw.data = NULL;
isp->ready = true;
+
rt_mutex_unlock(&isp->loading);
+ err = atomisp_register_device_nodes(isp);
+ if (err)
+ goto css_init_fail;
+
atomisp_drvfs_init(isp);
return 0;