From df6d76968e3a7d355c25c2b0fde413dc09fe0c4a Mon Sep 17 00:00:00 2001 From: Yuan Zhao Date: Thu, 4 Jul 2019 10:32:09 +0800 Subject: [PATCH 1/3] disp: msm: dsi: Add a new function to get drm_panel A new API to get drm_panel from dsi_display. The drm_panel was defined as a member of drm_connector. When doing connector initialize, can set drm_panel to drm_connector. So this API is needed to get drm_panel from dsi_dsiplay. Change-Id: I0ec9de5a9407085048a8fef421b7b28d466085ed Signed-off-by: Yuan Zhao --- msm/dsi/dsi_display.c | 10 ++++++++++ msm/dsi/dsi_display.h | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 0da75a811c..878de8f490 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -5537,6 +5537,16 @@ static struct mipi_dsi_host_ops dsi_host_ext_ops = { .transfer = dsi_host_transfer, }; +struct drm_panel *dsi_display_get_drm_panel(struct dsi_display * display) +{ + if (!display || !display->panel) { + pr_err("invalid param(s)\n"); + return NULL; + } + + return &display->panel->drm_panel; +} + int dsi_display_drm_ext_bridge_init(struct dsi_display *display, struct drm_encoder *encoder, struct drm_connector *connector) { diff --git a/msm/dsi/dsi_display.h b/msm/dsi/dsi_display.h index 29dab31095..de26a7224f 100644 --- a/msm/dsi/dsi_display.h +++ b/msm/dsi/dsi_display.h @@ -585,6 +585,15 @@ int dsi_display_set_tpg_state(struct dsi_display *display, bool enable); int dsi_display_clock_gate(struct dsi_display *display, bool enable); int dsi_dispaly_static_frame(struct dsi_display *display, bool enable); +/** + * dsi_display_get_drm_panel() - get drm_panel from display. + * @display: Handle to display. + * Get drm_panel which was inclued in dsi_display's dsi_panel. + * + * Return: drm_panel/NULL. + */ +struct drm_panel *dsi_display_get_drm_panel(struct dsi_display *display); + /** * dsi_display_enable_event() - enable interrupt based connector event * @connector: Pointer to drm connector structure From 51ca5e052c2ece811f44198b77b95cfb392c6d76 Mon Sep 17 00:00:00 2001 From: Yuan Zhao Date: Thu, 4 Jul 2019 10:44:47 +0800 Subject: [PATCH 2/3] disp: msm: sde: Set drm_panel to drm_connector Set drm_panel to drm_connector. It can get drm_panel from connector for other usage. Change-Id: I68430be8aa05f140b88592c38db8e79aa96dafe6 Signed-off-by: Yuan Zhao --- msm/sde/sde_connector.c | 1 + msm/sde/sde_kms.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 844d2b8590..017f5a037c 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -2448,6 +2448,7 @@ struct drm_connector *sde_connector_init(struct drm_device *dev, spin_lock_init(&c_conn->event_lock); + c_conn->base.panel = panel; c_conn->connector_type = connector_type; c_conn->encoder = encoder; c_conn->display = display; diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index cddf8220a3..c6f8400c4e 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -1280,7 +1280,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev, connector = sde_connector_init(dev, encoder, - 0, + dsi_display_get_drm_panel(display), display, &dsi_ops, DRM_CONNECTOR_POLL_HPD, From fdaf7b0e21392fb7a51ab7ee962e2866a15cd331 Mon Sep 17 00:00:00 2001 From: Yuan Zhao Date: Thu, 4 Jul 2019 10:56:06 +0800 Subject: [PATCH 3/3] disp: msm: Use the new notifier function instead of msm_drm_notifier Since other driver module could not use msm_drm function, then the notify function was moved to drm_panel. So used the new drm_panel notify API instead of the old one. Change-Id: I053992d74125807ccbf8991e3ac771dfc3eef732 Signed-off-by: Yuan Zhao --- msm/msm_atomic.c | 84 ++++++++++++------------------------------------ 1 file changed, 21 insertions(+), 63 deletions(-) diff --git a/msm/msm_atomic.c b/msm/msm_atomic.c index afb4b078da..5bdb37bacd 100644 --- a/msm/msm_atomic.c +++ b/msm/msm_atomic.c @@ -15,9 +15,7 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ - -#include -#include +#include #include "msm_drv.h" #include "msm_gem.h" @@ -34,49 +32,6 @@ struct msm_commit { struct kthread_work commit_work; }; -static BLOCKING_NOTIFIER_HEAD(msm_drm_notifier_list); - -/** - * msm_drm_register_client - register a client notifier - * @nb: notifier block to callback on events - * - * This function registers a notifier callback function - * to msm_drm_notifier_list, which would be called when - * received unblank/power down event. - */ -int msm_drm_register_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_register(&msm_drm_notifier_list, - nb); -} -EXPORT_SYMBOL(msm_drm_register_client); - -/** - * msm_drm_unregister_client - unregister a client notifier - * @nb: notifier block to callback on events - * - * This function unregisters the callback function from - * msm_drm_notifier_list. - */ -int msm_drm_unregister_client(struct notifier_block *nb) -{ - return blocking_notifier_chain_unregister(&msm_drm_notifier_list, - nb); -} -EXPORT_SYMBOL(msm_drm_unregister_client); - -/** - * msm_drm_notifier_call_chain - notify clients of drm_events - * @val: event MSM_DRM_EARLY_EVENT_BLANK or MSM_DRM_EVENT_BLANK - * @v: notifier data, inculde display id and display blank - * event(unblank or power down). - */ -static int msm_drm_notifier_call_chain(unsigned long val, void *v) -{ - return blocking_notifier_call_chain(&msm_drm_notifier_list, val, - v); -} - static inline bool _msm_seamless_for_crtc(struct drm_atomic_state *state, struct drm_crtc_state *crtc_state, bool enable) { @@ -186,7 +141,7 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) struct drm_connector_state *old_conn_state; struct drm_crtc *crtc; struct drm_crtc_state *old_crtc_state; - struct msm_drm_notifier notifier_data; + struct drm_panel_notifier notifier_data; int i, blank; SDE_ATRACE_BEGIN("msm_disable"); @@ -195,7 +150,6 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) const struct drm_encoder_helper_funcs *funcs; struct drm_encoder *encoder; struct drm_crtc_state *old_crtc_state; - unsigned int crtc_idx; /* * Shut down everything that's in the changeset and currently @@ -204,7 +158,6 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) if (!old_conn_state->crtc) continue; - crtc_idx = drm_crtc_index(old_conn_state->crtc); old_crtc_state = drm_atomic_get_old_crtc_state(old_state, old_conn_state->crtc); @@ -230,11 +183,12 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) if (connector->state->crtc && connector->state->crtc->state->active_changed) { - blank = MSM_DRM_BLANK_POWERDOWN; + blank = DRM_PANEL_BLANK_POWERDOWN; notifier_data.data = ␣ - notifier_data.id = crtc_idx; - msm_drm_notifier_call_chain(MSM_DRM_EARLY_EVENT_BLANK, - ¬ifier_data); + if (connector->panel) + drm_panel_notifier_call_chain(connector->panel, + DRM_PANEL_EARLY_EVENT_BLANK, + ¬ifier_data); } /* * Each encoder has at most one connector (since we always steal @@ -254,8 +208,10 @@ msm_disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) if (connector->state->crtc && connector->state->crtc->state->active_changed) { DRM_DEBUG_ATOMIC("Notify blank\n"); - msm_drm_notifier_call_chain(MSM_DRM_EVENT_BLANK, - ¬ifier_data); + if (connector->panel) + drm_panel_notifier_call_chain(connector->panel, + DRM_PANEL_EVENT_BLANK, + ¬ifier_data); } } @@ -398,7 +354,7 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, struct drm_crtc_state *new_crtc_state; struct drm_connector *connector; struct drm_connector_state *new_conn_state; - struct msm_drm_notifier notifier_data; + struct drm_panel_notifier notifier_data; struct msm_drm_private *priv = dev->dev_private; struct msm_kms *kms = priv->kms; int bridge_enable_count = 0; @@ -468,13 +424,13 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, if (splash || (connector->state->crtc && connector->state->crtc->state->active_changed)) { - blank = MSM_DRM_BLANK_UNBLANK; + blank = DRM_PANEL_BLANK_UNBLANK; notifier_data.data = ␣ - notifier_data.id = - connector->state->crtc->index; DRM_DEBUG_ATOMIC("Notify early unblank\n"); - msm_drm_notifier_call_chain(MSM_DRM_EARLY_EVENT_BLANK, - ¬ifier_data); + if (connector->panel) + drm_panel_notifier_call_chain(connector->panel, + DRM_PANEL_EARLY_EVENT_BLANK, + ¬ifier_data); } /* * Each encoder has at most one connector (since we always steal @@ -528,8 +484,10 @@ static void msm_atomic_helper_commit_modeset_enables(struct drm_device *dev, if (splash || (connector->state->crtc && connector->state->crtc->state->active_changed)) { DRM_DEBUG_ATOMIC("Notify unblank\n"); - msm_drm_notifier_call_chain(MSM_DRM_EVENT_BLANK, - ¬ifier_data); + if (connector->panel) + drm_panel_notifier_call_chain(connector->panel, + DRM_PANEL_EVENT_BLANK, + ¬ifier_data); } } SDE_ATRACE_END("msm_enable");