auxdisplay: Move write_cmd pointers to hd44780 drivers
authorLars Poeschel <poeschel@lemonage.de>
Tue, 3 Nov 2020 09:58:09 +0000 (10:58 +0100)
committerMiguel Ojeda <ojeda@kernel.org>
Wed, 4 Nov 2020 10:04:03 +0000 (11:04 +0100)
The write_cmd function is used to send commands to hd44780 displays.
The individual hd44780 drivers then implement their appropriate way of
doing this with their supported displays. So we move this pointer so
hd44780_common.

Reviewed-by: Willy Tarreau <w@1wt.eu>
Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
drivers/auxdisplay/charlcd.c
drivers/auxdisplay/charlcd.h
drivers/auxdisplay/hd44780.c
drivers/auxdisplay/hd44780_common.h
drivers/auxdisplay/panel.c

index df54078656c17943f8fb0887c9f215a6bd0cc2d5..ce6622f71c34d224332c0faba7093a69c652c804 100644 (file)
@@ -162,7 +162,7 @@ static void charlcd_gotoxy(struct charlcd *lcd)
                addr += hdc->hwidth;
        if (priv->addr.y & 2)
                addr += hdc->bwidth;
-       lcd->ops->write_cmd(lcd, LCD_CMD_SET_DDRAM_ADDR | addr);
+       hdc->write_cmd(hdc, LCD_CMD_SET_DDRAM_ADDR | addr);
 }
 
 static void charlcd_home(struct charlcd *lcd)
@@ -211,8 +211,9 @@ static void charlcd_clear_fast(struct charlcd *lcd)
 static void charlcd_clear_display(struct charlcd *lcd)
 {
        struct charlcd_priv *priv = charlcd_to_priv(lcd);
+       struct hd44780_common *hdc = lcd->drvdata;
 
-       lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CLEAR);
+       hdc->write_cmd(hdc, LCD_CMD_DISPLAY_CLEAR);
        priv->addr.x = 0;
        priv->addr.y = 0;
        /* we must wait a few milliseconds (15) */
@@ -221,7 +222,7 @@ static void charlcd_clear_display(struct charlcd *lcd)
 
 static int charlcd_init_display(struct charlcd *lcd)
 {
-       void (*write_cmd_raw)(struct charlcd *lcd, int cmd);
+       void (*write_cmd_raw)(struct hd44780_common *hdc, int cmd);
        struct charlcd_priv *priv = charlcd_to_priv(lcd);
        struct hd44780_common *hdc = lcd->drvdata;
        u8 init;
@@ -241,25 +242,25 @@ static int charlcd_init_display(struct charlcd *lcd)
        init = LCD_CMD_FUNCTION_SET | LCD_CMD_DATA_LEN_8BITS;
        if (hdc->ifwidth == 4) {
                init >>= 4;
-               write_cmd_raw = lcd->ops->write_cmd_raw4;
+               write_cmd_raw = hdc->write_cmd_raw4;
        } else {
-               write_cmd_raw = lcd->ops->write_cmd;
+               write_cmd_raw = hdc->write_cmd;
        }
-       write_cmd_raw(lcd, init);
+       write_cmd_raw(hdc, init);
        long_sleep(10);
-       write_cmd_raw(lcd, init);
+       write_cmd_raw(hdc, init);
        long_sleep(10);
-       write_cmd_raw(lcd, init);
+       write_cmd_raw(hdc, init);
        long_sleep(10);
 
        if (hdc->ifwidth == 4) {
                /* Switch to 4-bit mode, 1 line, small fonts */
-               lcd->ops->write_cmd_raw4(lcd, LCD_CMD_FUNCTION_SET >> 4);
+               hdc->write_cmd_raw4(hdc, LCD_CMD_FUNCTION_SET >> 4);
                long_sleep(10);
        }
 
        /* set font height and lines number */
-       lcd->ops->write_cmd(lcd,
+       hdc->write_cmd(hdc,
                LCD_CMD_FUNCTION_SET |
                ((hdc->ifwidth == 8) ? LCD_CMD_DATA_LEN_8BITS : 0) |
                ((priv->flags & LCD_FLAG_F) ? LCD_CMD_FONT_5X10_DOTS : 0) |
@@ -267,10 +268,10 @@ static int charlcd_init_display(struct charlcd *lcd)
        long_sleep(10);
 
        /* display off, cursor off, blink off */
-       lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CTRL);
+       hdc->write_cmd(hdc, LCD_CMD_DISPLAY_CTRL);
        long_sleep(10);
 
-       lcd->ops->write_cmd(lcd,
+       hdc->write_cmd(hdc,
                LCD_CMD_DISPLAY_CTRL |  /* set display mode */
                ((priv->flags & LCD_FLAG_D) ? LCD_CMD_DISPLAY_ON : 0) |
                ((priv->flags & LCD_FLAG_C) ? LCD_CMD_CURSOR_ON : 0) |
@@ -281,7 +282,7 @@ static int charlcd_init_display(struct charlcd *lcd)
        long_sleep(10);
 
        /* entry mode set : increment, cursor shifting */
-       lcd->ops->write_cmd(lcd, LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC);
+       hdc->write_cmd(hdc, LCD_CMD_ENTRY_MODE | LCD_CMD_CURSOR_INC);
 
        charlcd_clear_display(lcd);
        return 0;
@@ -417,7 +418,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
                if (priv->addr.x > 0) {
                        /* back one char if not at end of line */
                        if (priv->addr.x < hdc->bwidth)
-                               lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT);
+                               hdc->write_cmd(hdc, LCD_CMD_SHIFT);
                        priv->addr.x--;
                }
                processed = 1;
@@ -426,18 +427,18 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
                if (priv->addr.x < lcd->width) {
                        /* allow the cursor to pass the end of the line */
                        if (priv->addr.x < (hdc->bwidth - 1))
-                               lcd->ops->write_cmd(lcd,
+                               hdc->write_cmd(hdc,
                                        LCD_CMD_SHIFT | LCD_CMD_SHIFT_RIGHT);
                        priv->addr.x++;
                }
                processed = 1;
                break;
        case 'L':       /* shift display left */
-               lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT);
+               hdc->write_cmd(hdc, LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT);
                processed = 1;
                break;
        case 'R':       /* shift display right */
-               lcd->ops->write_cmd(lcd,
+               hdc->write_cmd(hdc,
                                    LCD_CMD_SHIFT | LCD_CMD_DISPLAY_SHIFT |
                                    LCD_CMD_SHIFT_RIGHT);
                processed = 1;
@@ -503,7 +504,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
                        }
                }
 
-               lcd->ops->write_cmd(lcd, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
+               hdc->write_cmd(hdc, LCD_CMD_SET_CGRAM_ADDR | (cgaddr * 8));
                for (addr = 0; addr < cgoffset; addr++)
                        hdc->write_data(hdc, cgbytes[addr]);
 
@@ -535,14 +536,14 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
        if ((oldflags ^ priv->flags) &
            (LCD_FLAG_B | LCD_FLAG_C | LCD_FLAG_D))
                /* set display mode */
-               lcd->ops->write_cmd(lcd,
+               hdc->write_cmd(hdc,
                        LCD_CMD_DISPLAY_CTRL |
                        ((priv->flags & LCD_FLAG_D) ? LCD_CMD_DISPLAY_ON : 0) |
                        ((priv->flags & LCD_FLAG_C) ? LCD_CMD_CURSOR_ON : 0) |
                        ((priv->flags & LCD_FLAG_B) ? LCD_CMD_BLINK_ON : 0));
        /* check whether one of F,N flags was changed */
        else if ((oldflags ^ priv->flags) & (LCD_FLAG_F | LCD_FLAG_N))
-               lcd->ops->write_cmd(lcd,
+               hdc->write_cmd(hdc,
                        LCD_CMD_FUNCTION_SET |
                        ((hdc->ifwidth == 8) ? LCD_CMD_DATA_LEN_8BITS : 0) |
                        ((priv->flags & LCD_FLAG_F) ? LCD_CMD_FONT_5X10_DOTS : 0) |
@@ -583,13 +584,13 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
                                 */
                                if (priv->addr.x < hdc->bwidth)
                                        /* back one char */
-                                       lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT);
+                                       hdc->write_cmd(hdc, LCD_CMD_SHIFT);
                                priv->addr.x--;
                        }
                        /* replace with a space */
                        hdc->write_data(hdc, ' ');
                        /* back one char again */
-                       lcd->ops->write_cmd(lcd, LCD_CMD_SHIFT);
+                       hdc->write_cmd(hdc, LCD_CMD_SHIFT);
                        break;
                case '\f':
                        /* quickly clear the display */
index fba4f2cd42c48421fd968fc3fea858ce2ff7b84b..ad6fd273352357a2f64b5edb8662d9805dbaa493 100644 (file)
@@ -25,11 +25,6 @@ struct charlcd {
 };
 
 struct charlcd_ops {
-       /* Required */
-       void (*write_cmd)(struct charlcd *lcd, int cmd);
-
-       /* Optional */
-       void (*write_cmd_raw4)(struct charlcd *lcd, int cmd);   /* 4-bit only */
        void (*clear_fast)(struct charlcd *lcd);
        void (*backlight)(struct charlcd *lcd, enum charlcd_onoff on);
 };
index 922f0e0d2e6df9f34c335b5a58e6cfd141d7deb4..dc4738563298684da1d4d23e6974be8e31fa6fe2 100644 (file)
@@ -103,9 +103,8 @@ static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs)
 }
 
 /* Send a command to the LCD panel in 8 bit GPIO mode */
-static void hd44780_write_cmd_gpio8(struct charlcd *lcd, int cmd)
+static void hd44780_write_cmd_gpio8(struct hd44780_common *hdc, int cmd)
 {
-       struct hd44780_common *hdc = lcd->drvdata;
        struct hd44780 *hd = hdc->hd44780;
 
        hd44780_write_gpio8(hd, cmd, 0);
@@ -126,14 +125,12 @@ static void hd44780_write_data_gpio8(struct hd44780_common *hdc, int data)
 }
 
 static const struct charlcd_ops hd44780_ops_gpio8 = {
-       .write_cmd      = hd44780_write_cmd_gpio8,
        .backlight      = hd44780_backlight,
 };
 
 /* Send a command to the LCD panel in 4 bit GPIO mode */
-static void hd44780_write_cmd_gpio4(struct charlcd *lcd, int cmd)
+static void hd44780_write_cmd_gpio4(struct hd44780_common *hdc, int cmd)
 {
-       struct hd44780_common *hdc = lcd->drvdata;
        struct hd44780 *hd = hdc->hd44780;
 
        hd44780_write_gpio4(hd, cmd, 0);
@@ -143,10 +140,9 @@ static void hd44780_write_cmd_gpio4(struct charlcd *lcd, int cmd)
 }
 
 /* Send 4-bits of a command to the LCD panel in raw 4 bit GPIO mode */
-static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd)
+static void hd44780_write_cmd_raw_gpio4(struct hd44780_common *hdc, int cmd)
 {
        DECLARE_BITMAP(values, 6); /* for DATA[4-7], RS, RW */
-       struct hd44780_common *hdc = lcd->drvdata;
        struct hd44780 *hd = hdc->hd44780;
        unsigned int n;
 
@@ -172,8 +168,6 @@ static void hd44780_write_data_gpio4(struct hd44780_common *hdc, int data)
 }
 
 static const struct charlcd_ops hd44780_ops_gpio4 = {
-       .write_cmd      = hd44780_write_cmd_gpio4,
-       .write_cmd_raw4 = hd44780_write_cmd_raw_gpio4,
        .backlight      = hd44780_backlight,
 };
 
@@ -275,9 +269,12 @@ static int hd44780_probe(struct platform_device *pdev)
        if (ifwidth == 8) {
                lcd->ops = &hd44780_ops_gpio8;
                hdc->write_data = hd44780_write_data_gpio8;
+               hdc->write_cmd = hd44780_write_cmd_gpio8;
        } else {
                lcd->ops = &hd44780_ops_gpio4;
                hdc->write_data = hd44780_write_data_gpio4;
+               hdc->write_cmd = hd44780_write_cmd_gpio4;
+               hdc->write_cmd_raw4 = hd44780_write_cmd_raw_gpio4;
        }
 
        ret = charlcd_register(lcd);
index bcc13421bf45a159de1da8f558ad27484a18b0e6..73dd4c7c6de308d3fcf7633a776e19fa1eff3192 100644 (file)
@@ -8,6 +8,9 @@ struct hd44780_common {
        int bwidth;                     /* Default set by hd44780_alloc() */
        int hwidth;                     /* Default set by hd44780_alloc() */
        void (*write_data)(struct hd44780_common *hdc, int data);
+       void (*write_cmd)(struct hd44780_common *hdc, int cmd);
+       /* write_cmd_raw4 is for 4-bit connected displays only */
+       void (*write_cmd_raw4)(struct hd44780_common *hdc, int cmd);
        void *hd44780;
 };
 
index 15100d21a6e95bcb2fb4a7aa9cf2554653e12e02..7ef9bc7188ca9e7f7671f56a0235e32894403628 100644 (file)
@@ -723,7 +723,7 @@ static void lcd_backlight(struct charlcd *charlcd, enum charlcd_onoff on)
 }
 
 /* send a command to the LCD panel in serial mode */
-static void lcd_write_cmd_s(struct charlcd *charlcd, int cmd)
+static void lcd_write_cmd_s(struct hd44780_common *hdc, int cmd)
 {
        spin_lock_irq(&pprt_lock);
        lcd_send_serial(0x1F);  /* R/W=W, RS=0 */
@@ -745,7 +745,7 @@ static void lcd_write_data_s(struct hd44780_common *hdc, int data)
 }
 
 /* send a command to the LCD panel in 8 bits parallel mode */
-static void lcd_write_cmd_p8(struct charlcd *charlcd, int cmd)
+static void lcd_write_cmd_p8(struct hd44780_common *hdc, int cmd)
 {
        spin_lock_irq(&pprt_lock);
        /* present the data to the data port */
@@ -789,7 +789,7 @@ static void lcd_write_data_p8(struct hd44780_common *hdc, int data)
 }
 
 /* send a command to the TI LCD panel */
-static void lcd_write_cmd_tilcd(struct charlcd *charlcd, int cmd)
+static void lcd_write_cmd_tilcd(struct hd44780_common *hdc, int cmd)
 {
        spin_lock_irq(&pprt_lock);
        /* present the data to the control port */
@@ -873,19 +873,16 @@ static void lcd_clear_fast_tilcd(struct charlcd *charlcd)
 }
 
 static const struct charlcd_ops charlcd_serial_ops = {
-       .write_cmd      = lcd_write_cmd_s,
        .clear_fast     = lcd_clear_fast_s,
        .backlight      = lcd_backlight,
 };
 
 static const struct charlcd_ops charlcd_parallel_ops = {
-       .write_cmd      = lcd_write_cmd_p8,
        .clear_fast     = lcd_clear_fast_p8,
        .backlight      = lcd_backlight,
 };
 
 static const struct charlcd_ops charlcd_tilcd_ops = {
-       .write_cmd      = lcd_write_cmd_tilcd,
        .clear_fast     = lcd_clear_fast_tilcd,
        .backlight      = lcd_backlight,
 };
@@ -1017,6 +1014,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;
+               hdc->write_cmd = lcd_write_cmd_s;
 
                if (lcd.pins.cl == PIN_NOT_SET)
                        lcd.pins.cl = DEFAULT_LCD_PIN_SCL;
@@ -1026,6 +1024,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;
+               hdc->write_cmd = lcd_write_cmd_p8;
 
                if (lcd.pins.e == PIN_NOT_SET)
                        lcd.pins.e = DEFAULT_LCD_PIN_E;
@@ -1036,6 +1035,7 @@ static void lcd_init(void)
        } else {
                charlcd->ops = &charlcd_tilcd_ops;
                hdc->write_data = lcd_write_data_tilcd;
+               hdc->write_cmd = lcd_write_cmd_tilcd;
        }
 
        if (lcd.pins.bl == PIN_NOT_SET)