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
WARNING: multiple messages have this Message-ID (diff)
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: Krzysztof Kozlowski <k.kozlowski@samsung.com>, linux-samsung-soc@vger.kernel.org, daniel.vetter@ffwll.ch, emil.l.velikov@gmail.com, dianders@chromium.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, Thierry Reding <treding@nvidia.com>, Dan Carpenter <dan.carpenter@oracle.com> 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 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2016-05-31 13:39 UTC|newest] Thread overview: 15+ 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:37 ` Yakir Yang 2016-05-31 13:39 ` Yakir Yang [this message] 2016-05-31 13:39 ` [RFC PATCH v1 1/2] drm/rockchip: add a notify event about vblank enable/disable Yakir Yang 2016-05-31 14:36 ` 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-05-31 14:38 ` Daniel Vetter 2016-06-01 2:41 ` Yakir Yang 2016-06-01 2:54 ` Yakir Yang 2016-06-01 2:54 ` Yakir Yang 2016-06-02 14:19 ` Daniel Vetter 2016-06-02 14:19 ` Daniel Vetter 2016-06-03 5:45 ` Yakir Yang
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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.