ANDROID: driver: gpu: drm: add notifier for panel related events

Add support for notfier of panel blank/unblank events.
This allows external drivers such as touch, backlight
drivers etc to subscribe to panel related events.

Signed-off-by: Shashank Babu Chinta Venkata <sbchin@codeaurora.org>
Bug: 139653858
Change-Id: I3ac644c1c931b959a511ee4a999a417a4b7bdcd1
This commit is contained in:
Shashank Babu Chinta Venkata
2019-10-16 10:56:43 -07:00
committed by Alistair Delva
parent 741b06141b
commit 310dd4fe83
3 changed files with 61 additions and 0 deletions

View File

@@ -51,6 +51,7 @@ static LIST_HEAD(panel_list);
void drm_panel_init(struct drm_panel *panel) void drm_panel_init(struct drm_panel *panel)
{ {
INIT_LIST_HEAD(&panel->list); INIT_LIST_HEAD(&panel->list);
BLOCKING_INIT_NOTIFIER_HEAD(&panel->nh);
} }
EXPORT_SYMBOL(drm_panel_init); 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); EXPORT_SYMBOL(of_drm_find_panel);
#endif #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 <treding@nvidia.com>"); MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
MODULE_DESCRIPTION("DRM panel infrastructure"); MODULE_DESCRIPTION("DRM panel infrastructure");
MODULE_LICENSE("GPL and additional rights"); MODULE_LICENSE("GPL and additional rights");

View File

@@ -40,6 +40,7 @@ struct drm_encoder;
struct drm_property; struct drm_property;
struct drm_property_blob; struct drm_property_blob;
struct drm_printer; struct drm_printer;
struct drm_panel;
struct edid; struct edid;
struct i2c_adapter; struct i2c_adapter;
@@ -1410,6 +1411,13 @@ struct drm_connector {
/** @hdr_sink_metadata: HDR Metadata Information read from sink */ /** @hdr_sink_metadata: HDR Metadata Information read from sink */
struct hdr_sink_metadata hdr_sink_metadata; 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) #define obj_to_connector(x) container_of(x, struct drm_connector, base)

View File

@@ -27,6 +27,23 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/notifier.h>
/* 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 device_node;
struct drm_connector; struct drm_connector;
@@ -145,6 +162,13 @@ struct drm_panel {
* Panel entry in registry. * Panel entry in registry.
*/ */
struct list_head list; struct list_head list;
/**
* @nh:
*
* panel notifier list head
*/
struct blocking_notifier_head nh;
}; };
void drm_panel_init(struct drm_panel *panel); 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); int drm_panel_attach(struct drm_panel *panel, struct drm_connector *connector);
void drm_panel_detach(struct drm_panel *panel); 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_prepare(struct drm_panel *panel);
int drm_panel_unprepare(struct drm_panel *panel); int drm_panel_unprepare(struct drm_panel *panel);