diff options
Diffstat (limited to 'arch/arm/mach-omap2/display.c')
| -rw-r--r-- | arch/arm/mach-omap2/display.c | 185 | 
1 files changed, 144 insertions, 41 deletions
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 03a0516c7f6..bf852d7ae95 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c @@ -23,6 +23,9 @@  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/delay.h> +#include <linux/of.h> +#include <linux/of_platform.h> +#include <linux/slab.h>  #include <video/omapdss.h>  #include "omap_hwmod.h" @@ -32,7 +35,6 @@  #include "soc.h"  #include "iomap.h" -#include "mux.h"  #include "control.h"  #include "display.h"  #include "prm.h" @@ -102,35 +104,6 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initconst = {  	{ "dss_hdmi", "omapdss_hdmi", -1 },  }; -static void __init omap4_tpd12s015_mux_pads(void) -{ -	omap_mux_init_signal("hdmi_cec", -			OMAP_PIN_INPUT_PULLUP); -	omap_mux_init_signal("hdmi_ddc_scl", -			OMAP_PIN_INPUT_PULLUP); -	omap_mux_init_signal("hdmi_ddc_sda", -			OMAP_PIN_INPUT_PULLUP); -} - -static void __init omap4_hdmi_mux_pads(enum omap_hdmi_flags flags) -{ -	u32 reg; -	u16 control_i2c_1; - -	/* -	 * CONTROL_I2C_1: HDMI_DDC_SDA_PULLUPRESX (bit 28) and -	 * HDMI_DDC_SCL_PULLUPRESX (bit 24) are set to disable -	 * internal pull up resistor. -	 */ -	if (flags & OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP) { -		control_i2c_1 = OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_1; -		reg = omap4_ctrl_pad_readl(control_i2c_1); -		reg |= (OMAP4_HDMI_DDC_SDA_PULLUPRESX_MASK | -			OMAP4_HDMI_DDC_SCL_PULLUPRESX_MASK); -			omap4_ctrl_pad_writel(reg, control_i2c_1); -	} -} -  static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)  {  	u32 enable_mask, enable_shift; @@ -164,16 +137,6 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)  	return 0;  } -int __init omap_hdmi_init(enum omap_hdmi_flags flags) -{ -	if (cpu_is_omap44xx()) { -		omap4_hdmi_mux_pads(flags); -		omap4_tpd12s015_mux_pads(); -	} - -	return 0; -} -  static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)  {  	if (cpu_is_omap44xx()) @@ -316,6 +279,8 @@ static enum omapdss_version __init omap_display_get_version(void)  		return OMAPDSS_VER_OMAP4;  	else if (soc_is_omap54xx())  		return OMAPDSS_VER_OMAP5; +	else if (soc_is_am43xx()) +		return OMAPDSS_VER_AM43xx;  	else  		return OMAPDSS_VER_UNKNOWN;  } @@ -341,7 +306,6 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)  	board_data->version = ver;  	board_data->dsi_enable_pads = omap_dsi_enable_pads;  	board_data->dsi_disable_pads = omap_dsi_disable_pads; -	board_data->get_context_loss_count = omap_pm_get_dev_context_loss_count;  	board_data->set_min_bus_tput = omap_dss_set_min_bus_tput;  	omap_display_device.dev.platform_data = board_data; @@ -416,6 +380,34 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)  		}  	} +	/* create DRM device */ +	r = omap_init_drm(); +	if (r < 0) { +		pr_err("Unable to register omapdrm device\n"); +		return r; +	} + +	/* create vrfb device */ +	r = omap_init_vrfb(); +	if (r < 0) { +		pr_err("Unable to register omapvrfb device\n"); +		return r; +	} + +	/* create FB device */ +	r = omap_init_fb(); +	if (r < 0) { +		pr_err("Unable to register omapfb device\n"); +		return r; +	} + +	/* create V4L2 display device */ +	r = omap_init_vout(); +	if (r < 0) { +		pr_err("Unable to register omap_vout device\n"); +		return r; +	} +  	return 0;  } @@ -564,3 +556,114 @@ int omap_dss_reset(struct omap_hwmod *oh)  	return r;  } + +void __init omapdss_early_init_of(void) +{ + +} + +struct device_node * __init omapdss_find_dss_of_node(void) +{ +	struct device_node *node; + +	node = of_find_compatible_node(NULL, NULL, "ti,omap2-dss"); +	if (node) +		return node; + +	node = of_find_compatible_node(NULL, NULL, "ti,omap3-dss"); +	if (node) +		return node; + +	node = of_find_compatible_node(NULL, NULL, "ti,omap4-dss"); +	if (node) +		return node; + +	node = of_find_compatible_node(NULL, NULL, "ti,omap5-dss"); +	if (node) +		return node; + +	return NULL; +} + +int __init omapdss_init_of(void) +{ +	int r; +	enum omapdss_version ver; +	struct device_node *node; +	struct platform_device *pdev; + +	static struct omap_dss_board_info board_data = { +		.dsi_enable_pads = omap_dsi_enable_pads, +		.dsi_disable_pads = omap_dsi_disable_pads, +		.set_min_bus_tput = omap_dss_set_min_bus_tput, +	}; + +	/* only create dss helper devices if dss is enabled in the .dts */ + +	node = omapdss_find_dss_of_node(); +	if (!node) +		return 0; + +	if (!of_device_is_available(node)) +		return 0; + +	ver = omap_display_get_version(); + +	if (ver == OMAPDSS_VER_UNKNOWN) { +		pr_err("DSS not supported on this SoC\n"); +		return -ENODEV; +	} + +	pdev = of_find_device_by_node(node); + +	if (!pdev) { +		pr_err("Unable to find DSS platform device\n"); +		return -ENODEV; +	} + +	r = of_platform_populate(node, NULL, NULL, &pdev->dev); +	if (r) { +		pr_err("Unable to populate DSS submodule devices\n"); +		return r; +	} + +	board_data.version = ver; + +	omap_display_device.dev.platform_data = &board_data; + +	r = platform_device_register(&omap_display_device); +	if (r < 0) { +		pr_err("Unable to register omapdss device\n"); +		return r; +	} + +	/* create DRM device */ +	r = omap_init_drm(); +	if (r < 0) { +		pr_err("Unable to register omapdrm device\n"); +		return r; +	} + +	/* create vrfb device */ +	r = omap_init_vrfb(); +	if (r < 0) { +		pr_err("Unable to register omapvrfb device\n"); +		return r; +	} + +	/* create FB device */ +	r = omap_init_fb(); +	if (r < 0) { +		pr_err("Unable to register omapfb device\n"); +		return r; +	} + +	/* create V4L2 display device */ +	r = omap_init_vout(); +	if (r < 0) { +		pr_err("Unable to register omap_vout device\n"); +		return r; +	} + +	return 0; +}  | 
