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

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
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ static void charlcd_print(struct charlcd *lcd, char c)
	if (priv->addr.x < hdc->bwidth) {
		if (lcd->char_conv)
			c = lcd->char_conv[(unsigned char)c];
		lcd->ops->write_data(lcd, c);
		hdc->write_data(hdc, c);
		priv->addr.x++;

		/* prevents the cursor from wrapping onto the next line */
@@ -202,7 +202,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
		lcd->ops->clear_fast(lcd);
	else
		for (pos = 0; pos < min(2, lcd->height) * hdc->hwidth; pos++)
			lcd->ops->write_data(lcd, ' ');
			hdc->write_data(hdc, ' ');

	charlcd_home(lcd);
}
@@ -446,7 +446,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
		int x;

		for (x = priv->addr.x; x < hdc->bwidth; x++)
			lcd->ops->write_data(lcd, ' ');
			hdc->write_data(hdc, ' ');

		/* restore cursor position */
		charlcd_gotoxy(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));
		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 */
		charlcd_gotoxy(lcd);
@@ -587,7 +587,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
				priv->addr.x--;
			}
			/* replace with a space */
			lcd->ops->write_data(lcd, ' ');
			hdc->write_data(hdc, ' ');
			/* back one char again */
			lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT);
			break;
@@ -601,7 +601,7 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
			 * go to the beginning of the next line
			 */
			for (; priv->addr.x < hdc->bwidth; priv->addr.x++)
				lcd->ops->write_data(lcd, ' ');
				hdc->write_data(hdc, ' ');
			priv->addr.x = 0;
			priv->addr.y = (priv->addr.y + 1) % lcd->height;
			charlcd_gotoxy(lcd);
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ struct charlcd {
struct charlcd_ops {
	/* Required */
	void (*write_cmd)(struct charlcd *lcd, int cmd);
	void (*write_data)(struct charlcd *lcd, int data);

	/* Optional */
	void (*write_cmd_raw4)(struct charlcd *lcd, int cmd);	/* 4-bit only */
+9 −7
Original line number Diff line number Diff line
@@ -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 */
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;

	hd44780_write_gpio8(hd, data, 1);
@@ -128,7 +127,6 @@ static void hd44780_write_data_gpio8(struct charlcd *lcd, int data)

static const struct charlcd_ops hd44780_ops_gpio8 = {
	.write_cmd	= hd44780_write_cmd_gpio8,
	.write_data	= hd44780_write_data_gpio8,
	.backlight	= hd44780_backlight,
};

@@ -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 */
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;

	hd44780_write_gpio4(hd, data, 1);
@@ -177,7 +174,6 @@ static void hd44780_write_data_gpio4(struct charlcd *lcd, int data)
static const struct charlcd_ops hd44780_ops_gpio4 = {
	.write_cmd	= hd44780_write_cmd_gpio4,
	.write_cmd_raw4	= hd44780_write_cmd_raw_gpio4,
	.write_data	= hd44780_write_data_gpio4,
	.backlight	= hd44780_backlight,
};

@@ -276,7 +272,13 @@ static int hd44780_probe(struct platform_device *pdev)
	device_property_read_u32(dev, "internal-buffer-width", &hdc->bwidth);

	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);
	if (ret)
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ struct hd44780_common {
	int ifwidth;			/* 4-bit or 8-bit (default) */
	int bwidth;			/* Default set by hd44780_alloc() */
	int hwidth;			/* Default set by hd44780_alloc() */
	void (*write_data)(struct hd44780_common *hdc, int data);
	void *hd44780;
};

+6 −6
Original line number Diff line number Diff line
@@ -734,7 +734,7 @@ static void lcd_write_cmd_s(struct charlcd *charlcd, int cmd)
}

/* 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);
	lcd_send_serial(0x5F);	/* R/W=W, RS=1 */
@@ -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 */
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);
	/* present the data to the data port */
@@ -799,7 +799,7 @@ static void lcd_write_cmd_tilcd(struct charlcd *charlcd, int cmd)
}

/* 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);
	/* present the data to the data port */
@@ -874,21 +874,18 @@ static void lcd_clear_fast_tilcd(struct charlcd *charlcd)

static const struct charlcd_ops charlcd_serial_ops = {
	.write_cmd	= lcd_write_cmd_s,
	.write_data	= lcd_write_data_s,
	.clear_fast	= lcd_clear_fast_s,
	.backlight	= lcd_backlight,
};

static const struct charlcd_ops charlcd_parallel_ops = {
	.write_cmd	= lcd_write_cmd_p8,
	.write_data	= lcd_write_data_p8,
	.clear_fast	= lcd_clear_fast_p8,
	.backlight	= lcd_backlight,
};

static const struct charlcd_ops charlcd_tilcd_ops = {
	.write_cmd	= lcd_write_cmd_tilcd,
	.write_data	= lcd_write_data_tilcd,
	.clear_fast	= lcd_clear_fast_tilcd,
	.backlight	= lcd_backlight,
};
@@ -1019,6 +1016,7 @@ static void lcd_init(void)

	if (lcd.proto == LCD_PROTO_SERIAL) {	/* SERIAL */
		charlcd->ops = &charlcd_serial_ops;
		hdc->write_data = lcd_write_data_s;

		if (lcd.pins.cl == PIN_NOT_SET)
			lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
@@ -1027,6 +1025,7 @@ static void lcd_init(void)

	} else if (lcd.proto == LCD_PROTO_PARALLEL) {	/* PARALLEL */
		charlcd->ops = &charlcd_parallel_ops;
		hdc->write_data = lcd_write_data_p8;

		if (lcd.pins.e == PIN_NOT_SET)
			lcd.pins.e = DEFAULT_LCD_PIN_E;
@@ -1036,6 +1035,7 @@ static void lcd_init(void)
			lcd.pins.rw = DEFAULT_LCD_PIN_RW;
	} else {
		charlcd->ops = &charlcd_tilcd_ops;
		hdc->write_data = lcd_write_data_tilcd;
	}

	if (lcd.pins.bl == PIN_NOT_SET)