diff options
author | Archit Taneja <archit@ti.com> | 2012-09-26 07:12:39 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2012-09-26 07:58:31 -0400 |
commit | 97f01b3a2ed6d46132bf4e2d237c27846e7b260a (patch) | |
tree | 27c7a36c7ea6dbd51b6bf0a5edb04a861e8ac381 /drivers | |
parent | 6d71b923e53184808b0206ebd74159c41a2dcf38 (diff) |
OMAPDSS: APPLY: Add manager set/unset output ops for omap_overlay_manager
Add set_output/unset_output ops for overlay managers, these form links between
managers and outputs. Create a function in dss features which tell all the
output instances that connect to a manager, use it when a manager tries to set
an output. Add a constraint of not unsetting an output when the manager is
enabled.
Keep the omap_dss_device pointer and set/unset_device ops in overlay_manager for
now to not break things. Keep the dss feature function get_supported_displays
as it's used in some places. These will be removed later.
Signed-off-by: Archit Taneja <archit@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/omap2/dss/apply.c | 70 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 3 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss_features.c | 71 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss_features.h | 1 | ||||
-rw-r--r-- | drivers/video/omap2/dss/manager.c | 4 |
5 files changed, 149 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 72f3468b0790..3cc47265bb03 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c | |||
@@ -1174,6 +1174,76 @@ err: | |||
1174 | return r; | 1174 | return r; |
1175 | } | 1175 | } |
1176 | 1176 | ||
1177 | int dss_mgr_set_output(struct omap_overlay_manager *mgr, | ||
1178 | struct omap_dss_output *output) | ||
1179 | { | ||
1180 | int r; | ||
1181 | |||
1182 | mutex_lock(&apply_lock); | ||
1183 | |||
1184 | if (mgr->output) { | ||
1185 | DSSERR("manager %s is already connected to an output\n", | ||
1186 | mgr->name); | ||
1187 | r = -EINVAL; | ||
1188 | goto err; | ||
1189 | } | ||
1190 | |||
1191 | if ((mgr->supported_outputs & output->id) == 0) { | ||
1192 | DSSERR("output does not support manager %s\n", | ||
1193 | mgr->name); | ||
1194 | r = -EINVAL; | ||
1195 | goto err; | ||
1196 | } | ||
1197 | |||
1198 | output->manager = mgr; | ||
1199 | mgr->output = output; | ||
1200 | |||
1201 | mutex_unlock(&apply_lock); | ||
1202 | |||
1203 | return 0; | ||
1204 | err: | ||
1205 | mutex_unlock(&apply_lock); | ||
1206 | return r; | ||
1207 | } | ||
1208 | |||
1209 | int dss_mgr_unset_output(struct omap_overlay_manager *mgr) | ||
1210 | { | ||
1211 | int r; | ||
1212 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
1213 | unsigned long flags; | ||
1214 | |||
1215 | mutex_lock(&apply_lock); | ||
1216 | |||
1217 | if (!mgr->output) { | ||
1218 | DSSERR("failed to unset output, output not set\n"); | ||
1219 | r = -EINVAL; | ||
1220 | goto err; | ||
1221 | } | ||
1222 | |||
1223 | spin_lock_irqsave(&data_lock, flags); | ||
1224 | |||
1225 | if (mp->enabled) { | ||
1226 | DSSERR("output can't be unset when manager is enabled\n"); | ||
1227 | r = -EINVAL; | ||
1228 | goto err1; | ||
1229 | } | ||
1230 | |||
1231 | spin_unlock_irqrestore(&data_lock, flags); | ||
1232 | |||
1233 | mgr->output->manager = NULL; | ||
1234 | mgr->output = NULL; | ||
1235 | |||
1236 | mutex_unlock(&apply_lock); | ||
1237 | |||
1238 | return 0; | ||
1239 | err1: | ||
1240 | spin_unlock_irqrestore(&data_lock, flags); | ||
1241 | err: | ||
1242 | mutex_unlock(&apply_lock); | ||
1243 | |||
1244 | return r; | ||
1245 | } | ||
1246 | |||
1177 | static void dss_apply_mgr_timings(struct omap_overlay_manager *mgr, | 1247 | static void dss_apply_mgr_timings(struct omap_overlay_manager *mgr, |
1178 | const struct omap_video_timings *timings) | 1248 | const struct omap_video_timings *timings) |
1179 | { | 1249 | { |
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index aecd3bea2e63..b5c0df43547f 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -209,6 +209,9 @@ void dss_mgr_get_info(struct omap_overlay_manager *mgr, | |||
209 | int dss_mgr_set_device(struct omap_overlay_manager *mgr, | 209 | int dss_mgr_set_device(struct omap_overlay_manager *mgr, |
210 | struct omap_dss_device *dssdev); | 210 | struct omap_dss_device *dssdev); |
211 | int dss_mgr_unset_device(struct omap_overlay_manager *mgr); | 211 | int dss_mgr_unset_device(struct omap_overlay_manager *mgr); |
212 | int dss_mgr_set_output(struct omap_overlay_manager *mgr, | ||
213 | struct omap_dss_output *output); | ||
214 | int dss_mgr_unset_output(struct omap_overlay_manager *mgr); | ||
212 | void dss_mgr_set_timings(struct omap_overlay_manager *mgr, | 215 | void dss_mgr_set_timings(struct omap_overlay_manager *mgr, |
213 | const struct omap_video_timings *timings); | 216 | const struct omap_video_timings *timings); |
214 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, | 217 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, |
diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c index 406913949e2c..bfe7fc7b8593 100644 --- a/drivers/video/omap2/dss/dss_features.c +++ b/drivers/video/omap2/dss/dss_features.c | |||
@@ -47,6 +47,7 @@ struct omap_dss_features { | |||
47 | const int num_mgrs; | 47 | const int num_mgrs; |
48 | const int num_ovls; | 48 | const int num_ovls; |
49 | const enum omap_display_type *supported_displays; | 49 | const enum omap_display_type *supported_displays; |
50 | const enum omap_dss_output_id *supported_outputs; | ||
50 | const enum omap_color_mode *supported_color_modes; | 51 | const enum omap_color_mode *supported_color_modes; |
51 | const enum omap_overlay_caps *overlay_caps; | 52 | const enum omap_overlay_caps *overlay_caps; |
52 | const char * const *clksrc_names; | 53 | const char * const *clksrc_names; |
@@ -172,6 +173,63 @@ static const enum omap_display_type omap5_dss_supported_displays[] = { | |||
172 | OMAP_DISPLAY_TYPE_DSI, | 173 | OMAP_DISPLAY_TYPE_DSI, |
173 | }; | 174 | }; |
174 | 175 | ||
176 | static const enum omap_dss_output_id omap2_dss_supported_outputs[] = { | ||
177 | /* OMAP_DSS_CHANNEL_LCD */ | ||
178 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI, | ||
179 | |||
180 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
181 | OMAP_DSS_OUTPUT_VENC, | ||
182 | }; | ||
183 | |||
184 | static const enum omap_dss_output_id omap3430_dss_supported_outputs[] = { | ||
185 | /* OMAP_DSS_CHANNEL_LCD */ | ||
186 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
187 | OMAP_DSS_OUTPUT_SDI | OMAP_DSS_OUTPUT_DSI1, | ||
188 | |||
189 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
190 | OMAP_DSS_OUTPUT_VENC, | ||
191 | }; | ||
192 | |||
193 | static const enum omap_dss_output_id omap3630_dss_supported_outputs[] = { | ||
194 | /* OMAP_DSS_CHANNEL_LCD */ | ||
195 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
196 | OMAP_DSS_OUTPUT_DSI1, | ||
197 | |||
198 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
199 | OMAP_DSS_OUTPUT_VENC, | ||
200 | }; | ||
201 | |||
202 | static const enum omap_dss_output_id omap4_dss_supported_outputs[] = { | ||
203 | /* OMAP_DSS_CHANNEL_LCD */ | ||
204 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
205 | OMAP_DSS_OUTPUT_DSI1, | ||
206 | |||
207 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
208 | OMAP_DSS_OUTPUT_VENC | OMAP_DSS_OUTPUT_HDMI | | ||
209 | OMAP_DSS_OUTPUT_DPI, | ||
210 | |||
211 | /* OMAP_DSS_CHANNEL_LCD2 */ | ||
212 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
213 | OMAP_DSS_OUTPUT_DSI2, | ||
214 | }; | ||
215 | |||
216 | static const enum omap_dss_output_id omap5_dss_supported_outputs[] = { | ||
217 | /* OMAP_DSS_CHANNEL_LCD */ | ||
218 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
219 | OMAP_DSS_OUTPUT_DSI1 | OMAP_DSS_OUTPUT_DSI2, | ||
220 | |||
221 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
222 | OMAP_DSS_OUTPUT_HDMI | OMAP_DSS_OUTPUT_DPI, | ||
223 | |||
224 | /* OMAP_DSS_CHANNEL_LCD2 */ | ||
225 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
226 | OMAP_DSS_OUTPUT_DSI1, | ||
227 | |||
228 | /* OMAP_DSS_CHANNEL_LCD3 */ | ||
229 | OMAP_DSS_OUTPUT_DPI | OMAP_DSS_OUTPUT_DBI | | ||
230 | OMAP_DSS_OUTPUT_DSI2, | ||
231 | }; | ||
232 | |||
175 | static const enum omap_color_mode omap2_dss_supported_color_modes[] = { | 233 | static const enum omap_color_mode omap2_dss_supported_color_modes[] = { |
176 | /* OMAP_DSS_GFX */ | 234 | /* OMAP_DSS_GFX */ |
177 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | | 235 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | |
@@ -554,6 +612,7 @@ static const struct omap_dss_features omap2_dss_features = { | |||
554 | .num_mgrs = 2, | 612 | .num_mgrs = 2, |
555 | .num_ovls = 3, | 613 | .num_ovls = 3, |
556 | .supported_displays = omap2_dss_supported_displays, | 614 | .supported_displays = omap2_dss_supported_displays, |
615 | .supported_outputs = omap2_dss_supported_outputs, | ||
557 | .supported_color_modes = omap2_dss_supported_color_modes, | 616 | .supported_color_modes = omap2_dss_supported_color_modes, |
558 | .overlay_caps = omap2_dss_overlay_caps, | 617 | .overlay_caps = omap2_dss_overlay_caps, |
559 | .clksrc_names = omap2_dss_clk_source_names, | 618 | .clksrc_names = omap2_dss_clk_source_names, |
@@ -574,6 +633,7 @@ static const struct omap_dss_features omap3430_dss_features = { | |||
574 | .num_mgrs = 2, | 633 | .num_mgrs = 2, |
575 | .num_ovls = 3, | 634 | .num_ovls = 3, |
576 | .supported_displays = omap3430_dss_supported_displays, | 635 | .supported_displays = omap3430_dss_supported_displays, |
636 | .supported_outputs = omap3430_dss_supported_outputs, | ||
577 | .supported_color_modes = omap3_dss_supported_color_modes, | 637 | .supported_color_modes = omap3_dss_supported_color_modes, |
578 | .overlay_caps = omap3430_dss_overlay_caps, | 638 | .overlay_caps = omap3430_dss_overlay_caps, |
579 | .clksrc_names = omap3_dss_clk_source_names, | 639 | .clksrc_names = omap3_dss_clk_source_names, |
@@ -597,6 +657,7 @@ static const struct omap_dss_features am35xx_dss_features = { | |||
597 | .num_mgrs = 2, | 657 | .num_mgrs = 2, |
598 | .num_ovls = 3, | 658 | .num_ovls = 3, |
599 | .supported_displays = omap3430_dss_supported_displays, | 659 | .supported_displays = omap3430_dss_supported_displays, |
660 | .supported_outputs = omap3430_dss_supported_outputs, | ||
600 | .supported_color_modes = omap3_dss_supported_color_modes, | 661 | .supported_color_modes = omap3_dss_supported_color_modes, |
601 | .overlay_caps = omap3430_dss_overlay_caps, | 662 | .overlay_caps = omap3430_dss_overlay_caps, |
602 | .clksrc_names = omap3_dss_clk_source_names, | 663 | .clksrc_names = omap3_dss_clk_source_names, |
@@ -616,6 +677,7 @@ static const struct omap_dss_features omap3630_dss_features = { | |||
616 | .num_mgrs = 2, | 677 | .num_mgrs = 2, |
617 | .num_ovls = 3, | 678 | .num_ovls = 3, |
618 | .supported_displays = omap3630_dss_supported_displays, | 679 | .supported_displays = omap3630_dss_supported_displays, |
680 | .supported_outputs = omap3630_dss_supported_outputs, | ||
619 | .supported_color_modes = omap3_dss_supported_color_modes, | 681 | .supported_color_modes = omap3_dss_supported_color_modes, |
620 | .overlay_caps = omap3630_dss_overlay_caps, | 682 | .overlay_caps = omap3630_dss_overlay_caps, |
621 | .clksrc_names = omap3_dss_clk_source_names, | 683 | .clksrc_names = omap3_dss_clk_source_names, |
@@ -637,6 +699,7 @@ static const struct omap_dss_features omap4430_es1_0_dss_features = { | |||
637 | .num_mgrs = 3, | 699 | .num_mgrs = 3, |
638 | .num_ovls = 4, | 700 | .num_ovls = 4, |
639 | .supported_displays = omap4_dss_supported_displays, | 701 | .supported_displays = omap4_dss_supported_displays, |
702 | .supported_outputs = omap4_dss_supported_outputs, | ||
640 | .supported_color_modes = omap4_dss_supported_color_modes, | 703 | .supported_color_modes = omap4_dss_supported_color_modes, |
641 | .overlay_caps = omap4_dss_overlay_caps, | 704 | .overlay_caps = omap4_dss_overlay_caps, |
642 | .clksrc_names = omap4_dss_clk_source_names, | 705 | .clksrc_names = omap4_dss_clk_source_names, |
@@ -657,6 +720,7 @@ static const struct omap_dss_features omap4430_es2_0_1_2_dss_features = { | |||
657 | .num_mgrs = 3, | 720 | .num_mgrs = 3, |
658 | .num_ovls = 4, | 721 | .num_ovls = 4, |
659 | .supported_displays = omap4_dss_supported_displays, | 722 | .supported_displays = omap4_dss_supported_displays, |
723 | .supported_outputs = omap4_dss_supported_outputs, | ||
660 | .supported_color_modes = omap4_dss_supported_color_modes, | 724 | .supported_color_modes = omap4_dss_supported_color_modes, |
661 | .overlay_caps = omap4_dss_overlay_caps, | 725 | .overlay_caps = omap4_dss_overlay_caps, |
662 | .clksrc_names = omap4_dss_clk_source_names, | 726 | .clksrc_names = omap4_dss_clk_source_names, |
@@ -677,6 +741,7 @@ static const struct omap_dss_features omap4_dss_features = { | |||
677 | .num_mgrs = 3, | 741 | .num_mgrs = 3, |
678 | .num_ovls = 4, | 742 | .num_ovls = 4, |
679 | .supported_displays = omap4_dss_supported_displays, | 743 | .supported_displays = omap4_dss_supported_displays, |
744 | .supported_outputs = omap4_dss_supported_outputs, | ||
680 | .supported_color_modes = omap4_dss_supported_color_modes, | 745 | .supported_color_modes = omap4_dss_supported_color_modes, |
681 | .overlay_caps = omap4_dss_overlay_caps, | 746 | .overlay_caps = omap4_dss_overlay_caps, |
682 | .clksrc_names = omap4_dss_clk_source_names, | 747 | .clksrc_names = omap4_dss_clk_source_names, |
@@ -697,6 +762,7 @@ static const struct omap_dss_features omap5_dss_features = { | |||
697 | .num_mgrs = 3, | 762 | .num_mgrs = 3, |
698 | .num_ovls = 4, | 763 | .num_ovls = 4, |
699 | .supported_displays = omap5_dss_supported_displays, | 764 | .supported_displays = omap5_dss_supported_displays, |
765 | .supported_outputs = omap5_dss_supported_outputs, | ||
700 | .supported_color_modes = omap4_dss_supported_color_modes, | 766 | .supported_color_modes = omap4_dss_supported_color_modes, |
701 | .overlay_caps = omap4_dss_overlay_caps, | 767 | .overlay_caps = omap4_dss_overlay_caps, |
702 | .clksrc_names = omap5_dss_clk_source_names, | 768 | .clksrc_names = omap5_dss_clk_source_names, |
@@ -766,6 +832,11 @@ enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel | |||
766 | return omap_current_dss_features->supported_displays[channel]; | 832 | return omap_current_dss_features->supported_displays[channel]; |
767 | } | 833 | } |
768 | 834 | ||
835 | enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel) | ||
836 | { | ||
837 | return omap_current_dss_features->supported_outputs[channel]; | ||
838 | } | ||
839 | |||
769 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane) | 840 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane) |
770 | { | 841 | { |
771 | return omap_current_dss_features->supported_color_modes[plane]; | 842 | return omap_current_dss_features->supported_color_modes[plane]; |
diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h index aacad863fa22..89df2aa860d4 100644 --- a/drivers/video/omap2/dss/dss_features.h +++ b/drivers/video/omap2/dss/dss_features.h | |||
@@ -108,6 +108,7 @@ int dss_feat_get_num_ovls(void); | |||
108 | unsigned long dss_feat_get_param_min(enum dss_range_param param); | 108 | unsigned long dss_feat_get_param_min(enum dss_range_param param); |
109 | unsigned long dss_feat_get_param_max(enum dss_range_param param); | 109 | unsigned long dss_feat_get_param_max(enum dss_range_param param); |
110 | enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel); | 110 | enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel); |
111 | enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel); | ||
111 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); | 112 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); |
112 | enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane); | 113 | enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane); |
113 | bool dss_feat_color_mode_supported(enum omap_plane plane, | 114 | bool dss_feat_color_mode_supported(enum omap_plane plane, |
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c index 383314f222b0..92a2585d04b2 100644 --- a/drivers/video/omap2/dss/manager.c +++ b/drivers/video/omap2/dss/manager.c | |||
@@ -95,6 +95,8 @@ int dss_init_overlay_managers(struct platform_device *pdev) | |||
95 | 95 | ||
96 | mgr->set_device = &dss_mgr_set_device; | 96 | mgr->set_device = &dss_mgr_set_device; |
97 | mgr->unset_device = &dss_mgr_unset_device; | 97 | mgr->unset_device = &dss_mgr_unset_device; |
98 | mgr->set_output = &dss_mgr_set_output; | ||
99 | mgr->unset_output = &dss_mgr_unset_output; | ||
98 | mgr->apply = &omap_dss_mgr_apply; | 100 | mgr->apply = &omap_dss_mgr_apply; |
99 | mgr->set_manager_info = &dss_mgr_set_info; | 101 | mgr->set_manager_info = &dss_mgr_set_info; |
100 | mgr->get_manager_info = &dss_mgr_get_info; | 102 | mgr->get_manager_info = &dss_mgr_get_info; |
@@ -104,6 +106,8 @@ int dss_init_overlay_managers(struct platform_device *pdev) | |||
104 | mgr->caps = 0; | 106 | mgr->caps = 0; |
105 | mgr->supported_displays = | 107 | mgr->supported_displays = |
106 | dss_feat_get_supported_displays(mgr->id); | 108 | dss_feat_get_supported_displays(mgr->id); |
109 | mgr->supported_outputs = | ||
110 | dss_feat_get_supported_outputs(mgr->id); | ||
107 | 111 | ||
108 | INIT_LIST_HEAD(&mgr->overlays); | 112 | INIT_LIST_HEAD(&mgr->overlays); |
109 | 113 | ||