bool shadow_extra_info_dirty;
struct omap_video_timings timings;
+ struct dss_lcd_mgr_config lcd_config;
};
static struct {
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);
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;
}
static bool ovl_manual_update(struct omap_overlay *ovl)
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;
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)
{
dpi.mgr_config.lcden_sig_polarity = 0;
- dispc_mgr_set_io_pad_mode(dpi.mgr_config.io_pad_mode);
- dispc_mgr_enable_stallmode(dssdev->manager->id,
- dpi.mgr_config.stallmode);
- dispc_mgr_enable_fifohandcheck(dssdev->manager->id,
- dpi.mgr_config.fifohandcheck);
-
- dispc_mgr_set_tft_data_lines(dssdev->manager->id,
- dpi.mgr_config.video_port_width);
-
- dispc_mgr_set_clock_div(dssdev->manager->id,
- &dpi.mgr_config.clock_info);
-
- dispc_lcd_enable_signal_polarity(dpi.mgr_config.lcden_sig_polarity);
-
- dispc_mgr_set_lcd_type_tft(dssdev->manager->id);
+ dss_mgr_set_lcd_config(dssdev->manager, &dpi.mgr_config);
}
int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt);
dsi->mgr_config.lcden_sig_polarity = 0;
- dispc_mgr_set_io_pad_mode(dsi->mgr_config.io_pad_mode);
-
- dispc_mgr_enable_stallmode(dssdev->manager->id,
- dsi->mgr_config.stallmode);
- dispc_mgr_enable_fifohandcheck(dssdev->manager->id,
- dsi->mgr_config.fifohandcheck);
-
- dispc_mgr_set_clock_div(dssdev->manager->id,
- &dsi->mgr_config.clock_info);
-
- dispc_mgr_set_tft_data_lines(dssdev->manager->id,
- dsi->mgr_config.video_port_width);
-
- dispc_lcd_enable_signal_polarity(dsi->mgr_config.lcden_sig_polarity);
-
- dispc_mgr_set_lcd_type_tft(dssdev->manager->id);
+ dss_mgr_set_lcd_config(dssdev->manager, &dsi->mgr_config);
return 0;
err1:
int dss_mgr_unset_device(struct omap_overlay_manager *mgr);
void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
struct omap_video_timings *timings);
+void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
+ const struct dss_lcd_mgr_config *config);
const struct omap_video_timings *dss_mgr_get_timings(struct omap_overlay_manager *mgr);
bool dss_ovl_is_enabled(struct omap_overlay *ovl);
const struct omap_video_timings *mgr_timings,
struct omap_overlay_info **overlay_infos);
+static inline bool dss_mgr_is_lcd(enum omap_channel id)
+{
+ if (id == OMAP_DSS_CHANNEL_LCD || id == OMAP_DSS_CHANNEL_LCD2 ||
+ id == OMAP_DSS_CHANNEL_LCD3)
+ return true;
+ else
+ return false;
+}
+
/* overlay */
void dss_init_overlays(struct platform_device *pdev);
void dss_uninit_overlays(struct platform_device *pdev);
mgr_config.video_port_width = dssdev->ctrl.pixel_size;
mgr_config.lcden_sig_polarity = 0;
- dispc_mgr_set_io_pad_mode(mgr_config.io_pad_mode);
-
- dispc_mgr_enable_stallmode(dssdev->manager->id, mgr_config.stallmode);
- dispc_mgr_enable_fifohandcheck(dssdev->manager->id,
- mgr_config.fifohandcheck);
-
- dispc_mgr_set_tft_data_lines(dssdev->manager->id,
- mgr_config.video_port_width);
-
- dispc_lcd_enable_signal_polarity(mgr_config.lcden_sig_polarity);
-
- dispc_mgr_set_lcd_type_tft(dssdev->manager->id);
+ dss_mgr_set_lcd_config(dssdev->manager, &mgr_config);
}
int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
sdi.mgr_config.video_port_width = 24;
sdi.mgr_config.lcden_sig_polarity = 1;
- dispc_mgr_set_io_pad_mode(sdi.mgr_config.io_pad_mode);
- dispc_mgr_enable_stallmode(dssdev->manager->id,
- sdi.mgr_config.stallmode);
- dispc_mgr_enable_fifohandcheck(dssdev->manager->id,
- sdi.mgr_config.fifohandcheck);
-
- dispc_mgr_set_clock_div(dssdev->manager->id,
- &sdi.mgr_config.clock_info);
-
- dispc_mgr_set_tft_data_lines(dssdev->manager->id,
- sdi.mgr_config.video_port_width);
- dispc_lcd_enable_signal_polarity(sdi.mgr_config.lcden_sig_polarity);
-
- dispc_mgr_set_lcd_type_tft(dssdev->manager->id);
+ dss_mgr_set_lcd_config(dssdev->manager, &sdi.mgr_config);
}
int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)