Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+37 −27
Original line number Original line Diff line number Diff line
@@ -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,
		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)


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,16 +405,22 @@ 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;
}
}