diff options
| -rw-r--r-- | drivers/gpu/drm/imx/imx-ldb.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c index 1b86aac0b341..2d6dc94e1e64 100644 --- a/drivers/gpu/drm/imx/imx-ldb.c +++ b/drivers/gpu/drm/imx/imx-ldb.c | |||
| @@ -163,22 +163,7 @@ static void imx_ldb_encoder_prepare(struct drm_encoder *encoder) | |||
| 163 | { | 163 | { |
| 164 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | 164 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); |
| 165 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 165 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
| 166 | struct drm_display_mode *mode = &encoder->crtc->hwmode; | ||
| 167 | u32 pixel_fmt; | 166 | u32 pixel_fmt; |
| 168 | unsigned long serial_clk; | ||
| 169 | unsigned long di_clk = mode->clock * 1000; | ||
| 170 | int mux = imx_drm_encoder_get_mux_id(imx_ldb_ch->child, encoder); | ||
| 171 | |||
| 172 | if (ldb->ldb_ctrl & LDB_SPLIT_MODE_EN) { | ||
| 173 | /* dual channel LVDS mode */ | ||
| 174 | serial_clk = 3500UL * mode->clock; | ||
| 175 | imx_ldb_set_clock(ldb, mux, 0, serial_clk, di_clk); | ||
| 176 | imx_ldb_set_clock(ldb, mux, 1, serial_clk, di_clk); | ||
| 177 | } else { | ||
| 178 | serial_clk = 7000UL * mode->clock; | ||
| 179 | imx_ldb_set_clock(ldb, mux, imx_ldb_ch->chno, serial_clk, | ||
| 180 | di_clk); | ||
| 181 | } | ||
| 182 | 167 | ||
| 183 | switch (imx_ldb_ch->chno) { | 168 | switch (imx_ldb_ch->chno) { |
| 184 | case 0: | 169 | case 0: |
| @@ -247,6 +232,9 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder, | |||
| 247 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); | 232 | struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder); |
| 248 | struct imx_ldb *ldb = imx_ldb_ch->ldb; | 233 | struct imx_ldb *ldb = imx_ldb_ch->ldb; |
| 249 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; | 234 | int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN; |
| 235 | unsigned long serial_clk; | ||
| 236 | unsigned long di_clk = mode->clock * 1000; | ||
| 237 | int mux = imx_drm_encoder_get_mux_id(imx_ldb_ch->child, encoder); | ||
| 250 | 238 | ||
| 251 | if (mode->clock > 170000) { | 239 | if (mode->clock > 170000) { |
| 252 | dev_warn(ldb->dev, | 240 | dev_warn(ldb->dev, |
| @@ -257,6 +245,16 @@ static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder, | |||
| 257 | "%s: mode exceeds 85 MHz pixel clock\n", __func__); | 245 | "%s: mode exceeds 85 MHz pixel clock\n", __func__); |
| 258 | } | 246 | } |
| 259 | 247 | ||
| 248 | if (dual) { | ||
| 249 | serial_clk = 3500UL * mode->clock; | ||
| 250 | imx_ldb_set_clock(ldb, mux, 0, serial_clk, di_clk); | ||
| 251 | imx_ldb_set_clock(ldb, mux, 1, serial_clk, di_clk); | ||
| 252 | } else { | ||
| 253 | serial_clk = 7000UL * mode->clock; | ||
| 254 | imx_ldb_set_clock(ldb, mux, imx_ldb_ch->chno, serial_clk, | ||
| 255 | di_clk); | ||
| 256 | } | ||
| 257 | |||
| 260 | /* FIXME - assumes straight connections DI0 --> CH0, DI1 --> CH1 */ | 258 | /* FIXME - assumes straight connections DI0 --> CH0, DI1 --> CH1 */ |
| 261 | if (imx_ldb_ch == &ldb->channel[0]) { | 259 | if (imx_ldb_ch == &ldb->channel[0]) { |
| 262 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) | 260 | if (mode->flags & DRM_MODE_FLAG_NVSYNC) |
