From: Yakir Yang <ykk@rock-chips.com>
To: Mark Yao <yzq@rock-chips.com>, Inki Dae <inki.dae@samsung.com>,
Heiko Stuebner <heiko@sntech.de>,
tfiga@chromium.org, Jingoo Han <jingoohan1@gmail.com>
Cc: David Airlie <airlied@linux.ie>,
daniel.vetter@ffwll.ch, Thierry Reding <treding@nvidia.com>,
dianders@chromium.org,
Krzysztof Kozlowski <k.kozlowski@samsung.com>,
emil.l.velikov@gmail.com,
Dan Carpenter <dan.carpenter@oracle.com>,
Yakir Yang <ykk@rock-chips.com>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-samsung-soc@vger.kernel.org,
linux-rockchip@lists.infradead.org
Subject: [RFC PATCH v1 1/2] drm/rockchip: add a notify event about vblank enable/disable
Date: Tue, 31 May 2016 21:39:19 +0800 [thread overview]
Message-ID: <1464701959-9428-1-git-send-email-ykk@rock-chips.com> (raw)
In-Reply-To: <1464701856-8695-1-git-send-email-ykk@rock-chips.com>
EDP PSR function is interesting in vblank enable or disable event,
so it would be great introduce a way to notify encoder about this
event.
Signed-off-by: Yakir Yang <ykk@rock-chips.com>
---
drivers/gpu/drm/rockchip/Makefile | 2 +-
drivers/gpu/drm/rockchip/rockchip_drm_notify.c | 66 ++++++++++++++++++++++++++
drivers/gpu/drm/rockchip/rockchip_drm_notify.h | 29 +++++++++++
drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 5 ++
4 files changed, 101 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/rockchip/rockchip_drm_notify.c
create mode 100644 drivers/gpu/drm/rockchip/rockchip_drm_notify.h
diff --git a/drivers/gpu/drm/rockchip/Makefile b/drivers/gpu/drm/rockchip/Makefile
index 05d0713..49fee8c 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -3,7 +3,7 @@
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
- rockchip_drm_gem.o rockchip_drm_vop.o
+ rockchip_drm_gem.o rockchip_drm_vop.o rockchip_drm_notify.o
rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
obj-$(CONFIG_ROCKCHIP_ANALOGIX_DP) += analogix_dp-rockchip.o
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_notify.c b/drivers/gpu/drm/rockchip/rockchip_drm_notify.c
new file mode 100644
index 0000000..84111d9
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_notify.c
@@ -0,0 +1,66 @@
+#include "rockchip_drm_notify.h"
+
+static RAW_NOTIFIER_HEAD(vblank_chain);
+static DEFINE_MUTEX(vblank_lock);
+
+/**
+ * rockchip_drm_vblank_enable - Send Vblank enable event. Will only enable send
+ * Vblank if there are 1 or fewer notifiers.
+ */
+void rockchip_drm_vblank_enable(void)
+{
+ mutex_lock(&vblank_lock);
+ raw_notifier_call_chain(&vblank_chain, VBLANK_ENABLE, NULL);
+ mutex_unlock(&vblank_lock);
+}
+EXPORT_SYMBOL_GPL(rockchip_drm_vblank_enable);
+
+/**
+ * rockchip_drm_vblank_disable - Send VBlank disable event.
+ */
+void rockchip_drm_vblank_disable(void)
+{
+ mutex_lock(&vblank_lock);
+ raw_notifier_call_chain(&vblank_chain, VBLANK_DISABLE, NULL);
+ mutex_unlock(&vblank_lock);
+}
+EXPORT_SYMBOL_GPL(rockchip_drm_vblank_disable);
+
+/**
+ * rockchip_drm_vblank_register_notifier - Add notifier to Vblank notifiers.
+ *
+ * Enable notifiers are called when we enable/disable vblank. This can be done
+ * through rockchip_drm_vblank_enable/disable or when there is more than one
+ * sync notifier. Must call rockchip_drm_vblank_lock before calling this.
+ * @nb The notifier to add
+ */
+int rockchip_drm_vblank_register_notifier(struct notifier_block *nb)
+{
+ int ret = 0;
+
+ if (!nb)
+ return -EINVAL;
+
+ ret = raw_notifier_chain_register(&vblank_chain, nb);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(rockchip_drm_vblank_register_notifier);
+
+/**
+ * rockchip_drm_vblank_unregister_notifier - Remove notifier from Vblank
+ * notifiers.
+ *
+ * Must call rockchip_drm_vblank_lock before calling this.
+ * @nb The notifier to remove.
+ */
+int rockchip_drm_vblank_unregister_notifier(struct notifier_block *nb)
+{
+ int ret = 0;
+
+ if (!nb)
+ return -EINVAL;
+
+ ret = raw_notifier_chain_unregister(&vblank_chain, nb);
+ return ret;
+}
+EXPORT_SYMBOL_GPL(rockchip_drm_vblank_unregister_notifier);
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_notify.h b/drivers/gpu/drm/rockchip/rockchip_drm_notify.h
new file mode 100644
index 0000000..2f28afa
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_notify.h
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * 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 __ROCKCHIP_DRM_NOTIFY_H
+#define __ROCKCHIP_DRM_NOTIFY_H
+
+#include <linux/notifier.h>
+
+enum vblank_enable_op {
+ VBLANK_ENABLE = 0,
+ VBLANK_DISABLE,
+};
+
+void rockchip_drm_vblank_enable(void);
+void rockchip_drm_vblank_disable(void);
+int rockchip_drm_vblank_register_notifier(struct notifier_block *nb);
+int rockchip_drm_vblank_unregister_notifier(struct notifier_block *nb);
+
+#endif /* __ROCKCHIP_DRM_NOTIFY_H */
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
index 257501f..fb6ce4b 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
@@ -35,6 +35,7 @@
#include "rockchip_drm_gem.h"
#include "rockchip_drm_fb.h"
#include "rockchip_drm_vop.h"
+#include "rockchip_drm_notify.h"
#define __REG_SET_RELAXED(x, off, mask, shift, v, write_mask) \
vop_mask_write(x, off, mask, shift, v, write_mask, true)
@@ -851,6 +852,8 @@ static int vop_crtc_enable_vblank(struct drm_crtc *crtc)
spin_unlock_irqrestore(&vop->irq_lock, flags);
+ rockchip_drm_vblank_enable();
+
return 0;
}
@@ -867,6 +870,8 @@ static void vop_crtc_disable_vblank(struct drm_crtc *crtc)
VOP_INTR_SET_TYPE(vop, enable, FS_INTR, 0);
spin_unlock_irqrestore(&vop->irq_lock, flags);
+
+ rockchip_drm_vblank_disable();
}
static void vop_crtc_wait_for_update(struct drm_crtc *crtc)
--
1.9.1
next prev parent reply other threads:[~2016-05-31 13:39 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-31 13:37 [RFC PATCH v1 0/2] Yakir Yang
2016-05-31 13:39 ` Yakir Yang [this message]
2016-05-31 14:36 ` [RFC PATCH v1 1/2] drm/rockchip: add a notify event about vblank enable/disable Daniel Vetter
2016-06-01 2:52 ` Yakir Yang
2016-05-31 13:39 ` [RFC PATCH v1 2/2] drm/rockchip: analogix: add eDP PSR function Yakir Yang
2016-05-31 14:38 ` [RFC PATCH v1 0/2] Daniel Vetter
2016-06-01 2:54 ` Yakir Yang
2016-06-02 14:19 ` Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1464701959-9428-1-git-send-email-ykk@rock-chips.com \
--to=ykk@rock-chips.com \
--cc=airlied@linux.ie \
--cc=dan.carpenter@oracle.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=emil.l.velikov@gmail.com \
--cc=heiko@sntech.de \
--cc=inki.dae@samsung.com \
--cc=jingoohan1@gmail.com \
--cc=k.kozlowski@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=tfiga@chromium.org \
--cc=treding@nvidia.com \
--cc=yzq@rock-chips.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®