aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-07-18 09:54:04 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-15 16:04:42 -0400
commit4bbc6d52e61a8a9c19fcc859c4acab89cb8cd4e5 (patch)
tree64ce43072ed8fa87bd8f5bc4d8fe5794a0373aef /drivers/media
parent4ec10bacd6bf08de39ebdba9e75060452cc313e0 (diff)
[media] soc-camera: Push probe-time power management to drivers
Several client drivers access the hardware at probe time, for instance to read the probe chip ID. Such chips need to be powered up when being probed. soc-camera handles this by powering chips up in the soc-camera probe implementation. However, this will break with non soc-camera hosts that don't perform the same operations. Fix the problem by pushing the power up/down from the soc-camera core down to individual drivers on a needs basis. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/i2c/soc_camera/imx074.c21
-rw-r--r--drivers/media/i2c/soc_camera/mt9m001.c17
-rw-r--r--drivers/media/i2c/soc_camera/mt9m111.c80
-rw-r--r--drivers/media/i2c/soc_camera/mt9t031.c37
-rw-r--r--drivers/media/i2c/soc_camera/mt9t112.c12
-rw-r--r--drivers/media/i2c/soc_camera/mt9v022.c5
-rw-r--r--drivers/media/i2c/soc_camera/ov2640.c11
-rw-r--r--drivers/media/i2c/soc_camera/ov5642.c21
-rw-r--r--drivers/media/i2c/soc_camera/ov6650.c19
-rw-r--r--drivers/media/i2c/soc_camera/ov772x.c14
-rw-r--r--drivers/media/i2c/soc_camera/ov9640.c17
-rw-r--r--drivers/media/i2c/soc_camera/ov9740.c23
-rw-r--r--drivers/media/i2c/soc_camera/rj54n1cb0c.c18
-rw-r--r--drivers/media/i2c/soc_camera/tw9910.c12
-rw-r--r--drivers/media/platform/soc_camera.c20
15 files changed, 204 insertions, 123 deletions
diff --git a/drivers/media/i2c/soc_camera/imx074.c b/drivers/media/i2c/soc_camera/imx074.c
index ade19873ed83..f8534eec9de9 100644
--- a/drivers/media/i2c/soc_camera/imx074.c
+++ b/drivers/media/i2c/soc_camera/imx074.c
@@ -310,26 +310,33 @@ static struct v4l2_subdev_ops imx074_subdev_ops = {
310 310
311static int imx074_video_probe(struct i2c_client *client) 311static int imx074_video_probe(struct i2c_client *client)
312{ 312{
313 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
313 int ret; 314 int ret;
314 u16 id; 315 u16 id;
315 316
317 ret = imx074_s_power(subdev, 1);
318 if (ret < 0)
319 return ret;
320
316 /* Read sensor Model ID */ 321 /* Read sensor Model ID */
317 ret = reg_read(client, 0); 322 ret = reg_read(client, 0);
318 if (ret < 0) 323 if (ret < 0)
319 return ret; 324 goto done;
320 325
321 id = ret << 8; 326 id = ret << 8;
322 327
323 ret = reg_read(client, 1); 328 ret = reg_read(client, 1);
324 if (ret < 0) 329 if (ret < 0)
325 return ret; 330 goto done;
326 331
327 id |= ret; 332 id |= ret;
328 333
329 dev_info(&client->dev, "Chip ID 0x%04x detected\n", id); 334 dev_info(&client->dev, "Chip ID 0x%04x detected\n", id);
330 335
331 if (id != 0x74) 336 if (id != 0x74) {
332 return -ENODEV; 337 ret = -ENODEV;
338 goto done;
339 }
333 340
334 /* PLL Setting EXTCLK=24MHz, 22.5times */ 341 /* PLL Setting EXTCLK=24MHz, 22.5times */
335 reg_write(client, PLL_MULTIPLIER, 0x2D); 342 reg_write(client, PLL_MULTIPLIER, 0x2D);
@@ -411,7 +418,11 @@ static int imx074_video_probe(struct i2c_client *client)
411 418
412 reg_write(client, GROUPED_PARAMETER_HOLD, 0x00); /* off */ 419 reg_write(client, GROUPED_PARAMETER_HOLD, 0x00); /* off */
413 420
414 return 0; 421 ret = 0;
422
423done:
424 imx074_s_power(subdev, 0);
425 return ret;
415} 426}
416 427
417static int imx074_probe(struct i2c_client *client, 428static int imx074_probe(struct i2c_client *client,
diff --git a/drivers/media/i2c/soc_camera/mt9m001.c b/drivers/media/i2c/soc_camera/mt9m001.c
index cd71230c51a9..d85be41ffa1d 100644
--- a/drivers/media/i2c/soc_camera/mt9m001.c
+++ b/drivers/media/i2c/soc_camera/mt9m001.c
@@ -490,6 +490,10 @@ static int mt9m001_video_probe(struct soc_camera_link *icl,
490 unsigned long flags; 490 unsigned long flags;
491 int ret; 491 int ret;
492 492
493 ret = mt9m001_s_power(&mt9m001->subdev, 1);
494 if (ret < 0)
495 return ret;
496
493 /* Enable the chip */ 497 /* Enable the chip */
494 data = reg_write(client, MT9M001_CHIP_ENABLE, 1); 498 data = reg_write(client, MT9M001_CHIP_ENABLE, 1);
495 dev_dbg(&client->dev, "write: %d\n", data); 499 dev_dbg(&client->dev, "write: %d\n", data);
@@ -511,7 +515,8 @@ static int mt9m001_video_probe(struct soc_camera_link *icl,
511 default: 515 default:
512 dev_err(&client->dev, 516 dev_err(&client->dev,
513 "No MT9M001 chip detected, register read %x\n", data); 517 "No MT9M001 chip detected, register read %x\n", data);
514 return -ENODEV; 518 ret = -ENODEV;
519 goto done;
515 } 520 }
516 521
517 mt9m001->num_fmts = 0; 522 mt9m001->num_fmts = 0;
@@ -540,11 +545,17 @@ static int mt9m001_video_probe(struct soc_camera_link *icl,
540 data == 0x8431 ? "C12STM" : "C12ST"); 545 data == 0x8431 ? "C12STM" : "C12ST");
541 546
542 ret = mt9m001_init(client); 547 ret = mt9m001_init(client);
543 if (ret < 0) 548 if (ret < 0) {
544 dev_err(&client->dev, "Failed to initialise the camera\n"); 549 dev_err(&client->dev, "Failed to initialise the camera\n");
550 goto done;
551 }
545 552
546 /* mt9m001_init() has reset the chip, returning registers to defaults */ 553 /* mt9m001_init() has reset the chip, returning registers to defaults */
547 return v4l2_ctrl_handler_setup(&mt9m001->hdl); 554 ret = v4l2_ctrl_handler_setup(&mt9m001->hdl);
555
556done:
557 mt9m001_s_power(&mt9m001->subdev, 0);
558 return ret;
548} 559}
549 560
550static void mt9m001_video_remove(struct soc_camera_link *icl) 561static void mt9m001_video_remove(struct soc_camera_link *icl)
diff --git a/drivers/media/i2c/soc_camera/mt9m111.c b/drivers/media/i2c/soc_camera/mt9m111.c
index e555f7739691..938c5c390eec 100644
--- a/drivers/media/i2c/soc_camera/mt9m111.c
+++ b/drivers/media/i2c/soc_camera/mt9m111.c
@@ -796,41 +796,6 @@ static int mt9m111_init(struct mt9m111 *mt9m111)
796 return ret; 796 return ret;
797} 797}
798 798
799/*
800 * Interface active, can use i2c. If it fails, it can indeed mean, that
801 * this wasn't our capture interface, so, we wait for the right one
802 */
803static int mt9m111_video_probe(struct i2c_client *client)
804{
805 struct mt9m111 *mt9m111 = to_mt9m111(client);
806 s32 data;
807 int ret;
808
809 data = reg_read(CHIP_VERSION);
810
811 switch (data) {
812 case 0x143a: /* MT9M111 or MT9M131 */
813 mt9m111->model = V4L2_IDENT_MT9M111;
814 dev_info(&client->dev,
815 "Detected a MT9M111/MT9M131 chip ID %x\n", data);
816 break;
817 case 0x148c: /* MT9M112 */
818 mt9m111->model = V4L2_IDENT_MT9M112;
819 dev_info(&client->dev, "Detected a MT9M112 chip ID %x\n", data);
820 break;
821 default:
822 dev_err(&client->dev,
823 "No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
824 data);
825 return -ENODEV;
826 }
827
828 ret = mt9m111_init(mt9m111);
829 if (ret)
830 return ret;
831 return v4l2_ctrl_handler_setup(&mt9m111->hdl);
832}
833
834static int mt9m111_power_on(struct mt9m111 *mt9m111) 799static int mt9m111_power_on(struct mt9m111 *mt9m111)
835{ 800{
836 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev); 801 struct i2c_client *client = v4l2_get_subdevdata(&mt9m111->subdev);
@@ -941,6 +906,51 @@ static struct v4l2_subdev_ops mt9m111_subdev_ops = {
941 .video = &mt9m111_subdev_video_ops, 906 .video = &mt9m111_subdev_video_ops,
942}; 907};
943 908
909/*
910 * Interface active, can use i2c. If it fails, it can indeed mean, that
911 * this wasn't our capture interface, so, we wait for the right one
912 */
913static int mt9m111_video_probe(struct i2c_client *client)
914{
915 struct mt9m111 *mt9m111 = to_mt9m111(client);
916 s32 data;
917 int ret;
918
919 ret = mt9m111_s_power(&mt9m111->subdev, 1);
920 if (ret < 0)
921 return ret;
922
923 data = reg_read(CHIP_VERSION);
924
925 switch (data) {
926 case 0x143a: /* MT9M111 or MT9M131 */
927 mt9m111->model = V4L2_IDENT_MT9M111;
928 dev_info(&client->dev,
929 "Detected a MT9M111/MT9M131 chip ID %x\n", data);
930 break;
931 case 0x148c: /* MT9M112 */
932 mt9m111->model = V4L2_IDENT_MT9M112;
933 dev_info(&client->dev, "Detected a MT9M112 chip ID %x\n", data);
934 break;
935 default:
936 dev_err(&client->dev,
937 "No MT9M111/MT9M112/MT9M131 chip detected register read %x\n",
938 data);
939 ret = -ENODEV;
940 goto done;
941 }
942
943 ret = mt9m111_init(mt9m111);
944 if (ret)
945 goto done;
946
947 ret = v4l2_ctrl_handler_setup(&mt9m111->hdl);
948
949done:
950 mt9m111_s_power(&mt9m111->subdev, 0);
951 return ret;
952}
953
944static int mt9m111_probe(struct i2c_client *client, 954static int mt9m111_probe(struct i2c_client *client,
945 const struct i2c_device_id *did) 955 const struct i2c_device_id *did)
946{ 956{
diff --git a/drivers/media/i2c/soc_camera/mt9t031.c b/drivers/media/i2c/soc_camera/mt9t031.c
index 9666e202e395..d74607adc585 100644
--- a/drivers/media/i2c/soc_camera/mt9t031.c
+++ b/drivers/media/i2c/soc_camera/mt9t031.c
@@ -161,14 +161,6 @@ static int mt9t031_idle(struct i2c_client *client)
161 return ret >= 0 ? 0 : -EIO; 161 return ret >= 0 ? 0 : -EIO;
162} 162}
163 163
164static int mt9t031_disable(struct i2c_client *client)
165{
166 /* Disable the chip */
167 reg_clear(client, MT9T031_OUTPUT_CONTROL, 2);
168
169 return 0;
170}
171
172static int mt9t031_s_stream(struct v4l2_subdev *sd, int enable) 164static int mt9t031_s_stream(struct v4l2_subdev *sd, int enable)
173{ 165{
174 struct i2c_client *client = v4l2_get_subdevdata(sd); 166 struct i2c_client *client = v4l2_get_subdevdata(sd);
@@ -643,9 +635,15 @@ static int mt9t031_video_probe(struct i2c_client *client)
643 s32 data; 635 s32 data;
644 int ret; 636 int ret;
645 637
646 /* Enable the chip */ 638 ret = mt9t031_s_power(&mt9t031->subdev, 1);
647 data = reg_write(client, MT9T031_CHIP_ENABLE, 1); 639 if (ret < 0)
648 dev_dbg(&client->dev, "write: %d\n", data); 640 return ret;
641
642 ret = mt9t031_idle(client);
643 if (ret < 0) {
644 dev_err(&client->dev, "Failed to initialise the camera\n");
645 goto done;
646 }
649 647
650 /* Read out the chip version register */ 648 /* Read out the chip version register */
651 data = reg_read(client, MT9T031_CHIP_VERSION); 649 data = reg_read(client, MT9T031_CHIP_VERSION);
@@ -657,16 +655,16 @@ static int mt9t031_video_probe(struct i2c_client *client)
657 default: 655 default:
658 dev_err(&client->dev, 656 dev_err(&client->dev,
659 "No MT9T031 chip detected, register read %x\n", data); 657 "No MT9T031 chip detected, register read %x\n", data);
660 return -ENODEV; 658 ret = -ENODEV;
659 goto done;
661 } 660 }
662 661
663 dev_info(&client->dev, "Detected a MT9T031 chip ID %x\n", data); 662 dev_info(&client->dev, "Detected a MT9T031 chip ID %x\n", data);
664 663
665 ret = mt9t031_idle(client); 664 ret = v4l2_ctrl_handler_setup(&mt9t031->hdl);
666 if (ret < 0) 665
667 dev_err(&client->dev, "Failed to initialise the camera\n"); 666done:
668 else 667 mt9t031_s_power(&mt9t031->subdev, 0);
669 v4l2_ctrl_handler_setup(&mt9t031->hdl);
670 668
671 return ret; 669 return ret;
672} 670}
@@ -817,12 +815,7 @@ static int mt9t031_probe(struct i2c_client *client,
817 mt9t031->xskip = 1; 815 mt9t031->xskip = 1;
818 mt9t031->yskip = 1; 816 mt9t031->yskip = 1;
819 817
820 mt9t031_idle(client);
821
822 ret = mt9t031_video_probe(client); 818 ret = mt9t031_video_probe(client);
823
824 mt9t031_disable(client);
825
826 if (ret) { 819 if (ret) {
827 v4l2_ctrl_handler_free(&mt9t031->hdl); 820 v4l2_ctrl_handler_free(&mt9t031->hdl);
828 kfree(mt9t031); 821 kfree(mt9t031);
diff --git a/drivers/media/i2c/soc_camera/mt9t112.c b/drivers/media/i2c/soc_camera/mt9t112.c
index 624ceec44e18..9ba428ede516 100644
--- a/drivers/media/i2c/soc_camera/mt9t112.c
+++ b/drivers/media/i2c/soc_camera/mt9t112.c
@@ -1041,6 +1041,11 @@ static int mt9t112_camera_probe(struct i2c_client *client)
1041 struct mt9t112_priv *priv = to_mt9t112(client); 1041 struct mt9t112_priv *priv = to_mt9t112(client);
1042 const char *devname; 1042 const char *devname;
1043 int chipid; 1043 int chipid;
1044 int ret;
1045
1046 ret = mt9t112_s_power(&priv->subdev, 1);
1047 if (ret < 0)
1048 return ret;
1044 1049
1045 /* 1050 /*
1046 * check and show chip ID 1051 * check and show chip ID
@@ -1058,12 +1063,15 @@ static int mt9t112_camera_probe(struct i2c_client *client)
1058 break; 1063 break;
1059 default: 1064 default:
1060 dev_err(&client->dev, "Product ID error %04x\n", chipid); 1065 dev_err(&client->dev, "Product ID error %04x\n", chipid);
1061 return -ENODEV; 1066 ret = -ENODEV;
1067 goto done;
1062 } 1068 }
1063 1069
1064 dev_info(&client->dev, "%s chip ID %04x\n", devname, chipid); 1070 dev_info(&client->dev, "%s chip ID %04x\n", devname, chipid);
1065 1071
1066 return 0; 1072done:
1073 mt9t112_s_power(&priv->subdev, 0);
1074 return ret;
1067} 1075}
1068 1076
1069static int mt9t112_probe(struct i2c_client *client, 1077static int mt9t112_probe(struct i2c_client *client,
diff --git a/drivers/media/i2c/soc_camera/mt9v022.c b/drivers/media/i2c/soc_camera/mt9v022.c
index 5f09cb702bf7..2edea8489092 100644
--- a/drivers/media/i2c/soc_camera/mt9v022.c
+++ b/drivers/media/i2c/soc_camera/mt9v022.c
@@ -578,6 +578,10 @@ static int mt9v022_video_probe(struct i2c_client *client)
578 int ret; 578 int ret;
579 unsigned long flags; 579 unsigned long flags;
580 580
581 ret = mt9v022_s_power(&mt9v022->subdev, 1);
582 if (ret < 0)
583 return ret;
584
581 /* Read out the chip version register */ 585 /* Read out the chip version register */
582 data = reg_read(client, MT9V022_CHIP_VERSION); 586 data = reg_read(client, MT9V022_CHIP_VERSION);
583 587
@@ -648,6 +652,7 @@ static int mt9v022_video_probe(struct i2c_client *client)
648 dev_err(&client->dev, "Failed to initialise the camera\n"); 652 dev_err(&client->dev, "Failed to initialise the camera\n");
649 653
650ei2c: 654ei2c:
655 mt9v022_s_power(&mt9v022->subdev, 0);
651 return ret; 656 return ret;
652} 657}
653 658
diff --git a/drivers/media/i2c/soc_camera/ov2640.c b/drivers/media/i2c/soc_camera/ov2640.c
index 16ed091c702d..78ac5744cb5d 100644
--- a/drivers/media/i2c/soc_camera/ov2640.c
+++ b/drivers/media/i2c/soc_camera/ov2640.c
@@ -955,6 +955,10 @@ static int ov2640_video_probe(struct i2c_client *client)
955 const char *devname; 955 const char *devname;
956 int ret; 956 int ret;
957 957
958 ret = ov2640_s_power(&priv->subdev, 1);
959 if (ret < 0)
960 return ret;
961
958 /* 962 /*
959 * check and show product ID and manufacturer ID 963 * check and show product ID and manufacturer ID
960 */ 964 */
@@ -973,16 +977,17 @@ static int ov2640_video_probe(struct i2c_client *client)
973 dev_err(&client->dev, 977 dev_err(&client->dev,
974 "Product ID error %x:%x\n", pid, ver); 978 "Product ID error %x:%x\n", pid, ver);
975 ret = -ENODEV; 979 ret = -ENODEV;
976 goto err; 980 goto done;
977 } 981 }
978 982
979 dev_info(&client->dev, 983 dev_info(&client->dev,
980 "%s Product ID %0x:%0x Manufacturer ID %x:%x\n", 984 "%s Product ID %0x:%0x Manufacturer ID %x:%x\n",
981 devname, pid, ver, midh, midl); 985 devname, pid, ver, midh, midl);
982 986
983 return v4l2_ctrl_handler_setup(&priv->hdl); 987 ret = v4l2_ctrl_handler_setup(&priv->hdl);
984 988
985err: 989done:
990 ov2640_s_power(&priv->subdev, 0);
986 return ret; 991 return ret;
987} 992}
988 993
diff --git a/drivers/media/i2c/soc_camera/ov5642.c b/drivers/media/i2c/soc_camera/ov5642.c
index 61824c6911d5..d886c0b9ce44 100644
--- a/drivers/media/i2c/soc_camera/ov5642.c
+++ b/drivers/media/i2c/soc_camera/ov5642.c
@@ -980,29 +980,40 @@ static struct v4l2_subdev_ops ov5642_subdev_ops = {
980 980
981static int ov5642_video_probe(struct i2c_client *client) 981static int ov5642_video_probe(struct i2c_client *client)
982{ 982{
983 struct v4l2_subdev *subdev = i2c_get_clientdata(client);
983 int ret; 984 int ret;
984 u8 id_high, id_low; 985 u8 id_high, id_low;
985 u16 id; 986 u16 id;
986 987
988 ret = ov5642_s_power(subdev, 1);
989 if (ret < 0)
990 return ret;
991
987 /* Read sensor Model ID */ 992 /* Read sensor Model ID */
988 ret = reg_read(client, REG_CHIP_ID_HIGH, &id_high); 993 ret = reg_read(client, REG_CHIP_ID_HIGH, &id_high);
989 if (ret < 0) 994 if (ret < 0)
990 return ret; 995 goto done;
991 996
992 id = id_high << 8; 997 id = id_high << 8;
993 998
994 ret = reg_read(client, REG_CHIP_ID_LOW, &id_low); 999 ret = reg_read(client, REG_CHIP_ID_LOW, &id_low);
995 if (ret < 0) 1000 if (ret < 0)
996 return ret; 1001 goto done;
997 1002
998 id |= id_low; 1003 id |= id_low;
999 1004
1000 dev_info(&client->dev, "Chip ID 0x%04x detected\n", id); 1005 dev_info(&client->dev, "Chip ID 0x%04x detected\n", id);
1001 1006
1002 if (id != 0x5642) 1007 if (id != 0x5642) {
1003 return -ENODEV; 1008 ret = -ENODEV;
1009 goto done;
1010 }
1004 1011
1005 return 0; 1012 ret = 0;
1013
1014done:
1015 ov5642_s_power(subdev, 0);
1016 return ret;
1006} 1017}
1007 1018
1008static int ov5642_probe(struct i2c_client *client, 1019static int ov5642_probe(struct i2c_client *client,
diff --git a/drivers/media/i2c/soc_camera/ov6650.c b/drivers/media/i2c/soc_camera/ov6650.c
index 12d57a5dd810..65b031f333b7 100644
--- a/drivers/media/i2c/soc_camera/ov6650.c
+++ b/drivers/media/i2c/soc_camera/ov6650.c
@@ -829,8 +829,13 @@ static int ov6650_prog_dflt(struct i2c_client *client)
829 829
830static int ov6650_video_probe(struct i2c_client *client) 830static int ov6650_video_probe(struct i2c_client *client)
831{ 831{
832 struct ov6650 *priv = to_ov6650(client);
832 u8 pidh, pidl, midh, midl; 833 u8 pidh, pidl, midh, midl;
833 int ret = 0; 834 int ret;
835
836 ret = ov6650_s_power(&priv->subdev, 1);
837 if (ret < 0)
838 return ret;
834 839
835 /* 840 /*
836 * check and show product ID and manufacturer ID 841 * check and show product ID and manufacturer ID
@@ -844,12 +849,13 @@ static int ov6650_video_probe(struct i2c_client *client)
844 ret = ov6650_reg_read(client, REG_MIDL, &midl); 849 ret = ov6650_reg_read(client, REG_MIDL, &midl);
845 850
846 if (ret) 851 if (ret)
847 return ret; 852 goto done;
848 853
849 if ((pidh != OV6650_PIDH) || (pidl != OV6650_PIDL)) { 854 if ((pidh != OV6650_PIDH) || (pidl != OV6650_PIDL)) {
850 dev_err(&client->dev, "Product ID error 0x%02x:0x%02x\n", 855 dev_err(&client->dev, "Product ID error 0x%02x:0x%02x\n",
851 pidh, pidl); 856 pidh, pidl);
852 return -ENODEV; 857 ret = -ENODEV;
858 goto done;
853 } 859 }
854 860
855 dev_info(&client->dev, 861 dev_info(&client->dev,
@@ -859,7 +865,11 @@ static int ov6650_video_probe(struct i2c_client *client)
859 ret = ov6650_reset(client); 865 ret = ov6650_reset(client);
860 if (!ret) 866 if (!ret)
861 ret = ov6650_prog_dflt(client); 867 ret = ov6650_prog_dflt(client);
868 if (!ret)
869 ret = v4l2_ctrl_handler_setup(&priv->hdl);
862 870
871done:
872 ov6650_s_power(&priv->subdev, 0);
863 return ret; 873 return ret;
864} 874}
865 875
@@ -1019,9 +1029,6 @@ static int ov6650_probe(struct i2c_client *client,
1019 priv->colorspace = V4L2_COLORSPACE_JPEG; 1029 priv->colorspace = V4L2_COLORSPACE_JPEG;
1020 1030
1021 ret = ov6650_video_probe(client); 1031 ret = ov6650_video_probe(client);
1022 if (!ret)
1023 ret = v4l2_ctrl_handler_setup(&priv->hdl);
1024
1025 if (ret) { 1032 if (ret) {
1026 v4l2_ctrl_handler_free(&priv->hdl); 1033 v4l2_ctrl_handler_free(&priv->hdl);
1027 kfree(priv); 1034 kfree(priv);
diff --git a/drivers/media/i2c/soc_camera/ov772x.c b/drivers/media/i2c/soc_camera/ov772x.c
index a022662da98a..641f6f43d7ee 100644
--- a/drivers/media/i2c/soc_camera/ov772x.c
+++ b/drivers/media/i2c/soc_camera/ov772x.c
@@ -962,6 +962,11 @@ static int ov772x_video_probe(struct i2c_client *client)
962 struct ov772x_priv *priv = to_ov772x(client); 962 struct ov772x_priv *priv = to_ov772x(client);
963 u8 pid, ver; 963 u8 pid, ver;
964 const char *devname; 964 const char *devname;
965 int ret;
966
967 ret = ov772x_s_power(&priv->subdev, 1);
968 if (ret < 0)
969 return ret;
965 970
966 /* 971 /*
967 * check and show product ID and manufacturer ID 972 * check and show product ID and manufacturer ID
@@ -981,7 +986,8 @@ static int ov772x_video_probe(struct i2c_client *client)
981 default: 986 default:
982 dev_err(&client->dev, 987 dev_err(&client->dev,
983 "Product ID error %x:%x\n", pid, ver); 988 "Product ID error %x:%x\n", pid, ver);
984 return -ENODEV; 989 ret = -ENODEV;
990 goto done;
985 } 991 }
986 992
987 dev_info(&client->dev, 993 dev_info(&client->dev,
@@ -991,7 +997,11 @@ static int ov772x_video_probe(struct i2c_client *client)
991 ver, 997 ver,
992 i2c_smbus_read_byte_data(client, MIDH), 998 i2c_smbus_read_byte_data(client, MIDH),
993 i2c_smbus_read_byte_data(client, MIDL)); 999 i2c_smbus_read_byte_data(client, MIDL));
994 return v4l2_ctrl_handler_setup(&priv->hdl); 1000 ret = v4l2_ctrl_handler_setup(&priv->hdl);
1001
1002done:
1003 ov772x_s_power(&priv->subdev, 0);
1004 return ret;
995} 1005}
996 1006
997static const struct v4l2_ctrl_ops ov772x_ctrl_ops = { 1007static const struct v4l2_ctrl_ops ov772x_ctrl_ops = {
diff --git a/drivers/media/i2c/soc_camera/ov9640.c b/drivers/media/i2c/soc_camera/ov9640.c
index 53156ef1ec0c..b323684eaf77 100644
--- a/drivers/media/i2c/soc_camera/ov9640.c
+++ b/drivers/media/i2c/soc_camera/ov9640.c
@@ -592,7 +592,11 @@ static int ov9640_video_probe(struct i2c_client *client)
592 struct ov9640_priv *priv = to_ov9640_sensor(sd); 592 struct ov9640_priv *priv = to_ov9640_sensor(sd);
593 u8 pid, ver, midh, midl; 593 u8 pid, ver, midh, midl;
594 const char *devname; 594 const char *devname;
595 int ret = 0; 595 int ret;
596
597 ret = ov9640_s_power(&priv->subdev, 1);
598 if (ret < 0)
599 return ret;
596 600
597 /* 601 /*
598 * check and show product ID and manufacturer ID 602 * check and show product ID and manufacturer ID
@@ -606,7 +610,7 @@ static int ov9640_video_probe(struct i2c_client *client)
606 if (!ret) 610 if (!ret)
607 ret = ov9640_reg_read(client, OV9640_MIDL, &midl); 611 ret = ov9640_reg_read(client, OV9640_MIDL, &midl);
608 if (ret) 612 if (ret)
609 return ret; 613 goto done;
610 614
611 switch (VERSION(pid, ver)) { 615 switch (VERSION(pid, ver)) {
612 case OV9640_V2: 616 case OV9640_V2:
@@ -621,13 +625,18 @@ static int ov9640_video_probe(struct i2c_client *client)
621 break; 625 break;
622 default: 626 default:
623 dev_err(&client->dev, "Product ID error %x:%x\n", pid, ver); 627 dev_err(&client->dev, "Product ID error %x:%x\n", pid, ver);
624 return -ENODEV; 628 ret = -ENODEV;
629 goto done;
625 } 630 }
626 631
627 dev_info(&client->dev, "%s Product ID %0x:%0x Manufacturer ID %x:%x\n", 632 dev_info(&client->dev, "%s Product ID %0x:%0x Manufacturer ID %x:%x\n",
628 devname, pid, ver, midh, midl); 633 devname, pid, ver, midh, midl);
629 634
630 return v4l2_ctrl_handler_setup(&priv->hdl); 635 ret = v4l2_ctrl_handler_setup(&priv->hdl);
636
637done:
638 ov9640_s_power(&priv->subdev, 0);
639 return ret;
631} 640}
632 641
633static const struct v4l2_ctrl_ops ov9640_ctrl_ops = { 642static const struct v4l2_ctrl_ops ov9640_ctrl_ops = {
diff --git a/drivers/media/i2c/soc_camera/ov9740.c b/drivers/media/i2c/soc_camera/ov9740.c
index 10c0ba9f5bcd..7a55889e397b 100644
--- a/drivers/media/i2c/soc_camera/ov9740.c
+++ b/drivers/media/i2c/soc_camera/ov9740.c
@@ -853,34 +853,38 @@ static int ov9740_video_probe(struct i2c_client *client)
853 u8 modelhi, modello; 853 u8 modelhi, modello;
854 int ret; 854 int ret;
855 855
856 ret = ov9740_s_power(&priv->subdev, 1);
857 if (ret < 0)
858 return ret;
859
856 /* 860 /*
857 * check and show product ID and manufacturer ID 861 * check and show product ID and manufacturer ID
858 */ 862 */
859 ret = ov9740_reg_read(client, OV9740_MODEL_ID_HI, &modelhi); 863 ret = ov9740_reg_read(client, OV9740_MODEL_ID_HI, &modelhi);
860 if (ret < 0) 864 if (ret < 0)
861 goto err; 865 goto done;
862 866
863 ret = ov9740_reg_read(client, OV9740_MODEL_ID_LO, &modello); 867 ret = ov9740_reg_read(client, OV9740_MODEL_ID_LO, &modello);
864 if (ret < 0) 868 if (ret < 0)
865 goto err; 869 goto done;
866 870
867 priv->model = (modelhi << 8) | modello; 871 priv->model = (modelhi << 8) | modello;
868 872
869 ret = ov9740_reg_read(client, OV9740_REVISION_NUMBER, &priv->revision); 873 ret = ov9740_reg_read(client, OV9740_REVISION_NUMBER, &priv->revision);
870 if (ret < 0) 874 if (ret < 0)
871 goto err; 875 goto done;
872 876
873 ret = ov9740_reg_read(client, OV9740_MANUFACTURER_ID, &priv->manid); 877 ret = ov9740_reg_read(client, OV9740_MANUFACTURER_ID, &priv->manid);
874 if (ret < 0) 878 if (ret < 0)
875 goto err; 879 goto done;
876 880
877 ret = ov9740_reg_read(client, OV9740_SMIA_VERSION, &priv->smiaver); 881 ret = ov9740_reg_read(client, OV9740_SMIA_VERSION, &priv->smiaver);
878 if (ret < 0) 882 if (ret < 0)
879 goto err; 883 goto done;
880 884
881 if (priv->model != 0x9740) { 885 if (priv->model != 0x9740) {
882 ret = -ENODEV; 886 ret = -ENODEV;
883 goto err; 887 goto done;
884 } 888 }
885 889
886 priv->ident = V4L2_IDENT_OV9740; 890 priv->ident = V4L2_IDENT_OV9740;
@@ -889,7 +893,10 @@ static int ov9740_video_probe(struct i2c_client *client)
889 "Manufacturer 0x%02x, SMIA Version 0x%02x\n", 893 "Manufacturer 0x%02x, SMIA Version 0x%02x\n",
890 priv->model, priv->revision, priv->manid, priv->smiaver); 894 priv->model, priv->revision, priv->manid, priv->smiaver);
891 895
892err: 896 ret = v4l2_ctrl_handler_setup(&priv->hdl);
897
898done:
899 ov9740_s_power(&priv->subdev, 0);
893 return ret; 900 return ret;
894} 901}
895 902
@@ -973,8 +980,6 @@ static int ov9740_probe(struct i2c_client *client,
973 } 980 }
974 981
975 ret = ov9740_video_probe(client); 982 ret = ov9740_video_probe(client);
976 if (!ret)
977 ret = v4l2_ctrl_handler_setup(&priv->hdl);
978 if (ret < 0) { 983 if (ret < 0) {
979 v4l2_ctrl_handler_free(&priv->hdl); 984 v4l2_ctrl_handler_free(&priv->hdl);
980 kfree(priv); 985 kfree(priv);
diff --git a/drivers/media/i2c/soc_camera/rj54n1cb0c.c b/drivers/media/i2c/soc_camera/rj54n1cb0c.c
index ca1cee7c66cb..32226c9024f9 100644
--- a/drivers/media/i2c/soc_camera/rj54n1cb0c.c
+++ b/drivers/media/i2c/soc_camera/rj54n1cb0c.c
@@ -1296,9 +1296,14 @@ static struct v4l2_subdev_ops rj54n1_subdev_ops = {
1296static int rj54n1_video_probe(struct i2c_client *client, 1296static int rj54n1_video_probe(struct i2c_client *client,
1297 struct rj54n1_pdata *priv) 1297 struct rj54n1_pdata *priv)
1298{ 1298{
1299 struct rj54n1 *rj54n1 = to_rj54n1(client);
1299 int data1, data2; 1300 int data1, data2;
1300 int ret; 1301 int ret;
1301 1302
1303 ret = rj54n1_s_power(&rj54n1->subdev, 1);
1304 if (ret < 0)
1305 return ret;
1306
1302 /* Read out the chip version register */ 1307 /* Read out the chip version register */
1303 data1 = reg_read(client, RJ54N1_DEV_CODE); 1308 data1 = reg_read(client, RJ54N1_DEV_CODE);
1304 data2 = reg_read(client, RJ54N1_DEV_CODE2); 1309 data2 = reg_read(client, RJ54N1_DEV_CODE2);
@@ -1307,18 +1312,21 @@ static int rj54n1_video_probe(struct i2c_client *client,
1307 ret = -ENODEV; 1312 ret = -ENODEV;
1308 dev_info(&client->dev, "No RJ54N1CB0C found, read 0x%x:0x%x\n", 1313 dev_info(&client->dev, "No RJ54N1CB0C found, read 0x%x:0x%x\n",
1309 data1, data2); 1314 data1, data2);
1310 goto ei2c; 1315 goto done;
1311 } 1316 }
1312 1317
1313 /* Configure IOCTL polarity from the platform data: 0 or 1 << 7. */ 1318 /* Configure IOCTL polarity from the platform data: 0 or 1 << 7. */
1314 ret = reg_write(client, RJ54N1_IOC, priv->ioctl_high << 7); 1319 ret = reg_write(client, RJ54N1_IOC, priv->ioctl_high << 7);
1315 if (ret < 0) 1320 if (ret < 0)
1316 goto ei2c; 1321 goto done;
1317 1322
1318 dev_info(&client->dev, "Detected a RJ54N1CB0C chip ID 0x%x:0x%x\n", 1323 dev_info(&client->dev, "Detected a RJ54N1CB0C chip ID 0x%x:0x%x\n",
1319 data1, data2); 1324 data1, data2);
1320 1325
1321ei2c: 1326 ret = v4l2_ctrl_handler_setup(&rj54n1->hdl);
1327
1328done:
1329 rj54n1_s_power(&rj54n1->subdev, 0);
1322 return ret; 1330 return ret;
1323} 1331}
1324 1332
@@ -1382,9 +1390,9 @@ static int rj54n1_probe(struct i2c_client *client,
1382 if (ret < 0) { 1390 if (ret < 0) {
1383 v4l2_ctrl_handler_free(&rj54n1->hdl); 1391 v4l2_ctrl_handler_free(&rj54n1->hdl);
1384 kfree(rj54n1); 1392 kfree(rj54n1);
1385 return ret;
1386 } 1393 }
1387 return v4l2_ctrl_handler_setup(&rj54n1->hdl); 1394
1395 return ret;
1388} 1396}
1389 1397
1390static int rj54n1_remove(struct i2c_client *client) 1398static int rj54n1_remove(struct i2c_client *client)
diff --git a/drivers/media/i2c/soc_camera/tw9910.c b/drivers/media/i2c/soc_camera/tw9910.c
index f28365051878..140716e71a15 100644
--- a/drivers/media/i2c/soc_camera/tw9910.c
+++ b/drivers/media/i2c/soc_camera/tw9910.c
@@ -780,6 +780,7 @@ static int tw9910_video_probe(struct i2c_client *client)
780{ 780{
781 struct tw9910_priv *priv = to_tw9910(client); 781 struct tw9910_priv *priv = to_tw9910(client);
782 s32 id; 782 s32 id;
783 int ret;
783 784
784 /* 785 /*
785 * tw9910 only use 8 or 16 bit bus width 786 * tw9910 only use 8 or 16 bit bus width
@@ -790,6 +791,10 @@ static int tw9910_video_probe(struct i2c_client *client)
790 return -ENODEV; 791 return -ENODEV;
791 } 792 }
792 793
794 ret = tw9910_s_power(&priv->subdev, 1);
795 if (ret < 0)
796 return ret;
797
793 /* 798 /*
794 * check and show Product ID 799 * check and show Product ID
795 * So far only revisions 0 and 1 have been seen 800 * So far only revisions 0 and 1 have been seen
@@ -803,7 +808,8 @@ static int tw9910_video_probe(struct i2c_client *client)
803 dev_err(&client->dev, 808 dev_err(&client->dev,
804 "Product ID error %x:%x\n", 809 "Product ID error %x:%x\n",
805 id, priv->revision); 810 id, priv->revision);
806 return -ENODEV; 811 ret = -ENODEV;
812 goto done;
807 } 813 }
808 814
809 dev_info(&client->dev, 815 dev_info(&client->dev,
@@ -811,7 +817,9 @@ static int tw9910_video_probe(struct i2c_client *client)
811 817
812 priv->norm = V4L2_STD_NTSC; 818 priv->norm = V4L2_STD_NTSC;
813 819
814 return 0; 820done:
821 tw9910_s_power(&priv->subdev, 0);
822 return ret;
815} 823}
816 824
817static struct v4l2_subdev_core_ops tw9910_subdev_core_ops = { 825static struct v4l2_subdev_core_ops tw9910_subdev_core_ops = {
diff --git a/drivers/media/platform/soc_camera.c b/drivers/media/platform/soc_camera.c
index 8e1548e16f54..f94055505d70 100644
--- a/drivers/media/platform/soc_camera.c
+++ b/drivers/media/platform/soc_camera.c
@@ -1086,22 +1086,6 @@ static int soc_camera_probe(struct soc_camera_device *icd)
1086 if (ret < 0) 1086 if (ret < 0)
1087 goto eadd; 1087 goto eadd;
1088 1088
1089 /*
1090 * This will not yet call v4l2_subdev_core_ops::s_power(1), because the
1091 * subdevice has not been initialised yet. We'll have to call it once
1092 * again after initialisation, even though it shouldn't be needed, we
1093 * don't do any IO here.
1094 *
1095 * The device pointer passed to soc_camera_power_on(), and ultimately to
1096 * the platform callback, should be the subdev physical device. However,
1097 * we have no way to retrieve a pointer to that device here. This isn't
1098 * a real issue, as no platform currently uses the device pointer, and
1099 * this soc_camera_power_on() call will be removed in the next commit.
1100 */
1101 ret = soc_camera_power_on(icd->pdev, icl);
1102 if (ret < 0)
1103 goto epower;
1104
1105 /* Must have icd->vdev before registering the device */ 1089 /* Must have icd->vdev before registering the device */
1106 ret = video_dev_create(icd); 1090 ret = video_dev_create(icd);
1107 if (ret < 0) 1091 if (ret < 0)
@@ -1171,8 +1155,6 @@ static int soc_camera_probe(struct soc_camera_device *icd)
1171 1155
1172 ici->ops->remove(icd); 1156 ici->ops->remove(icd);
1173 1157
1174 __soc_camera_power_off(icd);
1175
1176 mutex_unlock(&icd->video_lock); 1158 mutex_unlock(&icd->video_lock);
1177 1159
1178 return 0; 1160 return 0;
@@ -1193,8 +1175,6 @@ eadddev:
1193 video_device_release(icd->vdev); 1175 video_device_release(icd->vdev);
1194 icd->vdev = NULL; 1176 icd->vdev = NULL;
1195evdc: 1177evdc:
1196 __soc_camera_power_off(icd);
1197epower:
1198 ici->ops->remove(icd); 1178 ici->ops->remove(icd);
1199eadd: 1179eadd:
1200 regulator_bulk_free(icl->num_regulators, icl->regulators); 1180 regulator_bulk_free(icl->num_regulators, icl->regulators);