]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/rcar-du/rcar_du_lvdsenc.c
drm: rcar-du: Add support for LVDS mode selection
[karo-tx-linux.git] / drivers / gpu / drm / rcar-du / rcar_du_lvdsenc.c
index e3a4985f6f3fe023d23efa5bce971ea1d6a1b771..1661f620121005398956028dfc8c291aac96238a 100644 (file)
@@ -31,6 +31,7 @@ struct rcar_du_lvdsenc {
        bool enabled;
 
        enum rcar_lvds_input input;
+       enum rcar_lvds_mode mode;
 };
 
 static void rcar_lvds_write(struct rcar_du_lvdsenc *lvds, u32 reg, u32 data)
@@ -61,7 +62,7 @@ static void rcar_du_lvdsenc_start_gen2(struct rcar_du_lvdsenc *lvds,
        /* Select the input, hardcode mode 0, enable LVDS operation and turn
         * bias circuitry on.
         */
-       lvdcr0 = LVDCR0_BEN | LVDCR0_LVEN;
+       lvdcr0 = (lvds->mode << LVDCR0_LVMD_SHIFT) | LVDCR0_BEN | LVDCR0_LVEN;
        if (rcrtc->index == 2)
                lvdcr0 |= LVDCR0_DUSEL;
        rcar_lvds_write(lvds, LVDCR0, lvdcr0);
@@ -114,7 +115,7 @@ static void rcar_du_lvdsenc_start_gen3(struct rcar_du_lvdsenc *lvds,
         * Turn the PLL on, set it to LVDS normal mode, wait for the startup
         * delay and turn the output on.
         */
-       lvdcr0 = LVDCR0_PLLON;
+       lvdcr0 = (lvds->mode << LVDCR0_LVMD_SHIFT) | LVDCR0_PLLON;
        rcar_lvds_write(lvds, LVDCR0, lvdcr0);
 
        lvdcr0 |= LVDCR0_PWD;
@@ -211,6 +212,12 @@ void rcar_du_lvdsenc_atomic_check(struct rcar_du_lvdsenc *lvds,
                mode->clock = clamp(mode->clock, 25175, 148500);
 }
 
+void rcar_du_lvdsenc_set_mode(struct rcar_du_lvdsenc *lvds,
+                             enum rcar_lvds_mode mode)
+{
+       lvds->mode = mode;
+}
+
 static int rcar_du_lvdsenc_get_resources(struct rcar_du_lvdsenc *lvds,
                                         struct platform_device *pdev)
 {