Commit 70a8c3eb authored by Bastien Armand's avatar Bastien Armand Committed by Greg Kroah-Hartman

staging: panel: fix sparse warnings in lcd_write

This patch fixes two sparse warnings related to lcd_write :
warning: incorrect type in argument 1 (different address spaces)
warning: incorrect type in initializer (incompatible argument 2
(different address spaces))

lcd_write can be used from kernel space (in panel_lcd_print) or from user
space. So we introduce the lcd_write_char function that will write a char to
the device. We modify lcd_write and panel_lcd_print to use it. Finally we add
__user annotation missing in lcd_write.
Signed-off-by: default avatarBastien Armand <armand.bastien@laposte.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e112f89b
...@@ -1217,24 +1217,8 @@ static inline int handle_lcd_special_code(void) ...@@ -1217,24 +1217,8 @@ static inline int handle_lcd_special_code(void)
return processed; return processed;
} }
static ssize_t lcd_write(struct file *file, static void lcd_write_char(char c)
const char *buf, size_t count, loff_t *ppos)
{ {
const char *tmp = buf;
char c;
for (; count-- > 0; (ppos ? (*ppos)++ : 0), ++tmp) {
if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
/* let's be a little nice with other processes
that need some CPU */
schedule();
if (ppos == NULL && file == NULL)
/* let's not use get_user() from the kernel ! */
c = *tmp;
else if (get_user(c, tmp))
return -EFAULT;
/* first, we'll test if we're in escape mode */ /* first, we'll test if we're in escape mode */
if ((c != '\n') && lcd_escape_len >= 0) { if ((c != '\n') && lcd_escape_len >= 0) {
/* yes, let's add this char to the buffer */ /* yes, let's add this char to the buffer */
...@@ -1322,6 +1306,24 @@ static ssize_t lcd_write(struct file *file, ...@@ -1322,6 +1306,24 @@ static ssize_t lcd_write(struct file *file,
if (processed || (lcd_escape_len >= LCD_ESCAPE_LEN)) if (processed || (lcd_escape_len >= LCD_ESCAPE_LEN))
lcd_escape_len = -1; lcd_escape_len = -1;
} /* escape codes */ } /* escape codes */
}
static ssize_t lcd_write(struct file *file,
const char __user *buf, size_t count, loff_t *ppos)
{
const char __user *tmp = buf;
char c;
for (; count-- > 0; (*ppos)++, tmp++) {
if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
/* let's be a little nice with other processes
that need some CPU */
schedule();
if (get_user(c, buf))
return -EFAULT;
lcd_write_char(c);
} }
return tmp - buf; return tmp - buf;
...@@ -1365,8 +1367,19 @@ static struct miscdevice lcd_dev = { ...@@ -1365,8 +1367,19 @@ static struct miscdevice lcd_dev = {
/* public function usable from the kernel for any purpose */ /* public function usable from the kernel for any purpose */
static void panel_lcd_print(const char *s) static void panel_lcd_print(const char *s)
{ {
if (lcd_enabled && lcd_initialized) const char *tmp = s;
lcd_write(NULL, s, strlen(s), NULL); int count = strlen(s);
if (lcd_enabled && lcd_initialized) {
for (; count-- > 0; tmp++) {
if (!in_interrupt() && (((count + 1) & 0x1f) == 0))
/* let's be a little nice with other processes
that need some CPU */
schedule();
lcd_write_char(*tmp);
}
}
} }
/* initialize the LCD driver */ /* initialize the LCD driver */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment