diff options
Diffstat (limited to 'drivers/media/video/soc_camera.c')
-rw-r--r-- | drivers/media/video/soc_camera.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c index b82710745ba8..eb25756a07af 100644 --- a/drivers/media/video/soc_camera.c +++ b/drivers/media/video/soc_camera.c | |||
@@ -526,10 +526,6 @@ static int soc_camera_open(struct file *file) | |||
526 | }, | 526 | }, |
527 | }; | 527 | }; |
528 | 528 | ||
529 | ret = soc_camera_power_on(icd, icl); | ||
530 | if (ret < 0) | ||
531 | goto epower; | ||
532 | |||
533 | /* The camera could have been already on, try to reset */ | 529 | /* The camera could have been already on, try to reset */ |
534 | if (icl->reset) | 530 | if (icl->reset) |
535 | icl->reset(icd->pdev); | 531 | icl->reset(icd->pdev); |
@@ -540,6 +536,10 @@ static int soc_camera_open(struct file *file) | |||
540 | goto eiciadd; | 536 | goto eiciadd; |
541 | } | 537 | } |
542 | 538 | ||
539 | ret = soc_camera_power_on(icd, icl); | ||
540 | if (ret < 0) | ||
541 | goto epower; | ||
542 | |||
543 | pm_runtime_enable(&icd->vdev->dev); | 543 | pm_runtime_enable(&icd->vdev->dev); |
544 | ret = pm_runtime_resume(&icd->vdev->dev); | 544 | ret = pm_runtime_resume(&icd->vdev->dev); |
545 | if (ret < 0 && ret != -ENOSYS) | 545 | if (ret < 0 && ret != -ENOSYS) |
@@ -578,10 +578,10 @@ einitvb: | |||
578 | esfmt: | 578 | esfmt: |
579 | pm_runtime_disable(&icd->vdev->dev); | 579 | pm_runtime_disable(&icd->vdev->dev); |
580 | eresume: | 580 | eresume: |
581 | ici->ops->remove(icd); | ||
582 | eiciadd: | ||
583 | soc_camera_power_off(icd, icl); | 581 | soc_camera_power_off(icd, icl); |
584 | epower: | 582 | epower: |
583 | ici->ops->remove(icd); | ||
584 | eiciadd: | ||
585 | icd->use_count--; | 585 | icd->use_count--; |
586 | module_put(ici->ops->owner); | 586 | module_put(ici->ops->owner); |
587 | 587 | ||
@@ -1050,6 +1050,14 @@ static int soc_camera_probe(struct soc_camera_device *icd) | |||
1050 | if (ret < 0) | 1050 | if (ret < 0) |
1051 | goto ereg; | 1051 | goto ereg; |
1052 | 1052 | ||
1053 | /* The camera could have been already on, try to reset */ | ||
1054 | if (icl->reset) | ||
1055 | icl->reset(icd->pdev); | ||
1056 | |||
1057 | ret = ici->ops->add(icd); | ||
1058 | if (ret < 0) | ||
1059 | goto eadd; | ||
1060 | |||
1053 | /* | 1061 | /* |
1054 | * This will not yet call v4l2_subdev_core_ops::s_power(1), because the | 1062 | * This will not yet call v4l2_subdev_core_ops::s_power(1), because the |
1055 | * subdevice has not been initialised yet. We'll have to call it once | 1063 | * subdevice has not been initialised yet. We'll have to call it once |
@@ -1060,14 +1068,6 @@ static int soc_camera_probe(struct soc_camera_device *icd) | |||
1060 | if (ret < 0) | 1068 | if (ret < 0) |
1061 | goto epower; | 1069 | goto epower; |
1062 | 1070 | ||
1063 | /* The camera could have been already on, try to reset */ | ||
1064 | if (icl->reset) | ||
1065 | icl->reset(icd->pdev); | ||
1066 | |||
1067 | ret = ici->ops->add(icd); | ||
1068 | if (ret < 0) | ||
1069 | goto eadd; | ||
1070 | |||
1071 | /* Must have icd->vdev before registering the device */ | 1071 | /* Must have icd->vdev before registering the device */ |
1072 | ret = video_dev_create(icd); | 1072 | ret = video_dev_create(icd); |
1073 | if (ret < 0) | 1073 | if (ret < 0) |
@@ -1165,10 +1165,10 @@ eadddev: | |||
1165 | video_device_release(icd->vdev); | 1165 | video_device_release(icd->vdev); |
1166 | icd->vdev = NULL; | 1166 | icd->vdev = NULL; |
1167 | evdc: | 1167 | evdc: |
1168 | ici->ops->remove(icd); | ||
1169 | eadd: | ||
1170 | soc_camera_power_off(icd, icl); | 1168 | soc_camera_power_off(icd, icl); |
1171 | epower: | 1169 | epower: |
1170 | ici->ops->remove(icd); | ||
1171 | eadd: | ||
1172 | regulator_bulk_free(icl->num_regulators, icl->regulators); | 1172 | regulator_bulk_free(icl->num_regulators, icl->regulators); |
1173 | ereg: | 1173 | ereg: |
1174 | v4l2_ctrl_handler_free(&icd->ctrl_handler); | 1174 | v4l2_ctrl_handler_free(&icd->ctrl_handler); |