static int samsung_dsim_enable_clock(struct samsung_dsim *dsi)
 {
-       unsigned long hs_clk, byte_clk, esc_clk;
+       unsigned long hs_clk, byte_clk, esc_clk, pix_clk;
        unsigned long esc_div;
        u32 reg;
+       struct drm_display_mode *m = &dsi->mode;
+       int bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
+
+       /* m->clock is in KHz */
+       pix_clk = m->clock * 1000;
+
+       /* Use burst_clk_rate if available, otherwise use the pix_clk */
+       if (dsi->burst_clk_rate)
+               hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate);
+       else
+               hs_clk = samsung_dsim_set_pll(dsi, DIV_ROUND_UP(pix_clk * bpp, dsi->lanes));
 
-       hs_clk = samsung_dsim_set_pll(dsi, dsi->burst_clk_rate);
        if (!hs_clk) {
                dev_err(dsi->dev, "failed to configure DSI PLL\n");
                return -EFAULT;
        u32 reg;
 
        if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
-               int byte_clk_khz = dsi->burst_clk_rate / 1000 / 8;
+               int byte_clk_khz = dsi->hs_clock / 1000 / 8;
                int hfp = (m->hsync_start - m->hdisplay) * byte_clk_khz / m->clock;
                int hbp = (m->htotal - m->hsync_end) * byte_clk_khz / m->clock;
                int hsa = (m->hsync_end - m->hsync_start) * byte_clk_khz / m->clock;
                        return PTR_ERR(pll_clk);
        }
 
+       /* If it doesn't exist, use pixel clock instead of failing */
        ret = samsung_dsim_of_read_u32(node, "samsung,burst-clock-frequency",
-                                      &dsi->burst_clk_rate, 0);
-       if (ret < 0)
-               return ret;
+                                      &dsi->burst_clk_rate, 1);
+       if (ret < 0) {
+               dev_dbg(dev, "Using pixel clock for HS clock frequency\n");
+               dsi->burst_clk_rate = 0;
+       }
 
        ret = samsung_dsim_of_read_u32(node, "samsung,esc-clock-frequency",
                                       &dsi->esc_clk_rate, 0);