On Wed, 18 Jul 2012, Laurent Pinchart wrote:

> Instead of forcing all soc-camera drivers to go through the mid-layer to
> handle power management, create soc_camera_power_[on|off]() functions
> that can be called from the subdev .s_power() operation to manage
> regulators and platform-specific power handling. This allows non
> soc-camera hosts to use soc-camera-aware clients.
> 
> Signed-off-by: Laurent Pinchart <[email protected]>
> ---
>  drivers/media/video/imx074.c              |    9 +++
>  drivers/media/video/mt9m001.c             |    9 +++
>  drivers/media/video/mt9m111.c             |   52 +++++++++++++-----
>  drivers/media/video/mt9t031.c             |   11 +++-
>  drivers/media/video/mt9t112.c             |    9 +++
>  drivers/media/video/mt9v022.c             |    9 +++
>  drivers/media/video/ov2640.c              |    9 +++
>  drivers/media/video/ov5642.c              |   10 +++-
>  drivers/media/video/ov6650.c              |    9 +++
>  drivers/media/video/ov772x.c              |    9 +++
>  drivers/media/video/ov9640.c              |   10 +++-
>  drivers/media/video/ov9740.c              |   24 ++++++---
>  drivers/media/video/rj54n1cb0c.c          |    9 +++
>  drivers/media/video/soc_camera.c          |   82 
> +++++++++++++++++------------
>  drivers/media/video/soc_camera_platform.c |   11 ++++-
>  drivers/media/video/tw9910.c              |    9 +++
>  include/media/soc_camera.h                |   10 ++++
>  17 files changed, 229 insertions(+), 62 deletions(-)
> 

[snip]

> diff --git a/drivers/media/video/soc_camera.c 
> b/drivers/media/video/soc_camera.c
> index 7bf21da..6abeae2 100644
> --- a/drivers/media/video/soc_camera.c
> +++ b/drivers/media/video/soc_camera.c
> @@ -50,43 +50,30 @@ static LIST_HEAD(hosts);
>  static LIST_HEAD(devices);
>  static DEFINE_MUTEX(list_lock);              /* Protects the list of hosts */
>  
> -static int soc_camera_power_on(struct soc_camera_device *icd,
> -                            struct soc_camera_link *icl)
> +int soc_camera_power_on(struct device *dev, struct soc_camera_link *icl)
>  {
> -     struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
>       int ret = regulator_bulk_enable(icl->num_regulators,
>                                       icl->regulators);
>       if (ret < 0) {
> -             dev_err(icd->pdev, "Cannot enable regulators\n");
> +             dev_err(dev, "Cannot enable regulators\n");
>               return ret;
>       }
>  
>       if (icl->power) {
> -             ret = icl->power(icd->control, 1);
> +             ret = icl->power(dev, 1);
>               if (ret < 0) {
> -                     dev_err(icd->pdev,
> +                     dev_err(dev,
>                               "Platform failed to power-on the camera.\n");
> -                     goto elinkpwr;
> +                     regulator_bulk_disable(icl->num_regulators,
> +                                            icl->regulators);
>               }
>       }
>  
> -     ret = v4l2_subdev_call(sd, core, s_power, 1);
> -     if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
> -             goto esdpwr;
> -
> -     return 0;
> -
> -esdpwr:
> -     if (icl->power)
> -             icl->power(icd->control, 0);
> -elinkpwr:
> -     regulator_bulk_disable(icl->num_regulators,
> -                            icl->regulators);
>       return ret;
>  }
> +EXPORT_SYMBOL(soc_camera_power_on);
>  
> -static int soc_camera_power_off(struct soc_camera_device *icd,
> -                             struct soc_camera_link *icl)
> +int soc_camera_power_off(struct device *dev, struct soc_camera_link *icl)
>  {
>       struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
>       int ret = 0;

Oops... Looks like this part went missing during the merge:

-       v4l2_subdev_call(sd, core, s_power, 0);
-

Could you please fix and resend just this patch?

Thanks
Guennadi

> @@ -94,14 +81,14 @@ static int soc_camera_power_off(struct soc_camera_device 
> *icd,
>  
>       err = v4l2_subdev_call(sd, core, s_power, 0);
>       if (err < 0 && err != -ENOIOCTLCMD && err != -ENODEV) {
> -             dev_err(icd->pdev, "Subdev failed to power-off the camera.\n");
> +             dev_err(dev, "Subdev failed to power-off the camera.\n");
>               ret = err;
>       }
>  
>       if (icl->power) {
> -             err = icl->power(icd->control, 0);
> +             err = icl->power(dev, 0);
>               if (err < 0) {
> -                     dev_err(icd->pdev,
> +                     dev_err(dev,
>                               "Platform failed to power-off the camera.\n");
>                       ret = ret ? : err;
>               }
> @@ -110,12 +97,37 @@ static int soc_camera_power_off(struct soc_camera_device 
> *icd,
>       err = regulator_bulk_disable(icl->num_regulators,
>                                    icl->regulators);
>       if (err < 0) {
> -             dev_err(icd->pdev, "Cannot disable regulators\n");
> +             dev_err(dev, "Cannot disable regulators\n");
>               ret = ret ? : err;
>       }
>  
>       return ret;
>  }
> +EXPORT_SYMBOL(soc_camera_power_off);
> +
> +static int __soc_camera_power_on(struct soc_camera_device *icd)
> +{
> +     struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
> +     int ret;
> +
> +     ret = v4l2_subdev_call(sd, core, s_power, 1);
> +     if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
> +             return ret;
> +
> +     return 0;
> +}
> +
> +static int __soc_camera_power_off(struct soc_camera_device *icd)
> +{
> +     struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
> +     int ret;
> +
> +     ret = v4l2_subdev_call(sd, core, s_power, 0);
> +     if (ret < 0 && ret != -ENOIOCTLCMD && ret != -ENODEV)
> +             return ret;
> +
> +     return 0;
> +}
>  
>  const struct soc_camera_format_xlate *soc_camera_xlate_by_fourcc(
>       struct soc_camera_device *icd, unsigned int fourcc)

---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to