Commit 71ff701b authored by Lars Poeschel's avatar Lars Poeschel Committed by Miguel Ojeda

auxdisplay: Move write_data pointer to hd44780_common

This moves the write_data function pointer from struct charlcd_ops to
struct hd44780_common. This is the function that actually writes the
character to the display. This hd44780 hardware specific function is
used by two drivers at the moment.
Reviewed-by: default avatarWilly Tarreau <w@1wt.eu>
Signed-off-by: default avatarLars Poeschel <poeschel@lemonage.de>
Signed-off-by: default avatarMiguel Ojeda <ojeda@kernel.org>
parent 3fc04dd7
...@@ -182,7 +182,7 @@ static void charlcd_print(struct charlcd *lcd, char c) ...@@ -182,7 +182,7 @@ static void charlcd_print(struct charlcd *lcd, char c)
if (priv->addr.x < hdc->bwidth) { if (priv->addr.x < hdc->bwidth) {
if (lcd->char_conv) if (lcd->char_conv)
c = lcd->char_conv[(unsigned char)c]; c = lcd->char_conv[(unsigned char)c];
lcd->ops->write_data(lcd, c); hdc->write_data(hdc, c);
priv->addr.x++; priv->addr.x++;
/* prevents the cursor from wrapping onto the next line */ /* prevents the cursor from wrapping onto the next line */
...@@ -202,7 +202,7 @@ static void charlcd_clear_fast(struct charlcd *lcd) ...@@ -202,7 +202,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
lcd->ops->clear_fast(lcd); lcd->ops->clear_fast(lcd);
else else
for (pos = 0; pos < min(2, lcd->height) * hdc->hwidth; pos++) for (pos = 0; pos < min(2, lcd->height) * hdc->hwidth; pos++)
lcd->ops->write_data(lcd, ' '); hdc->write_data(hdc, ' ');
charlcd_home(lcd); charlcd_home(lcd);
} }
...@@ -446,7 +446,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd) ...@@ -446,7 +446,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
int x; int x;
for (x = priv->addr.x; x < hdc->bwidth; x++) for (x = priv->addr.x; x < hdc->bwidth; x++)
lcd->ops->write_data(lcd, ' '); hdc->write_data(hdc, ' ');
/* restore cursor position */ /* restore cursor position */
charlcd_gotoxy(lcd); charlcd_gotoxy(lcd);
...@@ -505,7 +505,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd) ...@@ -505,7 +505,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
lcd->ops->write_cmd(lcd, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8)); lcd->ops->write_cmd(lcd, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
for (addr = 0; addr < cgoffset; addr++) for (addr = 0; addr < cgoffset; addr++)
lcd->ops->write_data(lcd, cgbytes[addr]); hdc->write_data(hdc, cgbytes[addr]);
/* ensures that we stop writing to CGRAM */ /* ensures that we stop writing to CGRAM */
charlcd_gotoxy(lcd); charlcd_gotoxy(lcd);
...@@ -587,7 +587,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c) ...@@ -587,7 +587,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
priv->addr.x--; priv->addr.x--;
} }
/* replace with a space */ /* replace with a space */
lcd->ops->write_data(lcd, ' '); hdc->write_data(hdc, ' ');
/* back one char again */ /* back one char again */
lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT); lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT);
break; break;
...@@ -601,7 +601,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c) ...@@ -601,7 +601,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
* go to the beginning of the next line * go to the beginning of the next line
*/ */
for (; priv->addr.x < hdc->bwidth; priv->addr.x++) for (; priv->addr.x < hdc->bwidth; priv->addr.x++)
lcd->ops->write_data(lcd, ' '); hdc->write_data(hdc, ' ');
priv->addr.x = 0; priv->addr.x = 0;
priv->addr.y = (priv->addr.y + 1) % lcd->height; priv->addr.y = (priv->addr.y + 1) % lcd->height;
charlcd_gotoxy(lcd); charlcd_gotoxy(lcd);
......
...@@ -27,7 +27,6 @@ struct charlcd { ...@@ -27,7 +27,6 @@ struct charlcd {
struct charlcd_ops { struct charlcd_ops {
/* Required */ /* Required */
void (*write_cmd)(struct charlcd *lcd, int cmd); void (*write_cmd)(struct charlcd *lcd, int cmd);
void (*write_data)(struct charlcd *lcd, int data);
/* Optional */ /* Optional */
void (*write_cmd_raw4)(struct charlcd *lcd, int cmd); /* 4-bit only */ void (*write_cmd_raw4)(struct charlcd *lcd, int cmd); /* 4-bit only */
......
...@@ -115,9 +115,8 @@ static void hd44780_write_cmd_gpio8(struct charlcd *lcd, int cmd) ...@@ -115,9 +115,8 @@ static void hd44780_write_cmd_gpio8(struct charlcd *lcd, int cmd)
} }
/* Send data to the LCD panel in 8 bit GPIO mode */ /* Send data to the LCD panel in 8 bit GPIO mode */
static void hd44780_write_data_gpio8(struct charlcd *lcd, int data) static void hd44780_write_data_gpio8(struct hd44780_common *hdc, int data)
{ {
struct hd44780_common *hdc = lcd->drvdata;
struct hd44780 *hd = hdc->hd44780; struct hd44780 *hd = hdc->hd44780;
hd44780_write_gpio8(hd, data, 1); hd44780_write_gpio8(hd, data, 1);
...@@ -128,7 +127,6 @@ static void hd44780_write_data_gpio8(struct charlcd *lcd, int data) ...@@ -128,7 +127,6 @@ static void hd44780_write_data_gpio8(struct charlcd *lcd, int data)
static const struct charlcd_ops hd44780_ops_gpio8 = { static const struct charlcd_ops hd44780_ops_gpio8 = {
.write_cmd = hd44780_write_cmd_gpio8, .write_cmd = hd44780_write_cmd_gpio8,
.write_data = hd44780_write_data_gpio8,
.backlight = hd44780_backlight, .backlight = hd44780_backlight,
}; };
...@@ -163,9 +161,8 @@ static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd) ...@@ -163,9 +161,8 @@ static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd)
} }
/* Send data to the LCD panel in 4 bit GPIO mode */ /* Send data to the LCD panel in 4 bit GPIO mode */
static void hd44780_write_data_gpio4(struct charlcd *lcd, int data) static void hd44780_write_data_gpio4(struct hd44780_common *hdc, int data)
{ {
struct hd44780_common *hdc = lcd->drvdata;
struct hd44780 *hd = hdc->hd44780; struct hd44780 *hd = hdc->hd44780;
hd44780_write_gpio4(hd, data, 1); hd44780_write_gpio4(hd, data, 1);
...@@ -177,7 +174,6 @@ static void hd44780_write_data_gpio4(struct charlcd *lcd, int data) ...@@ -177,7 +174,6 @@ static void hd44780_write_data_gpio4(struct charlcd *lcd, int data)
static const struct charlcd_ops hd44780_ops_gpio4 = { static const struct charlcd_ops hd44780_ops_gpio4 = {
.write_cmd = hd44780_write_cmd_gpio4, .write_cmd = hd44780_write_cmd_gpio4,
.write_cmd_raw4 = hd44780_write_cmd_raw_gpio4, .write_cmd_raw4 = hd44780_write_cmd_raw_gpio4,
.write_data = hd44780_write_data_gpio4,
.backlight = hd44780_backlight, .backlight = hd44780_backlight,
}; };
...@@ -276,7 +272,13 @@ static int hd44780_probe(struct platform_device *pdev) ...@@ -276,7 +272,13 @@ static int hd44780_probe(struct platform_device *pdev)
device_property_read_u32(dev, "internal-buffer-width", &hdc->bwidth); device_property_read_u32(dev, "internal-buffer-width", &hdc->bwidth);
hdc->ifwidth = ifwidth; hdc->ifwidth = ifwidth;
lcd->ops = ifwidth == 8 ? &hd44780_ops_gpio8 : &hd44780_ops_gpio4; if (ifwidth == 8) {
lcd->ops = &hd44780_ops_gpio8;
hdc->write_data = hd44780_write_data_gpio8;
} else {
lcd->ops = &hd44780_ops_gpio4;
hdc->write_data = hd44780_write_data_gpio4;
}
ret = charlcd_register(lcd); ret = charlcd_register(lcd);
if (ret) if (ret)
......
...@@ -7,6 +7,7 @@ struct hd44780_common { ...@@ -7,6 +7,7 @@ struct hd44780_common {
int ifwidth; /* 4-bit or 8-bit (default) */ int ifwidth; /* 4-bit or 8-bit (default) */
int bwidth; /* Default set by hd44780_alloc() */ int bwidth; /* Default set by hd44780_alloc() */
int hwidth; /* Default set by hd44780_alloc() */ int hwidth; /* Default set by hd44780_alloc() */
void (*write_data)(struct hd44780_common *hdc, int data);
void *hd44780; void *hd44780;
}; };
......
...@@ -734,7 +734,7 @@ static void lcd_write_cmd_s(struct charlcd *charlcd, int cmd) ...@@ -734,7 +734,7 @@ static void lcd_write_cmd_s(struct charlcd *charlcd, int cmd)
} }
/* send data to the LCD panel in serial mode */ /* send data to the LCD panel in serial mode */
static void lcd_write_data_s(struct charlcd *charlcd, int data) static void lcd_write_data_s(struct hd44780_common *hdc, int data)
{ {
spin_lock_irq(&pprt_lock); spin_lock_irq(&pprt_lock);
lcd_send_serial(0x5F); /* R/W=W, RS=1 */ lcd_send_serial(0x5F); /* R/W=W, RS=1 */
...@@ -767,7 +767,7 @@ static void lcd_write_cmd_p8(struct charlcd *charlcd, int cmd) ...@@ -767,7 +767,7 @@ static void lcd_write_cmd_p8(struct charlcd *charlcd, int cmd)
} }
/* send data to the LCD panel in 8 bits parallel mode */ /* send data to the LCD panel in 8 bits parallel mode */
static void lcd_write_data_p8(struct charlcd *charlcd, int data) static void lcd_write_data_p8(struct hd44780_common *hdc, 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 */
...@@ -799,7 +799,7 @@ static void lcd_write_cmd_tilcd(struct charlcd *charlcd, int cmd) ...@@ -799,7 +799,7 @@ static void lcd_write_cmd_tilcd(struct charlcd *charlcd, int cmd)
} }
/* send data to the TI LCD panel */ /* send data to the TI LCD panel */
static void lcd_write_data_tilcd(struct charlcd *charlcd, int data) static void lcd_write_data_tilcd(struct hd44780_common *hdc, 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 */
...@@ -874,21 +874,18 @@ static void lcd_clear_fast_tilcd(struct charlcd *charlcd) ...@@ -874,21 +874,18 @@ static void lcd_clear_fast_tilcd(struct charlcd *charlcd)
static const struct charlcd_ops charlcd_serial_ops = { static const struct charlcd_ops charlcd_serial_ops = {
.write_cmd = lcd_write_cmd_s, .write_cmd = lcd_write_cmd_s,
.write_data = lcd_write_data_s,
.clear_fast = lcd_clear_fast_s, .clear_fast = lcd_clear_fast_s,
.backlight = lcd_backlight, .backlight = lcd_backlight,
}; };
static const struct charlcd_ops charlcd_parallel_ops = { static const struct charlcd_ops charlcd_parallel_ops = {
.write_cmd = lcd_write_cmd_p8, .write_cmd = lcd_write_cmd_p8,
.write_data = lcd_write_data_p8,
.clear_fast = lcd_clear_fast_p8, .clear_fast = lcd_clear_fast_p8,
.backlight = lcd_backlight, .backlight = lcd_backlight,
}; };
static const struct charlcd_ops charlcd_tilcd_ops = { static const struct charlcd_ops charlcd_tilcd_ops = {
.write_cmd = lcd_write_cmd_tilcd, .write_cmd = lcd_write_cmd_tilcd,
.write_data = lcd_write_data_tilcd,
.clear_fast = lcd_clear_fast_tilcd, .clear_fast = lcd_clear_fast_tilcd,
.backlight = lcd_backlight, .backlight = lcd_backlight,
}; };
...@@ -1019,6 +1016,7 @@ static void lcd_init(void) ...@@ -1019,6 +1016,7 @@ static void lcd_init(void)
if (lcd.proto == LCD_PROTO_SERIAL) { /* SERIAL */ if (lcd.proto == LCD_PROTO_SERIAL) { /* SERIAL */
charlcd->ops = &charlcd_serial_ops; charlcd->ops = &charlcd_serial_ops;
hdc->write_data = lcd_write_data_s;
if (lcd.pins.cl == PIN_NOT_SET) if (lcd.pins.cl == PIN_NOT_SET)
lcd.pins.cl = DEFAULT_LCD_PIN_SCL; lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
...@@ -1027,6 +1025,7 @@ static void lcd_init(void) ...@@ -1027,6 +1025,7 @@ static void lcd_init(void)
} else if (lcd.proto == LCD_PROTO_PARALLEL) { /* PARALLEL */ } else if (lcd.proto == LCD_PROTO_PARALLEL) { /* PARALLEL */
charlcd->ops = &charlcd_parallel_ops; charlcd->ops = &charlcd_parallel_ops;
hdc->write_data = lcd_write_data_p8;
if (lcd.pins.e == PIN_NOT_SET) if (lcd.pins.e == PIN_NOT_SET)
lcd.pins.e = DEFAULT_LCD_PIN_E; lcd.pins.e = DEFAULT_LCD_PIN_E;
...@@ -1036,6 +1035,7 @@ static void lcd_init(void) ...@@ -1036,6 +1035,7 @@ static void lcd_init(void)
lcd.pins.rw = DEFAULT_LCD_PIN_RW; lcd.pins.rw = DEFAULT_LCD_PIN_RW;
} else { } else {
charlcd->ops = &charlcd_tilcd_ops; charlcd->ops = &charlcd_tilcd_ops;
hdc->write_data = lcd_write_data_tilcd;
} }
if (lcd.pins.bl == PIN_NOT_SET) if (lcd.pins.bl == PIN_NOT_SET)
......
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