aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2012-09-26 07:12:39 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-09-26 07:58:31 -0400
commit97f01b3a2ed6d46132bf4e2d237c27846e7b260a (patch)
tree27c7a36c7ea6dbd51b6bf0a5edb04a861e8ac381 /drivers
parent6d71b923e53184808b0206ebd74159c41a2dcf38 (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.c70
-rw-r--r--drivers/video/omap2/dss/dss.h3
-rw-r--r--drivers/video/omap2/dss/dss_features.c71
-rw-r--r--drivers/video/omap2/dss/dss_features.h1
-rw-r--r--drivers/video/omap2/dss/manager.c4
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
1177int 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;
1204err:
1205 mutex_unlock(&apply_lock);
1206 return r;
1207}
1208
1209int 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;
1239err1:
1240 spin_unlock_irqrestore(&data_lock, flags);
1241err:
1242 mutex_unlock(&apply_lock);
1243
1244 return r;
1245}
1246
1177static void dss_apply_mgr_timings(struct omap_overlay_manager *mgr, 1247static 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,
209int dss_mgr_set_device(struct omap_overlay_manager *mgr, 209int dss_mgr_set_device(struct omap_overlay_manager *mgr,
210 struct omap_dss_device *dssdev); 210 struct omap_dss_device *dssdev);
211int dss_mgr_unset_device(struct omap_overlay_manager *mgr); 211int dss_mgr_unset_device(struct omap_overlay_manager *mgr);
212int dss_mgr_set_output(struct omap_overlay_manager *mgr,
213 struct omap_dss_output *output);
214int dss_mgr_unset_output(struct omap_overlay_manager *mgr);
212void dss_mgr_set_timings(struct omap_overlay_manager *mgr, 215void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
213 const struct omap_video_timings *timings); 216 const struct omap_video_timings *timings);
214void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, 217void 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
176static 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
184static 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
193static 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
202static 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
216static 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
175static const enum omap_color_mode omap2_dss_supported_color_modes[] = { 233static 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
835enum 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
769enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane) 840enum 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);
108unsigned long dss_feat_get_param_min(enum dss_range_param param); 108unsigned long dss_feat_get_param_min(enum dss_range_param param);
109unsigned long dss_feat_get_param_max(enum dss_range_param param); 109unsigned long dss_feat_get_param_max(enum dss_range_param param);
110enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel); 110enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel);
111enum omap_dss_output_id dss_feat_get_supported_outputs(enum omap_channel channel);
111enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); 112enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane);
112enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane); 113enum omap_overlay_caps dss_feat_get_overlay_caps(enum omap_plane plane);
113bool dss_feat_color_mode_supported(enum omap_plane plane, 114bool 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