Commit 0e8276ef authored by Tomi Valkeinen's avatar Tomi Valkeinen

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: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 6061675b
...@@ -49,28 +49,30 @@ static struct { ...@@ -49,28 +49,30 @@ static struct {
struct omap_dss_output output; struct omap_dss_output output;
} dpi; } dpi;
static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk) static struct platform_device *dpi_get_dsidev(enum omap_channel channel)
{ {
int dsi_module; switch (channel) {
case OMAP_DSS_CHANNEL_LCD:
dsi_module = clk == OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC ? 0 : 1; return dsi_get_dsidev_from_id(0);
case OMAP_DSS_CHANNEL_LCD2:
return dsi_get_dsidev_from_id(dsi_module); return dsi_get_dsidev_from_id(1);
default:
return NULL;
}
} }
static bool dpi_use_dsi_pll(struct omap_dss_device *dssdev) static enum omap_dss_clk_source dpi_get_alt_clk_src(enum omap_channel channel)
{ {
if (dssdev->clocks.dispc.dispc_fclk_src == switch (channel) {
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC || case OMAP_DSS_CHANNEL_LCD:
dssdev->clocks.dispc.dispc_fclk_src == return OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC;
OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC || case OMAP_DSS_CHANNEL_LCD2:
dssdev->clocks.dispc.channel.lcd_clk_src == return OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC;
OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC || default:
dssdev->clocks.dispc.channel.lcd_clk_src == /* this shouldn't happen */
OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC) WARN_ON(1);
return true; return OMAP_DSS_CLK_SRC_FCK;
else }
return false;
} }
static int dpi_set_dsi_clk(struct omap_dss_device *dssdev, 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,7 +94,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,
return r; return r;
dss_select_lcd_clk_source(mgr->id, dss_select_lcd_clk_source(mgr->id,
dssdev->clocks.dispc.channel.lcd_clk_src); dpi_get_alt_clk_src(mgr->id));
dpi.mgr_config.clock_info = dispc_cinfo; dpi.mgr_config.clock_info = dispc_cinfo;
...@@ -385,6 +387,8 @@ static int __init dpi_verify_dsi_pll(struct platform_device *dsidev) ...@@ -385,6 +387,8 @@ static int __init dpi_verify_dsi_pll(struct platform_device *dsidev)
static int __init dpi_init_display(struct omap_dss_device *dssdev) static int __init dpi_init_display(struct omap_dss_device *dssdev)
{ {
struct platform_device *dsidev;
DSSDBG("init_display\n"); DSSDBG("init_display\n");
if (dss_has_feature(FEAT_DPI_USES_VDDS_DSI) && 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,17 +405,23 @@ static int __init dpi_init_display(struct omap_dss_device *dssdev)
dpi.vdds_dsi_reg = vdds_dsi; dpi.vdds_dsi_reg = vdds_dsi;
} }
if (dpi_use_dsi_pll(dssdev)) { /*
enum omap_dss_clk_source dispc_fclk_src = * XXX We shouldn't need dssdev->channel for this. The dsi pll clock
dssdev->clocks.dispc.dispc_fclk_src; * source for DPI is SoC integration detail, not something that should
dpi.dsidev = dpi_get_dsidev(dispc_fclk_src); * be configured in the dssdev
*/
dsidev = dpi_get_dsidev(dssdev->channel);
if (dpi_verify_dsi_pll(dpi.dsidev)) { if (dpi_verify_dsi_pll(dsidev)) {
dpi.dsidev = NULL; dsidev = NULL;
DSSWARN("DSI PLL not operational\n"); DSSWARN("DSI PLL not operational\n");
}
} }
if (dsidev)
DSSDBG("using DSI PLL for DPI clock\n");
dpi.dsidev = dsidev;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment