Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3249977pxk; Mon, 5 Oct 2020 05:16:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8AlO88Wn7m3fkxbVA8LVqRlMpJuLCw7OrvJuhoALifKsP6oJszmdy59PlVBDqmG6jUyl2 X-Received: by 2002:a17:906:3716:: with SMTP id d22mr15248459ejc.267.1601900189453; Mon, 05 Oct 2020 05:16:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1601900189; cv=none; d=google.com; s=arc-20160816; b=KOrARWbAXuh44bOvsWRTr0QN7DEDMNXPJtdk5c5LqLbqXwW2z18W+WTSrVX3yNhmRy oM+Co8tBRDQsenVT5km3ady33wJVZBnFX1oPiI5GTcxNSfeW7ZUy6Bx0OiAR8JHEpCxN oYZPAwkeJ69ZB2MinTy6skjxZReZkiQzZzoYr1VYGDc8wyDueMVz4R0dNrefg0yBhzir K7PWPU0Doc5IbTuhJYqJ1D8maPhVAW7QzqsXF3FL098sv28rQzGnGQxUSQSDfPCEiQXv N5kDDVTfBchFlZQMJJ3bzl5I/JfmHAV6wYX9dvskG7Bw/m+MvkZ/RxWHx48ld7RQHOfX q1OQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=H8psiR5Tv0s/Qh7UIC8S2wBkgzGbJoA3ureWc1Fdj7I=; b=AzxdI1fPqQuRC1YmqwcgOWZvSDgQpwHdAhlpPYA0xw1aOdWeHBJ8VC7oNb0clka0Iy Pk3MuLorp7cgr4zIMyUXwMlVw4GSByVP08qrFtcSuHPoMHs/WtnF47HpizsDLl2WDdH5 0qcU98KATccLaBEnRZslGB9BR0KZa9Wjlg6gQVP0Av8HoRmF/bjUJuB2ulCz4QynV8Yj fqhN7LJLchzgccZNqVA7qo3BdhtUer1FGdayjraQc8ubCLvUEuVWt1A0+QVAkKY+g5Hy OJ20pRPN5LojH0s+NSC/AnXA8Fe7LpXxrBoYAKmMkiQqPJnS8TrQxOGE7NzDQotHbhXN LWUA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id c10si3777453edj.155.2020.10.05.05.16.06; Mon, 05 Oct 2020 05:16:29 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725954AbgJEMMm (ORCPT + 99 others); Mon, 5 Oct 2020 08:12:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46378 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726147AbgJEMMb (ORCPT ); Mon, 5 Oct 2020 08:12:31 -0400 Received: from smtp2-2.goneo.de (smtp2.goneo.de [IPv6:2001:1640:5::8:33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5DB67C0613AC for ; Mon, 5 Oct 2020 05:12:25 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by smtp2.goneo.de (Postfix) with ESMTP id 360F723FF15; Mon, 5 Oct 2020 14:12:24 +0200 (CEST) X-Virus-Scanned: by goneo X-Spam-Flag: NO X-Spam-Score: -2.991 X-Spam-Level: X-Spam-Status: No, score=-2.991 tagged_above=-999 tests=[ALL_TRUSTED=-1, AWL=-0.091, BAYES_00=-1.9] autolearn=ham Received: from smtp2.goneo.de ([127.0.0.1]) by localhost (smtp2.goneo.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id u2tbruNdUKfh; Mon, 5 Oct 2020 14:12:21 +0200 (CEST) Received: from lem-wkst-02.lemonage.de. (hq.lemonage.de [87.138.178.34]) by smtp2.goneo.de (Postfix) with ESMTPA id 317DC241B47; Mon, 5 Oct 2020 14:12:21 +0200 (CEST) From: poeschel@lemonage.de To: Miguel Ojeda Sandonis , Willy Tarreau , Ksenija Stanojevic , linux-kernel@vger.kernel.org (open list) Cc: Lars Poeschel , Willy Tarreau Subject: [PATCH v3 06/32] auxdisplay: Move write_cmd pointers to hd44780 drivers Date: Mon, 5 Oct 2020 14:11:34 +0200 Message-Id: <20201005121200.3427363-7-poeschel@lemonage.de> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20201005121200.3427363-1-poeschel@lemonage.de> References: <20201005121200.3427363-1-poeschel@lemonage.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Lars Poeschel 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 Signed-off-by: Lars Poeschel --- drivers/auxdisplay/charlcd.c | 45 +++++++++++++++-------------- drivers/auxdisplay/charlcd.h | 5 ---- drivers/auxdisplay/hd44780.c | 15 ++++------ drivers/auxdisplay/hd44780_common.h | 3 ++ drivers/auxdisplay/panel.c | 12 ++++---- 5 files changed, 38 insertions(+), 42 deletions(-) diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c index df54078656c1..ce6622f71c34 100644 --- a/drivers/auxdisplay/charlcd.c +++ b/drivers/auxdisplay/charlcd.c @@ -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 */ diff --git a/drivers/auxdisplay/charlcd.h b/drivers/auxdisplay/charlcd.h index fba4f2cd42c4..ad6fd2733523 100644 --- a/drivers/auxdisplay/charlcd.h +++ b/drivers/auxdisplay/charlcd.h @@ -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); }; diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c index 922f0e0d2e6d..dc4738563298 100644 --- a/drivers/auxdisplay/hd44780.c +++ b/drivers/auxdisplay/hd44780.c @@ -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); diff --git a/drivers/auxdisplay/hd44780_common.h b/drivers/auxdisplay/hd44780_common.h index 1d686c99b2c1..6c38ddf8f2ce 100644 --- a/drivers/auxdisplay/hd44780_common.h +++ b/drivers/auxdisplay/hd44780_common.h @@ -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; }; diff --git a/drivers/auxdisplay/panel.c b/drivers/auxdisplay/panel.c index 15100d21a6e9..7ef9bc7188ca 100644 --- a/drivers/auxdisplay/panel.c +++ b/drivers/auxdisplay/panel.c @@ -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) -- 2.28.0