diff options
Diffstat (limited to 'arch/arm/mach-omap2/display.c')
-rw-r--r-- | arch/arm/mach-omap2/display.c | 77 |
1 files changed, 50 insertions, 27 deletions
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index 256d23fb79ab..543fcb8b518c 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/err.h> | 23 | #include <linux/err.h> |
24 | 24 | ||
25 | #include <plat/display.h> | 25 | #include <video/omapdss.h> |
26 | #include <plat/omap_hwmod.h> | 26 | #include <plat/omap_hwmod.h> |
27 | #include <plat/omap_device.h> | 27 | #include <plat/omap_device.h> |
28 | 28 | ||
@@ -56,37 +56,58 @@ static bool opt_clock_available(const char *clk_role) | |||
56 | return false; | 56 | return false; |
57 | } | 57 | } |
58 | 58 | ||
59 | struct omap_dss_hwmod_data { | ||
60 | const char *oh_name; | ||
61 | const char *dev_name; | ||
62 | const int id; | ||
63 | }; | ||
64 | |||
65 | static const struct omap_dss_hwmod_data omap2_dss_hwmod_data[] __initdata = { | ||
66 | { "dss_core", "omapdss_dss", -1 }, | ||
67 | { "dss_dispc", "omapdss_dispc", -1 }, | ||
68 | { "dss_rfbi", "omapdss_rfbi", -1 }, | ||
69 | { "dss_venc", "omapdss_venc", -1 }, | ||
70 | }; | ||
71 | |||
72 | static const struct omap_dss_hwmod_data omap3_dss_hwmod_data[] __initdata = { | ||
73 | { "dss_core", "omapdss_dss", -1 }, | ||
74 | { "dss_dispc", "omapdss_dispc", -1 }, | ||
75 | { "dss_rfbi", "omapdss_rfbi", -1 }, | ||
76 | { "dss_venc", "omapdss_venc", -1 }, | ||
77 | { "dss_dsi1", "omapdss_dsi1", -1 }, | ||
78 | }; | ||
79 | |||
80 | static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = { | ||
81 | { "dss_core", "omapdss_dss", -1 }, | ||
82 | { "dss_dispc", "omapdss_dispc", -1 }, | ||
83 | { "dss_rfbi", "omapdss_rfbi", -1 }, | ||
84 | { "dss_venc", "omapdss_venc", -1 }, | ||
85 | { "dss_dsi1", "omapdss_dsi1", -1 }, | ||
86 | { "dss_dsi2", "omapdss_dsi2", -1 }, | ||
87 | { "dss_hdmi", "omapdss_hdmi", -1 }, | ||
88 | }; | ||
89 | |||
59 | int __init omap_display_init(struct omap_dss_board_info *board_data) | 90 | int __init omap_display_init(struct omap_dss_board_info *board_data) |
60 | { | 91 | { |
61 | int r = 0; | 92 | int r = 0; |
62 | struct omap_hwmod *oh; | 93 | struct omap_hwmod *oh; |
63 | struct omap_device *od; | 94 | struct omap_device *od; |
64 | int i; | 95 | int i, oh_count; |
65 | struct omap_display_platform_data pdata; | 96 | struct omap_display_platform_data pdata; |
66 | 97 | const struct omap_dss_hwmod_data *curr_dss_hwmod; | |
67 | /* | ||
68 | * omap: valid DSS hwmod names | ||
69 | * omap2,3,4: dss_core, dss_dispc, dss_rfbi, dss_venc | ||
70 | * omap3,4: dss_dsi1 | ||
71 | * omap4: dss_dsi2, dss_hdmi | ||
72 | */ | ||
73 | char *oh_name[] = { "dss_core", "dss_dispc", "dss_rfbi", "dss_venc", | ||
74 | "dss_dsi1", "dss_dsi2", "dss_hdmi" }; | ||
75 | char *dev_name[] = { "omapdss_dss", "omapdss_dispc", "omapdss_rfbi", | ||
76 | "omapdss_venc", "omapdss_dsi1", "omapdss_dsi2", | ||
77 | "omapdss_hdmi" }; | ||
78 | int oh_count; | ||
79 | 98 | ||
80 | memset(&pdata, 0, sizeof(pdata)); | 99 | memset(&pdata, 0, sizeof(pdata)); |
81 | 100 | ||
82 | if (cpu_is_omap24xx()) | 101 | if (cpu_is_omap24xx()) { |
83 | oh_count = ARRAY_SIZE(oh_name) - 3; | 102 | curr_dss_hwmod = omap2_dss_hwmod_data; |
84 | /* last 3 hwmod dev in oh_name are not available for omap2 */ | 103 | oh_count = ARRAY_SIZE(omap2_dss_hwmod_data); |
85 | else if (cpu_is_omap44xx()) | 104 | } else if (cpu_is_omap34xx()) { |
86 | oh_count = ARRAY_SIZE(oh_name); | 105 | curr_dss_hwmod = omap3_dss_hwmod_data; |
87 | else | 106 | oh_count = ARRAY_SIZE(omap3_dss_hwmod_data); |
88 | oh_count = ARRAY_SIZE(oh_name) - 2; | 107 | } else { |
89 | /* last 2 hwmod dev in oh_name are not available for omap3 */ | 108 | curr_dss_hwmod = omap4_dss_hwmod_data; |
109 | oh_count = ARRAY_SIZE(omap4_dss_hwmod_data); | ||
110 | } | ||
90 | 111 | ||
91 | /* opt_clks are always associated with dss hwmod */ | 112 | /* opt_clks are always associated with dss hwmod */ |
92 | oh_core = omap_hwmod_lookup("dss_core"); | 113 | oh_core = omap_hwmod_lookup("dss_core"); |
@@ -100,19 +121,21 @@ int __init omap_display_init(struct omap_dss_board_info *board_data) | |||
100 | pdata.opt_clock_available = opt_clock_available; | 121 | pdata.opt_clock_available = opt_clock_available; |
101 | 122 | ||
102 | for (i = 0; i < oh_count; i++) { | 123 | for (i = 0; i < oh_count; i++) { |
103 | oh = omap_hwmod_lookup(oh_name[i]); | 124 | oh = omap_hwmod_lookup(curr_dss_hwmod[i].oh_name); |
104 | if (!oh) { | 125 | if (!oh) { |
105 | pr_err("Could not look up %s\n", oh_name[i]); | 126 | pr_err("Could not look up %s\n", |
127 | curr_dss_hwmod[i].oh_name); | ||
106 | return -ENODEV; | 128 | return -ENODEV; |
107 | } | 129 | } |
108 | 130 | ||
109 | od = omap_device_build(dev_name[i], -1, oh, &pdata, | 131 | od = omap_device_build(curr_dss_hwmod[i].dev_name, |
132 | curr_dss_hwmod[i].id, oh, &pdata, | ||
110 | sizeof(struct omap_display_platform_data), | 133 | sizeof(struct omap_display_platform_data), |
111 | omap_dss_latency, | 134 | omap_dss_latency, |
112 | ARRAY_SIZE(omap_dss_latency), 0); | 135 | ARRAY_SIZE(omap_dss_latency), 0); |
113 | 136 | ||
114 | if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", | 137 | if (WARN((IS_ERR(od)), "Could not build omap_device for %s\n", |
115 | oh_name[i])) | 138 | curr_dss_hwmod[i].oh_name)) |
116 | return -ENODEV; | 139 | return -ENODEV; |
117 | } | 140 | } |
118 | omap_display_device.dev.platform_data = board_data; | 141 | omap_display_device.dev.platform_data = board_data; |