aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2014-03-13 03:50:39 -0400
committerThierry Reding <treding@nvidia.com>2014-06-05 17:09:26 -0400
commitf7d6889b79aa93c0dde8e30d3e0f2f9acf0812b2 (patch)
treecce8102bb326312cfa6f8fe5a98dc9e453a974e0
parent7e2464304ba71dc1b4ae89171529f0d004a2637c (diff)
drm/tegra: dsi - Use internal pixel format
The pixel format enumeration values used by the Tegra DSI controller don't match those defined by the DSI framework. Make sure to convert them to the internal format before writing it to the register. Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/drm/tegra/dsi.c34
-rw-r--r--drivers/gpu/drm/tegra/dsi.h10
2 files changed, 43 insertions, 1 deletions
diff --git a/drivers/gpu/drm/tegra/dsi.c b/drivers/gpu/drm/tegra/dsi.c
index 0e599f0417c0..71c1b1a64ccf 100644
--- a/drivers/gpu/drm/tegra/dsi.c
+++ b/drivers/gpu/drm/tegra/dsi.c
@@ -361,6 +361,33 @@ static int tegra_dsi_get_muldiv(enum mipi_dsi_pixel_format format,
361 return 0; 361 return 0;
362} 362}
363 363
364static int tegra_dsi_get_format(enum mipi_dsi_pixel_format format,
365 enum tegra_dsi_format *fmt)
366{
367 switch (format) {
368 case MIPI_DSI_FMT_RGB888:
369 *fmt = TEGRA_DSI_FORMAT_24P;
370 break;
371
372 case MIPI_DSI_FMT_RGB666:
373 *fmt = TEGRA_DSI_FORMAT_18NP;
374 break;
375
376 case MIPI_DSI_FMT_RGB666_PACKED:
377 *fmt = TEGRA_DSI_FORMAT_18P;
378 break;
379
380 case MIPI_DSI_FMT_RGB565:
381 *fmt = TEGRA_DSI_FORMAT_16P;
382 break;
383
384 default:
385 return -EINVAL;
386 }
387
388 return 0;
389}
390
364static int tegra_output_dsi_enable(struct tegra_output *output) 391static int tegra_output_dsi_enable(struct tegra_output *output)
365{ 392{
366 struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc); 393 struct tegra_dc *dc = to_tegra_dc(output->encoder.crtc);
@@ -369,6 +396,7 @@ static int tegra_output_dsi_enable(struct tegra_output *output)
369 struct tegra_dsi *dsi = to_dsi(output); 396 struct tegra_dsi *dsi = to_dsi(output);
370 /* FIXME: don't hardcode this */ 397 /* FIXME: don't hardcode this */
371 const u32 *pkt_seq = pkt_seq_vnb_syne; 398 const u32 *pkt_seq = pkt_seq_vnb_syne;
399 enum tegra_dsi_format format;
372 unsigned long value; 400 unsigned long value;
373 int err; 401 int err;
374 402
@@ -376,13 +404,17 @@ static int tegra_output_dsi_enable(struct tegra_output *output)
376 if (err < 0) 404 if (err < 0)
377 return err; 405 return err;
378 406
407 err = tegra_dsi_get_format(dsi->format, &format);
408 if (err < 0)
409 return err;
410
379 err = clk_enable(dsi->clk); 411 err = clk_enable(dsi->clk);
380 if (err < 0) 412 if (err < 0)
381 return err; 413 return err;
382 414
383 reset_control_deassert(dsi->rst); 415 reset_control_deassert(dsi->rst);
384 416
385 value = DSI_CONTROL_CHANNEL(0) | DSI_CONTROL_FORMAT(dsi->format) | 417 value = DSI_CONTROL_CHANNEL(0) | DSI_CONTROL_FORMAT(format) |
386 DSI_CONTROL_LANES(dsi->lanes - 1) | 418 DSI_CONTROL_LANES(dsi->lanes - 1) |
387 DSI_CONTROL_SOURCE(dc->pipe); 419 DSI_CONTROL_SOURCE(dc->pipe);
388 tegra_dsi_writel(dsi, value, DSI_CONTROL); 420 tegra_dsi_writel(dsi, value, DSI_CONTROL);
diff --git a/drivers/gpu/drm/tegra/dsi.h b/drivers/gpu/drm/tegra/dsi.h
index 1db5cc24ea91..5ce610d08d77 100644
--- a/drivers/gpu/drm/tegra/dsi.h
+++ b/drivers/gpu/drm/tegra/dsi.h
@@ -117,4 +117,14 @@
117#define DSI_INIT_SEQ_DATA_14 0x5e 117#define DSI_INIT_SEQ_DATA_14 0x5e
118#define DSI_INIT_SEQ_DATA_15 0x5f 118#define DSI_INIT_SEQ_DATA_15 0x5f
119 119
120/*
121 * pixel format as used in the DSI_CONTROL_FORMAT field
122 */
123enum tegra_dsi_format {
124 TEGRA_DSI_FORMAT_16P,
125 TEGRA_DSI_FORMAT_18NP,
126 TEGRA_DSI_FORMAT_18P,
127 TEGRA_DSI_FORMAT_24P,
128};
129
120#endif 130#endif