aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-10-22 09:12:58 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-11-05 04:17:39 -0500
commit0e8276ef75f5c7811b038d1d23b2b42c16efc5ac (patch)
tree1234608a68cdd76d5e1aa93da26a7ed6cb51e4ae
parent6061675b3fc83d8d190b87b54f04f0c89f605149 (diff)
OMAPDSS: DPI: always use DSI PLL if available
We currently get the decision whether to use PRCM or DSI PLL clock for DPI from the board file. This is not a good way to handle it, and it won't work with device tree. This patch changes DPI to always use DSI PLL if it's available. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
-rw-r--r--drivers/video/omap2/dss/dpi.c64
1 files changed, 37 insertions, 27 deletions
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index 6baeb04e60cc..1e103b3135b9 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -49,28 +49,30 @@ static struct {
49 struct omap_dss_output output; 49 struct omap_dss_output output;
50} dpi; 50} dpi;
51 51
52static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk) 52static struct platform_device *dpi_get_dsidev(enum omap_channel channel)
53{ 53{
54 int dsi_module; 54 switch (channel) {
55 55 case OMAP_DSS_CHANNEL_LCD:
56 dsi_module = clk == OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC ? 0 : 1; 56 return dsi_get_dsidev_from_id(0);
57 57 case OMAP_DSS_CHANNEL_LCD2:
58 return dsi_get_dsidev_from_id(dsi_module); 58 return dsi_get_dsidev_from_id(1);
59 default:
60 return NULL;
61 }
59} 62}
60 63
61static bool dpi_use_dsi_pll(struct omap_dss_device *dssdev) 64static enum omap_dss_clk_source dpi_get_alt_clk_src(enum omap_channel channel)
62{ 65{
63 if (dssdev->clocks.dispc.dispc_fclk_src == 66 switch (channel) {
64 OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC || 67 case OMAP_DSS_CHANNEL_LCD:
65 dssdev->clocks.dispc.dispc_fclk_src == 68 return OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC;
66 OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC || 69 case OMAP_DSS_CHANNEL_LCD2:
67 dssdev->clocks.dispc.channel.lcd_clk_src == 70 return OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC;
68 OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC || 71 default:
69 dssdev->clocks.dispc.channel.lcd_clk_src == 72 /* this shouldn't happen */
70 OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC) 73 WARN_ON(1);
71 return true; 74 return OMAP_DSS_CLK_SRC_FCK;
72 else 75 }
73 return false;
74} 76}
75 77
76static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, 78static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
@@ -92,7 +94,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
92 return r; 94 return r;
93 95
94 dss_select_lcd_clk_source(mgr->id, 96 dss_select_lcd_clk_source(mgr->id,
95 dssdev->clocks.dispc.channel.lcd_clk_src); 97 dpi_get_alt_clk_src(mgr->id));
96 98
97 dpi.mgr_config.clock_info = dispc_cinfo; 99 dpi.mgr_config.clock_info = dispc_cinfo;
98 100
@@ -385,6 +387,8 @@ static int __init dpi_verify_dsi_pll(struct platform_device *dsidev)
385 387
386static int __init dpi_init_display(struct omap_dss_device *dssdev) 388static int __init dpi_init_display(struct omap_dss_device *dssdev)
387{ 389{
390 struct platform_device *dsidev;
391
388 DSSDBG("init_display\n"); 392 DSSDBG("init_display\n");
389 393
390 if (dss_has_feature(FEAT_DPI_USES_VDDS_DSI) && 394 if (dss_has_feature(FEAT_DPI_USES_VDDS_DSI) &&
@@ -401,17 +405,23 @@ static int __init dpi_init_display(struct omap_dss_device *dssdev)
401 dpi.vdds_dsi_reg = vdds_dsi; 405 dpi.vdds_dsi_reg = vdds_dsi;
402 } 406 }
403 407
404 if (dpi_use_dsi_pll(dssdev)) { 408 /*
405 enum omap_dss_clk_source dispc_fclk_src = 409 * XXX We shouldn't need dssdev->channel for this. The dsi pll clock
406 dssdev->clocks.dispc.dispc_fclk_src; 410 * source for DPI is SoC integration detail, not something that should
407 dpi.dsidev = dpi_get_dsidev(dispc_fclk_src); 411 * be configured in the dssdev
412 */
413 dsidev = dpi_get_dsidev(dssdev->channel);
408 414
409 if (dpi_verify_dsi_pll(dpi.dsidev)) { 415 if (dpi_verify_dsi_pll(dsidev)) {
410 dpi.dsidev = NULL; 416 dsidev = NULL;
411 DSSWARN("DSI PLL not operational\n"); 417 DSSWARN("DSI PLL not operational\n");
412 }
413 } 418 }
414 419
420 if (dsidev)
421 DSSDBG("using DSI PLL for DPI clock\n");
422
423 dpi.dsidev = dsidev;
424
415 return 0; 425 return 0;
416} 426}
417 427