Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753598AbbHQCJD (ORCPT ); Sun, 16 Aug 2015 22:09:03 -0400 Received: from mail-yk0-f172.google.com ([209.85.160.172]:32839 "EHLO mail-yk0-f172.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752117AbbHQCJA (ORCPT ); Sun, 16 Aug 2015 22:09:00 -0400 MIME-Version: 1.0 In-Reply-To: <20150817004009.GB1864@shlinux2> References: <33e56f632418b8e42162d5b64decb6ffc8de3e01.1439519412.git.baolin.wang@linaro.org> <20150817004009.GB1864@shlinux2> Date: Mon, 17 Aug 2015 10:08:59 +0800 Message-ID: Subject: Re: [PATCH v2 1/3] gadget: Support for the usb charger framework From: Baolin Wang To: Peter Chen Cc: Felipe Balbi , Mark Brown , Linus Walleij , LKML , Greg KH , sojka@merica.cz, Alan Stern , r.baldyga@samsung.com, yoshihiro.shimoda.uh@renesas.com, linux-usb@vger.kernel.org, device-mainlining@lists.linuxfoundation.org, sre@kernel.org, Dmitry Eremin-Solenikov , David Woodhouse , sameo@linux.intel.com, Lee Jones , patches@opensource.wolfsonmicro.com, linux-pm@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5918 Lines: 174 On 17 August 2015 at 08:40, Peter Chen wrote: > 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 >> --- >> 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 >> #include >> #include >> +#include >> >> /** >> * 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). > Yes, I missed that. Thanks for your comments. > 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 -- Baolin.wang Best Regards -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/