diff options
author | Archit Taneja <archit@ti.com> | 2010-09-14 17:55:58 +0530 |
---|---|---|
committer | Ricardo Perez Olivares <x0081762@ti.com> | 2010-09-15 03:19:07 -0500 |
commit | d1bd336426af6262f0569092558d68d0e040a499 (patch) | |
tree | 7ba3d14feffe06fcba3e33f6d80d8d76d4d3e175 /drivers/media | |
parent | 40080f659a6576ffb504a86713576b9cac6ab276 (diff) |
V4L2: PM constraints for omap_vout driver
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/omap/omap_vout.c | 28 | ||||
-rw-r--r-- | drivers/media/video/omap/omap_voutdef.h | 7 |
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 */ |