media: ov2680: Wait for endpoint fwnode before continuing with probe()
authorHans de Goede <hdegoede@redhat.com>
Thu, 3 Aug 2023 09:33:31 +0000 (11:33 +0200)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Mon, 14 Aug 2023 18:27:56 +0000 (20:27 +0200)
Defer probe() until the endpoint fwnode is available. This is necessary
on ACPI platforms where the bridge code creating the fwnodes may also e.g.
set the "clock-frequency" device property and add GPIO mappings.

Acked-by: Rui Miguel Silva <rmfrfs@gmail.com>
Reviewed-by: Daniel Scally <dan.scally@ideasonboard.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/media/i2c/ov2680.c

index a8c257f..d466458 100644 (file)
@@ -717,11 +717,23 @@ static int ov2680_check_id(struct ov2680_dev *sensor)
 static int ov2680_parse_dt(struct ov2680_dev *sensor)
 {
        struct device *dev = sensor->dev;
+       struct fwnode_handle *ep_fwnode;
        struct gpio_desc *gpio;
        unsigned int rate = 0;
        int i, ret;
 
        /*
+        * Sometimes the fwnode graph is initialized by the bridge driver.
+        * Bridge drivers doing this may also add GPIO mappings, wait for this.
+        */
+       ep_fwnode = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL);
+       if (!ep_fwnode)
+               return dev_err_probe(dev, -EPROBE_DEFER,
+                                    "waiting for fwnode graph endpoint\n");
+
+       fwnode_handle_put(ep_fwnode);
+
+       /*
         * The pin we want is named XSHUTDN in the datasheet. Linux sensor
         * drivers have standardized on using "powerdown" as con-id name
         * for powerdown or shutdown pins. Older DTB files use "reset",
@@ -801,7 +813,7 @@ static int ov2680_probe(struct i2c_client *client)
 
        ret = ov2680_parse_dt(sensor);
        if (ret < 0)
-               return -EINVAL;
+               return ret;
 
        ret = ov2680_mode_init(sensor);
        if (ret < 0)