diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-10-22 09:12:58 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-11-05 04:17:39 -0500 |
commit | 0e8276ef75f5c7811b038d1d23b2b42c16efc5ac (patch) | |
tree | 1234608a68cdd76d5e1aa93da26a7ed6cb51e4ae | |
parent | 6061675b3fc83d8d190b87b54f04f0c89f605149 (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.c | 64 |
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 | ||
52 | static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk) | 52 | static 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 | ||
61 | static bool dpi_use_dsi_pll(struct omap_dss_device *dssdev) | 64 | static 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 | ||
76 | static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, | 78 | static 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 | ||
386 | static int __init dpi_init_display(struct omap_dss_device *dssdev) | 388 | static 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 | ||