Commit bea7433b authored by Daniel Chromik's avatar Daniel Chromik Committed by Greg Kroah-Hartman

misc: panel, convert struct to bitmap

There is an anonymous struct which is actually used as a bitmap. So
convert the struct to a bitmap and change code accordingly where
needed.

This also allows for a cleanup of set_data_bits and set_ctrl_bits as
they can use a common helper now. The helper can also be converted to
a for loop instead of doing bit OR. And given it is a for loop now,
bit masking (using BIT_MSK) is moved from the callers there too.
Signed-off-by: default avatarDaniel Chromik <daniel.chromik@seznam.cz>
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Ksenija Stanojevic <ksenija.stanojevic@gmail.com>
Acked-by: default avatarWilly Tarreau <willy@haproxy.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8c79c49c
...@@ -648,34 +648,28 @@ static const char nexcom_keypad_profile[][4][9] = { ...@@ -648,34 +648,28 @@ static const char nexcom_keypad_profile[][4][9] = {
static const char (*keypad_profile)[4][9] = old_keypad_profile; static const char (*keypad_profile)[4][9] = old_keypad_profile;
/* FIXME: this should be converted to a bit array containing signals states */ static DECLARE_BITMAP(bits, LCD_BITS);
static struct {
unsigned char e; /* parallel LCD E (data latch on falling edge) */ static void lcd_get_bits(unsigned int port, int *val)
unsigned char rs; /* parallel LCD RS (0 = cmd, 1 = data) */ {
unsigned char rw; /* parallel LCD R/W (0 = W, 1 = R) */ unsigned int bit, state;
unsigned char bl; /* parallel LCD backlight (0 = off, 1 = on) */
unsigned char cl; /* serial LCD clock (latch on rising edge) */ for (bit = 0; bit < LCD_BITS; bit++) {
unsigned char da; /* serial LCD data */ state = test_bit(bit, bits) ? BIT_SET : BIT_CLR;
} bits; *val &= lcd_bits[port][bit][BIT_MSK];
*val |= lcd_bits[port][bit][state];
}
}
static void init_scan_timer(void); static void init_scan_timer(void);
/* sets data port bits according to current signals values */ /* sets data port bits according to current signals values */
static int set_data_bits(void) static int set_data_bits(void)
{ {
int val, bit; int val;
val = r_dtr(pprt); val = r_dtr(pprt);
for (bit = 0; bit < LCD_BITS; bit++) lcd_get_bits(LCD_PORT_D, &val);
val &= lcd_bits[LCD_PORT_D][bit][BIT_MSK];
val |= lcd_bits[LCD_PORT_D][LCD_BIT_E][bits.e]
| lcd_bits[LCD_PORT_D][LCD_BIT_RS][bits.rs]
| lcd_bits[LCD_PORT_D][LCD_BIT_RW][bits.rw]
| lcd_bits[LCD_PORT_D][LCD_BIT_BL][bits.bl]
| lcd_bits[LCD_PORT_D][LCD_BIT_CL][bits.cl]
| lcd_bits[LCD_PORT_D][LCD_BIT_DA][bits.da];
w_dtr(pprt, val); w_dtr(pprt, val);
return val; return val;
} }
...@@ -683,19 +677,10 @@ static int set_data_bits(void) ...@@ -683,19 +677,10 @@ static int set_data_bits(void)
/* sets ctrl port bits according to current signals values */ /* sets ctrl port bits according to current signals values */
static int set_ctrl_bits(void) static int set_ctrl_bits(void)
{ {
int val, bit; int val;
val = r_ctr(pprt); val = r_ctr(pprt);
for (bit = 0; bit < LCD_BITS; bit++) lcd_get_bits(LCD_PORT_C, &val);
val &= lcd_bits[LCD_PORT_C][bit][BIT_MSK];
val |= lcd_bits[LCD_PORT_C][LCD_BIT_E][bits.e]
| lcd_bits[LCD_PORT_C][LCD_BIT_RS][bits.rs]
| lcd_bits[LCD_PORT_C][LCD_BIT_RW][bits.rw]
| lcd_bits[LCD_PORT_C][LCD_BIT_BL][bits.bl]
| lcd_bits[LCD_PORT_C][LCD_BIT_CL][bits.cl]
| lcd_bits[LCD_PORT_C][LCD_BIT_DA][bits.da];
w_ctr(pprt, val); w_ctr(pprt, val);
return val; return val;
} }
...@@ -791,12 +776,17 @@ static void lcd_send_serial(int byte) ...@@ -791,12 +776,17 @@ static void lcd_send_serial(int byte)
* LCD reads D0 on STROBE's rising edge. * LCD reads D0 on STROBE's rising edge.
*/ */
for (bit = 0; bit < 8; bit++) { for (bit = 0; bit < 8; bit++) {
bits.cl = BIT_CLR; /* CLK low */ clear_bit(LCD_BIT_CL, bits); /* CLK low */
panel_set_bits(); panel_set_bits();
bits.da = byte & 1; if (byte & 1) {
set_bit(LCD_BIT_DA, bits);
} else {
clear_bit(LCD_BIT_DA, bits);
}
panel_set_bits(); panel_set_bits();
udelay(2); /* maintain the data during 2 us before CLK up */ udelay(2); /* maintain the data during 2 us before CLK up */
bits.cl = BIT_SET; /* CLK high */ set_bit(LCD_BIT_CL, bits); /* CLK high */
panel_set_bits(); panel_set_bits();
udelay(1); /* maintain the strobe during 1 us */ udelay(1); /* maintain the strobe during 1 us */
byte >>= 1; byte >>= 1;
...@@ -811,7 +801,10 @@ static void lcd_backlight(int on) ...@@ -811,7 +801,10 @@ static void lcd_backlight(int on)
/* The backlight is activated by setting the AUTOFEED line to +5V */ /* The backlight is activated by setting the AUTOFEED line to +5V */
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
bits.bl = on; if (on)
set_bit(LCD_BIT_BL, bits);
else
clear_bit(LCD_BIT_BL, bits);
panel_set_bits(); panel_set_bits();
spin_unlock_irq(&pprt_lock); spin_unlock_irq(&pprt_lock);
} }
...@@ -846,14 +839,14 @@ static void lcd_write_cmd_p8(int cmd) ...@@ -846,14 +839,14 @@ static void lcd_write_cmd_p8(int cmd)
w_dtr(pprt, cmd); w_dtr(pprt, cmd);
udelay(20); /* maintain the data during 20 us before the strobe */ udelay(20); /* maintain the data during 20 us before the strobe */
bits.e = BIT_SET; set_bit(LCD_BIT_E, bits);
bits.rs = BIT_CLR; clear_bit(LCD_BIT_RS, bits);
bits.rw = BIT_CLR; clear_bit(LCD_BIT_RW, bits);
set_ctrl_bits(); set_ctrl_bits();
udelay(40); /* maintain the strobe during 40 us */ udelay(40); /* maintain the strobe during 40 us */
bits.e = BIT_CLR; clear_bit(LCD_BIT_E, bits);
set_ctrl_bits(); set_ctrl_bits();
udelay(120); /* the shortest command takes at least 120 us */ udelay(120); /* the shortest command takes at least 120 us */
...@@ -868,14 +861,14 @@ static void lcd_write_data_p8(int data) ...@@ -868,14 +861,14 @@ static void lcd_write_data_p8(int data)
w_dtr(pprt, data); w_dtr(pprt, data);
udelay(20); /* maintain the data during 20 us before the strobe */ udelay(20); /* maintain the data during 20 us before the strobe */
bits.e = BIT_SET; set_bit(LCD_BIT_E, bits);
bits.rs = BIT_SET; set_bit(LCD_BIT_RS, bits);
bits.rw = BIT_CLR; clear_bit(LCD_BIT_RW, bits);
set_ctrl_bits(); set_ctrl_bits();
udelay(40); /* maintain the strobe during 40 us */ udelay(40); /* maintain the strobe during 40 us */
bits.e = BIT_CLR; clear_bit(LCD_BIT_E, bits);
set_ctrl_bits(); set_ctrl_bits();
udelay(45); /* the shortest data takes at least 45 us */ udelay(45); /* the shortest data takes at least 45 us */
...@@ -968,15 +961,15 @@ static void lcd_clear_fast_p8(void) ...@@ -968,15 +961,15 @@ static void lcd_clear_fast_p8(void)
/* maintain the data during 20 us before the strobe */ /* maintain the data during 20 us before the strobe */
udelay(20); udelay(20);
bits.e = BIT_SET; set_bit(LCD_BIT_E, bits);
bits.rs = BIT_SET; set_bit(LCD_BIT_RS, bits);
bits.rw = BIT_CLR; clear_bit(LCD_BIT_RW, bits);
set_ctrl_bits(); set_ctrl_bits();
/* maintain the strobe during 40 us */ /* maintain the strobe during 40 us */
udelay(40); udelay(40);
bits.e = BIT_CLR; clear_bit(LCD_BIT_E, bits);
set_ctrl_bits(); set_ctrl_bits();
/* the shortest data takes at least 45 us */ /* the shortest data takes at least 45 us */
......
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