Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp5073919ybi; Tue, 4 Jun 2019 00:25:45 -0700 (PDT) X-Google-Smtp-Source: APXvYqyCMummWzH53//LfhKBiRN1L3/DTGJs8gND0VCIF12TBt2gGYEn7x4sz3quUGoPYurabcog X-Received: by 2002:a62:a508:: with SMTP id v8mr35589833pfm.87.1559633145116; Tue, 04 Jun 2019 00:25:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559633145; cv=none; d=google.com; s=arc-20160816; b=wKz7lmxB+CMxO3xwFkcEEDr5sGL5592I6UkJwtm9vBvj9aSiHrHk8QnQaLTMzu6zhg qd3laOp43VTmLHmZkYhgKTifQISozC6k6cS1OBInMJ/q8aL/7AnL5J/X4nj/I0ygyU4s nEUcwUzgRyu/82z0u9epa+WFs8bhQe6mW5ZiId4bx21Gz0uUVjnQdufWAw8j5x2wug9Z 6DkkKB7JPMSBAbk+XJe5xYR4seBGV22I52cR6o6XaaCcjskyUkitLz4uqxu6d+FpaEqa 8B2AWjnUa/YqgJpjG4qG6o477PBPbf9Yy+npof+M2c7eg8O8s7JX6PlD7AOdlkzMcah4 u3dQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:mail-followup-to :message-id:subject:cc:to:from:date:dkim-signature; bh=0dFsy2rFq42UkS0Ssk/MAyWGgrB545kfwphM4t8ezSc=; b=YrE3wMJjkI+no+vY+raRuB+/SGYpvx89CeOOq2ooYotVg4KZPVm1I7Oy/6i3G90Tlv 7N9MdWjc3zUNPgN6/hI9t+vtXt8XSAY94Nm0qs419tAT6J44qIydP5W7RnfNhVwJMLXN oKcBUvrrlqb/kzs3a1Xih8qh5StepHrTeuKSQOCIckT2Wzph2NTtPqnWCLBUtWZq1ERf tuA4VrqT24ioy8RRa3IWjAIKKllaTMKs+9dNzR2Sf4alrNSb4+0X3qsRc/sYTJNgbE8S HibGS3uKBdjzljZgTv8HjddxIwwAY8JrIF6P3EBsPDBnFH7D9uA4xn26162uzSbP0j/O Y35w== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@ffwll.ch header.s=google header.b=iZMQr78a; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g10si18517386pgq.36.2019.06.04.00.25.28; Tue, 04 Jun 2019 00:25:45 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@ffwll.ch header.s=google header.b=iZMQr78a; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726729AbfFDHYR (ORCPT + 99 others); Tue, 4 Jun 2019 03:24:17 -0400 Received: from mail-ed1-f68.google.com ([209.85.208.68]:41991 "EHLO mail-ed1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726589AbfFDHYR (ORCPT ); Tue, 4 Jun 2019 03:24:17 -0400 Received: by mail-ed1-f68.google.com with SMTP id z25so4501780edq.9 for ; Tue, 04 Jun 2019 00:24:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=sender:date:from:to:cc:subject:message-id:mail-followup-to :references:mime-version:content-disposition:in-reply-to:user-agent; bh=0dFsy2rFq42UkS0Ssk/MAyWGgrB545kfwphM4t8ezSc=; b=iZMQr78avGqnpdFR3M8ew6qZGFcrKOgD85gDYWN8ueczWlthRtz3N7pjF+Y5LtCJkM HSVkIaVXMniJCwAWHFgjMh2xNVO+bMHo/xdKtf+YS2U3WvwMvCPsIlfl2rGC8ZUgA1my B87WeTsT1NmKjZqEiFkX31S1U1Y4e5g6oHgUU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :mail-followup-to:references:mime-version:content-disposition :in-reply-to:user-agent; bh=0dFsy2rFq42UkS0Ssk/MAyWGgrB545kfwphM4t8ezSc=; b=ErUOnOipIMnVchaW4f0k8F+ySTULWMCBx+hKLsLWJRjya3hd3lVCDOZd8UEIeMgIxr RZ5y6Z+CCIJvFA/zYQiHxTT5d2bT2pm5j63d6sGqE5z7hGl/nWPdLOlrJbtVNTcckzdM 7jqy80Qmo+v473XJG1oGtMxXCJgp61QEXrGdm8S30xL3z+wfhkPQGI5VBfoXPa6UVjww FV/1Qek7QrPiACRPlJHHuLkUxZFJ9RHoOFzXHN7LViwL6zJkXkoHTWsim9f2KMGU7vqO DeH5M2nwq3z1q7aGMMC+VC4CbW3lEilUAcPioi+oKX4uiaJoZwdTVO9RpxoK7HnVPs3z rX4w== X-Gm-Message-State: APjAAAVNbnguJUvHvzuXtQhDV5JaOUpjrdgWiocV2HR9lf46Kf6YC5jv IOwNSLDu0ZR1ZqfKt3q0NC0UsQ== X-Received: by 2002:a17:906:844:: with SMTP id f4mr443008ejd.118.1559633054859; Tue, 04 Jun 2019 00:24:14 -0700 (PDT) Received: from phenom.ffwll.local ([2a02:168:569e:0:3106:d637:d723:e855]) by smtp.gmail.com with ESMTPSA id b10sm3019458eja.58.2019.06.04.00.24.12 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 04 Jun 2019 00:24:13 -0700 (PDT) Date: Tue, 4 Jun 2019 09:24:11 +0200 From: Daniel Vetter To: Cheng-yi Chiang Cc: Hans Verkuil , linux-kernel , Bartlomiej Zolnierkiewicz , Greg Kroah-Hartman , Philipp Zabel , Mark Brown , Liam Girdwood , Takashi Iwai , Jaroslav Kysela , Russell King , Andrzej Hajda , Laurent Pinchart , David Airlie , Rob Herring , Heiko Stuebner , Doug Anderson , Dylan Reid , tzungbi@chromium.org, linux-media@vger.kernel.org, "moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM..." , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, Dariusz Marcinkiewicz , Daniel Vetter Subject: Re: [PATCH 1/7] video: add HDMI state notifier support Message-ID: <20190604072411.GP21222@phenom.ffwll.local> Mail-Followup-To: Cheng-yi Chiang , Hans Verkuil , linux-kernel , Bartlomiej Zolnierkiewicz , Greg Kroah-Hartman , Philipp Zabel , Mark Brown , Liam Girdwood , Takashi Iwai , Jaroslav Kysela , Russell King , Andrzej Hajda , Laurent Pinchart , David Airlie , Rob Herring , Heiko Stuebner , Doug Anderson , Dylan Reid , tzungbi@chromium.org, linux-media@vger.kernel.org, "moderated list:SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEM..." , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, Dariusz Marcinkiewicz References: <20190603043251.226549-1-cychiang@chromium.org> <20190603043251.226549-2-cychiang@chromium.org> <41e7052b-a58c-5a8c-5d94-37237e0c2070@xs4all.nl> <20190603080931.GG21222@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Operating-System: Linux phenom 4.14.0-3-amd64 User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jun 04, 2019 at 10:32:50AM +0800, Cheng-yi Chiang wrote: > On Mon, Jun 3, 2019 at 4:09 PM Daniel Vetter wrote: > > > > On Mon, Jun 03, 2019 at 09:45:49AM +0200, Hans Verkuil wrote: > > > On 6/3/19 6:32 AM, Cheng-Yi Chiang wrote: > > > > From: Hans Verkuil > > > > > > > > Add support for HDMI hotplug and EDID notifiers, which is used to convey > > > > information from HDMI drivers to their CEC and audio counterparts. > > > > > > > > Based on an earlier version from Russell King: > > > > > > > > https://patchwork.kernel.org/patch/9277043/ > > > > > > > > The hdmi_notifier is a reference counted object containing the HDMI state > > > > of an HDMI device. > > > > > > > > When a new notifier is registered the current state will be reported to > > > > that notifier at registration time. > > > > > > > > Based on Hans Verkuil's patch: > > > > > > > > https://patchwork.kernel.org/patch/9472521/ > > > > > > Erm, you are aware that this patch morphed into a CEC-specific notifier > > > found in drivers/media/cec/cec-notifier.c? > > > > > > I don't think it makes sense to have two notifier implementations in the kernel. > > > The original intention was to have the notifier deal with both CEC and ASoC > > > notifications, but there was not enough interest for the ASoC bits at the time > > > and it was dropped. > > > > > > I am planning changes to the cec-notifier API, I hope to work on that this > > > week. I'll CC you when I post those. Those might be a good starting point > > > to convert the cec-notifier to an hdmi-notifier as was originally intended. > > > > > > I've added your colleague Dariusz Marcinkiewicz to the CC list since he's been > > > working on some nice cec-notifier improvements as well. > > > > We also have some interfaces for drm/alsa interactions around hdmi > > already in drm/drm_audio_component.h, but it's not used by anything > > outside of i915. Imo we should extend that, not reinvent a new wheel. > > > Hi Daniel, > Thank you for the pointer. Looking at the ops, it seems that it is > specific to HDA. > I am not familiar with drm and HDA. I am not sure how applicable it > would be to report jack status to ASoC. > There is a use case in sound/soc/codecs/hdac_hdmi.c though so it > should be possible. Currently hda is the only user, but the idea was to make it more generic. Jack status in alsa is what drm calls connector status btw. So if we can take that as a baseline and extend it (probably needs some registration boilerplate and helpers to look up the right endpoint using of/dt for soc systems, we use component.c in i915/hda for this), that would be great I think. > > Another note: notifiers considered evil, imo. Gets the job done for one > > case, as soon as you have multiple devices and need to make sure you get > > the update for the right one it all comes crashing down. Please create an > > api which registers for updates from a specific device only, plus > > something that has real callbacks (like the drm_audio_component.h thing we > > started already). > > To clarify a bit, this hdmi-notifier indeed supports updating from a > specific device only. > hdmi_notifier_get takes a device and return the notifier. Hm I missed that, I thought it's global, so one of my usual notifier concerns addressed. > It seems that a major difference between drm_audio_components and > hdmi-notifier is that > drm_audio_components defines all supported ops in drm_audio_component_audio_ops. > On the other hand, hdmi-notifier passes different events using an enum > like HDMI_CONNECTED and let listener handle different events. > In this regard I agree with you that drm_audio_component is cleaner. > Anyway, I will look into it a bit more and see how it works. Yeah I think if we could combine the approach, i.e. notifier side for registration, some _ops structure for the actual notifications, then there's a solid interface. I just really don't like the opaque void * interface notifier provides, it encourages abuse way too much. Ofc the registration side would then no longer be based on the notifier datastructure, list_head (like cec-notifier.c) of registeres devices with their _ops structure should be enough. -Daniel > > Thanks again! > > > -Daniel > > > > > > > > Regards, > > > > > > Hans > > > > > > > > > > > Modified by Cheng-Yi Chiang: > > > > - Add a section in MAINTAINER. > > > > - Changes connected and has_eld to bitfield of unsigned int. > > > > - Other minor fixes to pass checkpatch.pl --strict checks. > > > > > > > > Signed-off-by: Hans Verkuil > > > > Acked-by: Philipp Zabel > > > > Signed-off-by: Cheng-Yi Chiang > > > > --- > > > > The original patch is at > > > > https://lore.kernel.org/linux-arm-kernel/20161213150813.37966-2-hverkuil@xs4all.nl > > > > > > > > MAINTAINERS | 6 ++ > > > > drivers/video/Kconfig | 3 + > > > > drivers/video/Makefile | 1 + > > > > drivers/video/hdmi-notifier.c | 145 ++++++++++++++++++++++++++++++++++ > > > > include/linux/hdmi-notifier.h | 112 ++++++++++++++++++++++++++ > > > > 5 files changed, 267 insertions(+) > > > > create mode 100644 drivers/video/hdmi-notifier.c > > > > create mode 100644 include/linux/hdmi-notifier.h > > > > > > > > diff --git a/MAINTAINERS b/MAINTAINERS > > > > index 5cfbea4ce575..ffb7376f9509 100644 > > > > --- a/MAINTAINERS > > > > +++ b/MAINTAINERS > > > > @@ -16676,6 +16676,12 @@ W: https://linuxtv.org > > > > S: Maintained > > > > F: drivers/media/platform/vicodec/* > > > > > > > > +VIDEO FRAMEWORK > > > > +M: Hans Verkuil > > > > +L: linux-media@vger.kernel.org > > > > +F: drivers/video/hdmi-notifier.* > > > > +S: Maintained > > > > + > > > > VIDEO MULTIPLEXER DRIVER > > > > M: Philipp Zabel > > > > L: linux-media@vger.kernel.org > > > > diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig > > > > index 83d3d271ca15..000ba9bc0ae7 100644 > > > > --- a/drivers/video/Kconfig > > > > +++ b/drivers/video/Kconfig > > > > @@ -34,6 +34,9 @@ config VIDEOMODE_HELPERS > > > > config HDMI > > > > bool > > > > > > > > +config HDMI_NOTIFIERS > > > > + bool > > > > + > > > > endif # HAS_IOMEM > > > > > > > > if VT > > > > diff --git a/drivers/video/Makefile b/drivers/video/Makefile > > > > index df7650adede9..eff4736102ca 100644 > > > > --- a/drivers/video/Makefile > > > > +++ b/drivers/video/Makefile > > > > @@ -1,6 +1,7 @@ > > > > # SPDX-License-Identifier: GPL-2.0 > > > > obj-$(CONFIG_VGASTATE) += vgastate.o > > > > obj-$(CONFIG_HDMI) += hdmi.o > > > > +obj-$(CONFIG_HDMI_NOTIFIERS) += hdmi-notifier.o > > > > > > > > obj-$(CONFIG_VT) += console/ > > > > obj-$(CONFIG_FB_STI) += console/ > > > > diff --git a/drivers/video/hdmi-notifier.c b/drivers/video/hdmi-notifier.c > > > > new file mode 100644 > > > > index 000000000000..d1eedf661648 > > > > --- /dev/null > > > > +++ b/drivers/video/hdmi-notifier.c > > > > @@ -0,0 +1,145 @@ > > > > +// SPDX-License-Identifier: GPL-2.0 > > > > +/* hdmi-notifier.c - notify interested parties of (dis)connect and EDID > > > > + * events > > > > + * > > > > + * Copyright 2016 Russell King > > > > + * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. > > > > + * All rights reserved. > > > > + */ > > > > + > > > > +#include > > > > +#include > > > > +#include > > > > +#include > > > > +#include > > > > + > > > > +static LIST_HEAD(hdmi_notifiers); > > > > +static DEFINE_MUTEX(hdmi_notifiers_lock); > > > > + > > > > +struct hdmi_notifier *hdmi_notifier_get(struct device *dev) > > > > +{ > > > > + struct hdmi_notifier *n; > > > > + > > > > + mutex_lock(&hdmi_notifiers_lock); > > > > + list_for_each_entry(n, &hdmi_notifiers, head) { > > > > + if (n->dev == dev) { > > > > + mutex_unlock(&hdmi_notifiers_lock); > > > > + kref_get(&n->kref); > > > > + return n; > > > > + } > > > > + } > > > > + n = kzalloc(sizeof(*n), GFP_KERNEL); > > > > + if (!n) > > > > + goto unlock; > > > > + n->dev = dev; > > > > + mutex_init(&n->lock); > > > > + BLOCKING_INIT_NOTIFIER_HEAD(&n->notifiers); > > > > + kref_init(&n->kref); > > > > + list_add_tail(&n->head, &hdmi_notifiers); > > > > +unlock: > > > > + mutex_unlock(&hdmi_notifiers_lock); > > > > + return n; > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_notifier_get); > > > > + > > > > +static void hdmi_notifier_release(struct kref *kref) > > > > +{ > > > > + struct hdmi_notifier *n = > > > > + container_of(kref, struct hdmi_notifier, kref); > > > > + > > > > + mutex_lock(&hdmi_notifiers_lock); > > > > + list_del(&n->head); > > > > + mutex_unlock(&hdmi_notifiers_lock); > > > > + kfree(n->edid); > > > > + kfree(n); > > > > +} > > > > + > > > > +void hdmi_notifier_put(struct hdmi_notifier *n) > > > > +{ > > > > + kref_put(&n->kref, hdmi_notifier_release); > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_notifier_put); > > > > + > > > > +int hdmi_notifier_register(struct hdmi_notifier *n, struct notifier_block *nb) > > > > +{ > > > > + int ret = blocking_notifier_chain_register(&n->notifiers, nb); > > > > + > > > > + if (ret) > > > > + return ret; > > > > + kref_get(&n->kref); > > > > + mutex_lock(&n->lock); > > > > + if (n->connected) { > > > > + blocking_notifier_call_chain(&n->notifiers, HDMI_CONNECTED, n); > > > > + if (n->edid_size) > > > > + blocking_notifier_call_chain(&n->notifiers, > > > > + HDMI_NEW_EDID, n); > > > > + if (n->has_eld) > > > > + blocking_notifier_call_chain(&n->notifiers, > > > > + HDMI_NEW_ELD, n); > > > > + } > > > > + mutex_unlock(&n->lock); > > > > + return 0; > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_notifier_register); > > > > + > > > > +int hdmi_notifier_unregister(struct hdmi_notifier *n, struct notifier_block *nb) > > > > +{ > > > > + int ret = blocking_notifier_chain_unregister(&n->notifiers, nb); > > > > + > > > > + if (ret == 0) > > > > + hdmi_notifier_put(n); > > > > + return ret; > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_notifier_unregister); > > > > + > > > > +void hdmi_event_connect(struct hdmi_notifier *n) > > > > +{ > > > > + mutex_lock(&n->lock); > > > > + n->connected = true; > > > > + blocking_notifier_call_chain(&n->notifiers, HDMI_CONNECTED, n); > > > > + mutex_unlock(&n->lock); > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_event_connect); > > > > + > > > > +void hdmi_event_disconnect(struct hdmi_notifier *n) > > > > +{ > > > > + mutex_lock(&n->lock); > > > > + n->connected = false; > > > > + n->has_eld = false; > > > > + n->edid_size = 0; > > > > + blocking_notifier_call_chain(&n->notifiers, HDMI_DISCONNECTED, n); > > > > + mutex_unlock(&n->lock); > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_event_disconnect); > > > > + > > > > +int hdmi_event_new_edid(struct hdmi_notifier *n, const void *edid, size_t size) > > > > +{ > > > > + mutex_lock(&n->lock); > > > > + if (n->edid_allocated_size < size) { > > > > + void *p = kmalloc(size, GFP_KERNEL); > > > > + > > > > + if (!p) { > > > > + mutex_unlock(&n->lock); > > > > + return -ENOMEM; > > > > + } > > > > + kfree(n->edid); > > > > + n->edid = p; > > > > + n->edid_allocated_size = size; > > > > + } > > > > + memcpy(n->edid, edid, size); > > > > + n->edid_size = size; > > > > + blocking_notifier_call_chain(&n->notifiers, HDMI_NEW_EDID, n); > > > > + mutex_unlock(&n->lock); > > > > + return 0; > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_event_new_edid); > > > > + > > > > +void hdmi_event_new_eld(struct hdmi_notifier *n, const u8 eld[128]) > > > > +{ > > > > + mutex_lock(&n->lock); > > > > + memcpy(n->eld, eld, sizeof(n->eld)); > > > > + n->has_eld = true; > > > > + blocking_notifier_call_chain(&n->notifiers, HDMI_NEW_ELD, n); > > > > + mutex_unlock(&n->lock); > > > > +} > > > > +EXPORT_SYMBOL_GPL(hdmi_event_new_eld); > > > > diff --git a/include/linux/hdmi-notifier.h b/include/linux/hdmi-notifier.h > > > > new file mode 100644 > > > > index 000000000000..c8f35110e3e3 > > > > --- /dev/null > > > > +++ b/include/linux/hdmi-notifier.h > > > > @@ -0,0 +1,112 @@ > > > > +/* SPDX-License-Identifier: GPL-2.0 > > > > + * hdmi-notifier.h - notify interested parties of (dis)connect and EDID > > > > + * events > > > > + * > > > > + * Copyright 2016 Russell King > > > > + * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. > > > > + * All rights reserved. > > > > + */ > > > > + > > > > +#ifndef LINUX_HDMI_NOTIFIER_H > > > > +#define LINUX_HDMI_NOTIFIER_H > > > > + > > > > +#include > > > > +#include > > > > +#include > > > > + > > > > +enum { > > > > + HDMI_CONNECTED, > > > > + HDMI_DISCONNECTED, > > > > + HDMI_NEW_EDID, > > > > + HDMI_NEW_ELD, > > > > +}; > > > > + > > > > +struct device; > > > > + > > > > +struct hdmi_notifier { > > > > + /* Lock to protect callback registration and notification. */ > > > > + struct mutex lock; > > > > + struct list_head head; > > > > + struct kref kref; > > > > + struct blocking_notifier_head notifiers; > > > > + struct device *dev; > > > > + > > > > + /* Current state */ > > > > + unsigned int connected : 1; > > > > + unsigned int has_eld : 1; > > > > + unsigned char eld[128]; > > > > + void *edid; > > > > + size_t edid_size; > > > > + size_t edid_allocated_size; > > > > +}; > > > > + > > > > +/** > > > > + * hdmi_notifier_get - find or create a new hdmi_notifier for the given device. > > > > + * @dev: device that sends the events. > > > > + * > > > > + * If a notifier for device @dev already exists, then increase the refcount > > > > + * and return that notifier. > > > > + * > > > > + * If it doesn't exist, then allocate a new notifier struct and return a > > > > + * pointer to that new struct. > > > > + * > > > > + * Return NULL if the memory could not be allocated. > > > > + */ > > > > +struct hdmi_notifier *hdmi_notifier_get(struct device *dev); > > > > + > > > > +/** > > > > + * hdmi_notifier_put - decrease refcount and delete when the refcount reaches 0. > > > > + * @n: notifier > > > > + */ > > > > +void hdmi_notifier_put(struct hdmi_notifier *n); > > > > + > > > > +/** > > > > + * hdmi_notifier_register - register the notifier with the notifier_block. > > > > + * @n: the HDMI notifier > > > > + * @nb: the notifier_block > > > > + */ > > > > +int hdmi_notifier_register(struct hdmi_notifier *n, struct notifier_block *nb); > > > > + > > > > +/** > > > > + * hdmi_notifier_unregister - unregister the notifier with the notifier_block. > > > > + * @n: the HDMI notifier > > > > + * @nb: the notifier_block > > > > + */ > > > > +int hdmi_notifier_unregister(struct hdmi_notifier *n, > > > > + struct notifier_block *nb); > > > > + > > > > +/** > > > > + * hdmi_event_connect - send a connect event. > > > > + * @n: the HDMI notifier > > > > + * > > > > + * Send an HDMI_CONNECTED event to any registered parties. > > > > + */ > > > > +void hdmi_event_connect(struct hdmi_notifier *n); > > > > + > > > > +/** > > > > + * hdmi_event_disconnect - send a disconnect event. > > > > + * @n: the HDMI notifier > > > > + * > > > > + * Send an HDMI_DISCONNECTED event to any registered parties. > > > > + */ > > > > +void hdmi_event_disconnect(struct hdmi_notifier *n); > > > > + > > > > +/** > > > > + * hdmi_event_new_edid - send a new EDID event. > > > > + * @n: the HDMI notifier > > > > + * > > > > + * Send an HDMI_NEW_EDID event to any registered parties. > > > > + * This function will make a copy the EDID so it can return -ENOMEM if > > > > + * no memory could be allocated. > > > > + */ > > > > +int hdmi_event_new_edid(struct hdmi_notifier *n, const void *edid, size_t size); > > > > + > > > > +/** > > > > + * hdmi_event_new_eld - send a new ELD event. > > > > + * @n: the HDMI notifier > > > > + * > > > > + * Send an HDMI_NEW_ELD event to any registered parties. > > > > + */ > > > > +void hdmi_event_new_eld(struct hdmi_notifier *n, const u8 eld[128]); > > > > + > > > > +#endif > > > > > > > > > > > -- > > Daniel Vetter > > Software Engineer, Intel Corporation > > http://blog.ffwll.ch -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch