[media] ov2640: print error if devm_*_optional*() fails
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Wed, 19 Apr 2017 12:58:22 +0000 (09:58 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Tue, 25 Apr 2017 10:08:21 +0000 (07:08 -0300)
devm_gpiod_get_optional() can return -ENOSYS if GPIOLIB is
disabled, causing probe to fail. Warn the user if this
happens.

Acked-by: Sakari Ailus <sakari.ailus@linux.intel.com>
Acked-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/i2c/ov2640.c

index 4a2ae24f8722026194235e16ecc9ddd62166a1fb..e6d0c1f64f0b1083c99d6dc4a3a5d3430f8b1265 100644 (file)
@@ -765,17 +765,17 @@ static int ov2640_s_register(struct v4l2_subdev *sd,
 
 static int ov2640_s_power(struct v4l2_subdev *sd, int on)
 {
+#ifdef CONFIG_GPIOLIB
        struct i2c_client *client = v4l2_get_subdevdata(sd);
        struct ov2640_priv *priv = to_ov2640(client);
 
-#ifdef CONFIG_GPIOLIB
        if (priv->pwdn_gpio)
                gpiod_direction_output(priv->pwdn_gpio, !on);
        if (on && priv->resetb_gpio) {
                /* Active the resetb pin to perform a reset pulse */
                gpiod_direction_output(priv->resetb_gpio, 1);
                usleep_range(3000, 5000);
-               gpiod_direction_output(priv->resetb_gpio, 0);
+               gpiod_set_value(priv->resetb_gpio, 0);
        }
 #endif
        return 0;
@@ -1048,21 +1048,35 @@ static const struct v4l2_subdev_ops ov2640_subdev_ops = {
 static int ov2640_probe_dt(struct i2c_client *client,
                struct ov2640_priv *priv)
 {
+       int ret;
+
        /* Request the reset GPIO deasserted */
        priv->resetb_gpio = devm_gpiod_get_optional(&client->dev, "resetb",
                        GPIOD_OUT_LOW);
+
        if (!priv->resetb_gpio)
                dev_dbg(&client->dev, "resetb gpio is not assigned!\n");
-       else if (IS_ERR(priv->resetb_gpio))
-               return PTR_ERR(priv->resetb_gpio);
+
+       ret = PTR_ERR_OR_ZERO(priv->resetb_gpio);
+       if (ret && ret != -ENOSYS) {
+               dev_dbg(&client->dev,
+                       "Error %d while getting resetb gpio\n", ret);
+               return ret;
+       }
 
        /* Request the power down GPIO asserted */
        priv->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "pwdn",
                        GPIOD_OUT_HIGH);
+
        if (!priv->pwdn_gpio)
                dev_dbg(&client->dev, "pwdn gpio is not assigned!\n");
-       else if (IS_ERR(priv->pwdn_gpio))
-               return PTR_ERR(priv->pwdn_gpio);
+
+       ret = PTR_ERR_OR_ZERO(priv->pwdn_gpio);
+       if (ret && ret != -ENOSYS) {
+               dev_dbg(&client->dev,
+                       "Error %d while getting pwdn gpio\n", ret);
+               return ret;
+       }
 
        return 0;
 }