mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
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:
committed by
Alistair Delva
parent
741b06141b
commit
310dd4fe83
@@ -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");
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user