From: Hans Verkuil <hverkuil@xs4all.nl> To: linux-media@vger.kernel.org Cc: Daniel Vetter <daniel.vetter@intel.com>, Russell King <linux@armlinux.org.uk>, dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, Krzysztof Kozlowski <krzk@kernel.org>, Inki Dae <inki.dae@samsung.com>, Marek Szyprowski <m.szyprowski@samsung.com>, Javier Martinez Canillas <javier@osg.samsung.com>, Benjamin Gaignard <benjamin.gaignard@linaro.org>, Hans Verkuil <hans.verkuil@cisco.com> Subject: [PATCHv4 3/9] cec: integrate HPD notifier support Date: Mon, 6 Feb 2017 11:29:45 +0100 [thread overview] Message-ID: <20170206102951.12623-4-hverkuil@xs4all.nl> (raw) In-Reply-To: <20170206102951.12623-1-hverkuil@xs4all.nl> From: Hans Verkuil <hans.verkuil@cisco.com> Support the HPD notifier framework, simplifying drivers that depend on this. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> --- drivers/media/cec/cec-core.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ include/media/cec.h | 15 +++++++++++++ 2 files changed, 65 insertions(+) diff --git a/drivers/media/cec/cec-core.c b/drivers/media/cec/cec-core.c index 37217e205040..f055720a1c65 100644 --- a/drivers/media/cec/cec-core.c +++ b/drivers/media/cec/cec-core.c @@ -195,6 +195,52 @@ static void cec_devnode_unregister(struct cec_devnode *devnode) put_device(&devnode->dev); } +#ifdef CONFIG_HPD_NOTIFIER +static u16 parse_hdmi_addr(const struct edid *edid) +{ + if (!edid || edid->extensions == 0) + return CEC_PHYS_ADDR_INVALID; + + return cec_get_edid_phys_addr((u8 *)edid, + EDID_LENGTH * (edid->extensions + 1), NULL); +} + +static int cec_hpd_notify(struct notifier_block *nb, unsigned long event, + void *data) +{ + struct cec_adapter *adap = container_of(nb, struct cec_adapter, nb); + struct hpd_notifier *n = data; + unsigned int phys; + + dprintk(1, "event %lu\n", event); + + switch (event) { + case HPD_DISCONNECTED: + cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false); + break; + + case HPD_NEW_EDID: + phys = parse_hdmi_addr(n->edid); + cec_s_phys_addr(adap, phys, false); + break; + } + + return NOTIFY_OK; +} + +void cec_register_hpd_notifier(struct cec_adapter *adap, + struct hpd_notifier *notifier) +{ + if (WARN_ON(!adap->devnode.registered)) + return; + + adap->nb.notifier_call = cec_hpd_notify; + adap->notifier = notifier; + hpd_notifier_register(adap->notifier, &adap->nb); +} +EXPORT_SYMBOL_GPL(cec_register_hpd_notifier); +#endif + struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, void *priv, const char *name, u32 caps, u8 available_las) @@ -343,6 +389,10 @@ void cec_unregister_adapter(struct cec_adapter *adap) adap->rc = NULL; #endif debugfs_remove_recursive(adap->cec_dir); +#ifdef CONFIG_HPD_NOTIFIER + if (adap->notifier) + hpd_notifier_unregister(adap->notifier, &adap->nb); +#endif cec_devnode_unregister(&adap->devnode); } EXPORT_SYMBOL_GPL(cec_unregister_adapter); diff --git a/include/media/cec.h b/include/media/cec.h index 96a0aa770d61..f87a07ee36b3 100644 --- a/include/media/cec.h +++ b/include/media/cec.h @@ -28,6 +28,11 @@ #include <linux/kthread.h> #include <linux/timer.h> #include <linux/cec-funcs.h> +#ifdef CONFIG_HPD_NOTIFIER +#include <linux/notifier.h> +#include <linux/hpd-notifier.h> +#include <drm/drm_edid.h> +#endif #include <media/rc-core.h> #include <media/cec-edid.h> @@ -173,6 +178,11 @@ struct cec_adapter { bool passthrough; struct cec_log_addrs log_addrs; +#ifdef CONFIG_HPD_NOTIFIER + struct hpd_notifier *notifier; + struct notifier_block nb; +#endif + struct dentry *cec_dir; struct dentry *status_file; @@ -213,6 +223,11 @@ void cec_transmit_done(struct cec_adapter *adap, u8 status, u8 arb_lost_cnt, u8 nack_cnt, u8 low_drive_cnt, u8 error_cnt); void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg); +#ifdef CONFIG_HPD_NOTIFIER +void cec_register_hpd_notifier(struct cec_adapter *adap, + struct hpd_notifier *notifier); +#endif + #else static inline int cec_register_adapter(struct cec_adapter *adap, -- 2.11.0
WARNING: multiple messages have this Message-ID (diff)
From: Hans Verkuil <hverkuil@xs4all.nl> To: linux-media@vger.kernel.org Cc: linux-samsung-soc@vger.kernel.org, Russell King <linux@armlinux.org.uk>, Krzysztof Kozlowski <krzk@kernel.org>, Javier Martinez Canillas <javier@osg.samsung.com>, Hans Verkuil <hans.verkuil@cisco.com>, dri-devel@lists.freedesktop.org, Daniel Vetter <daniel.vetter@intel.com>, Marek Szyprowski <m.szyprowski@samsung.com> Subject: [PATCHv4 3/9] cec: integrate HPD notifier support Date: Mon, 6 Feb 2017 11:29:45 +0100 [thread overview] Message-ID: <20170206102951.12623-4-hverkuil@xs4all.nl> (raw) In-Reply-To: <20170206102951.12623-1-hverkuil@xs4all.nl> From: Hans Verkuil <hans.verkuil@cisco.com> Support the HPD notifier framework, simplifying drivers that depend on this. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> --- drivers/media/cec/cec-core.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ include/media/cec.h | 15 +++++++++++++ 2 files changed, 65 insertions(+) diff --git a/drivers/media/cec/cec-core.c b/drivers/media/cec/cec-core.c index 37217e205040..f055720a1c65 100644 --- a/drivers/media/cec/cec-core.c +++ b/drivers/media/cec/cec-core.c @@ -195,6 +195,52 @@ static void cec_devnode_unregister(struct cec_devnode *devnode) put_device(&devnode->dev); } +#ifdef CONFIG_HPD_NOTIFIER +static u16 parse_hdmi_addr(const struct edid *edid) +{ + if (!edid || edid->extensions == 0) + return CEC_PHYS_ADDR_INVALID; + + return cec_get_edid_phys_addr((u8 *)edid, + EDID_LENGTH * (edid->extensions + 1), NULL); +} + +static int cec_hpd_notify(struct notifier_block *nb, unsigned long event, + void *data) +{ + struct cec_adapter *adap = container_of(nb, struct cec_adapter, nb); + struct hpd_notifier *n = data; + unsigned int phys; + + dprintk(1, "event %lu\n", event); + + switch (event) { + case HPD_DISCONNECTED: + cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false); + break; + + case HPD_NEW_EDID: + phys = parse_hdmi_addr(n->edid); + cec_s_phys_addr(adap, phys, false); + break; + } + + return NOTIFY_OK; +} + +void cec_register_hpd_notifier(struct cec_adapter *adap, + struct hpd_notifier *notifier) +{ + if (WARN_ON(!adap->devnode.registered)) + return; + + adap->nb.notifier_call = cec_hpd_notify; + adap->notifier = notifier; + hpd_notifier_register(adap->notifier, &adap->nb); +} +EXPORT_SYMBOL_GPL(cec_register_hpd_notifier); +#endif + struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops, void *priv, const char *name, u32 caps, u8 available_las) @@ -343,6 +389,10 @@ void cec_unregister_adapter(struct cec_adapter *adap) adap->rc = NULL; #endif debugfs_remove_recursive(adap->cec_dir); +#ifdef CONFIG_HPD_NOTIFIER + if (adap->notifier) + hpd_notifier_unregister(adap->notifier, &adap->nb); +#endif cec_devnode_unregister(&adap->devnode); } EXPORT_SYMBOL_GPL(cec_unregister_adapter); diff --git a/include/media/cec.h b/include/media/cec.h index 96a0aa770d61..f87a07ee36b3 100644 --- a/include/media/cec.h +++ b/include/media/cec.h @@ -28,6 +28,11 @@ #include <linux/kthread.h> #include <linux/timer.h> #include <linux/cec-funcs.h> +#ifdef CONFIG_HPD_NOTIFIER +#include <linux/notifier.h> +#include <linux/hpd-notifier.h> +#include <drm/drm_edid.h> +#endif #include <media/rc-core.h> #include <media/cec-edid.h> @@ -173,6 +178,11 @@ struct cec_adapter { bool passthrough; struct cec_log_addrs log_addrs; +#ifdef CONFIG_HPD_NOTIFIER + struct hpd_notifier *notifier; + struct notifier_block nb; +#endif + struct dentry *cec_dir; struct dentry *status_file; @@ -213,6 +223,11 @@ void cec_transmit_done(struct cec_adapter *adap, u8 status, u8 arb_lost_cnt, u8 nack_cnt, u8 low_drive_cnt, u8 error_cnt); void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg); +#ifdef CONFIG_HPD_NOTIFIER +void cec_register_hpd_notifier(struct cec_adapter *adap, + struct hpd_notifier *notifier); +#endif + #else static inline int cec_register_adapter(struct cec_adapter *adap, -- 2.11.0 _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2017-02-06 10:30 UTC|newest] Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-02-06 10:29 [PATCHv4 0/9] video/exynos/sti/cec: add HPD state notifier & use in drivers Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil 2017-02-06 10:29 ` [PATCHv4 1/9] video: add hotplug detect notifier support Hans Verkuil 2017-02-06 13:08 ` Andrzej Hajda 2017-02-06 13:08 ` Andrzej Hajda 2017-02-27 16:08 ` Daniel Vetter 2017-02-27 16:08 ` Daniel Vetter 2017-02-27 17:04 ` Russell King - ARM Linux 2017-02-27 17:21 ` Hans Verkuil 2017-02-27 17:21 ` Hans Verkuil 2017-02-27 17:46 ` Russell King - ARM Linux 2017-02-28 8:51 ` Daniel Vetter 2017-02-28 8:51 ` Daniel Vetter 2017-02-28 9:23 ` Hans Verkuil 2017-02-28 9:23 ` Hans Verkuil 2017-02-28 9:45 ` Daniel Vetter 2017-02-28 9:45 ` Daniel Vetter 2017-02-06 10:29 ` [PATCHv4 2/9] exynos_hdmi: add HPD " Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil [this message] 2017-02-06 10:29 ` [PATCHv4 3/9] cec: integrate " Hans Verkuil 2017-02-06 10:29 ` [PATCHv4 4/9] ARM: dts: exynos: add HDMI controller phandle to exynos4.dtsi Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil 2017-02-06 10:29 ` [PATCHv4 6/9] s5p-cec: add hpd-notifier support, move out of staging Hans Verkuil 2017-02-06 10:29 ` [PATCHv4 7/9] sti: hdmi: add HPD notifier support Hans Verkuil [not found] ` <20170206102951.12623-1-hverkuil-qWit8jRvyhVmR6Xm/wNWPw@public.gmane.org> 2017-02-06 10:29 ` [PATCHv4 5/9] s5p-cec.txt: document the HDMI controller phandle Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil 2017-02-06 10:29 ` [PATCHv4 8/9] stih-cec: add HPD notifier support Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil 2017-02-08 23:17 ` Rob Herring 2017-02-08 23:17 ` Rob Herring 2017-02-06 10:29 ` [PATCHv4 9/9] arm: sti: update sti-cec for " Hans Verkuil 2017-02-06 10:29 ` Hans Verkuil
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=20170206102951.12623-4-hverkuil@xs4all.nl \ --to=hverkuil@xs4all.nl \ --cc=benjamin.gaignard@linaro.org \ --cc=daniel.vetter@intel.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=hans.verkuil@cisco.com \ --cc=inki.dae@samsung.com \ --cc=javier@osg.samsung.com \ --cc=krzk@kernel.org \ --cc=linux-media@vger.kernel.org \ --cc=linux-samsung-soc@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=m.szyprowski@samsung.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.