diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2013-07-12 12:34:42 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2013-07-12 12:34:42 +0200 | 
| commit | f2006e27396f55276f24434f56e208d86e7f9908 (patch) | |
| tree | 71896db916d33888b4286f80117d3cac0da40e6d /drivers/gpu/drm/omapdrm/omap_crtc.c | |
| parent | e399eb56a6110e13f97e644658648602e2b08de7 (diff) | |
| parent | 9903883f1dd6e86f286b7bfa6e4b423f98c1cd9e (diff) | |
Merge branch 'linus' into timers/urgent
Get upstream changes so we can apply fixes against them
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_crtc.c | 51 | 
1 files changed, 39 insertions, 12 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 79b200aee18..11a5263a5e9 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -40,7 +40,7 @@ struct omap_crtc {  	 * mgr->id.)  Eventually this will be replaced w/ something  	 * more common-panel-framework-y  	 */ -	struct omap_overlay_manager mgr; +	struct omap_overlay_manager *mgr;  	struct omap_video_timings timings;  	bool enabled; @@ -90,7 +90,32 @@ uint32_t pipe2vbl(struct drm_crtc *crtc)   * job of sequencing the setup of the video pipe in the proper order   */ +/* ovl-mgr-id -> crtc */ +static struct omap_crtc *omap_crtcs[8]; +  /* we can probably ignore these until we support command-mode panels: */ +static int omap_crtc_connect(struct omap_overlay_manager *mgr, +		struct omap_dss_device *dst) +{ +	if (mgr->output) +		return -EINVAL; + +	if ((mgr->supported_outputs & dst->id) == 0) +		return -EINVAL; + +	dst->manager = mgr; +	mgr->output = dst; + +	return 0; +} + +static void omap_crtc_disconnect(struct omap_overlay_manager *mgr, +		struct omap_dss_device *dst) +{ +	mgr->output->manager = NULL; +	mgr->output = NULL; +} +  static void omap_crtc_start_update(struct omap_overlay_manager *mgr)  {  } @@ -107,7 +132,7 @@ static void omap_crtc_disable(struct omap_overlay_manager *mgr)  static void omap_crtc_set_timings(struct omap_overlay_manager *mgr,  		const struct omap_video_timings *timings)  { -	struct omap_crtc *omap_crtc = container_of(mgr, struct omap_crtc, mgr); +	struct omap_crtc *omap_crtc = omap_crtcs[mgr->id];  	DBG("%s", omap_crtc->name);  	omap_crtc->timings = *timings;  	omap_crtc->full_update = true; @@ -116,7 +141,7 @@ static void omap_crtc_set_timings(struct omap_overlay_manager *mgr,  static void omap_crtc_set_lcd_config(struct omap_overlay_manager *mgr,  		const struct dss_lcd_mgr_config *config)  { -	struct omap_crtc *omap_crtc = container_of(mgr, struct omap_crtc, mgr); +	struct omap_crtc *omap_crtc = omap_crtcs[mgr->id];  	DBG("%s", omap_crtc->name);  	dispc_mgr_set_lcd_config(omap_crtc->channel, config);  } @@ -135,6 +160,8 @@ static void omap_crtc_unregister_framedone_handler(  }  static const struct dss_mgr_ops mgr_ops = { +		.connect = omap_crtc_connect, +		.disconnect = omap_crtc_disconnect,  		.start_update = omap_crtc_start_update,  		.enable = omap_crtc_enable,  		.disable = omap_crtc_disable, @@ -253,10 +280,6 @@ static int omap_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,  			NULL, NULL);  } -static void omap_crtc_load_lut(struct drm_crtc *crtc) -{ -} -  static void vblank_cb(void *arg)  {  	struct drm_crtc *crtc = arg; @@ -366,7 +389,6 @@ static const struct drm_crtc_helper_funcs omap_crtc_helper_funcs = {  	.prepare = omap_crtc_prepare,  	.commit = omap_crtc_commit,  	.mode_set_base = omap_crtc_mode_set_base, -	.load_lut = omap_crtc_load_lut,  };  const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc) @@ -569,7 +591,7 @@ static void omap_crtc_pre_apply(struct omap_drm_apply *apply)  	} else {  		if (encoder) {  			omap_encoder_set_enabled(encoder, false); -			omap_encoder_update(encoder, &omap_crtc->mgr, +			omap_encoder_update(encoder, omap_crtc->mgr,  					&omap_crtc->timings);  			omap_encoder_set_enabled(encoder, true);  			omap_crtc->full_update = false; @@ -595,6 +617,11 @@ static const char *channel_names[] = {  		[OMAP_DSS_CHANNEL_LCD2] = "lcd2",  }; +void omap_crtc_pre_init(void) +{ +	dss_install_mgr_ops(&mgr_ops); +} +  /* initialize crtc */  struct drm_crtc *omap_crtc_init(struct drm_device *dev,  		struct drm_plane *plane, enum omap_channel channel, int id) @@ -635,9 +662,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,  	omap_irq_register(dev, &omap_crtc->error_irq);  	/* temporary: */ -	omap_crtc->mgr.id = channel; - -	dss_install_mgr_ops(&mgr_ops); +	omap_crtc->mgr = omap_dss_get_overlay_manager(channel);  	/* TODO: fix hard-coded setup.. add properties! */  	info = &omap_crtc->info; @@ -651,6 +676,8 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev,  	omap_plane_install_properties(omap_crtc->plane, &crtc->base); +	omap_crtcs[channel] = omap_crtc; +  	return crtc;  fail:  | 
