From: Petr Hodina <[email protected]>

Program DPI_LP_CMD_TIM when configuring a message, switch the
low-power command bit in VID_MODE_CFG instead of gating the clock
lane per message and set the clock lane control in set_mode()
for both command and video mode.

Based on megi's 0711c54e94c ("video: dw-mipi-dsi: Sync-up with
Linux driver"), https://codeberg.org/megi/u-boot

Signed-off-by: Petr Hodina <[email protected]>
---
 drivers/video/dw_mipi_dsi.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/video/dw_mipi_dsi.c b/drivers/video/dw_mipi_dsi.c
index c74fe678d12..fa22ee82b7e 100644
--- a/drivers/video/dw_mipi_dsi.c
+++ b/drivers/video/dw_mipi_dsi.c
@@ -85,6 +85,7 @@
 #define VID_MODE_TYPE_NON_BURST_SYNC_EVENTS    0x1
 #define VID_MODE_TYPE_BURST                    0x2
 #define VID_MODE_TYPE_MASK                     0x3
+#define ENABLE_LOW_POWER_CMD           BIT(15)
 
 #define DSI_VID_PKT_SIZE               0x3c
 #define VID_PKT_SIZE(p)                        ((p) & 0x3fff)
@@ -293,13 +294,28 @@ static void dw_mipi_message_config(struct dw_mipi_dsi 
*dsi,
        bool lpm = msg->flags & MIPI_DSI_MSG_USE_LPM;
        u32 val = 0;
 
+       /*
+        * TODO dw drv improvements
+        * largest packet sizes during hfp or during vsa/vpb/vfp
+        * should be computed according to byte lane, lane number and only
+        * if sending lp cmds in high speed is enable (PHY_TXREQUESTCLKHS)
+        */
+       dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(16)
+                 | INVACT_LPCMD_TIME(4));
+
        if (msg->flags & MIPI_DSI_MSG_REQ_ACK)
                val |= ACK_RQST_EN;
        if (lpm)
                val |= CMD_MODE_ALL_LP;
 
-       dsi_write(dsi, DSI_LPCLK_CTRL, lpm ? 0 : PHY_TXREQUESTCLKHS);
        dsi_write(dsi, DSI_CMD_MODE_CFG, val);
+
+       val = dsi_read(dsi, DSI_VID_MODE_CFG);
+       if (lpm)
+               val |= ENABLE_LOW_POWER_CMD;
+       else
+               val &= ~ENABLE_LOW_POWER_CMD;
+       dsi_write(dsi, DSI_VID_MODE_CFG, val);
 }
 
 static int dw_mipi_dsi_gen_pkt_hdr_write(struct dw_mipi_dsi *dsi, u32 hdr_val)
@@ -463,17 +479,22 @@ static void dw_mipi_dsi_set_mode(struct dw_mipi_dsi *dsi,
                                 unsigned long mode_flags)
 {
        const struct mipi_dsi_phy_ops *phy_ops = dsi->phy_ops;
+       u32 val;
 
        dsi_write(dsi, DSI_PWR_UP, RESET);
 
        if (mode_flags & MIPI_DSI_MODE_VIDEO) {
                dsi_write(dsi, DSI_MODE_CFG, ENABLE_VIDEO_MODE);
                dw_mipi_dsi_video_mode_config(dsi);
-               dsi_write(dsi, DSI_LPCLK_CTRL, PHY_TXREQUESTCLKHS);
        } else {
                dsi_write(dsi, DSI_MODE_CFG, ENABLE_CMD_MODE);
        }
 
+       val = PHY_TXREQUESTCLKHS;
+       if (mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)
+               val |= AUTO_CLKLANE_CTRL;
+       dsi_write(dsi, DSI_LPCLK_CTRL, val);
+
        if (phy_ops->post_set_mode)
                phy_ops->post_set_mode(dsi->device, mode_flags);
 
@@ -544,14 +565,6 @@ static void dw_mipi_dsi_dpi_config(struct dw_mipi_dsi *dsi,
        dsi_write(dsi, DSI_DPI_VCID, DPI_VCID(dsi->channel));
        dsi_write(dsi, DSI_DPI_COLOR_CODING, color);
        dsi_write(dsi, DSI_DPI_CFG_POL, val);
-       /*
-        * TODO dw drv improvements
-        * largest packet sizes during hfp or during vsa/vpb/vfp
-        * should be computed according to byte lane, lane number and only
-        * if sending lp cmds in high speed is enable (PHY_TXREQUESTCLKHS)
-        */
-       dsi_write(dsi, DSI_DPI_LP_CMD_TIM, OUTVACT_LPCMD_TIME(4)
-                 | INVACT_LPCMD_TIME(4));
 }
 
 static void dw_mipi_dsi_packet_handler_config(struct dw_mipi_dsi *dsi)

-- 
2.55.0


Reply via email to