V4L/DVB (9783): Change power on/off sequence on ov772x

Signed-off-by: Kuninori Morimoto <morimoto.kuninori@renesas.com>
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
diff --git a/drivers/media/video/ov772x.c b/drivers/media/video/ov772x.c
index 0af2ca6..d3b54a4 100644
--- a/drivers/media/video/ov772x.c
+++ b/drivers/media/video/ov772x.c
@@ -593,12 +593,30 @@
 
 static int ov772x_init(struct soc_camera_device *icd)
 {
-	return 0;
+	struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
+	int ret = 0;
+
+	if (priv->info->link.power) {
+		ret = priv->info->link.power(&priv->client->dev, 1);
+		if (ret < 0)
+			return ret;
+	}
+
+	if (priv->info->link.reset)
+		ret = priv->info->link.reset(&priv->client->dev);
+
+	return ret;
 }
 
 static int ov772x_release(struct soc_camera_device *icd)
 {
-	return 0;
+	struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
+	int ret = 0;
+
+	if (priv->info->link.power)
+		ret = priv->info->link.power(&priv->client->dev, 0);
+
+	return ret;
 }
 
 static int ov772x_start_capture(struct soc_camera_device *icd)
@@ -814,9 +832,6 @@
 	icd->formats     = ov772x_fmt_lists;
 	icd->num_formats = ARRAY_SIZE(ov772x_fmt_lists);
 
-	if (priv->info->link.power)
-		priv->info->link.power(&priv->client->dev, 1);
-
 	/*
 	 * check and show product ID and manufacturer ID
 	 */
@@ -824,8 +839,8 @@
 	ver = i2c_smbus_read_byte_data(priv->client, VER);
 	if (pid != 0x77 ||
 	    ver != 0x21) {
-		if (priv->info->link.power)
-			priv->info->link.power(&priv->client->dev, 0);
+		dev_err(&icd->dev,
+			"Product ID error %x:%x\n", pid, ver);
 		return -ENODEV;
 	}
 
@@ -842,13 +857,7 @@
 
 static void ov772x_video_remove(struct soc_camera_device *icd)
 {
-	struct ov772x_priv *priv = container_of(icd, struct ov772x_priv, icd);
-
 	soc_camera_video_stop(icd);
-
-	if (priv->info->link.power)
-		priv->info->link.power(&priv->client->dev, 0);
-
 }
 
 static struct soc_camera_ops ov772x_ops = {