summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeert Uytterhoeven <geert@linux-m68k.org>2017-03-10 15:15:19 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-03-17 07:10:49 +0100
commit1d3b2af213902059d9f4b35eb15b53f8062dc3b3 (patch)
treef887a0ffced8b09515f52e84aaca5774b6dee40d
parentauxdisplay: charlcd: Add support for 4-bit interfaces (diff)
downloadlinux-1d3b2af213902059d9f4b35eb15b53f8062dc3b3.tar.xz
linux-1d3b2af213902059d9f4b35eb15b53f8062dc3b3.zip
auxdisplay: charlcd: Add support for displays with more than two lines
On displays with more than two lines, the additional lines are stored in the buffers used for the first two lines, but beyond the visible parts. Adjust the DDRAM address calculation to cater for this. When clearing the display, avoid writing more spaces than the actual size of the physical buffer. Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/auxdisplay/charlcd.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/auxdisplay/charlcd.c b/drivers/auxdisplay/charlcd.c
index b3a84e90a268..cfeb049a01ef 100644
--- a/drivers/auxdisplay/charlcd.c
+++ b/drivers/auxdisplay/charlcd.c
@@ -159,15 +159,19 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
static void charlcd_gotoxy(struct charlcd *lcd)
{
struct charlcd_priv *priv = to_priv(lcd);
+ unsigned int addr;
- lcd->ops->write_cmd(lcd,
- LCD_CMD_SET_DDRAM_ADDR | (priv->addr.y ? lcd->hwidth : 0) |
- /*
- * we force the cursor to stay at the end of the
- * line if it wants to go farther
- */
- ((priv->addr.x < lcd->bwidth) ? priv->addr.x & (lcd->hwidth - 1)
- : lcd->bwidth - 1));
+ /*
+ * we force the cursor to stay at the end of the
+ * line if it wants to go farther
+ */
+ addr = priv->addr.x < lcd->bwidth ? priv->addr.x & (lcd->hwidth - 1)
+ : lcd->bwidth - 1;
+ if (priv->addr.y & 1)
+ addr += lcd->hwidth;
+ if (priv->addr.y & 2)
+ addr += lcd->bwidth;
+ lcd->ops->write_cmd(lcd, LCD_CMD_SET_DDRAM_ADDR | addr);
}
static void charlcd_home(struct charlcd *lcd)
@@ -203,7 +207,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
if (lcd->ops->clear_fast)
lcd->ops->clear_fast(lcd);
else
- for (pos = 0; pos < lcd->height * lcd->hwidth; pos++)
+ for (pos = 0; pos < min(2, lcd->height) * lcd->hwidth; pos++)
lcd->ops->write_data(lcd, ' ');
charlcd_home(lcd);