diff options
Diffstat (limited to 'arch/arm/mach-omap2/display.c')
| -rw-r--r-- | arch/arm/mach-omap2/display.c | 60 | 
1 files changed, 57 insertions, 3 deletions
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 8ad0a2f0367..4036821a01f 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -27,6 +27,8 @@  #include <plat/omap_device.h>  #include <plat/omap-pm.h> +#include "control.h" +  static struct platform_device omap_display_device = {  	.name          = "omapdss",  	.id            = -1, @@ -53,7 +55,7 @@ static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initdata = {  	{ "dss_dispc", "omapdss_dispc", -1 },  	{ "dss_rfbi", "omapdss_rfbi", -1 },  	{ "dss_venc", "omapdss_venc", -1 }, -	{ "dss_dsi1", "omapdss_dsi1", -1 }, +	{ "dss_dsi1", "omapdss_dsi", 0 },  };  static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = { @@ -61,11 +63,58 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = {  	{ "dss_dispc", "omapdss_dispc", -1 },  	{ "dss_rfbi", "omapdss_rfbi", -1 },  	{ "dss_venc", "omapdss_venc", -1 }, -	{ "dss_dsi1", "omapdss_dsi1", -1 }, -	{ "dss_dsi2", "omapdss_dsi2", -1 }, +	{ "dss_dsi1", "omapdss_dsi", 0 }, +	{ "dss_dsi2", "omapdss_dsi", 1 },  	{ "dss_hdmi", "omapdss_hdmi", -1 },  }; +static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes) +{ +	u32 enable_mask, enable_shift; +	u32 pipd_mask, pipd_shift; +	u32 reg; + +	if (dsi_id == 0) { +		enable_mask = OMAP4_DSI1_LANEENABLE_MASK; +		enable_shift = OMAP4_DSI1_LANEENABLE_SHIFT; +		pipd_mask = OMAP4_DSI1_PIPD_MASK; +		pipd_shift = OMAP4_DSI1_PIPD_SHIFT; +	} else if (dsi_id == 1) { +		enable_mask = OMAP4_DSI2_LANEENABLE_MASK; +		enable_shift = OMAP4_DSI2_LANEENABLE_SHIFT; +		pipd_mask = OMAP4_DSI2_PIPD_MASK; +		pipd_shift = OMAP4_DSI2_PIPD_SHIFT; +	} else { +		return -ENODEV; +	} + +	reg = omap4_ctrl_pad_readl(OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); + +	reg &= ~enable_mask; +	reg &= ~pipd_mask; + +	reg |= (lanes << enable_shift) & enable_mask; +	reg |= (lanes << pipd_shift) & pipd_mask; + +	omap4_ctrl_pad_writel(reg, OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_DSIPHY); + +	return 0; +} + +static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask) +{ +	if (cpu_is_omap44xx()) +		return omap4_dsi_mux_pads(dsi_id, lane_mask); + +	return 0; +} + +static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask) +{ +	if (cpu_is_omap44xx()) +		omap4_dsi_mux_pads(dsi_id, 0); +} +  int __init omap_display_init(struct omap_dss_board_info *board_data)  {  	int r = 0; @@ -88,6 +137,11 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)  		oh_count = ARRAY_SIZE(omap4_dss_hwmod_data);  	} +	if (board_data->dsi_enable_pads == NULL) +		board_data->dsi_enable_pads = omap_dsi_enable_pads; +	if (board_data->dsi_disable_pads == NULL) +		board_data->dsi_disable_pads = omap_dsi_disable_pads; +  	pdata.board_data = board_data;  	pdata.board_data->get_context_loss_count =  		omap_pm_get_dev_context_loss_count;  |