diff options
| -rw-r--r-- | drivers/video/omap2/dss/apply.c | 85 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dispc.c | 26 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/display.c | 34 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dpi.c | 31 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dsi.c | 91 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/dss.h | 31 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/manager.c | 35 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/overlay.c | 13 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/rfbi.c | 39 | ||||
| -rw-r--r-- | drivers/video/omap2/dss/sdi.c | 32 |
10 files changed, 271 insertions, 146 deletions
diff --git a/drivers/video/omap2/dss/apply.c b/drivers/video/omap2/dss/apply.c index 3ce7a3ec6224..0fefc68372b9 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,16 +170,35 @@ 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 | ||
| 185 | /* | ||
| 186 | * A LCD manager's stallmode decides whether it is in manual or auto update. TV | ||
| 187 | * manager is always auto update, stallmode field for TV manager is false by | ||
| 188 | * default | ||
| 189 | */ | ||
| 173 | static bool ovl_manual_update(struct omap_overlay *ovl) | 190 | static bool ovl_manual_update(struct omap_overlay *ovl) |
| 174 | { | 191 | { |
| 175 | return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; | 192 | struct mgr_priv_data *mp = get_mgr_priv(ovl->manager); |
| 193 | |||
| 194 | return mp->lcd_config.stallmode; | ||
| 176 | } | 195 | } |
| 177 | 196 | ||
| 178 | static bool mgr_manual_update(struct omap_overlay_manager *mgr) | 197 | static bool mgr_manual_update(struct omap_overlay_manager *mgr) |
| 179 | { | 198 | { |
| 180 | return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; | 199 | struct mgr_priv_data *mp = get_mgr_priv(mgr); |
| 200 | |||
| 201 | return mp->lcd_config.stallmode; | ||
| 181 | } | 202 | } |
| 182 | 203 | ||
| 183 | static int dss_check_settings_low(struct omap_overlay_manager *mgr, | 204 | static int dss_check_settings_low(struct omap_overlay_manager *mgr, |
| @@ -214,7 +235,7 @@ static int dss_check_settings_low(struct omap_overlay_manager *mgr, | |||
| 214 | ois[ovl->id] = oi; | 235 | ois[ovl->id] = oi; |
| 215 | } | 236 | } |
| 216 | 237 | ||
| 217 | return dss_mgr_check(mgr, mi, &mp->timings, ois); | 238 | return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois); |
| 218 | } | 239 | } |
| 219 | 240 | ||
| 220 | /* | 241 | /* |
| @@ -550,7 +571,7 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl) | |||
| 550 | 571 | ||
| 551 | mp = get_mgr_priv(ovl->manager); | 572 | mp = get_mgr_priv(ovl->manager); |
| 552 | 573 | ||
| 553 | replication = dss_use_replication(ovl->manager->device, oi->color_mode); | 574 | replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode); |
| 554 | 575 | ||
| 555 | r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings); | 576 | r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings); |
| 556 | if (r) { | 577 | if (r) { |
| @@ -633,6 +654,24 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr) | |||
| 633 | 654 | ||
| 634 | dispc_mgr_set_timings(mgr->id, &mp->timings); | 655 | dispc_mgr_set_timings(mgr->id, &mp->timings); |
| 635 | 656 | ||
| 657 | /* lcd_config parameters */ | ||
| 658 | if (dss_mgr_is_lcd(mgr->id)) { | ||
| 659 | dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode); | ||
| 660 | |||
| 661 | dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode); | ||
| 662 | dispc_mgr_enable_fifohandcheck(mgr->id, | ||
| 663 | mp->lcd_config.fifohandcheck); | ||
| 664 | |||
| 665 | dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info); | ||
| 666 | |||
| 667 | dispc_mgr_set_tft_data_lines(mgr->id, | ||
| 668 | mp->lcd_config.video_port_width); | ||
| 669 | |||
| 670 | dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity); | ||
| 671 | |||
| 672 | dispc_mgr_set_lcd_type_tft(mgr->id); | ||
| 673 | } | ||
| 674 | |||
| 636 | mp->extra_info_dirty = false; | 675 | mp->extra_info_dirty = false; |
| 637 | if (mp->updating) | 676 | if (mp->updating) |
| 638 | mp->shadow_extra_info_dirty = true; | 677 | mp->shadow_extra_info_dirty = true; |
| @@ -1292,6 +1331,44 @@ void dss_mgr_set_timings(struct omap_overlay_manager *mgr, | |||
| 1292 | mutex_unlock(&apply_lock); | 1331 | mutex_unlock(&apply_lock); |
| 1293 | } | 1332 | } |
| 1294 | 1333 | ||
| 1334 | static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr, | ||
| 1335 | const struct dss_lcd_mgr_config *config) | ||
| 1336 | { | ||
| 1337 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
| 1338 | |||
| 1339 | mp->lcd_config = *config; | ||
| 1340 | mp->extra_info_dirty = true; | ||
| 1341 | } | ||
| 1342 | |||
| 1343 | void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, | ||
| 1344 | const struct dss_lcd_mgr_config *config) | ||
| 1345 | { | ||
| 1346 | unsigned long flags; | ||
| 1347 | struct mgr_priv_data *mp = get_mgr_priv(mgr); | ||
| 1348 | |||
| 1349 | mutex_lock(&apply_lock); | ||
| 1350 | |||
| 1351 | if (mp->enabled) { | ||
| 1352 | DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n", | ||
| 1353 | mgr->name); | ||
| 1354 | goto out; | ||
| 1355 | } | ||
| 1356 | |||
| 1357 | spin_lock_irqsave(&data_lock, flags); | ||
| 1358 | |||
| 1359 | dss_apply_mgr_lcd_config(mgr, config); | ||
| 1360 | |||
| 1361 | dss_write_regs(); | ||
| 1362 | dss_set_go_bits(); | ||
| 1363 | |||
| 1364 | spin_unlock_irqrestore(&data_lock, flags); | ||
| 1365 | |||
| 1366 | wait_pending_extra_info_updates(); | ||
| 1367 | |||
| 1368 | out: | ||
| 1369 | mutex_unlock(&apply_lock); | ||
| 1370 | } | ||
| 1371 | |||
| 1295 | int dss_ovl_set_info(struct omap_overlay *ovl, | 1372 | int dss_ovl_set_info(struct omap_overlay *ovl, |
| 1296 | struct omap_overlay_info *info) | 1373 | struct omap_overlay_info *info) |
| 1297 | { | 1374 | { |
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index d1a7a0c90289..5b289c5f695b 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c | |||
| @@ -498,16 +498,6 @@ void dispc_runtime_put(void) | |||
| 498 | WARN_ON(r < 0 && r != -ENOSYS); | 498 | WARN_ON(r < 0 && r != -ENOSYS); |
| 499 | } | 499 | } |
| 500 | 500 | ||
| 501 | static inline bool dispc_mgr_is_lcd(enum omap_channel channel) | ||
| 502 | { | ||
| 503 | if (channel == OMAP_DSS_CHANNEL_LCD || | ||
| 504 | channel == OMAP_DSS_CHANNEL_LCD2 || | ||
| 505 | channel == OMAP_DSS_CHANNEL_LCD3) | ||
| 506 | return true; | ||
| 507 | else | ||
| 508 | return false; | ||
| 509 | } | ||
| 510 | |||
| 511 | u32 dispc_mgr_get_vsync_irq(enum omap_channel channel) | 501 | u32 dispc_mgr_get_vsync_irq(enum omap_channel channel) |
| 512 | { | 502 | { |
| 513 | return mgr_desc[channel].vsync_irq; | ||
