diff options
Diffstat (limited to 'arch/arm/mach-omap2/display.c')
| -rw-r--r-- | arch/arm/mach-omap2/display.c | 66 | 
1 files changed, 60 insertions, 6 deletions
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index a5b7a236aa5..836f0f7d8c0 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, @@ -61,7 +63,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 = { @@ -69,16 +71,63 @@ 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;  	struct omap_hwmod *oh; -	struct omap_device *od; +	struct platform_device *pdev;  	int i, oh_count;  	struct omap_display_platform_data pdata;  	const struct omap_dss_hwmod_data *curr_dss_hwmod; @@ -96,6 +145,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; @@ -108,13 +162,13 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)  			return -ENODEV;  		} -		od = omap_device_build(curr_dss_hwmod[i].dev_name, +		pdev = omap_device_build(curr_dss_hwmod[i].dev_name,  				curr_dss_hwmod[i].id, oh, &pdata,  				sizeof(struct omap_display_platform_data),  				omap_dss_latency,  				ARRAY_SIZE(omap_dss_latency), 0); -		if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", +		if (WARN((IS_ERR(pdev)), "Could not build omap_device for %s\n",  				curr_dss_hwmod[i].oh_name))  			return -ENODEV;  	}  |