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

Commit c777549f authored by Ian Armstrong's avatar Ian Armstrong Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (9163): ivtvfb: fix sparse warnings and improve write function

parent a8b86435
Loading
Loading
Loading
Loading
+37 −39
Original line number Original line Diff line number Diff line
@@ -275,7 +275,6 @@ static int ivtvfb_prep_dec_dma_to_device(struct ivtv *itv,
				  int size_in_bytes)
				  int size_in_bytes)
{
{
	DEFINE_WAIT(wait);
	DEFINE_WAIT(wait);
	int ret = 0;
	int got_sig = 0;
	int got_sig = 0;


	mutex_lock(&itv->udma.lock);
	mutex_lock(&itv->udma.lock);
@@ -316,7 +315,7 @@ static int ivtvfb_prep_dec_dma_to_device(struct ivtv *itv,
		return -EINTR;
		return -EINTR;
	}
	}


	return ret;
	return 0;
}
}


static int ivtvfb_prep_frame(struct ivtv *itv, int cmd, void __user *source,
static int ivtvfb_prep_frame(struct ivtv *itv, int cmd, void __user *source,
@@ -373,6 +372,7 @@ static ssize_t ivtvfb_write(struct fb_info *info, const char __user *buf,
	unsigned long p = *ppos;
	unsigned long p = *ppos;
	void *dst;
	void *dst;
	int err = 0;
	int err = 0;
	int dma_err;
	unsigned long total_size;
	unsigned long total_size;
	struct ivtv *itv = (struct ivtv *) info->par;
	struct ivtv *itv = (struct ivtv *) info->par;
	unsigned long dma_offset =
	unsigned long dma_offset =
@@ -399,7 +399,6 @@ static ssize_t ivtvfb_write(struct fb_info *info, const char __user *buf,
	if (count + p > total_size) {
	if (count + p > total_size) {
		if (!err)
		if (!err)
			err = -ENOSPC;
			err = -ENOSPC;

		count = total_size - p;
		count = total_size - p;
	}
	}


@@ -408,13 +407,6 @@ static ssize_t ivtvfb_write(struct fb_info *info, const char __user *buf,
	if (info->fbops->fb_sync)
	if (info->fbops->fb_sync)
		info->fbops->fb_sync(info);
		info->fbops->fb_sync(info);


	if (!access_ok(VERIFY_READ, buf, count)) {
		IVTVFB_WARN("Invalid userspace pointer 0x%08lx\n",
			(unsigned long)buf);
		err = -EFAULT;
	}

	if (!err) {
	/* If transfer size > threshold and both src/dst
	/* If transfer size > threshold and both src/dst
	addresses are aligned, use DMA */
	addresses are aligned, use DMA */
	if (count >= 4096 &&
	if (count >= 4096 &&
@@ -422,7 +414,8 @@ static ssize_t ivtvfb_write(struct fb_info *info, const char __user *buf,
		/* Odd address = can't DMA. Align */
		/* Odd address = can't DMA. Align */
		if ((unsigned long)dst & 3) {
		if ((unsigned long)dst & 3) {
			lead = 4 - ((unsigned long)dst & 3);
			lead = 4 - ((unsigned long)dst & 3);
				memcpy(dst, buf, lead);
			if (copy_from_user(dst, buf, lead))
				return -EFAULT;
			buf += lead;
			buf += lead;
			dst += lead;
			dst += lead;
		}
		}
@@ -431,16 +424,17 @@ static ssize_t ivtvfb_write(struct fb_info *info, const char __user *buf,
			tail = (count - lead) & 3;
			tail = (count - lead) & 3;
		/* DMA the data */
		/* DMA the data */
		dma_size = count - lead - tail;
		dma_size = count - lead - tail;
			err = ivtvfb_prep_dec_dma_to_device(itv,
		dma_err = ivtvfb_prep_dec_dma_to_device(itv,
			       p + lead + dma_offset, (void *)buf, dma_size);
		       p + lead + dma_offset, (void __user *)buf, dma_size);
		if (dma_err)
			return dma_err;
		dst += dma_size;
		dst += dma_size;
		buf += dma_size;
		buf += dma_size;
		/* Copy any leftover data */
		/* Copy any leftover data */
			if (tail)
		if (tail && copy_from_user(dst, buf, tail))
				memcpy(dst, buf, tail);
			return -EFAULT;
		} else {
	} else if (copy_from_user(dst, buf, count)) {
			memcpy(dst, buf, count);
		return -EFAULT;
		}
	}
	}


	if  (!err)
	if  (!err)
@@ -463,9 +457,12 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
			vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT |
			vblank.flags = FB_VBLANK_HAVE_COUNT |FB_VBLANK_HAVE_VCOUNT |
					FB_VBLANK_HAVE_VSYNC;
					FB_VBLANK_HAVE_VSYNC;
			trace = read_reg(0x028c0) >> 16;
			trace = read_reg(0x028c0) >> 16;
			if (itv->is_50hz && trace > 312) trace -= 312;
			if (itv->is_50hz && trace > 312)
			else if (itv->is_60hz && trace > 262) trace -= 262;
				trace -= 312;
			if (trace == 1) vblank.flags |= FB_VBLANK_VSYNCING;
			else if (itv->is_60hz && trace > 262)
				trace -= 262;
			if (trace == 1)
				vblank.flags |= FB_VBLANK_VSYNCING;
			vblank.count = itv->last_vsync_field;
			vblank.count = itv->last_vsync_field;
			vblank.vcount = trace;
			vblank.vcount = trace;
			vblank.hcount = 0;
			vblank.hcount = 0;
@@ -476,7 +473,8 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar


		case FBIO_WAITFORVSYNC:
		case FBIO_WAITFORVSYNC:
			prepare_to_wait(&itv->vsync_waitq, &wait, TASK_INTERRUPTIBLE);
			prepare_to_wait(&itv->vsync_waitq, &wait, TASK_INTERRUPTIBLE);
			if (!schedule_timeout(msecs_to_jiffies(50))) rc = -ETIMEDOUT;
			if (!schedule_timeout(msecs_to_jiffies(50)))
				rc = -ETIMEDOUT;
			finish_wait(&itv->vsync_waitq, &wait);
			finish_wait(&itv->vsync_waitq, &wait);
			return rc;
			return rc;