Re: [PATCH v2 1/3] gadget: Support for the usb charger framework

2015-08-16 Thread Baolin Wang
On 17 August 2015 at 08:40, Peter Chen peter.c...@freescale.com 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 baolin.w...@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).


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 {
   unsignedout_epnum;
   unsignedin_epnum;
   struct usb_otg_caps *otg_caps;
 + struct raw_notifier_headnh;
 + struct usb_charger  *uchger;
 + struct mutexlock;

   unsignedsg_supported:1;
   unsignedis_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,
 + 

Re: [PATCH v2 1/3] gadget: Support for the usb charger framework

2015-08-16 Thread Peter Chen
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.w...@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 {
   unsignedout_epnum;
   unsignedin_epnum;
   struct usb_otg_caps *otg_caps;
 + struct raw_notifier_headnh;
 + struct usb_charger  *uchger;
 + struct mutexlock;
  
   unsignedsg_supported:1;
   unsignedis_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);
 +
 

[PATCH v2 1/3] gadget: Support for the usb charger framework

2015-08-14 Thread Baolin Wang
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.w...@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;
+
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 {
unsignedout_epnum;
unsignedin_epnum;
struct usb_otg_caps *otg_caps;
+   struct raw_notifier_headnh;
+   struct usb_charger  *uchger;
+   struct mutexlock;
 
unsignedsg_supported:1;
unsignedis_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

--
To unsubscribe from this list: send the line