summaryrefslogtreecommitdiff
path: root/drivers/auxdisplay/hd44780_common.c
diff options
context:
space:
mode:
authorLars Poeschel <poeschel@lemonage.de>2020-11-03 12:58:14 +0300
committerMiguel Ojeda <ojeda@kernel.org>2020-11-04 13:04:03 +0300
commit45421ffefbb5f195de02ead952755329ef8576d8 (patch)
tree37fb7be29a8b25c6df3648512212d669d6dd90d8 /drivers/auxdisplay/hd44780_common.c
parent88645a86e3420cddfe5bb9cd8d7c15aff8f54b46 (diff)
downloadlinux-45421ffefbb5f195de02ead952755329ef8576d8.tar.xz
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: Willy Tarreau <w@1wt.eu> Signed-off-by: Lars Poeschel <poeschel@lemonage.de> Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Diffstat (limited to 'drivers/auxdisplay/hd44780_common.c')
-rw-r--r--drivers/auxdisplay/hd44780_common.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/auxdisplay/hd44780_common.c b/drivers/auxdisplay/hd44780_common.c
index ea62beada9d8..2f7d55668eb4 100644
--- a/drivers/auxdisplay/hd44780_common.c
+++ b/drivers/auxdisplay/hd44780_common.c
@@ -1,13 +1,22 @@
// 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;