Thread (3 messages) 3 messages, 2 authors, 2008-06-25

Re: [PATCH][1/2] add new Cobalt LCD framebuffer driver

flat view

From: Andrew Morton <akpm@linux-foundation.org>
Date: 2008-06-24 21:15:15
Also in: linux-mips

On Tue, 24 Jun 2008 22:46:54 +0900
Yoichi Yuasa [off-list ref] wrote:
Add new Cobalt LCD framebuffer driver.

Signed-off-by: Yoichi Yuasa <redacted>


...

+static ssize_t cobalt_lcdfb_read(struct fb_info *info, char __user *buf,
+				 size_t count, loff_t *ppos)
+{
+	char src[LCD_CHARS_MAX];
+	unsigned long pos;
+	int len, retval;
+
+	pos = *ppos;
+	if (pos >= LCD_CHARS_MAX)
+		return 0;
+
+	if (pos + count >= LCD_CHARS_MAX)
+		count = LCD_CHARS_MAX - pos;
I think if sizeof(pos) == sizeof(count), and `count' is sufficiently
large (eg: 0xffffffff) then bad things will happen in this function.
quoted hunk ↗ jump to hunk
+	for (len = 0; len < count; len++) {
+		retval = lcd_busy_wait(info);
+		if (retval < 0)
+			break;
+
+		lcd_write_control(info, LCD_TEXT_POS(pos));
+
+		retval = lcd_busy_wait(info);
+		if (retval < 0)
+			break;
+
+		src[len] = lcd_read_data(info);
+		if (pos == 0x0f)
+			pos = 0x40;
+		else
+			pos++;
+	}
+
+	if (copy_to_user(buf, src, len))
+		return -EFAULT;
+
+	*ppos += len;
+
+	return len;
+}
+
+static ssize_t cobalt_lcdfb_write(struct fb_info *info, const char __user *buf,
+				  size_t count, loff_t *ppos)
+{
+	char dst[LCD_CHARS_MAX];
+	unsigned long pos;
+	int len, retval;
+
+	pos = *ppos;
+	if (pos >= LCD_CHARS_MAX)
+		return 0;
+
+	if (pos + count >= LCD_CHARS_MAX)
+		count = LCD_CHARS_MAX - pos;
Ditto.
quoted hunk ↗ jump to hunk
+	if (copy_from_user(dst, buf, count))
+		return -EFAULT;
+
+	for (len = 0; len < count; len++) {
+		retval = lcd_busy_wait(info);
+		if (retval < 0)
+			break;
+
+		lcd_write_control(info, LCD_TEXT_POS(pos));
+
+		retval = lcd_busy_wait(info);
+		if (retval < 0)
+			break;
+
+		lcd_write_data(info, dst[len]);
+		if (pos == 0x0f)
+			pos = 0x40;
+		else
+			pos++;
+	}
+
+	*ppos += len;
+
+	return len;
+}
Is there any real benefit in this handling of signal_pending()?  afaict
it is done correctly, but why did we bother doing it?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help