aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/pci
diff options
context:
space:
mode:
authorSimon Farnsworth <simon.farnsworth@onelan.co.uk>2012-12-10 06:35:09 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-12-27 13:08:55 -0500
commit87739868944919beb4e6b3860c74355a114a54a1 (patch)
tree80c0dc7e9d427b9e56f669e8948f6f4307c1e78f /drivers/media/pci
parente8d4237325a475b02594d1fd85bb67983f7d57b9 (diff)
[media] saa7134: Add pm_qos_request to fix video corruption
The SAA7134 appears to have trouble buffering more than one line of video when doing DMA. Rather than try to fix the driver to cope (as has been done by Andy Walls for the cx18 driver), put in a pm_qos_request to limit deep sleep exit latencies. The visible effect of not having this is that seemingly random lines are only partly transferred - if you feed in a static image, you see a portion of the image "flicker" into place. [mchehab@redhat.com: Fix ABI breakage due to some renames at pm_qos] Signed-off-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/pci')
-rw-r--r--drivers/media/pci/saa7134/saa7134-video.c13
-rw-r--r--drivers/media/pci/saa7134/saa7134.h2
2 files changed, 15 insertions, 0 deletions
diff --git a/drivers/media/pci/saa7134/saa7134-video.c b/drivers/media/pci/saa7134/saa7134-video.c
index 3abf52711e13..7c503fb68526 100644
--- a/drivers/media/pci/saa7134/saa7134-video.c
+++ b/drivers/media/pci/saa7134/saa7134-video.c
@@ -2248,6 +2248,17 @@ static int saa7134_streamon(struct file *file, void *priv,
2248 if (!res_get(dev, fh, res)) 2248 if (!res_get(dev, fh, res))
2249 return -EBUSY; 2249 return -EBUSY;
2250 2250
2251 /* The SAA7134 has a 1K FIFO; the datasheet suggests that when
2252 * configured conservatively, there's 22 usec of buffering for video.
2253 * We therefore request a DMA latency of 20 usec, giving us 2 usec of
2254 * margin in case the FIFO is configured differently to the datasheet.
2255 * Unfortunately, I lack register-level documentation to check the
2256 * Linux FIFO setup and confirm the perfect value.
2257 */
2258 pm_qos_add_request(&fh->qos_request,
2259 PM_QOS_CPU_DMA_LATENCY,
2260 20);
2261
2251 return videobuf_streamon(saa7134_queue(fh)); 2262 return videobuf_streamon(saa7134_queue(fh));
2252} 2263}
2253 2264
@@ -2259,6 +2270,8 @@ static int saa7134_streamoff(struct file *file, void *priv,
2259 struct saa7134_dev *dev = fh->dev; 2270 struct saa7134_dev *dev = fh->dev;
2260 int res = saa7134_resource(fh); 2271 int res = saa7134_resource(fh);
2261 2272
2273 pm_qos_remove_request(&fh->qos_request);
2274
2262 err = videobuf_streamoff(saa7134_queue(fh)); 2275 err = videobuf_streamoff(saa7134_queue(fh));
2263 if (err < 0) 2276 if (err < 0)
2264 return err; 2277 return err;
diff --git a/drivers/media/pci/saa7134/saa7134.h b/drivers/media/pci/saa7134/saa7134.h
index c24b6512bd8f..0a3feaa8589b 100644
--- a/drivers/media/pci/saa7134/saa7134.h
+++ b/drivers/media/pci/saa7134/saa7134.h
@@ -29,6 +29,7 @@
29#include <linux/notifier.h> 29#include <linux/notifier.h>
30#include <linux/delay.h> 30#include <linux/delay.h>
31#include <linux/mutex.h> 31#include <linux/mutex.h>
32#include <linux/pm_qos.h>
32 33
33#include <asm/io.h> 34#include <asm/io.h>
34 35
@@ -469,6 +470,7 @@ struct saa7134_fh {
469 enum v4l2_buf_type type; 470 enum v4l2_buf_type type;
470 unsigned int resources; 471 unsigned int resources;
471 enum v4l2_priority prio; 472 enum v4l2_priority prio;
473 struct pm_qos_request qos_request;
472 474
473 /* video overlay */ 475 /* video overlay */
474 struct v4l2_window win; 476 struct v4l2_window win;