Commit 45421ffe authored by Lars Poeschel's avatar Lars Poeschel Committed by Miguel Ojeda
Browse files

auxdisplay: Move clear_display to hd44780_common



This moves the clear_display function from charlcd to hd44780_common.
This is one more step to make charlcd independent from device specific
code. The two hd44780 drivers use the new function from hd44780_common
and charlcd calls this function through its function pointer in its ops
structure.

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 88645a86
Loading
Loading
Loading
Loading
+6 −16
Original line number Diff line number Diff line
@@ -34,8 +34,6 @@
#define LCD_FLAG_L		0x0080	/* Backlight enabled */

/* LCD commands */
#define LCD_CMD_DISPLAY_CLEAR	0x01	/* Clear entire display */

#define LCD_CMD_ENTRY_MODE	0x04	/* Set entry mode */
#define LCD_CMD_CURSOR_INC	0x02	/* Increment cursor */

@@ -178,18 +176,6 @@ static void charlcd_clear_fast(struct charlcd *lcd)
	charlcd_home(lcd);
}

/* clears the display and resets X/Y */
static void charlcd_clear_display(struct charlcd *lcd)
{
	struct hd44780_common *hdc = lcd->drvdata;

	hdc->write_cmd(hdc, LCD_CMD_DISPLAY_CLEAR);
	lcd->addr.x = 0;
	lcd->addr.y = 0;
	/* we must wait a few milliseconds (15) */
	long_sleep(15);
}

static int charlcd_init_display(struct charlcd *lcd)
{
	void (*write_cmd_raw)(struct hd44780_common *hdc, int cmd);
@@ -254,7 +240,9 @@ static int charlcd_init_display(struct charlcd *lcd)
	/* entry mode set : increment, cursor shifting */
	hdc->write_cmd(hdc, LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC);

	charlcd_clear_display(lcd);
	lcd->ops->clear_display(lcd);
	lcd->addr.x = 0;
	lcd->addr.y = 0;
	return 0;
}

@@ -670,8 +658,10 @@ static int charlcd_open(struct inode *inode, struct file *file)
		goto fail;

	if (priv->must_clear) {
		charlcd_clear_display(&priv->lcd);
		priv->lcd.ops->clear_display(&priv->lcd);
		priv->must_clear = false;
		priv->lcd.addr.x = 0;
		priv->lcd.addr.y = 0;
	}
	return nonseekable_open(inode, file);

+4 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ struct charlcd {
 * previously set in addr.x and addr.y by charlcd.
 * @home: Set cursor to 0, 0. The values in addr.x and addr.y are set to 0, 0 by
 * charlcd prior to calling this function.
 * @clear_display: Again clear the whole display, set the cursor to 0, 0. The
 * values in addr.x and addr.y are set to 0, 0 by charlcd prior to calling this
 * function.
 */
struct charlcd_ops {
	void (*clear_fast)(struct charlcd *lcd);
@@ -50,6 +53,7 @@ struct charlcd_ops {
	int (*print)(struct charlcd *lcd, int c);
	int (*gotoxy)(struct charlcd *lcd);
	int (*home)(struct charlcd *lcd);
	int (*clear_display)(struct charlcd *lcd);
};

struct charlcd *charlcd_alloc(void);
+2 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ static const struct charlcd_ops hd44780_ops_gpio8 = {
	.print		= hd44780_common_print,
	.gotoxy		= hd44780_common_gotoxy,
	.home		= hd44780_common_home,
	.clear_display	= hd44780_common_clear_display,
};

/* Send a command to the LCD panel in 4 bit GPIO mode */
@@ -175,6 +176,7 @@ static const struct charlcd_ops hd44780_ops_gpio4 = {
	.print		= hd44780_common_print,
	.gotoxy		= hd44780_common_gotoxy,
	.home		= hd44780_common_home,
	.clear_display	= hd44780_common_clear_display,
};

static int hd44780_probe(struct platform_device *pdev)
+21 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>

#include "charlcd.h"
#include "hd44780_common.h"

/* LCD commands */
#define LCD_CMD_DISPLAY_CLEAR	0x01	/* Clear entire display */

#define LCD_CMD_SET_DDRAM_ADDR	0x80	/* Set display data RAM address */

/* sleeps that many milliseconds with a reschedule */
static void long_sleep(int ms)
{
	schedule_timeout_interruptible(msecs_to_jiffies(ms));
}

int hd44780_common_print(struct charlcd *lcd, int c)
{
	struct hd44780_common *hdc = lcd->drvdata;
@@ -49,6 +58,18 @@ int hd44780_common_home(struct charlcd *lcd)
}
EXPORT_SYMBOL_GPL(hd44780_common_home);

/* clears the display and resets X/Y */
int hd44780_common_clear_display(struct charlcd *lcd)
{
	struct hd44780_common *hdc = lcd->drvdata;

	hdc->write_cmd(hdc, LCD_CMD_DISPLAY_CLEAR);
	/* we must wait a few milliseconds (15) */
	long_sleep(15);
	return 0;
}
EXPORT_SYMBOL_GPL(hd44780_common_clear_display);

struct hd44780_common *hd44780_common_alloc(void)
{
	struct hd44780_common *hd;
+1 −0
Original line number Diff line number Diff line
@@ -17,4 +17,5 @@ struct hd44780_common {
int hd44780_common_print(struct charlcd *lcd, int c);
int hd44780_common_gotoxy(struct charlcd *lcd);
int hd44780_common_home(struct charlcd *lcd);
int hd44780_common_clear_display(struct charlcd *lcd);
struct hd44780_common *hd44780_common_alloc(void);
Loading