| From b1c6e530403b3583e6527ad87caf4f7b43040834 Mon Sep 17 00:00:00 2001 |
| From: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| Date: Thu, 4 Apr 2013 08:51:36 -0300 |
| Subject: [media] soc-camera: add host clock callbacks to start and stop the |
| master clock |
| |
| Currently soc-camera uses a single camera host callback to activate the |
| interface master clock and to configure the interface for a specific |
| client. However, during probing we might not have the information about |
| a client, we just need to activate the clock. Add new camera host driver |
| callbacks to only start and stop the clock without and client-specific |
| configuration. |
| |
| Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de> |
| Acked-by: Hans Verkuil <hans.verkuil@cisco.com> |
| Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| (cherry picked from commit eb569cf9db804e6ba34b3a1812415e59d5e43d1a) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/media/platform/soc_camera/soc_camera.c | 19 +++++++++++++++++-- |
| include/media/soc_camera.h | 2 ++ |
| 2 files changed, 19 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/media/platform/soc_camera/soc_camera.c b/drivers/media/platform/soc_camera/soc_camera.c |
| index 832f0593..df90565c 100644 |
| --- a/drivers/media/platform/soc_camera/soc_camera.c |
| +++ b/drivers/media/platform/soc_camera/soc_camera.c |
| @@ -513,10 +513,23 @@ static int soc_camera_add_device(struct soc_camera_device *icd) |
| if (ici->icd) |
| return -EBUSY; |
| |
| + if (ici->ops->clock_start) { |
| + ret = ici->ops->clock_start(ici); |
| + if (ret < 0) |
| + return ret; |
| + } |
| + |
| ret = ici->ops->add(icd); |
| - if (!ret) |
| - ici->icd = icd; |
| + if (ret < 0) |
| + goto eadd; |
| + |
| + ici->icd = icd; |
| |
| + return 0; |
| + |
| +eadd: |
| + if (ici->ops->clock_stop) |
| + ici->ops->clock_stop(ici); |
| return ret; |
| } |
| |
| @@ -528,6 +541,8 @@ static void soc_camera_remove_device(struct soc_camera_device *icd) |
| return; |
| |
| ici->ops->remove(icd); |
| + if (ici->ops->clock_stop) |
| + ici->ops->clock_stop(ici); |
| ici->icd = NULL; |
| } |
| |
| diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h |
| index 5a46ce2d..64415ee8 100644 |
| --- a/include/media/soc_camera.h |
| +++ b/include/media/soc_camera.h |
| @@ -74,6 +74,8 @@ struct soc_camera_host_ops { |
| struct module *owner; |
| int (*add)(struct soc_camera_device *); |
| void (*remove)(struct soc_camera_device *); |
| + int (*clock_start)(struct soc_camera_host *); |
| + void (*clock_stop)(struct soc_camera_host *); |
| /* |
| * .get_formats() is called for each client device format, but |
| * .put_formats() is only called once. Further, if any of the calls to |
| -- |
| 1.8.4.3.gca3854a |
| |