diff mbox series

[v2,4/8] video console: add select font logic to vidconsole uclass driver

Message ID 20230213165700.982691-5-dsankouski@gmail.com
State Superseded
Delegated to: Anatolij Gustschin
Headers show
Series vidconsole: refactoring and support for wider fonts | expand

Commit Message

Dzmitry Sankouski Feb. 13, 2023, 4:56 p.m. UTC
Select font logic at runtime needed to unit test different fonts.
This commit is a preparation to enable runtime font selection in
console_simple driver.

- move console true type select font logic to driver ops
- add select font logic to vidconsole-uclass.c

Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com>
---
Changes for v2: N/A

 cmd/font.c                        |  7 ++++++-
 drivers/video/console_truetype.c  |  6 ++++--
 drivers/video/vidconsole-uclass.c | 22 ++++++++++++++++++++++
 include/video.h                   |  1 +
 include/video_console.h           | 18 +++++++++++++++++-
 5 files changed, 50 insertions(+), 4 deletions(-)

Comments

Simon Glass Feb. 14, 2023, 7:48 p.m. UTC | #1
Hi Dzmitry,

On Mon, 13 Feb 2023 at 09:57, Dzmitry Sankouski <dsankouski@gmail.com> wrote:
>
> Select font logic at runtime needed to unit test different fonts.
> This commit is a preparation to enable runtime font selection in
> console_simple driver.
>
> - move console true type select font logic to driver ops
> - add select font logic to vidconsole-uclass.c
>
> Signed-off-by: Dzmitry Sankouski <dsankouski@gmail.com>
> ---
> Changes for v2: N/A
>
>  cmd/font.c                        |  7 ++++++-
>  drivers/video/console_truetype.c  |  6 ++++--
>  drivers/video/vidconsole-uclass.c | 22 ++++++++++++++++++++++
>  include/video.h                   |  1 +
>  include/video_console.h           | 18 +++++++++++++++++-
>  5 files changed, 50 insertions(+), 4 deletions(-)
>
> diff --git a/cmd/font.c b/cmd/font.c
> index 3e522f3aaa..769796c5ec 100644
> --- a/cmd/font.c
> +++ b/cmd/font.c
> @@ -15,7 +15,12 @@
>  static int do_font_list(struct cmd_tbl *cmdtp, int flag, int argc,
>                         char *const argv[])
>  {
> -       vidconsole_list_fonts();
> +       struct udevice *dev;
> +
> +       if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
> +               return CMD_RET_FAILURE;
> +
> +       vidconsole_list_fonts(dev);
>
>         return 0;
>  }
> diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
> index 6859c9fa11..389fa483fc 100644
> --- a/drivers/video/console_truetype.c
> +++ b/drivers/video/console_truetype.c
> @@ -584,7 +584,7 @@ static struct font_info *console_truetype_find_font(void)
>         return NULL;
>  }
>
> -void vidconsole_list_fonts(void)
> +void console_truetype_list_fonts(struct udevice __maybe_unused *dev)

You should not need the __maybe_unused here?

>  {
>         struct font_info *tab;
>
> @@ -674,7 +674,7 @@ static void select_metrics(struct udevice *dev, struct console_tt_metrics *met)
>         vc_priv->tab_width_frac = VID_TO_POS(met->font_size) * 8 / 2;
>  }
>
> -int vidconsole_select_font(struct udevice *dev, const char *name, uint size)
> +int console_truetype_select_font(struct udevice *dev, const char *name, uint size)
>  {
>         struct console_tt_priv *priv = dev_get_priv(dev);
>         struct console_tt_metrics *met;
> @@ -763,6 +763,8 @@ struct vidconsole_ops console_truetype_ops = {
>         .set_row        = console_truetype_set_row,
>         .backspace      = console_truetype_backspace,
>         .entry_start    = console_truetype_entry_start,
> +       .list_fonts     = console_truetype_list_fonts,
> +       .select_font    = console_truetype_select_font,
>  };
>
>  U_BOOT_DRIVER(vidconsole_truetype) = {
> diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
> index 6bdfb6e37d..5a08fdd689 100644
> --- a/drivers/video/vidconsole-uclass.c
> +++ b/drivers/video/vidconsole-uclass.c
> @@ -85,6 +85,28 @@ static int vidconsole_back(struct udevice *dev)
>         return video_sync(dev->parent, false);
>  }
>
> +void vidconsole_list_fonts(struct udevice *dev)
> +{
> +       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
> +
> +       if (ops->select_font)
> +               ops->list_fonts(dev);
> +}
> +
> +int vidconsole_select_font(struct udevice *dev, const char *name, uint size)
> +{
> +       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
> +       int ret;
> +
> +       if (ops->select_font) {
> +               ret = ops->select_font(dev, name, size);
> +               if (ret != -ENOSYS)
> +                       return ret;
> +       }
> +
> +       return 0;
> +}
> +
>  /* Move to a newline, scrolling the display if necessary */
>  static void vidconsole_newline(struct udevice *dev)
>  {
> diff --git a/include/video.h b/include/video.h
> index 43f2e2c02f..91c05fa9f0 100644
> --- a/include/video.h
> +++ b/include/video.h
> @@ -115,6 +115,7 @@ struct video_priv {
>         bool flush_dcache;
>         u8 fg_col_idx;
>         u8 bg_col_idx;
> +       struct video_fontdata *fontdata;

please update comment for this new member

>  };
>
>  /**
> diff --git a/include/video_console.h b/include/video_console.h
> index d755eb73cf..fc702cc165 100644
> --- a/include/video_console.h
> +++ b/include/video_console.h
> @@ -133,6 +133,22 @@ struct vidconsole_ops {
>          * characters.
>          */
>         int (*backspace)(struct udevice *dev);
> +
> +       /**
> +        * list_fonts() - List the available fonts
> +        *
> +        * This shows a list on the console

comments again, @dev and Returns

> +        */
> +       void (*list_fonts)(struct udevice *dev);
> +
> +       /**
> +        * select_font() - Select a font to use
> +        *
> +        * @dev: vidconsole device
> +        * @name: Font name
> +        * @size: Size of the font (norminal pixel height) or 0 for default

Returns

> +        */
> +       int (*select_font)(struct udevice *dev, const char *name, uint size);
>  };
>
>  /* Get a pointer to the driver operations for a video console device */
> @@ -236,7 +252,7 @@ void vidconsole_set_cursor_pos(struct udevice *dev, int x, int y);
>   *
>   * This shows a list on the console

add @dev
>   */
> -void vidconsole_list_fonts(void);
> +void vidconsole_list_fonts(struct udevice *dev);
>
>  /**
>   * vidconsole_select_font() - Select a font to use
> --
> 2.30.2
>

Regards,
Simon
diff mbox series

Patch

diff --git a/cmd/font.c b/cmd/font.c
index 3e522f3aaa..769796c5ec 100644
--- a/cmd/font.c
+++ b/cmd/font.c
@@ -15,7 +15,12 @@ 
 static int do_font_list(struct cmd_tbl *cmdtp, int flag, int argc,
 			char *const argv[])
 {
-	vidconsole_list_fonts();
+	struct udevice *dev;
+
+	if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
+		return CMD_RET_FAILURE;
+
+	vidconsole_list_fonts(dev);
 
 	return 0;
 }
diff --git a/drivers/video/console_truetype.c b/drivers/video/console_truetype.c
index 6859c9fa11..389fa483fc 100644
--- a/drivers/video/console_truetype.c
+++ b/drivers/video/console_truetype.c
@@ -584,7 +584,7 @@  static struct font_info *console_truetype_find_font(void)
 	return NULL;
 }
 
-void vidconsole_list_fonts(void)
+void console_truetype_list_fonts(struct udevice __maybe_unused *dev)
 {
 	struct font_info *tab;
 
@@ -674,7 +674,7 @@  static void select_metrics(struct udevice *dev, struct console_tt_metrics *met)
 	vc_priv->tab_width_frac = VID_TO_POS(met->font_size) * 8 / 2;
 }
 
-int vidconsole_select_font(struct udevice *dev, const char *name, uint size)
+int console_truetype_select_font(struct udevice *dev, const char *name, uint size)
 {
 	struct console_tt_priv *priv = dev_get_priv(dev);
 	struct console_tt_metrics *met;
@@ -763,6 +763,8 @@  struct vidconsole_ops console_truetype_ops = {
 	.set_row	= console_truetype_set_row,
 	.backspace	= console_truetype_backspace,
 	.entry_start	= console_truetype_entry_start,
+	.list_fonts	= console_truetype_list_fonts,
+	.select_font	= console_truetype_select_font,
 };
 
 U_BOOT_DRIVER(vidconsole_truetype) = {
diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index 6bdfb6e37d..5a08fdd689 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -85,6 +85,28 @@  static int vidconsole_back(struct udevice *dev)
 	return video_sync(dev->parent, false);
 }
 
+void vidconsole_list_fonts(struct udevice *dev)
+{
+	struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+
+	if (ops->select_font)
+		ops->list_fonts(dev);
+}
+
+int vidconsole_select_font(struct udevice *dev, const char *name, uint size)
+{
+	struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+	int ret;
+
+	if (ops->select_font) {
+		ret = ops->select_font(dev, name, size);
+		if (ret != -ENOSYS)
+			return ret;
+	}
+
+	return 0;
+}
+
 /* Move to a newline, scrolling the display if necessary */
 static void vidconsole_newline(struct udevice *dev)
 {
diff --git a/include/video.h b/include/video.h
index 43f2e2c02f..91c05fa9f0 100644
--- a/include/video.h
+++ b/include/video.h
@@ -115,6 +115,7 @@  struct video_priv {
 	bool flush_dcache;
 	u8 fg_col_idx;
 	u8 bg_col_idx;
+	struct video_fontdata *fontdata;
 };
 
 /**
diff --git a/include/video_console.h b/include/video_console.h
index d755eb73cf..fc702cc165 100644
--- a/include/video_console.h
+++ b/include/video_console.h
@@ -133,6 +133,22 @@  struct vidconsole_ops {
 	 * characters.
 	 */
 	int (*backspace)(struct udevice *dev);
+
+	/**
+	 * list_fonts() - List the available fonts
+	 *
+	 * This shows a list on the console
+	 */
+	void (*list_fonts)(struct udevice *dev);
+
+	/**
+	 * select_font() - Select a font to use
+	 *
+	 * @dev: vidconsole device
+	 * @name: Font name
+	 * @size: Size of the font (norminal pixel height) or 0 for default
+	 */
+	int (*select_font)(struct udevice *dev, const char *name, uint size);
 };
 
 /* Get a pointer to the driver operations for a video console device */
@@ -236,7 +252,7 @@  void vidconsole_set_cursor_pos(struct udevice *dev, int x, int y);
  *
  * This shows a list on the console
  */
-void vidconsole_list_fonts(void);
+void vidconsole_list_fonts(struct udevice *dev);
 
 /**
  * vidconsole_select_font() - Select a font to use