diff options
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/omap2/dss/apply.c | 68 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dpi.c | 16 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dsi.c | 17 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 11 | ||||
-rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 13 | ||||
-rw-r--r-- | drivers/video/omap2/dss/sdi.c | 15 |
6 files changed, 83 insertions, 57 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 3ce7a3ec6224..30915bdcb237 100644 --- a/drivers/video/omap2/dss/apply.c +++ b/drivers/video/omap2/dss/apply.c | |||
@@ -104,6 +104,7 @@ struct mgr_priv_data { | |||
104 | bool shadow_extra_info_dirty; | 104 | bool shadow_extra_info_dirty; |
105 | 105 | ||
106 | struct omap_video_timings timings; | 106 | struct omap_video_timings timings; |
107 | struct dss_lcd_mgr_config lcd_config; | ||
107 | }; | 108 | }; |
108 | 109 | ||
109 | static struct { | 110 | static struct { |
@@ -137,6 +138,7 @@ static struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr) | |||
137 | void dss_apply_init(void) | 138 | void dss_apply_init(void) |
138 | { | 139 | { |
139 | const int num_ovls = dss_feat_get_num_ovls(); | 140 | const int num_ovls = dss_feat_get_num_ovls(); |
141 | struct mgr_priv_data *mp; | ||
140 | int i; | 142 | int i; |
141 | 143 | ||
142 | spin_lock_init(&data_lock); | 144 | spin_lock_init(&data_lock); |
@@ -168,6 +170,16 @@ void dss_apply_init(void) | |||
168 | 170 | ||
169 | op->user_info = op->info; | 171 | op->user_info = op->info; |
170 | } | 172 | } |
173 | |||
174 | /* | ||
175 | * Initialize some of the lcd_config fields for TV manager, this lets | ||
176 | * us prevent checking if the manager is LCD or TV at some places | ||
177 | */ | ||
178 | mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT]; | ||
179 | |||
180 | mp->lcd_config.video_port_width = 24; | ||
181 | mp->lcd_config.clock_info.lck_div = 1; | ||
182 | mp->lcd_config.clock_info.pck_div = 1; | ||
171 | } | 183 | } |
172 | 184 | ||
173 | static bool ovl_manual_update(struct omap_overlay *ovl) | 185 | static bool ovl_manual_update(struct omap_overlay *ovl) |
@@ -633,6 +645,24 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr) | |||
633 | 645 | ||
634 | dispc_mgr_set_timings(mgr->id, &mp->timings); | 646 | dispc_mgr_set_timings(mgr->id, &mp->timings); |
635 | 647 | ||
648 | /* lcd_config parameters */ | ||
649 | if (dss_mgr_is_lcd(mgr->id)) { | ||
650 | dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode); | ||
651 | |||
652 | dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode); | ||
653 | dispc_mgr_enable_fifohandcheck(mgr->id, | ||
654 | mp->lcd_config.fifohandcheck); | ||
655 | |||
656 | dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info); | ||
657 | |||
658 | dispc_mgr_set_tft_data_lines(mgr->id, | ||
659 | mp->lcd_config.video_port_width); | ||
660 | |||
661 | dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity); | ||
662 | |||
663 | dispc_mgr_set_lcd_type_tft(mgr->id); | ||
664 | } | ||
665 | |||
636 | mp->extra_info_dirty = false; | 666 | mp->extra_info_dirty = false; |
637 | if (mp->updating) | 667 | if (mp->updating) |
638 | mp->shadow_extra_info_dirty = true; | 668 | mp->shadow_extra_info_dirty = true; |
@@ -1292,6 +1322,44 @@ void dss_mgr_set_timings(struct omap_overlay_manager *mgr, | |||
1292 | mutex_unlock(&apply_lock); | 1322 | mutex_unlock(&apply_lock); |
1293 | } | 1323 | } |
1294 | 1324 | ||
1325 | static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr, | ||
1326 | const struct dss_lcd_mgr_config *config) | ||
1327 | { | ||
1328 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
1329 | |||
1330 | mp->lcd_config = *config; | ||
1331 | mp->extra_info_dirty = true; | ||
1332 | } | ||
1333 | |||
1334 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, | ||
1335 | const struct dss_lcd_mgr_config *config) | ||
1336 | { | ||
1337 | unsigned long flags; | ||
1338 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
1339 | |||
1340 | mutex_lock(&apply_lock); | ||
1341 | |||
1342 | if (mp->enabled) { | ||
1343 | DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n", | ||
1344 | mgr->name); | ||
1345 | goto out; | ||
1346 | } | ||
1347 | |||
1348 | spin_lock_irqsave(&data_lock, flags); | ||
1349 | |||
1350 | dss_apply_mgr_lcd_config(mgr, config); | ||
1351 | |||
1352 | dss_write_regs(); | ||
1353 | dss_set_go_bits(); | ||
1354 | |||
1355 | spin_unlock_irqrestore(&data_lock, flags); | ||
1356 | |||
1357 | wait_pending_extra_info_updates(); | ||
1358 | |||
1359 | out: | ||
1360 | mutex_unlock(&apply_lock); | ||
1361 | } | ||
1362 | |||
1295 | int dss_ovl_set_info(struct omap_overlay *ovl, | 1363 | int dss_ovl_set_info(struct omap_overlay *ovl, |
1296 | struct omap_overlay_info *info) | 1364 | struct omap_overlay_info *info) |
1297 | { | 1365 | { |
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c index 6664775c3e45..3266be23fc0d 100644 --- a/drivers/video/omap2/dss/dpi.c +++ b/drivers/video/omap2/dss/dpi.c | |||
@@ -162,21 +162,7 @@ static void dpi_config_lcd_manager(struct omap_dss_device *dssdev) | |||
162 | 162 | ||
163 | dpi.mgr_config.lcden_sig_polarity = 0; | 163 | dpi.mgr_config.lcden_sig_polarity = 0; |
164 | 164 | ||
165 | dispc_mgr_set_io_pad_mode(dpi.mgr_config.io_pad_mode); | 165 | dss_mgr_set_lcd_config(dssdev->manager, &dpi.mgr_config); |
166 | dispc_mgr_enable_stallmode(dssdev->manager->id, | ||
167 | dpi.mgr_config.stallmode); | ||
168 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, | ||
169 | dpi.mgr_config.fifohandcheck); | ||
170 | |||
171 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
172 | dpi.mgr_config.video_port_width); | ||
173 | |||
174 | dispc_mgr_set_clock_div(dssdev->manager->id, | ||
175 | &dpi.mgr_config.clock_info); | ||
176 | |||
177 | dispc_lcd_enable_signal_polarity(dpi.mgr_config.lcden_sig_polarity); | ||
178 | |||
179 | dispc_mgr_set_lcd_type_tft(dssdev->manager->id); | ||
180 | } | 166 | } |
181 | 167 | ||
182 | int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | 168 | int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) |
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index f51df30d8c15..b07e8864f82f 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
@@ -4425,22 +4425,7 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) | |||
4425 | dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); | 4425 | dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); |
4426 | dsi->mgr_config.lcden_sig_polarity = 0; | 4426 | dsi->mgr_config.lcden_sig_polarity = 0; |
4427 | 4427 | ||
4428 | dispc_mgr_set_io_pad_mode(dsi->mgr_config.io_pad_mode); | 4428 | dss_mgr_set_lcd_config(dssdev->manager, &dsi->mgr_config); |
4429 | |||
4430 | dispc_mgr_enable_stallmode(dssdev->manager->id, | ||
4431 | dsi->mgr_config.stallmode); | ||
4432 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, | ||
4433 | dsi->mgr_config.fifohandcheck); | ||
4434 | |||
4435 | dispc_mgr_set_clock_div(dssdev->manager->id, | ||
4436 | &dsi->mgr_config.clock_info); | ||
4437 | |||
4438 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
4439 | dsi->mgr_config.video_port_width); | ||
4440 | |||
4441 | dispc_lcd_enable_signal_polarity(dsi->mgr_config.lcden_sig_polarity); | ||
4442 | |||
4443 | dispc_mgr_set_lcd_type_tft(dssdev->manager->id); | ||
4444 | 4429 | ||
4445 | return 0; | 4430 | return 0; |
4446 | err1: | 4431 | err1: |
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 061c95e20d49..80ed88f53c19 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -207,6 +207,8 @@ int dss_mgr_set_device(struct omap_overlay_manager *mgr, | |||
207 | int dss_mgr_unset_device(struct omap_overlay_manager *mgr); | 207 | int dss_mgr_unset_device(struct omap_overlay_manager *mgr); |
208 | void dss_mgr_set_timings(struct omap_overlay_manager *mgr, | 208 | void dss_mgr_set_timings(struct omap_overlay_manager *mgr, |
209 | struct omap_video_timings *timings); | 209 | struct omap_video_timings *timings); |
210 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, | ||
211 | const struct dss_lcd_mgr_config *config); | ||
210 | const struct omap_video_timings *dss_mgr_get_timings(struct omap_overlay_manager *mgr); | 212 | const struct omap_video_timings *dss_mgr_get_timings(struct omap_overlay_manager *mgr); |
211 | 213 | ||
212 | bool dss_ovl_is_enabled(struct omap_overlay *ovl); | 214 | bool dss_ovl_is_enabled(struct omap_overlay *ovl); |
@@ -244,6 +246,15 @@ int dss_mgr_check(struct omap_overlay_manager *mgr, | |||
244 | const struct omap_video_timings *mgr_timings, | 246 | const struct omap_video_timings *mgr_timings, |
245 | struct omap_overlay_info **overlay_infos); | 247 | struct omap_overlay_info **overlay_infos); |
246 | 248 | ||
249 | static inline bool dss_mgr_is_lcd(enum omap_channel id) | ||
250 | { | ||
251 | if (id == OMAP_DSS_CHANNEL_LCD || id == OMAP_DSS_CHANNEL_LCD2 || | ||
252 | id == OMAP_DSS_CHANNEL_LCD3) | ||
253 | return true; | ||
254 | else | ||
255 | return false; | ||
256 | } | ||
257 | |||
247 | /* overlay */ | 258 | /* overlay */ |
248 | void dss_init_overlays(struct platform_device *pdev); | 259 | void dss_init_overlays(struct platform_device *pdev); |
249 | void dss_uninit_overlays(struct platform_device *pdev); | 260 | void dss_uninit_overlays(struct platform_device *pdev); |
diff --git a/drivers/video/omap2/dss/rfbi.c b/drivers/video/omap2/dss/rfbi.c index 0dc8dac1c07c..cc22426144cb 100644 --- a/drivers/video/omap2/dss/rfbi.c +++ b/drivers/video/omap2/dss/rfbi.c | |||
@@ -872,18 +872,7 @@ static void rfbi_config_lcd_manager(struct omap_dss_device *dssdev) | |||
872 | mgr_config.video_port_width = dssdev->ctrl.pixel_size; | 872 | mgr_config.video_port_width = dssdev->ctrl.pixel_size; |
873 | mgr_config.lcden_sig_polarity = 0; | 873 | mgr_config.lcden_sig_polarity = 0; |
874 | 874 | ||
875 | dispc_mgr_set_io_pad_mode(mgr_config.io_pad_mode); | 875 | dss_mgr_set_lcd_config(dssdev->manager, &mgr_config); |
876 | |||
877 | dispc_mgr_enable_stallmode(dssdev->manager->id, mgr_config.stallmode); | ||
878 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, | ||
879 | mgr_config.fifohandcheck); | ||
880 | |||
881 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
882 | mgr_config.video_port_width); | ||
883 | |||
884 | dispc_lcd_enable_signal_polarity(mgr_config.lcden_sig_polarity); | ||
885 | |||
886 | dispc_mgr_set_lcd_type_tft(dssdev->manager->id); | ||
887 | } | 876 | } |
888 | 877 | ||
889 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) | 878 | int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) |
diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c index f102eae6e2af..5d31699fbd3c 100644 --- a/drivers/video/omap2/dss/sdi.c +++ b/drivers/video/omap2/dss/sdi.c | |||
@@ -46,20 +46,7 @@ static void sdi_config_lcd_manager(struct omap_dss_device *dssdev) | |||
46 | sdi.mgr_config.video_port_width = 24; | 46 | sdi.mgr_config.video_port_width = 24; |
47 | sdi.mgr_config.lcden_sig_polarity = 1; | 47 | sdi.mgr_config.lcden_sig_polarity = 1; |
48 | 48 | ||
49 | dispc_mgr_set_io_pad_mode(sdi.mgr_config.io_pad_mode); | 49 | dss_mgr_set_lcd_config(dssdev->manager, &sdi.mgr_config); |
50 | dispc_mgr_enable_stallmode(dssdev->manager->id, | ||
51 | sdi.mgr_config.stallmode); | ||
52 | dispc_mgr_enable_fifohandcheck(dssdev->manager->id, | ||
53 | sdi.mgr_config.fifohandcheck); | ||
54 | |||
55 | dispc_mgr_set_clock_div(dssdev->manager->id, | ||
56 | &sdi.mgr_config.clock_info); | ||
57 | |||
58 | dispc_mgr_set_tft_data_lines(dssdev->manager->id, | ||
59 | sdi.mgr_config.video_port_width); | ||
60 | dispc_lcd_enable_signal_polarity(sdi.mgr_config.lcden_sig_polarity); | ||
61 | |||
62 | dispc_mgr_set_lcd_type_tft(dssdev->manager->id); | ||
63 | } | 50 | } |
64 | 51 | ||
65 | int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) | 52 | int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) |