]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/mediatek: Allow commands to be sent during video mode
authorJulien STEPHAN <jstephan@baylibre.com>
Mon, 14 Feb 2022 09:27:42 +0000 (10:27 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:24:19 +0000 (14:24 +0200)
[ Upstream commit 36958d814e3c47b628edc38faa10adf8060ac2a0 ]

Mipi dsi panel drivers can use mipi_dsi_dcs_{set,get}_display_brightness()
to request backlight changes.

This can be done during panel initialization (dsi is in command mode)
or afterwards (dsi is in Video Mode).

When the DSI is in Video Mode, all commands are rejected.

Detect current DSI mode in mtk_dsi_host_transfer() and switch modes
temporarily to allow commands to be sent.

Signed-off-by: Julien STEPHAN <jstephan@baylibre.com>
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/mediatek/mtk_dsi.c

index b0cb0ba53589f330bd87d2ff44264b0fb1ca29c6..ab51656d5daeaf928dd567af9e84ee648c76e5ba 100644 (file)
@@ -910,24 +910,33 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
        u8 read_data[16];
        void *src_addr;
        u8 irq_flag = CMD_DONE_INT_FLAG;
+       u32 dsi_mode;
+       int ret;
 
-       if (readl(dsi->regs + DSI_MODE_CTRL) & MODE) {
-               DRM_ERROR("dsi engine is not command mode\n");
-               return -EINVAL;
+       dsi_mode = readl(dsi->regs + DSI_MODE_CTRL);
+       if (dsi_mode & MODE) {
+               mtk_dsi_stop(dsi);
+               ret = mtk_dsi_switch_to_cmd_mode(dsi, VM_DONE_INT_FLAG, 500);
+               if (ret)
+                       goto restore_dsi_mode;
        }
 
        if (MTK_DSI_HOST_IS_READ(msg->type))
                irq_flag |= LPRX_RD_RDY_INT_FLAG;
 
-       if (mtk_dsi_host_send_cmd(dsi, msg, irq_flag) < 0)
-               return -ETIME;
+       ret = mtk_dsi_host_send_cmd(dsi, msg, irq_flag);
+       if (ret)
+               goto restore_dsi_mode;
 
-       if (!MTK_DSI_HOST_IS_READ(msg->type))
-               return 0;
+       if (!MTK_DSI_HOST_IS_READ(msg->type)) {
+               recv_cnt = 0;
+               goto restore_dsi_mode;
+       }
 
        if (!msg->rx_buf) {
                DRM_ERROR("dsi receive buffer size may be NULL\n");
-               return -EINVAL;
+               ret = -EINVAL;
+               goto restore_dsi_mode;
        }
 
        for (i = 0; i < 16; i++)
@@ -952,7 +961,13 @@ static ssize_t mtk_dsi_host_transfer(struct mipi_dsi_host *host,
        DRM_INFO("dsi get %d byte data from the panel address(0x%x)\n",
                 recv_cnt, *((u8 *)(msg->tx_buf)));
 
-       return recv_cnt;
+restore_dsi_mode:
+       if (dsi_mode & MODE) {
+               mtk_dsi_set_mode(dsi);
+               mtk_dsi_start(dsi);
+       }
+
+       return ret < 0 ? ret : recv_cnt;
 }
 
 static const struct mipi_dsi_host_ops mtk_dsi_ops = {