Lower modes on ADV7533 require lower number of DSI lanes for correct
operation. If ADV7533 is being used with 4 DSI lanes, then switch the
lanes to 3 when the target mode's pixel clock is less than 80 Mhz.

Based on patch by Andy Green <andy.green at linaro.org>

Signed-off-by: Archit Taneja <architt at codeaurora.org>
---
 drivers/gpu/drm/i2c/adv7511.c |  3 +++
 drivers/gpu/drm/i2c/adv7511.h |  5 +++++
 drivers/gpu/drm/i2c/adv7533.c | 22 ++++++++++++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/drivers/gpu/drm/i2c/adv7511.c b/drivers/gpu/drm/i2c/adv7511.c
index e0c353e..ec8fb2e 100644
--- a/drivers/gpu/drm/i2c/adv7511.c
+++ b/drivers/gpu/drm/i2c/adv7511.c
@@ -712,6 +712,9 @@ static void adv7511_mode_set(struct adv7511 *adv7511,
        regmap_update_bits(adv7511->regmap, 0x17,
                0x60, (vsync_polarity << 6) | (hsync_polarity << 5));

+       if (adv7511->type == ADV7533)
+               adv7533_mode_set(adv7511, adj_mode);
+
        drm_mode_copy(&adv7511->curr_mode, adj_mode);

        /*
diff --git a/drivers/gpu/drm/i2c/adv7511.h b/drivers/gpu/drm/i2c/adv7511.h
index a9745ea..b113b77 100644
--- a/drivers/gpu/drm/i2c/adv7511.h
+++ b/drivers/gpu/drm/i2c/adv7511.h
@@ -339,6 +339,7 @@ struct adv7511 {
 #ifdef CONFIG_DRM_I2C_ADV7533
 void adv7533_dsi_power_on(struct adv7511 *adv);
 void adv7533_dsi_power_off(struct adv7511 *adv);
+void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode);
 int adv7533_patch_registers(struct adv7511 *adv);
 void adv7533_uninit_cec(struct adv7511 *adv);
 int adv7533_init_cec(struct adv7511 *adv);
@@ -352,6 +353,10 @@ static inline void adv7533_dsi_power_on(struct adv7511 
*adv)
 static inline void adv7533_dsi_power_off(struct adv7511 *adv)
 {
 }
+static inline void adv7533_mode_set(struct adv7511 *adv,
+                                   struct drm_display_mode *mode)
+{
+}
 static inline int adv7533_patch_registers(struct adv7511 *adv)
 {
        return -ENODEV;
diff --git a/drivers/gpu/drm/i2c/adv7533.c b/drivers/gpu/drm/i2c/adv7533.c
index d002ac4..5eebd15 100644
--- a/drivers/gpu/drm/i2c/adv7533.c
+++ b/drivers/gpu/drm/i2c/adv7533.c
@@ -115,6 +115,28 @@ void adv7533_dsi_power_off(struct adv7511 *adv)
        regmap_write(adv->regmap_cec, 0x27, 0x0b);
 }

+void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode)
+{
+       struct mipi_dsi_device *dsi = adv->dsi;
+       int lanes, ret;
+
+       if (adv->num_dsi_lanes != 4)
+               return;
+
+       if (mode->clock > 80000)
+               lanes = 4;
+       else
+               lanes = 3;
+
+       if (lanes != dsi->lanes) {
+               mipi_dsi_detach(dsi);
+               dsi->lanes = lanes;
+               ret = mipi_dsi_attach(dsi);
+               if (ret)
+                       dev_err(&dsi->dev, "failed to change host lanes\n");
+       }
+}
+
 int adv7533_patch_registers(struct adv7511 *adv)
 {
        return regmap_register_patch(adv->regmap,
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation

Reply via email to