From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jianhua Lu Date: Thu, 4 Aug 2022 13:26:53 +0800 Subject: drm: Add drm notifier support --- drivers/gpu/drm/Makefile | 3 +- drivers/gpu/drm/drm_notifier.c | 57 ++++++++++ include/drm/drm_notifier.h | 37 ++++++ 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 7a09a89b493b..8e18dbb6986c 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -45,7 +45,8 @@ drm-y := \ drm_vblank.o \ drm_vblank_work.o \ drm_vma_manager.o \ - drm_writeback.o + drm_writeback.o \ + drm_notifier.o drm-$(CONFIG_DRM_LEGACY) += \ drm_agpsupport.o \ drm_bufs.o \ diff --git a/drivers/gpu/drm/drm_notifier.c b/drivers/gpu/drm/drm_notifier.c new file mode 100644 index 000000000000..792069640ea7 --- /dev/null +++ b/drivers/gpu/drm/drm_notifier.c @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * Copyright (C) 2021 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include + +static BLOCKING_NOTIFIER_HEAD(mi_drm_notifier_list); + +/** + * mi_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 mi_drm_register_client(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&mi_drm_notifier_list, nb); +} +EXPORT_SYMBOL(mi_drm_register_client); + +/** + * mi_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 mi_drm_unregister_client(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&mi_drm_notifier_list, nb); +} +EXPORT_SYMBOL(mi_drm_unregister_client); + +/** + * mi_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). + */ +int mi_drm_notifier_call_chain(unsigned long val, void *v) +{ + return blocking_notifier_call_chain(&mi_drm_notifier_list, val, v); +} +EXPORT_SYMBOL(mi_drm_notifier_call_chain); \ No newline at end of file diff --git a/include/drm/drm_notifier.h b/include/drm/drm_notifier.h new file mode 100644 index 000000000000..fd0e976559b8 --- /dev/null +++ b/include/drm/drm_notifier.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019, The Linux Foundation. All rights reserved. + * Copyright (C) 2021 XiaoMi, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _DRM_NOTIFIER_H_ +#define _DRM_NOTIFIER_H_ + +#include + +/* A hardware display blank change occurred */ +#define MI_DRM_EVENT_BLANK 0x01 +/* A hardware display blank early change occurred */ +#define MI_DRM_EARLY_EVENT_BLANK 0x02 + +enum drm_notifier_data { + /* panel: power on */ + MI_DRM_BLANK_UNBLANK, + /* panel: power down */ + MI_DRM_BLANK_POWERDOWN, +}; + +int mi_drm_register_client(struct notifier_block *nb); +int mi_drm_unregister_client(struct notifier_block *nb); +int mi_drm_notifier_call_chain(unsigned long val, void *v); + +#endif /* _DRM_NOTIFIER_H */ -- Armbian