|
@@ -104,6 +104,7 @@ struct mgr_priv_data {
|
|
|
bool shadow_extra_info_dirty;
|
|
|
|
|
|
struct omap_video_timings timings;
|
|
|
+ struct dss_lcd_mgr_config lcd_config;
|
|
|
};
|
|
|
|
|
|
static struct {
|
|
@@ -137,6 +138,7 @@ static struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
|
|
|
void dss_apply_init(void)
|
|
|
{
|
|
|
const int num_ovls = dss_feat_get_num_ovls();
|
|
|
+ struct mgr_priv_data *mp;
|
|
|
int i;
|
|
|
|
|
|
spin_lock_init(&data_lock);
|
|
@@ -168,16 +170,35 @@ void dss_apply_init(void)
|
|
|
|
|
|
op->user_info = op->info;
|
|
|
}
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Initialize some of the lcd_config fields for TV manager, this lets
|
|
|
+ * us prevent checking if the manager is LCD or TV at some places
|
|
|
+ */
|
|
|
+ mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT];
|
|
|
+
|
|
|
+ mp->lcd_config.video_port_width = 24;
|
|
|
+ mp->lcd_config.clock_info.lck_div = 1;
|
|
|
+ mp->lcd_config.clock_info.pck_div = 1;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * A LCD manager's stallmode decides whether it is in manual or auto update. TV
|
|
|
+ * manager is always auto update, stallmode field for TV manager is false by
|
|
|
+ * default
|
|
|
+ */
|
|
|
static bool ovl_manual_update(struct omap_overlay *ovl)
|
|
|
{
|
|
|
- return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
|
|
|
+ struct mgr_priv_data *mp = get_mgr_priv(ovl->manager);
|
|
|
+
|
|
|
+ return mp->lcd_config.stallmode;
|
|
|
}
|
|
|
|
|
|
static bool mgr_manual_update(struct omap_overlay_manager *mgr)
|
|
|
{
|
|
|
- return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
|
|
|
+ struct mgr_priv_data *mp = get_mgr_priv(mgr);
|
|
|
+
|
|
|
+ return mp->lcd_config.stallmode;
|
|
|
}
|
|
|
|
|
|
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,
|
|
|
ois[ovl->id] = oi;
|
|
|
}
|
|
|
|
|
|
- return dss_mgr_check(mgr, mi, &mp->timings, ois);
|
|
|
+ return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -550,7 +571,7 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl)
|
|
|
|
|
|
mp = get_mgr_priv(ovl->manager);
|
|
|
|
|
|
- replication = dss_use_replication(ovl->manager->device, oi->color_mode);
|
|
|
+ replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode);
|
|
|
|
|
|
r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings);
|
|
|
if (r) {
|
|
@@ -633,6 +654,24 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr)
|
|
|
|
|
|
dispc_mgr_set_timings(mgr->id, &mp->timings);
|
|
|
|
|
|
+ /* lcd_config parameters */
|
|
|
+ if (dss_mgr_is_lcd(mgr->id)) {
|
|
|
+ dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode);
|
|
|
+
|
|
|
+ dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode);
|
|
|
+ dispc_mgr_enable_fifohandcheck(mgr->id,
|
|
|
+ mp->lcd_config.fifohandcheck);
|
|
|
+
|
|
|
+ dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info);
|
|
|
+
|
|
|
+ dispc_mgr_set_tft_data_lines(mgr->id,
|
|
|
+ mp->lcd_config.video_port_width);
|
|
|
+
|
|
|
+ dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity);
|
|
|
+
|
|
|
+ dispc_mgr_set_lcd_type_tft(mgr->id);
|
|
|
+ }
|
|
|
+
|
|
|
mp->extra_info_dirty = false;
|
|
|
if (mp->updating)
|
|
|
mp->shadow_extra_info_dirty = true;
|
|
@@ -1292,6 +1331,44 @@ void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
|
|
|
mutex_unlock(&apply_lock);
|
|
|
}
|
|
|
|
|
|
+static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
|
|
|
+ const struct dss_lcd_mgr_config *config)
|
|
|
+{
|
|
|
+ struct mgr_priv_data *mp = get_mgr_priv(mgr);
|
|
|
+
|
|
|
+ mp->lcd_config = *config;
|
|
|
+ mp->extra_info_dirty = true;
|
|
|
+}
|
|
|
+
|
|
|
+void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
|
|
|
+ const struct dss_lcd_mgr_config *config)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ struct mgr_priv_data *mp = get_mgr_priv(mgr);
|
|
|
+
|
|
|
+ mutex_lock(&apply_lock);
|
|
|
+
|
|
|
+ if (mp->enabled) {
|
|
|
+ DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n",
|
|
|
+ mgr->name);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ spin_lock_irqsave(&data_lock, flags);
|
|
|
+
|
|
|
+ dss_apply_mgr_lcd_config(mgr, config);
|
|
|
+
|
|
|
+ dss_write_regs();
|
|
|
+ dss_set_go_bits();
|
|
|
+
|
|
|
+ spin_unlock_irqrestore(&data_lock, flags);
|
|
|
+
|
|
|
+ wait_pending_extra_info_updates();
|
|
|
+
|
|
|
+out:
|
|
|
+ mutex_unlock(&apply_lock);
|
|
|
+}
|
|
|
+
|
|
|
int dss_ovl_set_info(struct omap_overlay *ovl,
|
|
|
struct omap_overlay_info *info)
|
|
|
{
|