Before the MIPI DSI clock source can be configured, the target divide
ratio needs to be known.

Signed-off-by: Chris Brandt <[email protected]>
Reviewed-by: Biju Das <[email protected]>
Tested-by: Biju Das <[email protected]>

---
v1->v2:
- Add spaces around '/' in comments
- Add target argument in new API

v2->v3:
- Add missing period in comment (Hugo)
- Changed '1' to 'PLL5_TARGET_DSI' (Hugo)
- Added Reviewed-by and Tested-by (Biju)

v3->v4:
- Fixed up the comments
- Fixed the match for the divider to set (was missing a * 2)

v4->v5:
- Rename patch title (Hugo)
- Add bpp varable for easy reuse (Hugo)
---
 .../gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c    | 21 ++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c 
b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
index 3b52dfc0ea1e..7f03ea8052e2 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c
@@ -7,6 +7,7 @@
 
 #include <linux/bitfield.h>
 #include <linux/clk.h>
+#include <linux/clk/renesas.h>
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
 #include <linux/io.h>
@@ -692,6 +693,7 @@ static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host 
*host,
                                      struct mipi_dsi_device *device)
 {
        struct rzg2l_mipi_dsi *dsi = host_to_rzg2l_mipi_dsi(host);
+       int bpp;
        int ret;
 
        if (device->lanes > dsi->num_data_lanes) {
@@ -701,7 +703,8 @@ static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host 
*host,
                return -EINVAL;
        }
 
-       switch (mipi_dsi_pixel_format_to_bpp(device->format)) {
+       bpp = mipi_dsi_pixel_format_to_bpp(device->format);
+       switch (bpp) {
        case 24:
                break;
        case 18:
@@ -732,6 +735,22 @@ static int rzg2l_mipi_dsi_host_attach(struct mipi_dsi_host 
*host,
 
        drm_bridge_add(&dsi->bridge);
 
+       /*
+        * Report the required division ratio setting for the MIPI clock 
dividers.
+        *
+        * VCO-->[POSTDIV1,2]--FOUTPOSTDIV-->|   |-->[1/(DSI DIV A * B)]--> 
MIPI_DSI_VCLK
+        *            |                      |-->|
+        *            |-->[1/2]---FOUT1PH0-->|   |-->[1/16]---------------> 
hsclk (MIPI-PHY)
+        *
+        * vclk * bpp = hsclk * 8 * num_lanes
+        *
+        * vclk * DSI_AB_divider = hsclk * 16
+        *
+        *   which simplifies to...
+        * DSI_AB_divider = bpp * 2 / num_lanes
+        */
+       rzg2l_cpg_dsi_div_set_divider(bpp * 2 / dsi->lanes, PLL5_TARGET_DSI);
+
        return 0;
 }
 
-- 
2.50.1

Reply via email to