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>
This commit is contained in:
Родитель
88645a86e3
Коммит
45421ffefb
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -877,6 +877,7 @@ static const struct charlcd_ops charlcd_serial_ops = {
|
|||
.backlight = lcd_backlight,
|
||||
.gotoxy = hd44780_common_gotoxy,
|
||||
.home = hd44780_common_home,
|
||||
.clear_display = hd44780_common_clear_display,
|
||||
};
|
||||
|
||||
static const struct charlcd_ops charlcd_parallel_ops = {
|
||||
|
@ -884,6 +885,7 @@ static const struct charlcd_ops charlcd_parallel_ops = {
|
|||
.backlight = lcd_backlight,
|
||||
.gotoxy = hd44780_common_gotoxy,
|
||||
.home = hd44780_common_home,
|
||||
.clear_display = hd44780_common_clear_display,
|
||||
};
|
||||
|
||||
static const struct charlcd_ops charlcd_tilcd_ops = {
|
||||
|
@ -891,6 +893,7 @@ static const struct charlcd_ops charlcd_tilcd_ops = {
|
|||
.backlight = lcd_backlight,
|
||||
.gotoxy = hd44780_common_gotoxy,
|
||||
.home = hd44780_common_home,
|
||||
.clear_display = hd44780_common_clear_display,
|
||||
};
|
||||
|
||||
/* initialize the LCD driver */
|
||||
|
|
Загрузка…
Ссылка в новой задаче