Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87739868 authored by Simon Farnsworth's avatar Simon Farnsworth Committed by Mauro Carvalho Chehab
Browse files

[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: default avatarSimon Farnsworth <simon.farnsworth@onelan.co.uk>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent e8d42373
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -2248,6 +2248,17 @@ static int saa7134_streamon(struct file *file, void *priv,
	if (!res_get(dev, fh, res))
	if (!res_get(dev, fh, res))
		return -EBUSY;
		return -EBUSY;


	/* The SAA7134 has a 1K FIFO; the datasheet suggests that when
	 * configured conservatively, there's 22 usec of buffering for video.
	 * We therefore request a DMA latency of 20 usec, giving us 2 usec of
	 * margin in case the FIFO is configured differently to the datasheet.
	 * Unfortunately, I lack register-level documentation to check the
	 * Linux FIFO setup and confirm the perfect value.
	 */
	pm_qos_add_request(&fh->qos_request,
			   PM_QOS_CPU_DMA_LATENCY,
			   20);

	return videobuf_streamon(saa7134_queue(fh));
	return videobuf_streamon(saa7134_queue(fh));
}
}


@@ -2259,6 +2270,8 @@ static int saa7134_streamoff(struct file *file, void *priv,
	struct saa7134_dev *dev = fh->dev;
	struct saa7134_dev *dev = fh->dev;
	int res = saa7134_resource(fh);
	int res = saa7134_resource(fh);


	pm_qos_remove_request(&fh->qos_request);

	err = videobuf_streamoff(saa7134_queue(fh));
	err = videobuf_streamoff(saa7134_queue(fh));
	if (err < 0)
	if (err < 0)
		return err;
		return err;
+2 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,7 @@
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <linux/pm_qos.h>


#include <asm/io.h>
#include <asm/io.h>


@@ -469,6 +470,7 @@ struct saa7134_fh {
	enum v4l2_buf_type         type;
	enum v4l2_buf_type         type;
	unsigned int               resources;
	unsigned int               resources;
	enum v4l2_priority	   prio;
	enum v4l2_priority	   prio;
	struct pm_qos_request	   qos_request;


	/* video overlay */
	/* video overlay */
	struct v4l2_window         win;
	struct v4l2_window         win;