linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Baolin Wang <baolin.wang@linaro.org>
To: balbi@ti.com
Cc: broonie@kernel.org, linus.walleij@linaro.org,
	linux-kernel@vger.kernel.org, baolin.wang@linaro.org,
	gregkh@linuxfoundation.org, peter.chen@freescale.com,
	sojka@merica.cz, stern@rowland.harvard.edu,
	r.baldyga@samsung.com, yoshihiro.shimoda.uh@renesas.com,
	linux-usb@vger.kernel.org,
	device-mainlining@lists.linuxfoundation.org, sre@kernel.org,
	dbaryshkov@gmail.com, dwmw2@infradead.org, sameo@linux.intel.com,
	lee.jones@linaro.org, patches@opensource.wolfsonmicro.com,
	linux-pm@vger.kernel.org
Subject: [PATCH v4 1/5] gadget: Introduce the notifier functions
Date: Wed, 19 Aug 2015 17:13:44 +0800	[thread overview]
Message-ID: <acd08255d6535082973a5e432c40433429544dbc.1439974219.git.baolin.wang@linaro.org> (raw)
In-Reply-To: <cover.1439974219.git.baolin.wang@linaro.org>
In-Reply-To: <cover.1439974219.git.baolin.wang@linaro.org>

The usb charger framework is based on usb gadget. The usb charger
need to be notified the state changing of usb gadget to confirm the
usb charger state.

Thus this patch adds a notifier mechanism for usb gadget to report a
event to usb charger when the usb gadget state is changed.

Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
---
 drivers/usb/gadget/udc/udc-core.c |   32 ++++++++++++++++++++++++++++++++
 include/linux/usb/gadget.h        |   18 ++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
index f660afb..4238fc3 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -129,6 +129,32 @@ void usb_gadget_giveback_request(struct usb_ep *ep,
 }
 EXPORT_SYMBOL_GPL(usb_gadget_giveback_request);
 
+int usb_gadget_register_notify(struct usb_gadget *gadget,
+			       struct notifier_block *nb)
+{
+	int ret;
+
+	mutex_lock(&gadget->lock);
+	ret = raw_notifier_chain_register(&gadget->nh, nb);
+	mutex_unlock(&gadget->lock);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(usb_gadget_register_notify);
+
+int usb_gadget_unregister_notify(struct usb_gadget *gadget,
+				 struct notifier_block *nb)
+{
+	int ret;
+
+	mutex_lock(&gadget->lock);
+	ret = raw_notifier_chain_unregister(&gadget->nh, nb);
+	mutex_unlock(&gadget->lock);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(usb_gadget_unregister_notify);
+
 /* ------------------------------------------------------------------------- */
 
 /**
@@ -226,6 +252,10 @@ static void usb_gadget_state_work(struct work_struct *work)
 	struct usb_gadget *gadget = work_to_gadget(work);
 	struct usb_udc *udc = gadget->udc;
 
+	mutex_lock(&gadget->lock);
+	raw_notifier_call_chain(&gadget->nh, gadget->state, gadget);
+	mutex_unlock(&gadget->lock);
+
 	if (udc)
 		sysfs_notify(&udc->dev.kobj, NULL, "state");
 }
@@ -364,6 +394,8 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
 
 	dev_set_name(&gadget->dev, "gadget");
 	INIT_WORK(&gadget->work, usb_gadget_state_work);
+	RAW_INIT_NOTIFIER_HEAD(&gadget->nh);
+	mutex_init(&gadget->lock);
 	gadget->dev.parent = parent;
 
 #ifdef	CONFIG_HAS_DMA
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index c14a69b..755e8bc 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -609,6 +609,8 @@ struct usb_gadget {
 	unsigned			out_epnum;
 	unsigned			in_epnum;
 	struct usb_otg_caps		*otg_caps;
+	struct raw_notifier_head	nh;
+	struct mutex			lock;
 
 	unsigned			sg_supported:1;
 	unsigned			is_otg:1;
@@ -1183,6 +1185,22 @@ extern void usb_gadget_unmap_request(struct usb_gadget *gadget,
 
 /*-------------------------------------------------------------------------*/
 
+/**
+ * Register a notifiee to get notified by any attach status changes from
+ * the usb gadget
+ */
+int usb_gadget_register_notify(struct usb_gadget *gadget,
+			       struct notifier_block *nb);
+
+/*-------------------------------------------------------------------------*/
+
+
+/* Unregister a notifiee from the usb gadget */
+int usb_gadget_unregister_notify(struct usb_gadget *gadget,
+				 struct notifier_block *nb);
+
+/*-------------------------------------------------------------------------*/
+
 /* utility to set gadget state properly */
 
 extern void usb_gadget_set_state(struct usb_gadget *gadget,
-- 
1.7.9.5


  reply	other threads:[~2015-08-19  9:14 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-08-19  9:13 [PATCH v4 0/5] Introduce usb charger framework to deal with the usb gadget power negotation Baolin Wang
2015-08-19  9:13 ` Baolin Wang [this message]
2015-08-19  9:13 ` [PATCH v4 2/5] gadget: Introduce the usb charger framework Baolin Wang
2015-08-19  9:13 ` [PATCH v4 3/5] gadget: Support for " Baolin Wang
2015-08-19 12:56   ` Sergei Shtylyov
2015-08-20  1:42     ` Baolin Wang
2015-08-19  9:13 ` [PATCH v4 4/5] gadget: Integrate with the usb gadget supporting for usb charger Baolin Wang
2015-08-19  9:13 ` [PATCH v4 5/5] power: wm831x_power: Support USB charger current limit management Baolin Wang
2015-08-19  9:56   ` Lee Jones
2015-08-19 10:27     ` Baolin Wang
2015-08-19 16:24   ` Mark Brown
2015-08-20  1:32     ` Baolin Wang
2015-09-24 17:39 [PATCH v4 0/5] Introduce usb charger framework to deal with the usb gadget power negotation Baolin Wang
2015-09-24 17:39 ` [PATCH v4 1/5] gadget: Introduce the notifier functions Baolin Wang
2015-10-01 17:29   ` Felipe Balbi
2015-10-01 17:43     ` Mark Brown
2015-10-01 17:58       ` Felipe Balbi
2015-10-01 18:01         ` Felipe Balbi
2015-10-02 16:47         ` Mark Brown
2015-10-02 17:23           ` Felipe Balbi
2015-10-02 18:49             ` Mark Brown
2015-10-02 19:11               ` Felipe Balbi
2015-10-04 22:55                 ` Mark Brown
2015-10-05 15:15                   ` Felipe Balbi
2015-10-05 16:18                     ` Mark Brown
2015-10-05 16:29                       ` Felipe Balbi
2015-10-08 15:51         ` Pavel Machek
2015-10-02  5:41     ` Greg KH
2015-10-02 17:27       ` Felipe Balbi
2015-10-08 15:50     ` Pavel Machek
2015-10-09 21:17       ` Felipe Balbi
2015-10-12 16:56         ` Mark Brown
2016-04-09 16:01         ` Pavel Machek

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=acd08255d6535082973a5e432c40433429544dbc.1439974219.git.baolin.wang@linaro.org \
    --to=baolin.wang@linaro.org \
    --cc=balbi@ti.com \
    --cc=broonie@kernel.org \
    --cc=dbaryshkov@gmail.com \
    --cc=device-mainlining@lists.linuxfoundation.org \
    --cc=dwmw2@infradead.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=lee.jones@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=patches@opensource.wolfsonmicro.com \
    --cc=peter.chen@freescale.com \
    --cc=r.baldyga@samsung.com \
    --cc=sameo@linux.intel.com \
    --cc=sojka@merica.cz \
    --cc=sre@kernel.org \
    --cc=stern@rowland.harvard.edu \
    --cc=yoshihiro.shimoda.uh@renesas.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;
as well as URLs for NNTP newsgroup(s).