[media] ov2640: print error if devm_*_optional*() fails

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>
This commit is contained in:
Mauro Carvalho Chehab 2017-04-19 09:58:22 -03:00
parent 9eb9db3a0f
commit 3622d3e77e

View 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) static int ov2640_s_power(struct v4l2_subdev *sd, int on)
{ {
#ifdef CONFIG_GPIOLIB
struct i2c_client *client = v4l2_get_subdevdata(sd); struct i2c_client *client = v4l2_get_subdevdata(sd);
struct ov2640_priv *priv = to_ov2640(client); struct ov2640_priv *priv = to_ov2640(client);
#ifdef CONFIG_GPIOLIB
if (priv->pwdn_gpio) if (priv->pwdn_gpio)
gpiod_direction_output(priv->pwdn_gpio, !on); gpiod_direction_output(priv->pwdn_gpio, !on);
if (on && priv->resetb_gpio) { if (on && priv->resetb_gpio) {
/* Active the resetb pin to perform a reset pulse */ /* Active the resetb pin to perform a reset pulse */
gpiod_direction_output(priv->resetb_gpio, 1); gpiod_direction_output(priv->resetb_gpio, 1);
usleep_range(3000, 5000); usleep_range(3000, 5000);
gpiod_direction_output(priv->resetb_gpio, 0); gpiod_set_value(priv->resetb_gpio, 0);
} }
#endif #endif
return 0; return 0;
@ -1048,21 +1048,35 @@ static const struct v4l2_subdev_ops ov2640_subdev_ops = {
static int ov2640_probe_dt(struct i2c_client *client, static int ov2640_probe_dt(struct i2c_client *client,
struct ov2640_priv *priv) struct ov2640_priv *priv)
{ {
int ret;
/* Request the reset GPIO deasserted */ /* Request the reset GPIO deasserted */
priv->resetb_gpio = devm_gpiod_get_optional(&client->dev, "resetb", priv->resetb_gpio = devm_gpiod_get_optional(&client->dev, "resetb",
GPIOD_OUT_LOW); GPIOD_OUT_LOW);
if (!priv->resetb_gpio) if (!priv->resetb_gpio)
dev_dbg(&client->dev, "resetb gpio is not assigned!\n"); 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 */ /* Request the power down GPIO asserted */
priv->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "pwdn", priv->pwdn_gpio = devm_gpiod_get_optional(&client->dev, "pwdn",
GPIOD_OUT_HIGH); GPIOD_OUT_HIGH);
if (!priv->pwdn_gpio) if (!priv->pwdn_gpio)
dev_dbg(&client->dev, "pwdn gpio is not assigned!\n"); 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; return 0;
} }