Commit 8c4e378e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'staging-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging

Pull staging fixes from Greg KH:
 "Here are some small staging driver fixes for 4.5-rc2.

  One of them predated 4.4-final, but I missed that merge window due to
  the holliday.  The others fix reported issues that have come up
  recently.  The tty change is needed for the speakup driver fix and has
  the ack of the tty driver maintainer as well, i.e.  myself :)

  All have been in linux-next with no reported issues"

* tag 'staging-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging:
  Staging: speakup: fix read scrolled-back VT
  Staging: speakup: Fix getting port information
  Revert "Staging: panel: usleep_range is preferred over udelay"
  iio: adis_buffer: Fix out-of-bounds memory access
parents f3ca903f 88867e3d
...@@ -43,7 +43,7 @@ int adis_update_scan_mode(struct iio_dev *indio_dev, ...@@ -43,7 +43,7 @@ int adis_update_scan_mode(struct iio_dev *indio_dev,
return -ENOMEM; return -ENOMEM;
rx = adis->buffer; rx = adis->buffer;
tx = rx + indio_dev->scan_bytes; tx = rx + scan_count;
spi_message_init(&adis->msg); spi_message_init(&adis->msg);
......
...@@ -825,8 +825,7 @@ static void lcd_write_cmd_s(int cmd) ...@@ -825,8 +825,7 @@ static void lcd_write_cmd_s(int cmd)
lcd_send_serial(0x1F); /* R/W=W, RS=0 */ lcd_send_serial(0x1F); /* R/W=W, RS=0 */
lcd_send_serial(cmd & 0x0F); lcd_send_serial(cmd & 0x0F);
lcd_send_serial((cmd >> 4) & 0x0F); lcd_send_serial((cmd >> 4) & 0x0F);
/* the shortest command takes at least 40 us */ udelay(40); /* the shortest command takes at least 40 us */
usleep_range(40, 100);
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -837,8 +836,7 @@ static void lcd_write_data_s(int data) ...@@ -837,8 +836,7 @@ static void lcd_write_data_s(int data)
lcd_send_serial(0x5F); /* R/W=W, RS=1 */ lcd_send_serial(0x5F); /* R/W=W, RS=1 */
lcd_send_serial(data & 0x0F); lcd_send_serial(data & 0x0F);
lcd_send_serial((data >> 4) & 0x0F); lcd_send_serial((data >> 4) & 0x0F);
/* the shortest data takes at least 40 us */ udelay(40); /* the shortest data takes at least 40 us */
usleep_range(40, 100);
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -848,20 +846,19 @@ static void lcd_write_cmd_p8(int cmd) ...@@ -848,20 +846,19 @@ static void lcd_write_cmd_p8(int cmd)
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
/* present the data to the data port */ /* present the data to the data port */
w_dtr(pprt, cmd); w_dtr(pprt, cmd);
/* maintain the data during 20 us before the strobe */ udelay(20); /* maintain the data during 20 us before the strobe */
usleep_range(20, 100);
bits.e = BIT_SET; bits.e = BIT_SET;
bits.rs = BIT_CLR; bits.rs = BIT_CLR;
bits.rw = BIT_CLR; bits.rw = BIT_CLR;
set_ctrl_bits(); set_ctrl_bits();
usleep_range(40, 100); /* maintain the strobe during 40 us */ udelay(40); /* maintain the strobe during 40 us */
bits.e = BIT_CLR; bits.e = BIT_CLR;
set_ctrl_bits(); set_ctrl_bits();
usleep_range(120, 500); /* the shortest command takes at least 120 us */ udelay(120); /* the shortest command takes at least 120 us */
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -871,20 +868,19 @@ static void lcd_write_data_p8(int data) ...@@ -871,20 +868,19 @@ static void lcd_write_data_p8(int data)
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
/* present the data to the data port */ /* present the data to the data port */
w_dtr(pprt, data); w_dtr(pprt, data);
/* maintain the data during 20 us before the strobe */ udelay(20); /* maintain the data during 20 us before the strobe */
usleep_range(20, 100);
bits.e = BIT_SET; bits.e = BIT_SET;
bits.rs = BIT_SET; bits.rs = BIT_SET;
bits.rw = BIT_CLR; bits.rw = BIT_CLR;
set_ctrl_bits(); set_ctrl_bits();
usleep_range(40, 100); /* maintain the strobe during 40 us */ udelay(40); /* maintain the strobe during 40 us */
bits.e = BIT_CLR; bits.e = BIT_CLR;
set_ctrl_bits(); set_ctrl_bits();
usleep_range(45, 100); /* the shortest data takes at least 45 us */ udelay(45); /* the shortest data takes at least 45 us */
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -894,7 +890,7 @@ static void lcd_write_cmd_tilcd(int cmd) ...@@ -894,7 +890,7 @@ static void lcd_write_cmd_tilcd(int cmd)
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
/* present the data to the control port */ /* present the data to the control port */
w_ctr(pprt, cmd); w_ctr(pprt, cmd);
usleep_range(60, 120); udelay(60);
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -904,7 +900,7 @@ static void lcd_write_data_tilcd(int data) ...@@ -904,7 +900,7 @@ static void lcd_write_data_tilcd(int data)
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
/* present the data to the data port */ /* present the data to the data port */
w_dtr(pprt, data); w_dtr(pprt, data);
usleep_range(60, 120); udelay(60);
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -947,7 +943,7 @@ static void lcd_clear_fast_s(void) ...@@ -947,7 +943,7 @@ static void lcd_clear_fast_s(void)
lcd_send_serial(0x5F); /* R/W=W, RS=1 */ lcd_send_serial(0x5F); /* R/W=W, RS=1 */
lcd_send_serial(' ' & 0x0F); lcd_send_serial(' ' & 0x0F);
lcd_send_serial((' ' >> 4) & 0x0F); lcd_send_serial((' ' >> 4) & 0x0F);
usleep_range(40, 100); /* the shortest data takes at least 40 us */ udelay(40); /* the shortest data takes at least 40 us */
} }
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
...@@ -971,7 +967,7 @@ static void lcd_clear_fast_p8(void) ...@@ -971,7 +967,7 @@ static void lcd_clear_fast_p8(void)
w_dtr(pprt, ' '); w_dtr(pprt, ' ');
/* maintain the data during 20 us before the strobe */ /* maintain the data during 20 us before the strobe */
usleep_range(20, 100); udelay(20);
bits.e = BIT_SET; bits.e = BIT_SET;
bits.rs = BIT_SET; bits.rs = BIT_SET;
...@@ -979,13 +975,13 @@ static void lcd_clear_fast_p8(void) ...@@ -979,13 +975,13 @@ static void lcd_clear_fast_p8(void)
set_ctrl_bits(); set_ctrl_bits();
/* maintain the strobe during 40 us */ /* maintain the strobe during 40 us */
usleep_range(40, 100); udelay(40);
bits.e = BIT_CLR; bits.e = BIT_CLR;
set_ctrl_bits(); set_ctrl_bits();
/* the shortest data takes at least 45 us */ /* the shortest data takes at least 45 us */
usleep_range(45, 100); udelay(45);
} }
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
...@@ -1007,7 +1003,7 @@ static void lcd_clear_fast_tilcd(void) ...@@ -1007,7 +1003,7 @@ static void lcd_clear_fast_tilcd(void)
for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) { for (pos = 0; pos < lcd.height * lcd.hwidth; pos++) {
/* present the data to the data port */ /* present the data to the data port */
w_dtr(pprt, ' '); w_dtr(pprt, ' ');
usleep_range(60, 120); udelay(60);
} }
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
......
...@@ -264,8 +264,9 @@ static struct notifier_block vt_notifier_block = { ...@@ -264,8 +264,9 @@ static struct notifier_block vt_notifier_block = {
.notifier_call = vt_notifier_call, .notifier_call = vt_notifier_call,
}; };
static unsigned char get_attributes(u16 *pos) static unsigned char get_attributes(struct vc_data *vc, u16 *pos)
{ {
pos = screen_pos(vc, pos - (u16 *)vc->vc_origin, 1);
return (u_char) (scr_readw(pos) >> 8); return (u_char) (scr_readw(pos) >> 8);
} }
...@@ -275,7 +276,7 @@ static void speakup_date(struct vc_data *vc) ...@@ -275,7 +276,7 @@ static void speakup_date(struct vc_data *vc)
spk_y = spk_cy = vc->vc_y; spk_y = spk_cy = vc->vc_y;
spk_pos = spk_cp = vc->vc_pos; spk_pos = spk_cp = vc->vc_pos;
spk_old_attr = spk_attr; spk_old_attr = spk_attr;
spk_attr = get_attributes((u_short *) spk_pos); spk_attr = get_attributes(vc, (u_short *)spk_pos);
} }
static void bleep(u_short val) static void bleep(u_short val)
...@@ -469,8 +470,12 @@ static u16 get_char(struct vc_data *vc, u16 *pos, u_char *attribs) ...@@ -469,8 +470,12 @@ static u16 get_char(struct vc_data *vc, u16 *pos, u_char *attribs)
u16 ch = ' '; u16 ch = ' ';
if (vc && pos) { if (vc && pos) {
u16 w = scr_readw(pos); u16 w;
u16 c = w & 0xff; u16 c;
pos = screen_pos(vc, pos - (u16 *)vc->vc_origin, 1);
w = scr_readw(pos);
c = w & 0xff;
if (w & vc->vc_hi_font_mask) if (w & vc->vc_hi_font_mask)
c |= 0x100; c |= 0x100;
...@@ -746,7 +751,7 @@ static int get_line(struct vc_data *vc) ...@@ -746,7 +751,7 @@ static int get_line(struct vc_data *vc)
u_char tmp2; u_char tmp2;
spk_old_attr = spk_attr; spk_old_attr = spk_attr;
spk_attr = get_attributes((u_short *) spk_pos); spk_attr = get_attributes(vc, (u_short *)spk_pos);
for (i = 0; i < vc->vc_cols; i++) { for (i = 0; i < vc->vc_cols; i++) {
buf[i] = (u_char) get_char(vc, (u_short *) tmp, &tmp2); buf[i] = (u_char) get_char(vc, (u_short *) tmp, &tmp2);
tmp += 2; tmp += 2;
...@@ -811,7 +816,7 @@ static int say_from_to(struct vc_data *vc, u_long from, u_long to, ...@@ -811,7 +816,7 @@ static int say_from_to(struct vc_data *vc, u_long from, u_long to,
u_short saved_punc_mask = spk_punc_mask; u_short saved_punc_mask = spk_punc_mask;
spk_old_attr = spk_attr; spk_old_attr = spk_attr;
spk_attr = get_attributes((u_short *) from); spk_attr = get_attributes(vc, (u_short *)from);
while (from < to) { while (from < to) {
buf[i++] = (char)get_char(vc, (u_short *) from, &tmp); buf[i++] = (char)get_char(vc, (u_short *) from, &tmp);
from += 2; from += 2;
...@@ -886,7 +891,7 @@ static int get_sentence_buf(struct vc_data *vc, int read_punc) ...@@ -886,7 +891,7 @@ static int get_sentence_buf(struct vc_data *vc, int read_punc)
sentmarks[bn][0] = &sentbuf[bn][0]; sentmarks[bn][0] = &sentbuf[bn][0];
i = 0; i = 0;
spk_old_attr = spk_attr; spk_old_attr = spk_attr;
spk_attr = get_attributes((u_short *) start); spk_attr = get_attributes(vc, (u_short *)start);
while (start < end) { while (start < end) {
sentbuf[bn][i] = (char)get_char(vc, (u_short *) start, &tmp); sentbuf[bn][i] = (char)get_char(vc, (u_short *) start, &tmp);
...@@ -1585,7 +1590,7 @@ static int count_highlight_color(struct vc_data *vc) ...@@ -1585,7 +1590,7 @@ static int count_highlight_color(struct vc_data *vc)
u16 *ptr; u16 *ptr;
for (ptr = start; ptr < end; ptr++) { for (ptr = start; ptr < end; ptr++) {
ch = get_attributes(ptr); ch = get_attributes(vc, ptr);
bg = (ch & 0x70) >> 4; bg = (ch & 0x70) >> 4;
speakup_console[vc_num]->ht.bgcount[bg]++; speakup_console[vc_num]->ht.bgcount[bg]++;
} }
......
...@@ -6,6 +6,11 @@ ...@@ -6,6 +6,11 @@
#include "spk_priv.h" #include "spk_priv.h"
#include "serialio.h" #include "serialio.h"
#include <linux/serial_core.h>
/* WARNING: Do not change this to <linux/serial.h> without testing that
* SERIAL_PORT_DFNS does get defined to the appropriate value. */
#include <asm/serial.h>
#ifndef SERIAL_PORT_DFNS #ifndef SERIAL_PORT_DFNS
#define SERIAL_PORT_DFNS #define SERIAL_PORT_DFNS
#endif #endif
...@@ -23,9 +28,15 @@ const struct old_serial_port *spk_serial_init(int index) ...@@ -23,9 +28,15 @@ const struct old_serial_port *spk_serial_init(int index)
int baud = 9600, quot = 0; int baud = 9600, quot = 0;
unsigned int cval = 0; unsigned int cval = 0;
int cflag = CREAD | HUPCL | CLOCAL | B9600 | CS8; int cflag = CREAD | HUPCL | CLOCAL | B9600 | CS8;
const struct old_serial_port *ser = rs_table + index; const struct old_serial_port *ser;
int err; int err;
if (index >= ARRAY_SIZE(rs_table)) {
pr_info("no port info for ttyS%d\n", index);
return NULL;
}
ser = rs_table + index;
/* Divisor, bytesize and parity */ /* Divisor, bytesize and parity */
quot = ser->baud_base / baud; quot = ser->baud_base / baud;
cval = cflag & (CSIZE | CSTOPB); cval = cflag & (CSIZE | CSTOPB);
......
...@@ -4250,6 +4250,7 @@ unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed) ...@@ -4250,6 +4250,7 @@ unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed)
{ {
return screenpos(vc, 2 * w_offset, viewed); return screenpos(vc, 2 * w_offset, viewed);
} }
EXPORT_SYMBOL_GPL(screen_pos);
void getconsxy(struct vc_data *vc, unsigned char *p) void getconsxy(struct vc_data *vc, unsigned char *p)
{ {
......
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