]> git.sur5r.net Git - u-boot/blobdiff - drivers/video/vidconsole-uclass.c
rockchip: video: vop: Reserve enough space for mipi dispaly
[u-boot] / drivers / video / vidconsole-uclass.c
index 3145fd8d6f9bab4f4ec810e4ac162153b0e08df3..e9a90b1b9bc375137cb93d4bdb1efa1ad6f66e4f 100644 (file)
@@ -47,19 +47,38 @@ int vidconsole_set_row(struct udevice *dev, uint row, int clr)
        return ops->set_row(dev, row, clr);
 }
 
+static int vidconsole_entry_start(struct udevice *dev)
+{
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+
+       if (!ops->entry_start)
+               return -ENOSYS;
+       return ops->entry_start(dev);
+}
+
 /* Move backwards one space */
-static void vidconsole_back(struct udevice *dev)
+static int vidconsole_back(struct udevice *dev)
 {
        struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
+       struct vidconsole_ops *ops = vidconsole_get_ops(dev);
+       int ret;
+
+       if (ops->backspace) {
+               ret = ops->backspace(dev);
+               if (ret != -ENOSYS)
+                       return ret;
+       }
 
        priv->xcur_frac -= VID_TO_POS(priv->x_charsize);
-       if (priv->xcur_frac < 0) {
+       if (priv->xcur_frac < priv->xstart_frac) {
                priv->xcur_frac = (priv->cols - 1) *
                        VID_TO_POS(priv->x_charsize);
                priv->ycur -= priv->y_charsize;
                if (priv->ycur < 0)
                        priv->ycur = 0;
        }
+
+       return 0;
 }
 
 /* Move to a newline, scrolling the display if necessary */
@@ -71,7 +90,7 @@ static void vidconsole_newline(struct udevice *dev)
        const int rows = CONFIG_CONSOLE_SCROLL_LINES;
        int i;
 
-       priv->xcur_frac = 0;
+       priv->xcur_frac = priv->xstart_frac;
        priv->ycur += priv->y_charsize;
 
        /* Check if we need to scroll the terminal */
@@ -82,6 +101,8 @@ static void vidconsole_newline(struct udevice *dev)
                                           vid_priv->colour_bg);
                priv->ycur -= rows * priv->y_charsize;
        }
+       priv->last_ch = 0;
+
        video_sync(dev->parent);
 }
 
@@ -91,11 +112,15 @@ int vidconsole_put_char(struct udevice *dev, char ch)
        int ret;
 
        switch (ch) {
+       case '\a':
+               /* beep */
+               break;
        case '\r':
-               priv->xcur_frac = 0;
+               priv->xcur_frac = priv->xstart_frac;
                break;
        case '\n':
                vidconsole_newline(dev);
+               vidconsole_entry_start(dev);
                break;
        case '\t':      /* Tab (8 chars alignment) */
                priv->xcur_frac = ((priv->xcur_frac / priv->tab_width_frac)
@@ -106,6 +131,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                break;
        case '\b':
                vidconsole_back(dev);
+               priv->last_ch = 0;
                break;
        default:
                /*
@@ -122,6 +148,7 @@ int vidconsole_put_char(struct udevice *dev, char ch)
                if (ret < 0)
                        return ret;
                priv->xcur_frac += ret;
+               priv->last_ch = ch;
                if (priv->xcur_frac >= priv->xsize_frac)
                        vidconsole_newline(dev);
                break;
@@ -143,6 +170,7 @@ static void vidconsole_puts(struct stdio_dev *sdev, const char *s)
 
        while (*s)
                vidconsole_put_char(dev, *s++);
+       video_sync(dev->parent);
 }
 
 /* Set up the number of rows and colours (rotated drivers override this) */
@@ -162,7 +190,6 @@ static int vidconsole_post_probe(struct udevice *dev)
 {
        struct vidconsole_priv *priv = dev_get_uclass_priv(dev);
        struct stdio_dev *sdev = &priv->sdev;
-       int ret;
 
        if (!priv->tab_width_frac)
                priv->tab_width_frac = VID_TO_POS(priv->x_charsize) * 8;
@@ -178,11 +205,8 @@ static int vidconsole_post_probe(struct udevice *dev)
        sdev->putc = vidconsole_putc;
        sdev->puts = vidconsole_puts;
        sdev->priv = dev;
-       ret = stdio_register(sdev);
-       if (ret)
-               return ret;
 
-       return 0;
+       return stdio_register(sdev);
 }
 
 UCLASS_DRIVER(vidconsole) = {
@@ -212,8 +236,7 @@ static int do_video_setcursor(cmd_tbl_t *cmdtp, int flag, int argc,
        if (argc != 3)
                return CMD_RET_USAGE;
 
-       uclass_first_device(UCLASS_VIDEO_CONSOLE, &dev);
-       if (!dev)
+       if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
                return CMD_RET_FAILURE;
        col = simple_strtoul(argv[1], NULL, 10);
        row = simple_strtoul(argv[2], NULL, 10);
@@ -231,8 +254,7 @@ static int do_video_puts(cmd_tbl_t *cmdtp, int flag, int argc,
        if (argc != 2)
                return CMD_RET_USAGE;
 
-       uclass_first_device(UCLASS_VIDEO_CONSOLE, &dev);
-       if (!dev)
+       if (uclass_first_device_err(UCLASS_VIDEO_CONSOLE, &dev))
                return CMD_RET_FAILURE;
        for (s = argv[1]; *s; s++)
                vidconsole_put_char(dev, *s);