diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c index 6b0bf42039cf..bb0f6cad4204 100644 --- a/drivers/gpu/drm/drm_panel.c +++ b/drivers/gpu/drm/drm_panel.c @@ -51,6 +51,7 @@ static LIST_HEAD(panel_list); void drm_panel_init(struct drm_panel *panel) { INIT_LIST_HEAD(&panel->list); + BLOCKING_INIT_NOTIFIER_HEAD(&panel->nh); } EXPORT_SYMBOL(drm_panel_init); @@ -266,6 +267,27 @@ struct drm_panel *of_drm_find_panel(const struct device_node *np) EXPORT_SYMBOL(of_drm_find_panel); #endif +int drm_panel_notifier_register(struct drm_panel *panel, + struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&panel->nh, nb); +} +EXPORT_SYMBOL(drm_panel_notifier_register); + +int drm_panel_notifier_unregister(struct drm_panel *panel, + struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&panel->nh, nb); +} +EXPORT_SYMBOL(drm_panel_notifier_unregister); + +int drm_panel_notifier_call_chain(struct drm_panel *panel, + unsigned long val, void *v) +{ + return blocking_notifier_call_chain(&panel->nh, val, v); +} +EXPORT_SYMBOL(drm_panel_notifier_call_chain); + MODULE_AUTHOR("Thierry Reding "); MODULE_DESCRIPTION("DRM panel infrastructure"); MODULE_LICENSE("GPL and additional rights"); diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 681cb590f952..650290a99602 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -40,6 +40,7 @@ struct drm_encoder; struct drm_property; struct drm_property_blob; struct drm_printer; +struct drm_panel; struct edid; struct i2c_adapter; @@ -1410,6 +1411,13 @@ struct drm_connector { /** @hdr_sink_metadata: HDR Metadata Information read from sink */ struct hdr_sink_metadata hdr_sink_metadata; + + /** + * @panel: + * + * Can find the panel which connected to drm_connector. + */ + struct drm_panel *panel; }; #define obj_to_connector(x) container_of(x, struct drm_connector, base) diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h index 624bd15ecfab..8997244fc9cf 100644 --- a/include/drm/drm_panel.h +++ b/include/drm/drm_panel.h @@ -27,6 +27,23 @@ #include #include #include +#include + +/* A hardware display blank change occurred */ +#define DRM_PANEL_EVENT_BLANK 0x01 +/* A hardware display blank early change occurred */ +#define DRM_PANEL_EARLY_EVENT_BLANK 0x02 + +enum { + /* panel: power on */ + DRM_PANEL_BLANK_UNBLANK, + /* panel: power off */ + DRM_PANEL_BLANK_POWERDOWN, +}; + +struct drm_panel_notifier { + void *data; +}; struct device_node; struct drm_connector; @@ -145,6 +162,13 @@ struct drm_panel { * Panel entry in registry. */ struct list_head list; + + /** + * @nh: + * + * panel notifier list head + */ + struct blocking_notifier_head nh; }; void drm_panel_init(struct drm_panel *panel); @@ -155,6 +179,13 @@ void drm_panel_remove(struct drm_panel *panel); int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector); void drm_panel_detach(struct drm_panel *panel); +int drm_panel_notifier_register(struct drm_panel *panel, + struct notifier_block *nb); +int drm_panel_notifier_unregister(struct drm_panel *panel, + struct notifier_block *nb); +int drm_panel_notifier_call_chain(struct drm_panel *panel, + unsigned long val, void *v); + int drm_panel_prepare(struct drm_panel *panel); int drm_panel_unprepare(struct drm_panel *panel);