summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuennadi Liakhovetski <g.liakhovetski@gmx.de>2013-04-04 08:51:36 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-06-21 15:35:51 -0300
commiteb569cf9db804e6ba34b3a1812415e59d5e43d1a (patch)
tree119054daf7f86e7b76fb64d6c8406cf76f66893d
parentf7f6ce2d09c86bd80ee11bd654a1ac1e8f5dfe13 (diff)
downloadlinux-eb569cf9db804e6ba34b3a1812415e59d5e43d1a.tar.bz2
[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>
-rw-r--r--drivers/media/platform/soc_camera/soc_camera.c19
-rw-r--r--include/media/soc_camera.h2
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 1e831009f914..3cc086036070 100644
--- a/drivers/media/platform/soc_camera/soc_camera.c
+++ b/drivers/media/platform/soc_camera/soc_camera.c
@@ -512,10 +512,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;
}
@@ -527,6 +540,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 db23a8f0c26b..dfa24df960df 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