summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2010-09-14 17:55:58 +0530
committerRicardo Perez Olivares <x0081762@ti.com>2010-09-15 03:19:07 -0500
commitd1bd336426af6262f0569092558d68d0e040a499 (patch)
tree7ba3d14feffe06fcba3e33f6d80d8d76d4d3e175 /drivers/media
parent40080f659a6576ffb504a86713576b9cac6ab276 (diff)
V4L2: PM constraints for omap_vout driver
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/omap/omap_vout.c28
-rw-r--r--drivers/media/video/omap/omap_voutdef.h7
2 files changed, 34 insertions, 1 deletions
diff --git a/drivers/media/video/omap/omap_vout.c b/drivers/media/video/omap/omap_vout.c
index 524a7a54d964..a1b47c26ad88 100644
--- a/drivers/media/video/omap/omap_vout.c
+++ b/drivers/media/video/omap/omap_vout.c
@@ -49,7 +49,9 @@
#include <plat/vrfb.h>
#include <plat/display.h>
#include <plat/cpu.h>
-
+#ifdef CONFIG_PM
+#include <plat/omap-pm.h>
+#endif
#include "omap_voutlib.h"
#include "omap_voutdef.h"
@@ -2485,6 +2487,8 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
struct omap_vout_device *vout = fh;
struct videobuf_queue *q = &vout->vbq;
struct omapvideo_info *ovid = &vout->vid_info;
+ struct vout_platform_data *pdata =
+ (((vout->vid_dev)->v4l2_dev).dev)->platform_data;
mutex_lock(&vout->lock);
@@ -2531,6 +2535,20 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
omap_dispc_register_isr(omap_vout_isr, vout, mask);
+#ifdef CONFIG_PM
+ if (pdata->set_min_bus_tput) {
+ if (cpu_is_omap3630() || cpu_is_omap4430()) {
+ pdata->set_min_bus_tput(
+ ((vout->vid_dev)->v4l2_dev).dev ,
+ OCP_INITIATOR_AGENT, 200 * 1000 * 4);
+ } else {
+ pdata->set_min_bus_tput(
+ ((vout->vid_dev)->v4l2_dev).dev ,
+ OCP_INITIATOR_AGENT, 166 * 1000 * 4);
+ }
+ }
+#endif
+
for (j = 0; j < ovid->num_overlays; j++) {
struct omap_overlay *ovl = ovid->overlays[j];
@@ -2574,6 +2592,8 @@ static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
int ret = 0, j;
struct omap_vout_device *vout = fh;
struct omapvideo_info *ovid = &vout->vid_info;
+ struct vout_platform_data *pdata =
+ (((vout->vid_dev)->v4l2_dev).dev)->platform_data;
if (!vout->streaming)
return -EINVAL;
@@ -2612,6 +2632,12 @@ static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)
INIT_LIST_HEAD(&vout->dma_queue);
ret = videobuf_streamoff(&vout->vbq);
+#ifdef CONFIG_PM
+ if (pdata->set_min_bus_tput)
+ pdata->set_min_bus_tput(
+ ((vout->vid_dev)->v4l2_dev).dev,
+ OCP_INITIATOR_AGENT, 0);
+#endif
return ret;
}
diff --git a/drivers/media/video/omap/omap_voutdef.h b/drivers/media/video/omap/omap_voutdef.h
index e32a5ac2bdae..e4787d486fd1 100644
--- a/drivers/media/video/omap/omap_voutdef.h
+++ b/drivers/media/video/omap/omap_voutdef.h
@@ -160,4 +160,11 @@ struct omap_vout_device {
bool wb_enabled;
bool buf_empty;
};
+
+struct vout_platform_data {
+ void (*set_min_bus_tput)(struct device *dev, u8 agent_id,
+ unsigned long r);
+ void (*set_max_mpu_wakeup_lat)(struct device *dev, long t);
+ void (*set_cpu_freq)(unsigned long f);
+};
#endif /* ifndef OMAP_VOUTDEF_H */