From 4e4b53ceb59301b2a1dbf3a9f74ce5e17f64287d Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Tue, 24 Mar 2015 15:46:35 +0200 Subject: drm/omap: HDMI: change enable/disable to avoid sync-losts We occasionally see DISPC sync-lost errors when enabling and disabling HDMI. Sometimes we get only a few, which get handled (ignored) by the driver, but sometimes there's a flood of the errors which doesn't seem to stop. The HW team has root caused this to the order in which HDMI and DISPC are enabled/disabled. Currently we enable HDMI first, and then DISPC, and vice versa when disabling. HW team's suggestion is to do it the other way around. This patch changes the order, but this has two side effects as the pixel clock is produced by HDMI, and the clock is not running when we enable/disable DISPC: * When enabling DISPC first, we don't get vertical sync events * When disabling DISPC last, we don't get FRAMEDONE event At the moment we use both of those to verify that DISPC has been enabled/disabled properly. Thus this patch also needs to change the omapdrm and omapdss which handle the DISPC side. Signed-off-by: Tomi Valkeinen Acked-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_crtc.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 2ed0754ed19e..7dd3d44a93e5 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -138,6 +138,11 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) u32 framedone_irq, vsync_irq; int ret; + if (omap_crtc->mgr->output->output_type == OMAP_DISPLAY_TYPE_HDMI) { + dispc_mgr_enable(channel, enable); + return; + } + if (dispc_mgr_is_enabled(channel) == enable) return; -- cgit v1.2.3 From a7696ea7402fc8140f2023821e60adcf406679fe Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 28 Oct 2015 14:00:42 +0200 Subject: drm/omap: drm_atomic_get_plane_state() may return ERR_PTR drm_atomic_get_plane_state() may return ERR_PTR. Handle drm_atomic_get_plane_state() return values right in omap_crtc_atomic_set_property(). Signed-off-by: Jyri Sarha Acked-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_crtc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 7dd3d44a93e5..f5b19d18fa8b 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -433,8 +433,8 @@ static int omap_crtc_atomic_set_property(struct drm_crtc *crtc, */ plane_state = drm_atomic_get_plane_state(state->state, plane); - if (!plane_state) - return -EINVAL; + if (IS_ERR(plane_state)) + return PTR_ERR(plane_state); return drm_atomic_plane_set_property(plane, plane_state, property, val); } -- cgit v1.2.3 From 61f3c40b489c7f3ca2f844e6513c1abd08e66a93 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 19 Nov 2015 17:31:25 +0200 Subject: drm/omap: increase vblank wait timeout omap_crtc_wait_pending() waits until the config changes have been taken into use, usually at next vblank. The wait-timeout used is 50ms, which usually is enough, but in some rare cases not. As time wait-timeout is just a safety measure for cases where something is broken, we can just as well increase the timeout considerably. This patch makes the timeout 250ms. Signed-off-by: Tomi Valkeinen Acked-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_crtc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index f5b19d18fa8b..f1cd2800055b 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -80,9 +80,13 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc) { struct omap_crtc *omap_crtc = to_omap_crtc(crtc); + /* + * Timeout is set to a "sufficiently" high value, which should cover + * a single frame refresh even on slower displays. + */ return wait_event_timeout(omap_crtc->pending_wait, !omap_crtc->pending, - msecs_to_jiffies(50)); + msecs_to_jiffies(250)); } /* ----------------------------------------------------------------------------- -- cgit v1.2.3 From 6bdad6cf98844e76f678da35dea09193bfb78be1 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 18 Feb 2016 18:47:14 +0200 Subject: drm/omap: fix crtc->plane property delegation Before universal planes we had to have plane specific properties for the crtc too, as on the hardware level a crtc uses a plane. In other words, e.g. 'zorder' property was added to both planes and crtcs, and omap_crtc.c would delegate the property set/get to the primary plane. However, the delegation was a bit too generic, delegating all property set/get calls to planes. Thus it's possible to set, say, FB_ID, on a crtc, which gets redirected to the primary plane. This is not standard, and shouldn't be allowed. To keep backward compatibility, we still need to redirect the properties we supported earlier for crtcs, namely 'zorder' and 'rotation'. This patch redirects only the allowed properties from crtcs to planes. Signed-off-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart --- drivers/gpu/drm/omapdrm/omap_crtc.c | 58 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 18 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index f1cd2800055b..8c5caf8bb1b9 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -423,24 +423,40 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc, } } +static bool omap_crtc_is_plane_prop(struct drm_device *dev, + struct drm_property *property) +{ + struct omap_drm_private *priv = dev->dev_private; + + return property == priv->zorder_prop || + property == dev->mode_config.rotation_property; +} + static int omap_crtc_atomic_set_property(struct drm_crtc *crtc, struct drm_crtc_state *state, struct drm_property *property, uint64_t val) { - struct drm_plane_state *plane_state; - struct drm_plane *plane = crtc->primary; + struct drm_device *dev = crtc->dev; - /* - * Delegate property set to the primary plane. Get the plane state and - * set the property directly. - */ + if (omap_crtc_is_plane_prop(dev, property)) { + struct drm_plane_state *plane_state; + struct drm_plane *plane = crtc->primary; + + /* + * Delegate property set to the primary plane. Get the plane + * state and set the property directly. + */ - plane_state = drm_atomic_get_plane_state(state->state, plane); - if (IS_ERR(plane_state)) - return PTR_ERR(plane_state); + plane_state = drm_atomic_get_plane_state(state->state, plane); + if (IS_ERR(plane_state)) + return PTR_ERR(plane_state); - return drm_atomic_plane_set_property(plane, plane_state, property, val); + return drm_atomic_plane_set_property(plane, plane_state, + property, val); + } + + return -EINVAL; } static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, @@ -448,14 +464,20 @@ static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, struct drm_property *property, uint64_t *val) { - /* - * Delegate property get to the primary plane. The - * drm_atomic_plane_get_property() function isn't exported, but can be - * called through drm_object_property_get_value() as that will call - * drm_atomic_get_property() for atomic drivers. - */ - return drm_object_property_get_value(&crtc->primary->base, property, - val); + struct drm_device *dev = crtc->dev; + + if (omap_crtc_is_plane_prop(dev, property)) { + /* + * Delegate property get to the primary plane. The + * drm_atomic_plane_get_property() function isn't exported, but + * can be called through drm_object_property_get_value() as that + * will call drm_atomic_get_property() for atomic drivers. + */ + return drm_object_property_get_value(&crtc->primary->base, + property, val); + } + + return -EINVAL; } static const struct drm_crtc_funcs omap_crtc_funcs = { -- cgit v1.2.3 From 7b9cb5eeb4d0b1db63e198dfd02aadddaf245de4 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Wed, 4 Nov 2015 15:11:25 +0200 Subject: drm/omap: Add dispc_mgr_get_supported_outputs() We are removing the use of the 'struct omap_overlay_manager' from omapdrm, and one part of that is removing the use of mgr->supported_outputs field. This patch adds dispc_mgr_get_supported_outputs() function which can be used instead of mgr->supported_outputs. omap_crtc.c is changed to use the new function. Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/dispc.c | 6 ++++++ drivers/gpu/drm/omapdrm/dss/omapdss.h | 2 ++ drivers/gpu/drm/omapdrm/omap_crtc.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/dss/dispc.c b/drivers/gpu/drm/omapdrm/dss/dispc.c index a4274dca384a..a5940892a788 100644 --- a/drivers/gpu/drm/omapdrm/dss/dispc.c +++ b/drivers/gpu/drm/omapdrm/dss/dispc.c @@ -2910,6 +2910,12 @@ bool dispc_ovl_enabled(enum omap_plane plane) } EXPORT_SYMBOL(dispc_ovl_enabled); +enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel) +{ + return dss_feat_get_supported_outputs(channel); +} +EXPORT_SYMBOL(dispc_mgr_get_supported_outputs); + void dispc_mgr_enable(enum omap_channel channel, bool enable) { mgr_fld_write(channel, DISPC_MGR_FLD_ENABLE, enable); diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 7712ffef2836..0a213489f133 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -58,6 +58,8 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi, bool replication, const struct omap_video_timings *mgr_timings, bool mem_to_mem); +enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel); + struct dss_mgr_ops { int (*connect)(struct omap_overlay_manager *mgr, struct omap_dss_device *dst); diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 8c5caf8bb1b9..6daf0bd67d06 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -112,7 +112,7 @@ static int omap_crtc_dss_connect(struct omap_overlay_manager *mgr, if (mgr->output) return -EINVAL; - if ((mgr->supported_outputs & dst->id) == 0) + if ((dispc_mgr_get_supported_outputs(mgr->id) & dst->id) == 0) return -EINVAL; dst->manager = mgr; -- cgit v1.2.3 From 3a9241386494ed5797e4c7244b944ac312d35515 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Wed, 21 Oct 2015 16:34:08 +0300 Subject: drm/omap: remove crtc->mgr field In order to remove uses of 'struct omap_overlay_manager' from omapdrm, this patch removes the crtc->mgr field. To accomplish that, a new static array is added along the current 'omap_crtcs' static array, which is used to store the output device connected to a crtc. Optimally we'd use the struct omap_crtc to store this information, but at the time when omap_crtc_dss_connect() is called, we don't yet have the omap_crtc instances. This might possibly be fixed later, but for now the static array does the job. Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_crtc.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 6daf0bd67d06..e583de9e31db 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -34,14 +34,6 @@ struct omap_crtc { const char *name; enum omap_channel channel; - /* - * Temporary: eventually this will go away, but it is needed - * for now to keep the output's happy. (They only need - * mgr->id.) Eventually this will be replaced w/ something - * more common-panel-framework-y - */ - struct omap_overlay_manager *mgr; - struct omap_video_timings timings; struct omap_drm_irq vblank_irq; @@ -104,17 +96,20 @@ int omap_crtc_wait_pending(struct drm_crtc *crtc) /* ovl-mgr-id -> crtc */ static struct omap_crtc *omap_crtcs[8]; +static struct omap_dss_device *omap_crtc_output[8]; /* we can probably ignore these until we support command-mode panels: */ static int omap_crtc_dss_connect(struct omap_overlay_manager *mgr, struct omap_dss_device *dst) { - if (mgr->output) + if (omap_crtc_output[mgr->id]) return -EINVAL; if ((dispc_mgr_get_supported_outputs(mgr->id) & dst->id) == 0) return -EINVAL; + omap_crtc_output[mgr->id] = dst; + dst->manager = mgr; mgr->output = dst; @@ -124,6 +119,8 @@ static int omap_crtc_dss_connect(struct omap_overlay_manager *mgr, static void omap_crtc_dss_disconnect(struct omap_overlay_manager *mgr, struct omap_dss_device *dst) { + omap_crtc_output[mgr->id] = NULL; + mgr->output->manager = NULL; mgr->output = NULL; } @@ -142,7 +139,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) u32 framedone_irq, vsync_irq; int ret; - if (omap_crtc->mgr->output->output_type == OMAP_DISPLAY_TYPE_HDMI) { + if (omap_crtc_output[channel]->output_type == OMAP_DISPLAY_TYPE_HDMI) { dispc_mgr_enable(channel, enable); return; } @@ -551,9 +548,6 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev, omap_crtc->error_irq.irq = omap_crtc_error_irq; omap_irq_register(dev, &omap_crtc->error_irq); - /* temporary: */ - omap_crtc->mgr = omap_dss_get_overlay_manager(channel); - ret = drm_crtc_init_with_planes(dev, crtc, plane, NULL, &omap_crtc_funcs, NULL); if (ret < 0) { -- cgit v1.2.3 From e5cbb6e8eaa6d4ae8b4acafd59e2e058105c8177 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Wed, 4 Nov 2015 19:36:26 +0200 Subject: drm/omap: convert dss_mgr_ops to use omap_channel We are removing the use of 'struct omap_overlay_manager' from omapdrm. This patch changes the function pointers in 'dss_mgr_ops' to get 'enum omap_channel' parameter instead of 'struct omap_overlay_manager'. The change is very straightforward, as we still use 'struct omap_overlay_manager' inside the function implementations where needed. Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/dss/apply.c | 27 ++++++++++++++++--------- drivers/gpu/drm/omapdrm/dss/omapdss.h | 18 ++++++++--------- drivers/gpu/drm/omapdrm/dss/output.c | 18 ++++++++--------- drivers/gpu/drm/omapdrm/omap_crtc.c | 38 +++++++++++++++++++---------------- 4 files changed, 57 insertions(+), 44 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/dss/apply.c b/drivers/gpu/drm/omapdrm/dss/apply.c index 663ccc3bf4e5..1b7c718c08b2 100644 --- a/drivers/gpu/drm/omapdrm/dss/apply.c +++ b/drivers/gpu/drm/omapdrm/dss/apply.c @@ -805,20 +805,23 @@ static void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr) } } -static int dss_mgr_connect_compat(struct omap_overlay_manager *mgr, +static int dss_mgr_connect_compat(enum omap_channel channel, struct omap_dss_device *dst) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); return mgr->set_output(mgr, dst); } -static void dss_mgr_disconnect_compat(struct omap_overlay_manager *mgr, +static void dss_mgr_disconnect_compat(enum omap_channel channel, struct omap_dss_device *dst) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); mgr->unset_output(mgr); } -static void dss_mgr_start_update_compat(struct omap_overlay_manager *mgr) +static void dss_mgr_start_update_compat(enum omap_channel channel) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); struct mgr_priv_data *mp = get_mgr_priv(mgr); unsigned long flags; int r; @@ -1072,8 +1075,9 @@ static void dss_setup_fifos(void) } } -static int dss_mgr_enable_compat(struct omap_overlay_manager *mgr) +static int dss_mgr_enable_compat(enum omap_channel channel) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); struct mgr_priv_data *mp = get_mgr_priv(mgr); unsigned long flags; int r; @@ -1122,8 +1126,9 @@ err: return r; } -static void dss_mgr_disable_compat(struct omap_overlay_manager *mgr) +static void dss_mgr_disable_compat(enum omap_channel channel) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); struct mgr_priv_data *mp = get_mgr_priv(mgr); unsigned long flags; @@ -1261,9 +1266,10 @@ static void dss_apply_mgr_timings(struct omap_overlay_manager *mgr, mp->extra_info_dirty = true; } -static void dss_mgr_set_timings_compat(struct omap_overlay_manager *mgr, +static void dss_mgr_set_timings_compat(enum omap_channel channel, const struct omap_video_timings *timings) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); unsigned long flags; struct mgr_priv_data *mp = get_mgr_priv(mgr); @@ -1289,9 +1295,10 @@ static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr, mp->extra_info_dirty = true; } -static void dss_mgr_set_lcd_config_compat(struct omap_overlay_manager *mgr, +static void dss_mgr_set_lcd_config_compat(enum omap_channel channel, const struct dss_lcd_mgr_config *config) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); unsigned long flags; struct mgr_priv_data *mp = get_mgr_priv(mgr); @@ -1554,9 +1561,10 @@ err: return r; } -static int dss_mgr_register_framedone_handler_compat(struct omap_overlay_manager *mgr, +static int dss_mgr_register_framedone_handler_compat(enum omap_channel channel, void (*handler)(void *), void *data) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); struct mgr_priv_data *mp = get_mgr_priv(mgr); if (mp->framedone_handler) @@ -1568,9 +1576,10 @@ static int dss_mgr_register_framedone_handler_compat(struct omap_overlay_manager return 0; } -static void dss_mgr_unregister_framedone_handler_compat(struct omap_overlay_manager *mgr, +static void dss_mgr_unregister_framedone_handler_compat(enum omap_channel channel, void (*handler)(void *), void *data) { + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); struct mgr_priv_data *mp = get_mgr_priv(mgr); WARN_ON(mp->framedone_handler != handler || diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h index 0a213489f133..640ba08735c5 100644 --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h @@ -61,21 +61,21 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi, enum omap_dss_output_id dispc_mgr_get_supported_outputs(enum omap_channel channel); struct dss_mgr_ops { - int (*connect)(struct omap_overlay_manager *mgr, + int (*connect)(enum omap_channel channel, struct omap_dss_device *dst); - void (*disconnect)(struct omap_overlay_manager *mgr, + void (*disconnect)(enum omap_channel channel, struct omap_dss_device *dst); - void (*start_update)(struct omap_overlay_manager *mgr); - int (*enable)(struct omap_overlay_manager *mgr); - void (*disable)(struct omap_overlay_manager *mgr); - void (*set_timings)(struct omap_overlay_manager *mgr, + void (*start_update)(enum omap_channel channel); + int (*enable)(enum omap_channel channel); + void (*disable)(enum omap_channel channel); + void (*set_timings)(enum omap_channel channel, const struct omap_video_timings *timings); - void (*set_lcd_config)(struct omap_overlay_manager *mgr, + void (*set_lcd_config)(enum omap_channel channel, const struct dss_lcd_mgr_config *config); - int (*register_framedone_handler)(struct omap_overlay_manager *mgr, + int (*register_framedone_handler)(enum omap_channel channel, void (*handler)(void *), void *data); - void (*unregister_framedone_handler)(struct omap_overlay_manager *mgr, + void (*unregister_framedone_handler)(enum omap_channel channel, void (*handler)(void *), void *data); }; diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c index c1c099dfd621..69e081392ee5 100644 --- a/drivers/gpu/drm/omapdrm/dss/output.c +++ b/drivers/gpu/drm/omapdrm/dss/output.c @@ -191,59 +191,59 @@ EXPORT_SYMBOL(dss_uninstall_mgr_ops); int dss_mgr_connect(struct omap_overlay_manager *mgr, struct omap_dss_device *dst) { - return dss_mgr_ops->connect(mgr, dst); + return dss_mgr_ops->connect(mgr->id, dst); } EXPORT_SYMBOL(dss_mgr_connect); void dss_mgr_disconnect(struct omap_overlay_manager *mgr, struct omap_dss_device *dst) { - dss_mgr_ops->disconnect(mgr, dst); + dss_mgr_ops->disconnect(mgr->id, dst); } EXPORT_SYMBOL(dss_mgr_disconnect); void dss_mgr_set_timings(struct omap_overlay_manager *mgr, const struct omap_video_timings *timings) { - dss_mgr_ops->set_timings(mgr, timings); + dss_mgr_ops->set_timings(mgr->id, timings); } EXPORT_SYMBOL(dss_mgr_set_timings); void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, const struct dss_lcd_mgr_config *config) { - dss_mgr_ops->set_lcd_config(mgr, config); + dss_mgr_ops->set_lcd_config(mgr->id, config); } EXPORT_SYMBOL(dss_mgr_set_lcd_config); int dss_mgr_enable(struct omap_overlay_manager *mgr) { - return dss_mgr_ops->enable(mgr); + return dss_mgr_ops->enable(mgr->id); } EXPORT_SYMBOL(dss_mgr_enable); void dss_mgr_disable(struct omap_overlay_manager *mgr) { - dss_mgr_ops->disable(mgr); + dss_mgr_ops->disable(mgr->id); } EXPORT_SYMBOL(dss_mgr_disable); void dss_mgr_start_update(struct omap_overlay_manager *mgr) { - dss_mgr_ops->start_update(mgr); + dss_mgr_ops->start_update(mgr->id); } EXPORT_SYMBOL(dss_mgr_start_update); int dss_mgr_register_framedone_handler(struct omap_overlay_manager *mgr, void (*handler)(void *), void *data) { - return dss_mgr_ops->register_framedone_handler(mgr, handler, data); + return dss_mgr_ops->register_framedone_handler(mgr->id, handler, data); } EXPORT_SYMBOL(dss_mgr_register_framedone_handler); void dss_mgr_unregister_framedone_handler(struct omap_overlay_manager *mgr, void (*handler)(void *), void *data) { - dss_mgr_ops->unregister_framedone_handler(mgr, handler, data); + dss_mgr_ops->unregister_framedone_handler(mgr->id, handler, data); } EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler); diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index e583de9e31db..cb5a30e3109d 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -99,16 +99,18 @@ static struct omap_crtc *omap_crtcs[8]; static struct omap_dss_device *omap_crtc_output[8]; /* we can probably ignore these until we support command-mode panels: */ -static int omap_crtc_dss_connect(struct omap_overlay_manager *mgr, +static int omap_crtc_dss_connect(enum omap_channel channel, struct omap_dss_device *dst) { - if (omap_crtc_output[mgr->id]) + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); + + if (omap_crtc_output[channel]) return -EINVAL; - if ((dispc_mgr_get_supported_outputs(mgr->id) & dst->id) == 0) + if ((dispc_mgr_get_supported_outputs(channel) & dst->id) == 0) return -EINVAL; - omap_crtc_output[mgr->id] = dst; + omap_crtc_output[channel] = dst; dst->manager = mgr; mgr->output = dst; @@ -116,16 +118,18 @@ static int omap_crtc_dss_connect(struct omap_overlay_manager *mgr, return 0; } -static void omap_crtc_dss_disconnect(struct omap_overlay_manager *mgr, +static void omap_crtc_dss_disconnect(enum omap_channel channel, struct omap_dss_device *dst) { - omap_crtc_output[mgr->id] = NULL; + struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); + + omap_crtc_output[channel] = NULL; mgr->output->manager = NULL; mgr->output = NULL; } -static void omap_crtc_dss_start_update(struct omap_overlay_manager *mgr) +static void omap_crtc_dss_start_update(enum omap_channel channel) { } @@ -192,9 +196,9 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) } -static int omap_crtc_dss_enable(struct omap_overlay_manager *mgr) +static int omap_crtc_dss_enable(enum omap_channel channel) { - struct omap_crtc *omap_crtc = omap_crtcs[mgr->id]; + struct omap_crtc *omap_crtc = omap_crtcs[channel]; struct omap_overlay_manager_info info; memset(&info, 0, sizeof(info)); @@ -211,38 +215,38 @@ static int omap_crtc_dss_enable(struct omap_overlay_manager *mgr) return 0; } -static void omap_crtc_dss_disable(struct omap_overlay_manager *mgr) +static void omap_crtc_dss_disable(enum omap_channel channel) { - struct omap_crtc *omap_crtc = omap_crtcs[mgr->id]; + struct omap_crtc *omap_crtc = omap_crtcs[channel]; omap_crtc_set_enabled(&omap_crtc->base, false); } -static void omap_crtc_dss_set_timings(struct omap_overlay_manager *mgr, +static void omap_crtc_dss_set_timings(enum omap_channel channel, const struct omap_video_timings *timings) { - struct omap_crtc *omap_crtc = omap_crtcs[mgr->id]; + struct omap_crtc *omap_crtc = omap_crtcs[channel]; DBG("%s", omap_crtc->name); omap_crtc->timings = *timings; } -static void omap_crtc_dss_set_lcd_config(struct omap_overlay_manager *mgr, +static void omap_crtc_dss_set_lcd_config(enum omap_channel channel, const struct dss_lcd_mgr_config *config) { - struct omap_crtc *omap_crtc = omap_crtcs[mgr->id]; + struct omap_crtc *omap_crtc = omap_crtcs[channel]; DBG("%s", omap_crtc->name); dispc_mgr_set_lcd_config(omap_crtc->channel, config); } static int omap_crtc_dss_register_framedone( - struct omap_overlay_manager *mgr, + enum omap_channel channel, void (*handler)(void *), void *data) { return 0; } static void omap_crtc_dss_unregister_framedone( - struct omap_overlay_manager *mgr, + enum omap_channel channel, void (*handler)(void *), void *data) { } -- cgit v1.2.3 From 49239503a364bf09845d03536b28ea434b92184d Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 5 Nov 2015 09:34:31 +0200 Subject: drm/omap: add dispc_channel_connected field to omap_dss_device We want to remove the 'struct omap_overlay_manager' from omap_dss_device. At the moment that field is used, among some other uses, to see if the omap_dss_device is connected to an overlay manager. To make it possible to remove the 'struct omap_overlay_manager' field, this patch adds 'bool dispc_channel_connected' field to track the connected-or-not status. Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_crtc.c | 2 ++ include/video/omapdss.h | 1 + 2 files changed, 3 insertions(+) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index cb5a30e3109d..3667ff1d8474 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -111,6 +111,7 @@ static int omap_crtc_dss_connect(enum omap_channel channel, return -EINVAL; omap_crtc_output[channel] = dst; + dst->dispc_channel_connected = true; dst->manager = mgr; mgr->output = dst; @@ -124,6 +125,7 @@ static void omap_crtc_dss_disconnect(enum omap_channel channel, struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); omap_crtc_output[channel] = NULL; + dst->dispc_channel_connected = false; mgr->output->manager = NULL; mgr->output = NULL; diff --git a/include/video/omapdss.h b/include/video/omapdss.h index b50ebcd2f460..8e14ad7327c9 100644 --- a/include/video/omapdss.h +++ b/include/video/omapdss.h @@ -770,6 +770,7 @@ struct omap_dss_device { /* DISPC channel for this output */ enum omap_channel dispc_channel; + bool dispc_channel_connected; /* output instance */ enum omap_dss_output_id id; -- cgit v1.2.3 From 751d2e18b0859ec3edc1c61bfcc09affdbd9b323 Mon Sep 17 00:00:00 2001 From: Tomi Valkeinen Date: Thu, 5 Nov 2015 10:02:43 +0200 Subject: drm/omap: remove last uses of omap_overlay_manager We have now removed all uses of 'struct omap_overlay_manager', so we can now remove the last places where it is set. Signed-off-by: Tomi Valkeinen --- drivers/gpu/drm/omapdrm/omap_crtc.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'drivers/gpu/drm/omapdrm/omap_crtc.c') diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index 3667ff1d8474..263f4b7a5789 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -102,8 +102,6 @@ static struct omap_dss_device *omap_crtc_output[8]; static int omap_crtc_dss_connect(enum omap_channel channel, struct omap_dss_device *dst) { - struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); - if (omap_crtc_output[channel]) return -EINVAL; @@ -113,22 +111,14 @@ static int omap_crtc_dss_connect(enum omap_channel channel, omap_crtc_output[channel] = dst; dst->dispc_channel_connected = true; - dst->manager = mgr; - mgr->output = dst; - return 0; } static void omap_crtc_dss_disconnect(enum omap_channel channel, struct omap_dss_device *dst) { - struct omap_overlay_manager *mgr = omap_dss_get_overlay_manager(channel); - omap_crtc_output[channel] = NULL; dst->dispc_channel_connected = false; - - mgr->output->manager = NULL; - mgr->output = NULL; } static void omap_crtc_dss_start_update(enum omap_channel channel) -- cgit v1.2.3