aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/dss/apply.c
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2012-06-29 05:07:03 -0400
committerArchit Taneja <archit@ti.com>2012-06-29 06:57:42 -0400
commitf476ae9dab3234532d41d36beb4ba7be838fa786 (patch)
treeaee514d49e1ccbc1aabd1cf74f4ff603c35d00b2 /drivers/video/omap2/dss/apply.c
parent37a579903efaf25b74fcf1fd645817af94d36152 (diff)
OMAPDSS: APPLY: Remove DISPC writes to manager's lcd parameters in interface drivers
Replace the DISPC fuctions used to configure LCD channel related manager parameters with dss_mgr_set_lcd_config() in APPLY. This function ensures that the DISPC registers are written at the right time by using the shadow register programming model. The LCD manager configurations is stored as a private data of manager in APPLY. It is treated as an extra info as it's the panel drivers which trigger this apply via interface drivers, and not a DSS2 user like omapfb or omapdrm. Storing LCD manager related properties in APPLY also prevents the need to refer to the panel connected to the manager for information. This helps in making the DSS driver less dependent on panel. A helper function is added to check whether the manager is LCD or TV. The direct DISPC register writes are removed from the interface drivers. Signed-off-by: Archit Taneja <archit@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/apply.c')
-rw-r--r--drivers/video/omap2/dss/apply.c68
1 files changed, 68 insertions, 0 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
109static struct { 110static struct {
@@ -137,6 +138,7 @@ static struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
137void dss_apply_init(void) 138void 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
173static bool ovl_manual_update(struct omap_overlay *ovl) 185static 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
1325static 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
1334void 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
1359out:
1360 mutex_unlock(&apply_lock);
1361}
1362
1295int dss_ovl_set_info(struct omap_overlay *ovl, 1363int dss_ovl_set_info(struct omap_overlay *ovl,
1296 struct omap_overlay_info *info) 1364 struct omap_overlay_info *info)
1297{ 1365{