From: Peter Chen <peter.chen-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
To: Baolin Wang <baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Cc: balbi-l0cyMroinI0@public.gmane.org,
broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org,
sojka-Knnw/vAvyUalVyrhU4qvOw@public.gmane.org,
stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org,
r.baldyga-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
yoshihiro.shimoda.uh-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org,
linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
device-mainlining-cunTk1MwBs98uUxBSJOaYoYkZiVZrdSR2LY78lusg7I@public.gmane.org,
sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org,
dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org,
sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org,
patches-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org,
linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH v2 1/3] gadget: Support for the usb charger framework
Date: Mon, 17 Aug 2015 08:40:10 +0800 [thread overview]
Message-ID: <20150817004009.GB1864@shlinux2> (raw)
In-Reply-To: <33e56f632418b8e42162d5b64decb6ffc8de3e01.1439519412.git.baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
On Fri, Aug 14, 2015 at 05:47:44PM +0800, Baolin Wang wrote:
> The usb charger framework is based on usb gadget, and each usb gadget
> can be one usb charger to set the current limitation.
>
> This patch adds a notifier mechanism for usb charger to report to usb
> charger when the usb gadget state is changed.
>
> Also we introduce a callback 'get_charger_type' which will implemented
> by user for usb gadget operations to get the usb charger type.
>
> Signed-off-by: Baolin Wang <baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
> ---
> drivers/usb/gadget/udc/udc-core.c | 38 +++++++++++++++++++++++++++++++++++++
> include/linux/usb/gadget.h | 20 +++++++++++++++++++
> 2 files changed, 58 insertions(+)
>
> diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
> index f660afb..47b231c 100644
> --- a/drivers/usb/gadget/udc/udc-core.c
> +++ b/drivers/usb/gadget/udc/udc-core.c
> @@ -28,6 +28,7 @@
> #include <linux/usb/ch9.h>
> #include <linux/usb/gadget.h>
> #include <linux/usb.h>
> +#include <linux/usb/usb_charger.h>
>
> /**
> * struct usb_udc - describes one usb device controller
> @@ -129,6 +130,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 +253,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 +395,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
> @@ -405,6 +438,10 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
>
> mutex_unlock(&udc_lock);
>
> + ret = usb_charger_init(gadget);
> + if (ret)
> + goto err4;
> +
If the charger's initialization fails, you may need to
call device_del(&udc->dev).
Peter
> return 0;
>
> err4:
> @@ -481,6 +518,7 @@ void usb_del_gadget_udc(struct usb_gadget *gadget)
> kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
> flush_work(&gadget->work);
> device_unregister(&udc->dev);
> + usb_charger_exit(gadget);
> device_unregister(&gadget->dev);
> }
> EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index c14a69b..78cc862 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -537,6 +537,7 @@ struct usb_gadget_ops {
> struct usb_ep *(*match_ep)(struct usb_gadget *,
> struct usb_endpoint_descriptor *,
> struct usb_ss_ep_comp_descriptor *);
> + enum usb_charger_type (*get_charger_type)(struct usb_gadget *);
> };
>
> /**
> @@ -609,6 +610,9 @@ struct usb_gadget {
> unsigned out_epnum;
> unsigned in_epnum;
> struct usb_otg_caps *otg_caps;
> + struct raw_notifier_head nh;
> + struct usb_charger *uchger;
> + struct mutex lock;
>
> unsigned sg_supported:1;
> unsigned is_otg:1;
> @@ -1183,6 +1187,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
>
--
Best Regards,
Peter Chen
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Peter Chen <peter.chen@freescale.com>
To: Baolin Wang <baolin.wang@linaro.org>
Cc: <balbi@ti.com>, <broonie@kernel.org>, <linus.walleij@linaro.org>,
<linux-kernel@vger.kernel.org>, <gregkh@linuxfoundation.org>,
<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: Re: [PATCH v2 1/3] gadget: Support for the usb charger framework
Date: Mon, 17 Aug 2015 08:40:10 +0800 [thread overview]
Message-ID: <20150817004009.GB1864@shlinux2> (raw)
In-Reply-To: <33e56f632418b8e42162d5b64decb6ffc8de3e01.1439519412.git.baolin.wang@linaro.org>
On Fri, Aug 14, 2015 at 05:47:44PM +0800, Baolin Wang wrote:
> The usb charger framework is based on usb gadget, and each usb gadget
> can be one usb charger to set the current limitation.
>
> This patch adds a notifier mechanism for usb charger to report to usb
> charger when the usb gadget state is changed.
>
> Also we introduce a callback 'get_charger_type' which will implemented
> by user for usb gadget operations to get the usb charger type.
>
> Signed-off-by: Baolin Wang <baolin.wang@linaro.org>
> ---
> drivers/usb/gadget/udc/udc-core.c | 38 +++++++++++++++++++++++++++++++++++++
> include/linux/usb/gadget.h | 20 +++++++++++++++++++
> 2 files changed, 58 insertions(+)
>
> diff --git a/drivers/usb/gadget/udc/udc-core.c b/drivers/usb/gadget/udc/udc-core.c
> index f660afb..47b231c 100644
> --- a/drivers/usb/gadget/udc/udc-core.c
> +++ b/drivers/usb/gadget/udc/udc-core.c
> @@ -28,6 +28,7 @@
> #include <linux/usb/ch9.h>
> #include <linux/usb/gadget.h>
> #include <linux/usb.h>
> +#include <linux/usb/usb_charger.h>
>
> /**
> * struct usb_udc - describes one usb device controller
> @@ -129,6 +130,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 +253,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 +395,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
> @@ -405,6 +438,10 @@ int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
>
> mutex_unlock(&udc_lock);
>
> + ret = usb_charger_init(gadget);
> + if (ret)
> + goto err4;
> +
If the charger's initialization fails, you may need to
call device_del(&udc->dev).
Peter
> return 0;
>
> err4:
> @@ -481,6 +518,7 @@ void usb_del_gadget_udc(struct usb_gadget *gadget)
> kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
> flush_work(&gadget->work);
> device_unregister(&udc->dev);
> + usb_charger_exit(gadget);
> device_unregister(&gadget->dev);
> }
> EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index c14a69b..78cc862 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -537,6 +537,7 @@ struct usb_gadget_ops {
> struct usb_ep *(*match_ep)(struct usb_gadget *,
> struct usb_endpoint_descriptor *,
> struct usb_ss_ep_comp_descriptor *);
> + enum usb_charger_type (*get_charger_type)(struct usb_gadget *);
> };
>
> /**
> @@ -609,6 +610,9 @@ struct usb_gadget {
> unsigned out_epnum;
> unsigned in_epnum;
> struct usb_otg_caps *otg_caps;
> + struct raw_notifier_head nh;
> + struct usb_charger *uchger;
> + struct mutex lock;
>
> unsigned sg_supported:1;
> unsigned is_otg:1;
> @@ -1183,6 +1187,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
>
--
Best Regards,
Peter Chen
next prev parent reply other threads:[~2015-08-17 0:40 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-14 9:47 [PATCH v2 0/3] Introduce usb charger framework to deal with the usb gadget power negotation Baolin Wang
2015-08-14 9:47 ` [PATCH v2 1/3] gadget: Support for the usb charger framework Baolin Wang
[not found] ` <33e56f632418b8e42162d5b64decb6ffc8de3e01.1439519412.git.baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-08-17 0:40 ` Peter Chen [this message]
2015-08-17 0:40 ` Peter Chen
2015-08-17 2:08 ` Baolin Wang
2015-08-14 9:47 ` [PATCH v2 2/3] gadget: Introduce " Baolin Wang
2015-08-14 15:27 ` Greg KH
2015-08-17 3:03 ` Baolin Wang
2015-08-17 15:25 ` [Device-mainlining] " Tim Bird
[not found] ` <55D1FCDF.6060709-/MT0OVThwyLZJqsBc5GL+g@public.gmane.org>
2015-08-18 1:43 ` Baolin Wang
2015-08-18 1:43 ` Baolin Wang
2015-10-08 15:50 ` Pavel Machek
2015-10-08 16:23 ` Greg KH
[not found] ` <20151008162316.GA5833-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2015-10-08 17:04 ` Pavel Machek
2015-10-08 17:04 ` Pavel Machek
2015-10-08 17:16 ` Greg KH
2015-08-17 17:24 ` Mark Brown
2015-08-18 1:44 ` Baolin Wang
[not found] ` <cover.1439519412.git.baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-08-14 8:55 ` [PATCH v2 0/3] Introduce usb charger framework to deal with the usb gadget power negotation Li Jun
2015-08-14 8:55 ` Li Jun
2015-08-14 11:04 ` Baolin Wang
[not found] ` <CAMz4kuK7f=rGOO-YdB0AB8PzpTbnWZtasuQK8gOXLuM9zyn3gw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-08-17 1:15 ` Li Jun
2015-08-17 1:15 ` Li Jun
2015-08-17 6:02 ` Baolin Wang
[not found] ` <CAMz4kuJGR1ZQPbBNpp7EABJn=Rag8jSrb-2ztcefUf4R7pk4AQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-08-17 8:20 ` Li Jun
2015-08-17 8:20 ` Li Jun
2015-08-17 11:51 ` Baolin Wang
2015-08-17 11:51 ` Baolin Wang
2015-08-14 9:47 ` [PATCH v2 3/3] power: wm831x_power: Support USB charger current limit management Baolin Wang
2015-08-14 9:47 ` Baolin Wang
2015-08-14 10:42 ` Lee Jones
2015-08-17 1:07 ` Peter Chen
2015-08-17 1:07 ` Peter Chen
2015-08-17 17:26 ` Mark Brown
[not found] ` <20150817172623.GO10748-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-08-17 23:58 ` Felipe Balbi
2015-08-17 23:58 ` Felipe Balbi
2015-08-18 5:04 ` Mark Brown
2015-08-18 14:07 ` Felipe Balbi
2015-08-18 14:07 ` Felipe Balbi
2015-08-18 5:20 ` Peter Chen
2015-08-18 5:20 ` Peter Chen
2015-08-18 16:12 ` Mark Brown
[not found] ` <20150818161200.GK10748-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2015-08-19 0:02 ` Peter Chen
2015-08-19 0:02 ` Peter Chen
2015-08-19 16:36 ` Mark Brown
[not found] ` <f3bfd04bc157e97e2d0632b7ed2452f366f66488.1439519413.git.baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-08-20 9:02 ` David Laight
2015-08-20 9:02 ` David Laight
2015-08-21 2:28 ` Baolin Wang
2015-08-21 2:28 ` Baolin Wang
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=20150817004009.GB1864@shlinux2 \
--to=peter.chen-kzfg59tc24xl57midrcfdg@public.gmane.org \
--cc=balbi-l0cyMroinI0@public.gmane.org \
--cc=baolin.wang-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
--cc=device-mainlining-cunTk1MwBs98uUxBSJOaYoYkZiVZrdSR2LY78lusg7I@public.gmane.org \
--cc=dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=patches-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@public.gmane.org \
--cc=r.baldyga-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=sameo-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
--cc=sojka-Knnw/vAvyUalVyrhU4qvOw@public.gmane.org \
--cc=sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org \
--cc=yoshihiro.shimoda.uh-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org \
/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 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.