[PATCH v3 11/13] video: Clear the vidconsole rather than the video

2023-03-10 Thread Simon Glass
It is better to clear the console device rather than the video device,
since the console has the text display. We also need to reset the cursor
position with the console, but not with the video device.

Add a new function to handle this and update the 'cls' command to use it.

Signed-off-by: Simon Glass 
---

(no changes since v1)

 cmd/cls.c | 12 
 drivers/video/vidconsole-uclass.c | 12 
 include/video_console.h   |  9 +
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/cmd/cls.c b/cmd/cls.c
index 40a32eeab63..073ba5a6c86 100644
--- a/cmd/cls.c
+++ b/cmd/cls.c
@@ -8,7 +8,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #define CSI "\x1b["
 
@@ -19,12 +19,16 @@ static int do_video_clear(struct cmd_tbl *cmdtp, int flag, 
int argc,
 
/*  Send clear screen and home */
printf(CSI "2J" CSI "1;1H");
-   if (IS_ENABLED(CONFIG_VIDEO) && !IS_ENABLED(CONFIG_VIDEO_ANSI)) {
-   if (uclass_first_device_err(UCLASS_VIDEO, ))
+   if (IS_ENABLED(CONFIG_VIDEO_ANSI))
+   return 0;
+
+   if (IS_ENABLED(CONFIG_VIDEO)) {
+   if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, ))
return CMD_RET_FAILURE;
-   if (video_clear(dev))
+   if (vidconsole_clear_and_reset(dev))
return CMD_RET_FAILURE;
}
+
return CMD_RET_SUCCESS;
 }
 
diff --git a/drivers/video/vidconsole-uclass.c 
b/drivers/video/vidconsole-uclass.c
index 627db8208b0..61f4216750f 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -643,3 +643,15 @@ int vidconsole_memmove(struct udevice *dev, void *dst, 
const void *src,
return vidconsole_sync_copy(dev, dst, dst + size);
 }
 #endif
+
+int vidconsole_clear_and_reset(struct udevice *dev)
+{
+   int ret;
+
+   ret = video_clear(dev_get_parent(dev));
+   if (ret)
+   return ret;
+   vidconsole_position_cursor(dev, 0, 0);
+
+   return 0;
+}
diff --git a/include/video_console.h b/include/video_console.h
index 770103284b7..3db9a7e1fb9 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -285,6 +285,15 @@ int vidconsole_put_string(struct udevice *dev, const char 
*str);
 void vidconsole_position_cursor(struct udevice *dev, unsigned col,
unsigned row);
 
+/**
+ * vidconsole_clear_and_reset() - Clear the console and reset the cursor
+ *
+ * The cursor is placed at the start of the console
+ *
+ * @dev:   vidconsole device to adjust
+ */
+int vidconsole_clear_and_reset(struct udevice *dev);
+
 /**
  * vidconsole_set_cursor_pos() - set cursor position
  *
-- 
2.40.0.rc1.284.g88254d51c5-goog



[PATCH v3 11/13] video: Clear the vidconsole rather than the video

2023-02-25 Thread Simon Glass
It is better to clear the console device rather than the video device,
since the console has the text display. We also need to reset the cursor
position with the console, but not with the video device.

Add a new function to handle this and update the 'cls' command to use it.

Signed-off-by: Simon Glass 
---

(no changes since v1)

 cmd/cls.c | 12 
 drivers/video/vidconsole-uclass.c | 12 
 include/video_console.h   |  9 +
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/cmd/cls.c b/cmd/cls.c
index 40a32eeab63..073ba5a6c86 100644
--- a/cmd/cls.c
+++ b/cmd/cls.c
@@ -8,7 +8,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #define CSI "\x1b["
 
@@ -19,12 +19,16 @@ static int do_video_clear(struct cmd_tbl *cmdtp, int flag, 
int argc,
 
/*  Send clear screen and home */
printf(CSI "2J" CSI "1;1H");
-   if (IS_ENABLED(CONFIG_VIDEO) && !IS_ENABLED(CONFIG_VIDEO_ANSI)) {
-   if (uclass_first_device_err(UCLASS_VIDEO, ))
+   if (IS_ENABLED(CONFIG_VIDEO_ANSI))
+   return 0;
+
+   if (IS_ENABLED(CONFIG_VIDEO)) {
+   if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, ))
return CMD_RET_FAILURE;
-   if (video_clear(dev))
+   if (vidconsole_clear_and_reset(dev))
return CMD_RET_FAILURE;
}
+
return CMD_RET_SUCCESS;
 }
 
diff --git a/drivers/video/vidconsole-uclass.c 
b/drivers/video/vidconsole-uclass.c
index 9f8b8ebe8ac..1bb36bd66c7 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -632,3 +632,15 @@ int vidconsole_memmove(struct udevice *dev, void *dst, 
const void *src,
return vidconsole_sync_copy(dev, dst, dst + size);
 }
 #endif
+
+int vidconsole_clear_and_reset(struct udevice *dev)
+{
+   int ret;
+
+   ret = video_clear(dev_get_parent(dev));
+   if (ret)
+   return ret;
+   vidconsole_position_cursor(dev, 0, 0);
+
+   return 0;
+}
diff --git a/include/video_console.h b/include/video_console.h
index 9d2c0f210e4..aebf1d5eb99 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -276,6 +276,15 @@ int vidconsole_put_string(struct udevice *dev, const char 
*str);
 void vidconsole_position_cursor(struct udevice *dev, unsigned col,
unsigned row);
 
+/**
+ * vidconsole_clear_and_reset() - Clear the console and reset the cursor
+ *
+ * The cursor is placed at the start of the console
+ *
+ * @dev:   vidconsole device to adjust
+ */
+int vidconsole_clear_and_reset(struct udevice *dev);
+
 /**
  * vidconsole_set_cursor_pos() - set cursor position
  *
-- 
2.39.2.637.g21b0678d19-goog