aboutsummaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorTom Rini2023-03-15 11:58:58 -0400
committerTom Rini2023-03-16 12:17:02 -0400
commitf6546c78221f2ed139ec6ad3a32285d4ef96a6ce (patch)
tree0b1b5fa6614100e01cb14540ccd674a8a1f8cf13 /drivers/video
parentcb90ddb2a64f30e6b0411f9385ddd84c5612314e (diff)
Revert 9f62a472dfb2 ("video: Remove duplicate cursor-positioning function")
This reverts commit 9f62a472dfb26ec14408a27938ddd2a25700009d. The changes here aren't quite right, and on platforms such as Raspberry Pi where we can have both serial and video output, the change above causes output to change. This can be seen as the hush tests we have now fail. Signed-off-by: Tom Rini <trini@konsulko.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/vidconsole-uclass.c44
1 files changed, 34 insertions, 10 deletions
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 61f4216750f..1225de23332 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -126,14 +126,26 @@ void vidconsole_set_cursor_pos(struct udevice *dev, int x, int y)
priv->ycur = y;
}
-void vidconsole_position_cursor(struct udevice *dev, uint col, uint row)
+/**
+ * set_cursor_position() - set cursor position
+ *
+ * @priv: private data of the video console
+ * @row: new row
+ * @col: new column
+ */
+static void set_cursor_position(struct vidconsole_priv *priv, int row, int col)
{
- struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
- short x, y;
-
- x = min_t(short, col, priv->cols - 1) * priv->x_charsize;
- y = min_t(short, row, priv->rows - 1) * priv->y_charsize;
- vidconsole_set_cursor_pos(dev, x, y);
+ /*
+ * Ensure we stay in the bounds of the screen.
+ */
+ if (row >= priv->rows)
+ row = priv->rows - 1;
+ if (col >= priv->cols)
+ col = priv->cols - 1;
+
+ priv->ycur = row * priv->y_charsize;
+ priv->xcur_frac = priv->xstart_frac +
+ VID_TO_POS(col * priv->x_charsize);
}
/**
@@ -180,7 +192,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
int row = priv->row_saved;
int col = priv->col_saved;
- vidconsole_position_cursor(dev, col, row);
+ set_cursor_position(priv, row, col);
priv->escape = 0;
return;
}
@@ -242,7 +254,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
if (row < 0)
row = 0;
/* Right and bottom overflows are handled in the callee. */
- vidconsole_position_cursor(dev, col, row);
+ set_cursor_position(priv, row, col);
break;
}
case 'H':
@@ -266,7 +278,7 @@ static void vidconsole_escape_char(struct udevice *dev, char ch)
if (col)
--col;
- vidconsole_position_cursor(dev, col, row);
+ set_cursor_position(priv, row, col);
break;
}
@@ -655,3 +667,15 @@ int vidconsole_clear_and_reset(struct udevice *dev)
return 0;
}
+
+void vidconsole_position_cursor(struct udevice *dev, unsigned col, unsigned row)
+{
+ struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+ struct udevice *vid_dev = dev->parent;
+ struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev);
+ short x, y;
+
+ x = min_t(short, col * priv->x_charsize, vid_priv->xsize - 1);
+ y = min_t(short, row * priv->y_charsize, vid_priv->ysize - 1);
+ vidconsole_set_cursor_pos(dev, x, y);
+}