On 25/04/17 11:45, Mauro Carvalho Chehab wrote:
> 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
> Signed-off-by: Mauro Carvalho Chehab
Acked-by: Hans Verkuil
Thanks!
Regards,
Hans
> ---
> drivers/media/i2c/ov2640.c | 30 ++
> 1 file changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/i2c/ov2640.c b/drivers/media/i2c/ov2640.c
> index 4a2ae24f8722..e6d0c1f64f0b 100644
> --- a/drivers/media/i2c/ov2640.c
> +++ b/drivers/media/i2c/ov2640.c
> @@ -765,17 +765,17 @@ static int ov2640_s_register(struct v4l2_subdev *sd,
>
> static int ov2640_s_power(struct v4l2_subdev *sd, int on)
> {
> - struct i2c_client *client = v4l2_get_subdevdata(sd);
> - struct ov2640_priv *priv = to_ov2640(client);
> -
> #ifdef CONFIG_GPIOLIB
> + struct i2c_client *client = v4l2_get_subdevdata(sd);
> + struct ov2640_priv *priv = to_ov2640(client);
> +
> 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(>dev, "resetb",
> GPIOD_OUT_LOW);
> +
> if (!priv->resetb_gpio)
> dev_dbg(>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(>dev,
> + "Error %d while getting resetb gpio\n", ret);
> + return ret;
> + }
>
> /* Request the power down GPIO asserted */
> priv->pwdn_gpio = devm_gpiod_get_optional(>dev, "pwdn",
> GPIOD_OUT_HIGH);
> +
> if (!priv->pwdn_gpio)
> dev_dbg(>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(>dev,
> + "Error %d while getting pwdn gpio\n", ret);
> + return ret;
> + }
>
> return 0;
> }
>