All of lore.kernel.org
 help / color / mirror / Atom feed
From: poeschel@lemonage.de
To: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>,
	linux-kernel@vger.kernel.org (open list)
Cc: Lars Poeschel <poeschel@lemonage.de>
Subject: [PATCH v2 08/32] auxdisplay: hd44780_common_print
Date: Mon, 21 Sep 2020 16:46:20 +0200	[thread overview]
Message-ID: <20200921144645.2061313-9-poeschel@lemonage.de> (raw)
In-Reply-To: <20200921144645.2061313-1-poeschel@lemonage.de>

From: Lars Poeschel <poeschel@lemonage.de>

We create a hd44780_common_print function. It is derived from the
original charlcd_print. charlcd_print becomes a device independent print
function, that then only calles via it's ops function pointers, into the
print function offered by drivers.

Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
---
 drivers/auxdisplay/charlcd.c        | 28 +++++++++++++++-------------
 drivers/auxdisplay/charlcd.h        | 11 +++++++++++
 drivers/auxdisplay/hd44780.c        |  2 ++
 drivers/auxdisplay/hd44780_common.c | 13 +++++++++++++
 drivers/auxdisplay/hd44780_common.h |  1 +
 5 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c
index 1b37d4bc38f9..72ed004a8980 100644
--- a/drivers/auxdisplay/charlcd.c
+++ b/drivers/auxdisplay/charlcd.c
@@ -167,18 +167,15 @@ static void charlcd_home(struct charlcd *lcd)
 
 static void charlcd_print(struct charlcd *lcd, char c)
 {
-	struct hd44780_common *hdc = lcd->drvdata;
+	if (lcd->char_conv)
+		c = lcd->char_conv[(unsigned char)c];
 
-	if (lcd->addr.x < hdc->bwidth) {
-		if (lcd->char_conv)
-			c = lcd->char_conv[(unsigned char)c];
-		hdc->write_data(hdc, c);
+	if (!lcd->ops->print(lcd, c))
 		lcd->addr.x++;
 
-		/* prevents the cursor from wrapping onto the next line */
-		if (lcd->addr.x == hdc->bwidth)
-			charlcd_gotoxy(lcd);
-	}
+	/* prevents the cursor from wrapping onto the next line */
+	if (lcd->addr.x == lcd->width)
+		charlcd_gotoxy(lcd);
 }
 
 static void charlcd_clear_fast(struct charlcd *lcd)
@@ -192,7 +189,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
 		lcd->ops->clear_fast(lcd);
 	else
 		for (pos = 0; pos < min(2, lcd->height) * hdc->hwidth; pos++)
-			hdc->write_data(hdc, ' ');
+			lcd->ops->print(lcd, ' ');
 
 	charlcd_home(lcd);
 }
@@ -433,12 +430,16 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
 		processed = 1;
 		break;
 	case 'k': {	/* kill end of line */
-		int x;
+		int x, xs, ys;
 
+		xs = lcd->addr.x;
+		ys = lcd->addr.y;
 		for (x = lcd->addr.x; x < hdc->bwidth; x++)
-			hdc->write_data(hdc, ' ');
+			lcd->ops->print(lcd, ' ');
 
 		/* restore cursor position */
+		lcd->addr.x = xs;
+		lcd->addr.y = ys;
 		charlcd_gotoxy(lcd);
 		processed = 1;
 		break;
@@ -591,7 +592,8 @@ static void charlcd_write_char(struct charlcd *lcd, char c)
 			 * go to the beginning of the next line
 			 */
 			for (; lcd->addr.x < hdc->bwidth; lcd->addr.x++)
-				hdc->write_data(hdc, ' ');
+				lcd->ops->print(lcd, ' ');
+
 			lcd->addr.x = 0;
 			lcd->addr.y = (lcd->addr.y + 1) % lcd->height;
 			charlcd_gotoxy(lcd);
diff --git a/drivers/auxdisplay/charlcd.h b/drivers/auxdisplay/charlcd.h
index ff4896af2189..874519f079b4 100644
--- a/drivers/auxdisplay/charlcd.h
+++ b/drivers/auxdisplay/charlcd.h
@@ -30,9 +30,20 @@ struct charlcd {
 	void *drvdata;
 };
 
+/**
+ * struct charlcd_ops - Functions used by charlcd. Drivers have to implement
+ * these.
+ * @clear_fast: Clear the whole display and set cursor to position 0, 0.
+ * @backlight: Turn backlight on or off. Optional.
+ * @print: just Print one character to the display at current cursor position.
+ * The cursor is advanced by charlcd.
+ * The buffered cursor position is advanced by charlcd. The cursor should not
+ * wrap to the next line at the end of a line.
+ */
 struct charlcd_ops {
 	void (*clear_fast)(struct charlcd *lcd);
 	void (*backlight)(struct charlcd *lcd, enum charlcd_onoff on);
+	int (*print)(struct charlcd *lcd, int c);
 };
 
 struct charlcd *charlcd_alloc(void);
diff --git a/drivers/auxdisplay/hd44780.c b/drivers/auxdisplay/hd44780.c
index dc4738563298..9680bb611639 100644
--- a/drivers/auxdisplay/hd44780.c
+++ b/drivers/auxdisplay/hd44780.c
@@ -126,6 +126,7 @@ static void hd44780_write_data_gpio8(struct hd44780_common *hdc, int data)
 
 static const struct charlcd_ops hd44780_ops_gpio8 = {
 	.backlight	= hd44780_backlight,
+	.print		= hd44780_common_print,
 };
 
 /* Send a command to the LCD panel in 4 bit GPIO mode */
@@ -169,6 +170,7 @@ static void hd44780_write_data_gpio4(struct hd44780_common *hdc, int data)
 
 static const struct charlcd_ops hd44780_ops_gpio4 = {
 	.backlight	= hd44780_backlight,
+	.print		= hd44780_common_print,
 };
 
 static int hd44780_probe(struct platform_device *pdev)
diff --git a/drivers/auxdisplay/hd44780_common.c b/drivers/auxdisplay/hd44780_common.c
index 285073a00302..da296c5ad7a5 100644
--- a/drivers/auxdisplay/hd44780_common.c
+++ b/drivers/auxdisplay/hd44780_common.c
@@ -2,8 +2,21 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 
+#include "charlcd.h"
 #include "hd44780_common.h"
 
+int hd44780_common_print(struct charlcd *lcd, int c)
+{
+	struct hd44780_common *hdc = lcd->drvdata;
+
+	if (lcd->addr.x < hdc->bwidth) {
+		hdc->write_data(hdc, c);
+		return 0;
+	}
+
+	return 1;
+}
+
 struct hd44780_common *hd44780_common_alloc(void)
 {
 	struct hd44780_common *hd;
diff --git a/drivers/auxdisplay/hd44780_common.h b/drivers/auxdisplay/hd44780_common.h
index 6c38ddf8f2ce..02d650903e35 100644
--- a/drivers/auxdisplay/hd44780_common.h
+++ b/drivers/auxdisplay/hd44780_common.h
@@ -14,5 +14,6 @@ struct hd44780_common {
 	void *hd44780;
 };
 
+int hd44780_common_print(struct charlcd *lcd, int c);
 struct hd44780_common *hd44780_common_alloc(void);
 
-- 
2.28.0


  parent reply	other threads:[~2020-09-21 14:49 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-16  8:24 [PATCH 1/3] auxdisplay: Make charlcd.[ch] more general Lars Poeschel
2019-10-16  8:26 ` [PATCH 2/3] auxdisplay: lcd2s DT binding doc Lars Poeschel
2019-10-29  1:24   ` Rob Herring
2019-10-16  8:27 ` [PATCH 3/3] auxdisplay: add a driver for lcd2s character display Lars Poeschel
2019-10-16 16:53 ` [PATCH 1/3] auxdisplay: Make charlcd.[ch] more general Miguel Ojeda
2019-10-17  8:07   ` Lars Poeschel
2019-10-17 11:26     ` Andy Shevchenko
2019-10-18 15:08     ` Miguel Ojeda
2019-10-18 15:33       ` Joe Perches
2019-10-18 21:55         ` Andi Kleen
2020-09-21 14:46 ` [PATCH v2 00/33] Make charlcd device independent poeschel
2020-09-21 14:46   ` [PATCH v2 01/32] auxdisplay: Use an enum for charlcd backlight on/off ops poeschel
2020-09-21 14:46   ` [PATCH v2 02/32] auxdisplay: Introduce hd44780_common.[ch] poeschel
2020-09-21 15:30     ` Randy Dunlap
2020-09-21 14:46   ` [PATCH v2 03/32] auxdisplay: Move hwidth and bwidth to struct hd44780_common poeschel
2020-09-21 14:46   ` [PATCH v2 04/32] auxdisplay: Move ifwidth " poeschel
2020-09-21 14:46   ` [PATCH v2 05/32] auxdisplay: Move write_data pointer to hd44780_common poeschel
2020-09-21 14:46   ` [PATCH v2 06/32] auxdisplay: Move write_cmd pointers to hd44780 drivers poeschel
2020-09-21 14:46   ` [PATCH v2 07/32] auxdisplay: Move addr out of charlcd_priv poeschel
2020-09-21 14:46   ` poeschel [this message]
2020-09-22  6:31     ` [PATCH v2 08/32] auxdisplay: hd44780_common_print kernel test robot
2020-09-21 14:46   ` [PATCH v2 09/32] auxdisplay: provide hd44780_common_gotoxy poeschel
2020-09-21 14:46   ` [PATCH v2 10/32] auxdisplay: add home to charlcd_ops poeschel
2020-09-21 14:46   ` [PATCH v2 11/32] auxdisplay: Move clear_display to hd44780_common poeschel
2020-09-21 14:46   ` [PATCH v2 12/32] auxdisplay: make charlcd_backlight visible " poeschel
2020-09-21 14:46   ` [PATCH v2 13/32] auxdisplay: Make use of enum for backlight on / off poeschel
2020-09-21 14:46   ` [PATCH v2 14/32] auxdisplay: Move init_display to hd44780_common poeschel
2020-09-21 14:46   ` [PATCH v2 15/32] auxdisplay: implement hd44780_common_shift_cursor poeschel
2020-09-21 14:46   ` [PATCH v2 16/32] auxdisplay: Implement hd44780_common_display_shift poeschel
2020-09-21 14:46   ` [PATCH v2 17/32] auxdisplay: Implement a hd44780_common_display poeschel
2020-09-21 14:46   ` [PATCH v2 18/32] auxdisplay: Implement hd44780_common_cursor poeschel
2020-09-21 14:46   ` [PATCH v2 19/32] auxdisplay: Implement hd44780_common_blink poeschel
2020-09-21 14:46   ` [PATCH v2 20/32] auxdisplay: cleanup unnecessary hd44780 code in charlcd poeschel
2020-09-21 14:46   ` [PATCH v2 21/32] auxdisplay: Implement hd44780_common_fontsize poeschel
2020-09-21 14:46   ` [PATCH v2 22/32] auxdisplay: Implement hd44780_common_lines poeschel
2020-09-21 14:46   ` [PATCH v2 23/32] auxdisplay: Remove unnecessary hd44780 from charlcd poeschel
2020-09-21 14:46   ` [PATCH v2 24/32] auxdisplay: Move char redefine code to hd44780_common poeschel
2020-09-21 14:46   ` [PATCH v2 25/32] auxdisplay: Call charlcd_backlight in place poeschel
2020-09-21 14:46   ` [PATCH v2 26/32] auxdisplay: Move clear_fast to hd44780 poeschel
2020-09-21 14:46   ` [PATCH v2 27/32] auxdisplay: remove naive display clear impl poeschel
2020-09-21 14:46   ` [PATCH v2 28/32] auxdisplay: hd44780: Remove clear_fast poeschel
2020-09-22  5:22     ` Willy Tarreau
2020-09-22  8:49       ` Lars Poeschel
2020-09-22  9:21         ` Willy Tarreau
2020-09-22 11:51           ` Lars Poeschel
2020-09-21 14:46   ` [PATCH v2 29/32] auxdisplay: charlcd: replace last device specific stuff poeschel
2020-09-21 14:46   ` [PATCH v2 30/32] auxdisplay: Change gotoxy calling interface poeschel
2020-09-21 14:46   ` [PATCH v2 31/32] auxdisplay: charlcd: Do not print chars at end of line poeschel
2020-09-22  5:27     ` Willy Tarreau
2020-09-22  9:44       ` Lars Poeschel
2020-09-22 10:04         ` Willy Tarreau
2020-09-22 10:20           ` Miguel Ojeda
2020-09-22 11:51             ` Lars Poeschel
2020-09-21 14:46   ` [PATCH v2 32/32] auxdisplay: lcd2s DT binding doc poeschel
2020-09-22 15:58     ` Rob Herring
2020-10-02 13:45       ` Lars Poeschel
2020-09-21 14:46   ` [PATCH v2 33/33] auxdisplay: add a driver for lcd2s character display poeschel
2020-09-21 15:33     ` Randy Dunlap
2020-10-02 12:42     ` Pavel Machek
2020-10-02 13:15       ` Lars Poeschel
2020-09-22  5:31   ` [PATCH v2 00/33] Make charlcd device independent Willy Tarreau
2020-09-22 10:23   ` Miguel Ojeda

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200921144645.2061313-9-poeschel@lemonage.de \
    --to=poeschel@lemonage.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=miguel.ojeda.sandonis@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.