Re: [PATCH v6 2/4] usb: gadget: Refactor request completion

2014-09-29 Thread Michal Sojka
On Mon, Sep 29 2014, Robert Baldyga wrote:
 Hi,

 On 09/24/2014 10:43 PM, Michal Sojka wrote:
 Use the recently introduced usb_gadget_giveback_request() in favor of
 direct invocation of the completion routine.
 
 All places in drivers/usb/ matching [-.]complete( were replaced with a
 call to usb_gadget_giveback_request(). This was compile-tested with all
 ARM drivers enabled and runtime-tested for musb.
 
 Signed-off-by: Michal Sojka so...@merica.cz

[...]

 diff --git a/drivers/usb/gadget/udc/fsl_qe_udc.c 
 b/drivers/usb/gadget/udc/fsl_qe_udc.c
 index 7324308..dd18ea3 100644
 --- a/drivers/usb/gadget/udc/fsl_qe_udc.c
 +++ b/drivers/usb/gadget/udc/fsl_qe_udc.c
 @@ -118,10 +118,7 @@ static void done(struct qe_ep *ep, struct qe_req *req, 
 int status)
  ep-stopped = 1;
  spin_unlock(udc-lock);
  
 -/* this complete() should a func implemented by gadget layer,
 - * eg fsg-bulk_in_complete() */
 -if (req-req.complete)
 -req-req.complete(ep-ep, req-req);
 +usb_gadget_giveback_request(ep-ep, req-req);

 It looks like you have omitted if() statement. Are you sure that request
 has set complete() callback?

Yes, see the rest of the thread. This was suggested by other reviewers.

-Michal
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v6 1/4] usb: gadget: Introduce usb_gadget_giveback_request()

2014-09-24 Thread Michal Sojka
All USB peripheral controller drivers call completion routines directly.
This patch adds usb_gadget_giveback_request() which will be used instead
of direct invocation in the next patch. The goal here is to have a place
where common functionality can be added.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/gadget/udc/udc-core.c | 16 
 include/linux/usb/gadget.h|  8 
 2 files changed, 24 insertions(+)

diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index b0d9817..f7b3151 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -106,6 +106,22 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 
 /* - */
 
+/**
+ * usb_gadget_giveback_request - give the request back to the gadget layer
+ * Context: in_interrupt()
+ *
+ * This is called by device controller drivers in order to return the
+ * completed request back to the gadget layer.
+ */
+void usb_gadget_giveback_request(struct usb_ep *ep,
+   struct usb_request *req)
+{
+   req-complete(ep, req);
+}
+EXPORT_SYMBOL_GPL(usb_gadget_giveback_request);
+
+/* - */
+
 static void usb_gadget_state_work(struct work_struct *work)
 {
struct usb_gadget   *gadget = work_to_gadget(work);
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index c3a6185..f795e95 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -1013,6 +1013,14 @@ extern void usb_gadget_set_state(struct usb_gadget 
*gadget,
 
 /*-*/
 
+/* utility to give requests back to the gadget layer */
+
+extern void usb_gadget_giveback_request(struct usb_ep *ep,
+   struct usb_request *req);
+
+
+/*-*/
+
 /* utility wrapping a simple endpoint selection policy */
 
 extern struct usb_ep *usb_ep_autoconfig(struct usb_gadget *,
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v6 3/4] usb: Rename usb-common.c

2014-09-24 Thread Michal Sojka
In the next commit, we will want the usb-common module to be composed of
two object files. Since Kbuild cannot append another object to an
existing one, we need to rename usb-common.c to something
else (common.c) and create usb-common.o by linking the wanted objects
together. Currently, usb-common.o comprises only common.o.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/common/Makefile |   4 +-
 drivers/usb/common/common.c | 144 
 drivers/usb/common/usb-common.c | 144 
 3 files changed, 147 insertions(+), 145 deletions(-)
 create mode 100644 drivers/usb/common/common.c
 delete mode 100644 drivers/usb/common/usb-common.c

diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 7526461..052c120 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -2,5 +2,7 @@
 # Makefile for the usb common parts.
 #
 
-obj-$(CONFIG_USB_COMMON) += usb-common.o
+obj-$(CONFIG_USB_COMMON) += usb-common.o
+usb-common-y += common.o
+
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/common.c b/drivers/usb/common/common.c
new file mode 100644
index 000..6dfd30a
--- /dev/null
+++ b/drivers/usb/common/common.c
@@ -0,0 +1,144 @@
+/*
+ * Provides code common for host and device side USB.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ *
+ * If either host side (ie. CONFIG_USB=y) or device side USB stack
+ * (ie. CONFIG_USB_GADGET=y) is compiled in the kernel, this module is
+ * compiled-in as well.  Otherwise, if either of the two stacks is
+ * compiled as module, this file is compiled as module as well.
+ */
+
+#include linux/kernel.h
+#include linux/module.h
+#include linux/of.h
+#include linux/usb/ch9.h
+#include linux/usb/of.h
+#include linux/usb/otg.h
+
+const char *usb_otg_state_string(enum usb_otg_state state)
+{
+   static const char *const names[] = {
+   [OTG_STATE_A_IDLE] = a_idle,
+   [OTG_STATE_A_WAIT_VRISE] = a_wait_vrise,
+   [OTG_STATE_A_WAIT_BCON] = a_wait_bcon,
+   [OTG_STATE_A_HOST] = a_host,
+   [OTG_STATE_A_SUSPEND] = a_suspend,
+   [OTG_STATE_A_PERIPHERAL] = a_peripheral,
+   [OTG_STATE_A_WAIT_VFALL] = a_wait_vfall,
+   [OTG_STATE_A_VBUS_ERR] = a_vbus_err,
+   [OTG_STATE_B_IDLE] = b_idle,
+   [OTG_STATE_B_SRP_INIT] = b_srp_init,
+   [OTG_STATE_B_PERIPHERAL] = b_peripheral,
+   [OTG_STATE_B_WAIT_ACON] = b_wait_acon,
+   [OTG_STATE_B_HOST] = b_host,
+   };
+
+   if (state  0 || state = ARRAY_SIZE(names))
+   return UNDEFINED;
+
+   return names[state];
+}
+EXPORT_SYMBOL_GPL(usb_otg_state_string);
+
+static const char *const speed_names[] = {
+   [USB_SPEED_UNKNOWN] = UNKNOWN,
+   [USB_SPEED_LOW] = low-speed,
+   [USB_SPEED_FULL] = full-speed,
+   [USB_SPEED_HIGH] = high-speed,
+   [USB_SPEED_WIRELESS] = wireless,
+   [USB_SPEED_SUPER] = super-speed,
+};
+
+const char *usb_speed_string(enum usb_device_speed speed)
+{
+   if (speed  0 || speed = ARRAY_SIZE(speed_names))
+   speed = USB_SPEED_UNKNOWN;
+   return speed_names[speed];
+}
+EXPORT_SYMBOL_GPL(usb_speed_string);
+
+const char *usb_state_string(enum usb_device_state state)
+{
+   static const char *const names[] = {
+   [USB_STATE_NOTATTACHED] = not attached,
+   [USB_STATE_ATTACHED] = attached,
+   [USB_STATE_POWERED] = powered,
+   [USB_STATE_RECONNECTING] = reconnecting,
+   [USB_STATE_UNAUTHENTICATED] = unauthenticated,
+   [USB_STATE_DEFAULT] = default,
+   [USB_STATE_ADDRESS] = addressed,
+   [USB_STATE_CONFIGURED] = configured,
+   [USB_STATE_SUSPENDED] = suspended,
+   };
+
+   if (state  0 || state = ARRAY_SIZE(names))
+   return UNKNOWN;
+
+   return names[state];
+}
+EXPORT_SYMBOL_GPL(usb_state_string);
+
+#ifdef CONFIG_OF
+static const char *const usb_dr_modes[] = {
+   [USB_DR_MODE_UNKNOWN]   = ,
+   [USB_DR_MODE_HOST]  = host,
+   [USB_DR_MODE_PERIPHERAL]= peripheral,
+   [USB_DR_MODE_OTG]   = otg,
+};
+
+/**
+ * of_usb_get_dr_mode - Get dual role mode for given device_node
+ * @np:Pointer to the given device_node
+ *
+ * The function gets phy interface string from property 'dr_mode',
+ * and returns the correspondig enum usb_dr_mode
+ */
+enum usb_dr_mode of_usb_get_dr_mode(struct device_node *np)
+{
+   const char *dr_mode;
+   int err, i;
+
+   err = of_property_read_string(np, dr_mode, dr_mode);
+   if (err  0)
+   return USB_DR_MODE_UNKNOWN

[PATCH v6 0/4] LED triggers for USB host and device

2014-09-24 Thread Michal Sojka
This adds LED triggers for USB host and device. First two patches
refactor UDC drivers as requested by Felipe Balbi, the next renames a
file and the last is the actual implementation of the LED triggers.

Changes from v5:
- Refactoring of USB gadget completion split into two patches (Filipe
  Balbi)
- Removed check for non-NULL req-completion (Filipe Balbi)

Changes from v4:
- Added performance numbers to the commit message of the last patch
  (greg k-h).
- Replaced BUG_ON with pr_err (Alan Stern, greg k-h).
- Used proper coding style for switch statement (greg k-h).
- Added comment about NULL argument (greg k-h).
- EXPORT_SYMBOL changed to EXPORT_SYMBOL_GPL (greg k-h).
- Both triggers are now registerd even if host or gagdet subsystem
  is not enabled (Bryan Wu, greg k-h).

Changes from v3:
- usb_gadget_giveback_request() moved outside of CONFIG_HAS_DMA
  conditioned block.
- Added kernel-doc for usb_gadget_giveback_request() (Felipe Balbi).
- Removed outdated comment (Alan Stern).
- req-complete == NULL is now a bug. Previously, this was ignored
  (Alan Stern).
- File rename moved to a separate commit (greg k-h).

Changes from v2:
- Host/gadget triggers merged to a single file in usb/common/ (Felipe
  Balbi).
- UDC drivers refactored so that LED trigger works for all of them.

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/.
- Improved Kconfig help.
- Linked with other modules rather than being standalone modules.

Michal Sojka (4):
  usb: gadget: Introduce usb_gadget_giveback_request()
  usb: gadget: Refactor request completion
  usb: Rename usb-common.c
  usb: Add LED triggers for USB activity

 drivers/usb/Kconfig |  10 +++
 drivers/usb/chipidea/udc.c  |   6 +-
 drivers/usb/common/Makefile |   5 +-
 drivers/usb/common/common.c | 144 
 drivers/usb/common/led.c|  57 +
 drivers/usb/common/usb-common.c | 144 
 drivers/usb/core/hcd.c  |   2 +
 drivers/usb/dwc2/gadget.c   |   6 +-
 drivers/usb/dwc3/gadget.c   |   2 +-
 drivers/usb/gadget/udc/amd5536udc.c |   2 +-
 drivers/usb/gadget/udc/at91_udc.c   |   2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |   4 +-
 drivers/usb/gadget/udc/bcm63xx_udc.c|   2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  |  10 +--
 drivers/usb/gadget/udc/fotg210-udc.c|   2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |   6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |   6 +-
 drivers/usb/gadget/udc/fusb300_udc.c|   2 +-
 drivers/usb/gadget/udc/goku_udc.c   |   2 +-
 drivers/usb/gadget/udc/gr_udc.c |   2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|   2 +-
 drivers/usb/gadget/udc/m66592-udc.c |   2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|   8 +-
 drivers/usb/gadget/udc/mv_udc_core.c|   8 +-
 drivers/usb/gadget/udc/net2272.c|   2 +-
 drivers/usb/gadget/udc/net2280.c|   2 +-
 drivers/usb/gadget/udc/omap_udc.c   |   2 +-
 drivers/usb/gadget/udc/pch_udc.c|   2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |   2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |   2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |   2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |   3 +-
 drivers/usb/gadget/udc/s3c2410_udc.c|   2 +-
 drivers/usb/gadget/udc/udc-core.c   |  20 +
 drivers/usb/musb/musb_gadget.c  |   2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |   2 +-
 include/linux/usb.h |  12 +++
 include/linux/usb/gadget.h  |   8 ++
 38 files changed, 298 insertions(+), 201 deletions(-)
 create mode 100644 drivers/usb/common/common.c
 create mode 100644 drivers/usb/common/led.c
 delete mode 100644 drivers/usb/common/usb-common.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v6 4/4] usb: Add LED triggers for USB activity

2014-09-24 Thread Michal Sojka
With this patch, USB activity can be signaled by blinking a LED. There
are two triggers, one for activity on USB host and one for USB gadget.

Both triggers should work with all host/device controllers. Tested only
with musb.

Performace: I measured performance overheads on ARM Cortex-A8 (TI
AM335x) running on 600 MHz.

Duration of usb_led_activity():
- with no LED attached to the trigger:2 ± 1 µs
- with one GPIO LED attached to the trigger:  2 ± 1 µs or 8 ± 2 µs (two peaks 
in histogram)

Duration of functions calling usb_led_activity() (with this patch
applied and no LED attached to the trigger):
- __usb_hcd_giveback_urb():10 - 25 µs
- usb_gadget_giveback_request(): 2 - 6 µs

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/Kconfig   | 10 +++
 drivers/usb/common/Makefile   |  1 +
 drivers/usb/common/led.c  | 57 +++
 drivers/usb/core/hcd.c|  2 ++
 drivers/usb/gadget/udc/udc-core.c |  4 +++
 include/linux/usb.h   | 12 +
 6 files changed, 86 insertions(+)
 create mode 100644 drivers/usb/common/led.c

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index cf1b19b..ae481c3 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -149,4 +149,14 @@ source drivers/usb/phy/Kconfig
 
 source drivers/usb/gadget/Kconfig
 
+config USB_LED_TRIG
+   bool USB LED Triggers
+   depends on LEDS_CLASS  USB_COMMON  LEDS_TRIGGERS
+   help
+ This option adds LED triggers for USB host and/or gadget activity.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as activity indicators for USB host or
+ gadget.
+
 endif # USB_SUPPORT
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 052c120..ca2f8bd 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -4,5 +4,6 @@
 
 obj-$(CONFIG_USB_COMMON) += usb-common.o
 usb-common-y += common.o
+usb-common-$(CONFIG_USB_LED_TRIG) += led.o
 
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
new file mode 100644
index 000..df23da0
--- /dev/null
+++ b/drivers/usb/common/led.c
@@ -0,0 +1,57 @@
+/*
+ * LED Triggers for USB Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb.h
+
+#define BLINK_DELAY 30
+
+static unsigned long usb_blink_delay = BLINK_DELAY;
+
+DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
+DEFINE_LED_TRIGGER(ledtrig_usb_host);
+
+void usb_led_activity(enum usb_led_event ev)
+{
+   struct led_trigger *trig = NULL;
+
+   switch (ev) {
+   case USB_LED_EVENT_GADGET:
+   trig = ledtrig_usb_gadget;
+   break;
+   case USB_LED_EVENT_HOST:
+   trig = ledtrig_usb_host;
+   break;
+   }
+   /* led_trigger_blink_oneshot() handles trig == NULL gracefully */
+   led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
+}
+EXPORT_SYMBOL_GPL(usb_led_activity);
+
+
+static int __init ledtrig_usb_init(void)
+{
+   led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
+   led_trigger_register_simple(usb-host, ledtrig_usb_host);
+   return 0;
+}
+
+static void __exit ledtrig_usb_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_gadget);
+   led_trigger_unregister_simple(ledtrig_usb_host);
+}
+
+module_init(ledtrig_usb_init);
+module_exit(ledtrig_usb_exit);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..409cb95 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (likely(status == 0))
+   usb_led_activity(USB_LED_EVENT_HOST);
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index f7b3151..931b9f1 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -27,6 +27,7 @@
 
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include linux/usb.h
 
 /**
  * struct usb_udc - describes one usb device controller
@@ -116,6 +117,9 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
 {
+   if (likely(req-status == 0))
+   usb_led_activity(USB_LED_EVENT_GADGET);
+
req-complete(ep, req

[PATCH v6 2/4] usb: gadget: Refactor request completion

2014-09-24 Thread Michal Sojka
Use the recently introduced usb_gadget_giveback_request() in favor of
direct invocation of the completion routine.

All places in drivers/usb/ matching [-.]complete( were replaced with a
call to usb_gadget_giveback_request(). This was compile-tested with all
ARM drivers enabled and runtime-tested for musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/chipidea/udc.c  |  6 +++---
 drivers/usb/dwc2/gadget.c   |  6 +++---
 drivers/usb/dwc3/gadget.c   |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c |  2 +-
 drivers/usb/gadget/udc/at91_udc.c   |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
 drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
 drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
 drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
 drivers/usb/gadget/udc/goku_udc.c   |  2 +-
 drivers/usb/gadget/udc/gr_udc.c |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
 drivers/usb/gadget/udc/m66592-udc.c |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
 drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
 drivers/usb/gadget/udc/net2272.c|  2 +-
 drivers/usb/gadget/udc/net2280.c|  2 +-
 drivers/usb/gadget/udc/omap_udc.c   |  2 +-
 drivers/usb/gadget/udc/pch_udc.c|  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
 drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
 drivers/usb/musb/musb_gadget.c  |  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
 29 files changed, 41 insertions(+), 56 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b8125aa..0444d3f 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -627,7 +627,7 @@ __acquires(hwep-lock)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -922,7 +922,7 @@ __acquires(hwep-lock)
if ((hwep-type == USB_ENDPOINT_XFER_CONTROL) 
hwreq-req.length)
hweptemp = hwep-ci-ep0in;
-   hwreq-req.complete(hweptemp-ep, hwreq-req);
+   usb_gadget_giveback_request(hweptemp-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -1347,7 +1347,7 @@ static int ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index ce6071d..ada5f30 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -987,8 +987,8 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg 
*hsotg,
hs_req = ep-req;
ep-req = NULL;
list_del_init(hs_req-queue);
-   hs_req-req.complete(ep-ep,
-hs_req-req);
+   usb_gadget_giveback_request(ep-ep,
+   
hs_req-req);
}
 
/* If we have pending request, then start it */
@@ -1245,7 +1245,7 @@ static void s3c_hsotg_complete_request(struct s3c_hsotg 
*hsotg,
 
if (hs_req-req.complete) {
spin_unlock(hsotg-lock);
-   hs_req-req.complete(hs_ep-ep, hs_req-req);
+   usb_gadget_giveback_request(hs_ep-ep, hs_req-req);
spin_lock(hsotg-lock);
}
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 490a6ca..45f1dfc 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,7 +268,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
req-request.length, status);
 
spin_unlock(dwc-lock);
-   req-request.complete(dep-endpoint, req-request);
+   usb_gadget_giveback_request(dep-endpoint, req-request);
spin_lock(dwc-lock);
 }
 
diff --git a/drivers/usb/gadget/udc/amd5536udc.c 
b/drivers/usb/gadget/udc/amd5536udc.c
index 41b062e..3b9d138 100644
--- a/drivers/usb

Re: [PATCH v5 1/3] usb: gadget: Refactor request completion

2014-09-23 Thread Michal Sojka
Dear Felipe,

On Wed, Sep 17 2014, Felipe Balbi wrote:
 On Wed, Sep 17, 2014 at 09:21:11AM +0200, Michal Sojka wrote:
 All USB peripheral controller drivers called completion routines
 directly. This patch moves the completion call from drivers to
 usb_gadget_giveback_request(), in order to have a place where common
 functionality can be added.
 
 All places in drivers/usb/ matching [-.]complete( were replaced with a
 call to usb_gadget_giveback_request(). This was compile-tested with all
 ARM drivers enabled and runtime-tested for musb.
 
 Signed-off-by: Michal Sojka so...@merica.cz
 ---
  drivers/usb/chipidea/udc.c  |  6 +++---
  drivers/usb/dwc2/gadget.c   |  6 +++---
  drivers/usb/dwc3/gadget.c   |  2 +-
  drivers/usb/gadget/udc/amd5536udc.c |  2 +-
  drivers/usb/gadget/udc/at91_udc.c   |  2 +-
  drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
  drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
  drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
  drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
  drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
  drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
  drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
  drivers/usb/gadget/udc/goku_udc.c   |  2 +-
  drivers/usb/gadget/udc/gr_udc.c |  2 +-
  drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
  drivers/usb/gadget/udc/m66592-udc.c |  2 +-
  drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
  drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
  drivers/usb/gadget/udc/net2272.c|  2 +-
  drivers/usb/gadget/udc/net2280.c|  2 +-
  drivers/usb/gadget/udc/omap_udc.c   |  2 +-
  drivers/usb/gadget/udc/pch_udc.c|  2 +-
  drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
  drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
  drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
  drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
  drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
  drivers/usb/gadget/udc/udc-core.c   | 19 +++
  drivers/usb/musb/musb_gadget.c  |  2 +-
  drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
  include/linux/usb/gadget.h  |  8 

 I would rather split this into several patches, btw. With the
 introduction of usb_gadget_giveback_request() being the first one in the
 series. It's easier to review that way.

This would be no problem.

 diff --git a/drivers/usb/gadget/udc/udc-core.c 
 b/drivers/usb/gadget/udc/udc-core.c
 index b0d9817..29789f1 100644
 --- a/drivers/usb/gadget/udc/udc-core.c
 +++ b/drivers/usb/gadget/udc/udc-core.c
 @@ -106,6 +106,25 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
  
  /* 
 - */
  
 +/**
 + * usb_gadget_giveback_request - give the request back to the gadget layer
 + * Context: in_interrupt()
 + *
 + * This is called by device controller drivers in order to return the
 + * completed request back to the gadget layer.
 + */
 +void usb_gadget_giveback_request(struct usb_ep *ep,
 +struct usb_request *req)
 +{
 +if (likely(req-complete))
 +req-complete(ep, req);
 +else
 +pr_err(%s : req-complete must not be NULL\n, __func__);

 let it Oops. We require -complete to be valid, if there's any gadget
 driver not setting -complete, it deserves to oops so we can the
 error.

The Oops was there before, but I removed it because greg k-h didn't want
it. See http://marc.info/?l=linux-usbm=140917381611947w=2. Do you
still want the oops here?

-Michal
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 2/3] usb: Rename usb-common.c

2014-09-17 Thread Michal Sojka
In the next commit, we will want the usb-common module to be composed of
two object files. Since Kbuild cannot append another object to an
existing one, we need to rename usb-common.c to something
else (common.c) and create usb-common.o by linking the wanted objects
together. Currently, usb-common.o comprises only common.o.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/common/Makefile   | 4 +++-
 drivers/usb/common/{usb-common.c = common.c} | 0
 2 files changed, 3 insertions(+), 1 deletion(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)

diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 7526461..052c120 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -2,5 +2,7 @@
 # Makefile for the usb common parts.
 #
 
-obj-$(CONFIG_USB_COMMON) += usb-common.o
+obj-$(CONFIG_USB_COMMON) += usb-common.o
+usb-common-y += common.o
+
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/usb-common.c b/drivers/usb/common/common.c
similarity index 100%
rename from drivers/usb/common/usb-common.c
rename to drivers/usb/common/common.c
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 3/3] usb: Add LED triggers for USB activity

2014-09-17 Thread Michal Sojka
With this patch, USB activity can be signaled by blinking a LED. There
are two triggers, one for activity on USB host and one for USB gadget.

Both triggers should work with all host/device controllers. Tested only
with musb.

Performace: I measured performance overheads on ARM Cortex-A8 (TI
AM335x) running on 600 MHz.

Duration of usb_led_activity():
- with no LED attached to the trigger:2 ± 1 µs
- with one GPIO LED attached to the trigger:  2 ± 1 µs or 8 ± 2 µs (two peaks 
in histogram)

Duration of functions calling usb_led_activity() (with this patch
applied and no LED attached to the trigger):
- __usb_hcd_giveback_urb():10 - 25 µs
- usb_gadget_giveback_request(): 2 - 6 µs

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/Kconfig   | 10 +++
 drivers/usb/common/Makefile   |  1 +
 drivers/usb/common/led.c  | 57 +++
 drivers/usb/core/hcd.c|  2 ++
 drivers/usb/gadget/udc/udc-core.c |  4 +++
 include/linux/usb.h   | 12 +
 6 files changed, 86 insertions(+)
 create mode 100644 drivers/usb/common/led.c

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index e0cad441..9d9cc3b 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -147,4 +147,14 @@ source drivers/usb/phy/Kconfig
 
 source drivers/usb/gadget/Kconfig
 
+config USB_LED_TRIG
+   bool USB LED Triggers
+   depends on LEDS_CLASS  USB_COMMON  LEDS_TRIGGERS
+   help
+ This option adds LED triggers for USB host and/or gadget activity.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as activity indicators for USB host or
+ gadget.
+
 endif # USB_SUPPORT
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 052c120..ca2f8bd 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -4,5 +4,6 @@
 
 obj-$(CONFIG_USB_COMMON) += usb-common.o
 usb-common-y += common.o
+usb-common-$(CONFIG_USB_LED_TRIG) += led.o
 
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
new file mode 100644
index 000..df23da0
--- /dev/null
+++ b/drivers/usb/common/led.c
@@ -0,0 +1,57 @@
+/*
+ * LED Triggers for USB Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb.h
+
+#define BLINK_DELAY 30
+
+static unsigned long usb_blink_delay = BLINK_DELAY;
+
+DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
+DEFINE_LED_TRIGGER(ledtrig_usb_host);
+
+void usb_led_activity(enum usb_led_event ev)
+{
+   struct led_trigger *trig = NULL;
+
+   switch (ev) {
+   case USB_LED_EVENT_GADGET:
+   trig = ledtrig_usb_gadget;
+   break;
+   case USB_LED_EVENT_HOST:
+   trig = ledtrig_usb_host;
+   break;
+   }
+   /* led_trigger_blink_oneshot() handles trig == NULL gracefully */
+   led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
+}
+EXPORT_SYMBOL_GPL(usb_led_activity);
+
+
+static int __init ledtrig_usb_init(void)
+{
+   led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
+   led_trigger_register_simple(usb-host, ledtrig_usb_host);
+   return 0;
+}
+
+static void __exit ledtrig_usb_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_gadget);
+   led_trigger_unregister_simple(ledtrig_usb_host);
+}
+
+module_init(ledtrig_usb_init);
+module_exit(ledtrig_usb_exit);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..409cb95 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (likely(status == 0))
+   usb_led_activity(USB_LED_EVENT_HOST);
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index 29789f1..f272cf0 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -27,6 +27,7 @@
 
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include linux/usb.h
 
 /**
  * struct usb_udc - describes one usb device controller
@@ -116,6 +117,9 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
 {
+   if (likely(req-status == 0))
+   usb_led_activity(USB_LED_EVENT_GADGET);
+
if (likely(req

[PATCH v5 0/3] LED triggers for USB host and device

2014-09-17 Thread Michal Sojka
(this is resend of a patch series from about three weeks ago)

This adds LED triggers for USB host and device. First patch refactors
UDC drivers as requested by Felipe Balbi, second is a preparation for
the third, which adds the LED triggers.

Changes from v4:
- Added performance numbers to the commit message of the last patch
  (greg k-h).
- Replaced BUG_ON with pr_err (Alan Stern, greg k-h).
- Used proper coding style for switch statement (greg k-h).
- Added comment about NULL argument (greg k-h).
- EXPORT_SYMBOL changed to EXPORT_SYMBOL_GPL (greg k-h).
- Both triggers are now registerd even if host or gagdet subsystem
  is not enabled (Bryan Wu, greg k-h).

Changes from v3:
- usb_gadget_giveback_request() moved outside of CONFIG_HAS_DMA
  conditioned block.
- Added kernel-doc for usb_gadget_giveback_request() (Felipe Balbi).
- Removed outdated comment (Alan Stern).
- req-complete == NULL is now a bug. Previously, this was ignored
  (Alan Stern).
- File rename moved to a separate commit (greg k-h).

Changes from v2:
- Host/gadget triggers merged to a single file in usb/common/ (Felipe
  Balbi).
- UDC drivers refactored so that LED trigger works for all of them.

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/.
- Improved Kconfig help.
- Linked with other modules rather than being standalone modules.

Michal Sojka (3):
  usb: gadget: Refactor request completion
  usb: Rename usb-common.c
  usb: Add LED triggers for USB activity

 drivers/usb/Kconfig   | 10 +
 drivers/usb/chipidea/udc.c|  6 +--
 drivers/usb/common/Makefile   |  5 ++-
 drivers/usb/common/{usb-common.c = common.c} |  0
 drivers/usb/common/led.c  | 57 +++
 drivers/usb/core/hcd.c|  2 +
 drivers/usb/dwc2/gadget.c |  6 +--
 drivers/usb/dwc3/gadget.c |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c   |  2 +-
 drivers/usb/gadget/udc/at91_udc.c |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c   |  4 +-
 drivers/usb/gadget/udc/bcm63xx_udc.c  |  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c| 10 ++---
 drivers/usb/gadget/udc/fotg210-udc.c  |  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c   |  6 +--
 drivers/usb/gadget/udc/fsl_udc_core.c |  6 +--
 drivers/usb/gadget/udc/fusb300_udc.c  |  2 +-
 drivers/usb/gadget/udc/goku_udc.c |  2 +-
 drivers/usb/gadget/udc/gr_udc.c   |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c  |  2 +-
 drivers/usb/gadget/udc/m66592-udc.c   |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c  |  8 +---
 drivers/usb/gadget/udc/mv_udc_core.c  |  8 +---
 drivers/usb/gadget/udc/net2272.c  |  2 +-
 drivers/usb/gadget/udc/net2280.c  |  2 +-
 drivers/usb/gadget/udc/omap_udc.c |  2 +-
 drivers/usb/gadget/udc/pch_udc.c  |  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c   |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c   |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c|  3 +-
 drivers/usb/gadget/udc/s3c2410_udc.c  |  2 +-
 drivers/usb/gadget/udc/udc-core.c | 23 +++
 drivers/usb/musb/musb_gadget.c|  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c|  2 +-
 include/linux/usb.h   | 12 ++
 include/linux/usb/gadget.h|  8 
 37 files changed, 157 insertions(+), 57 deletions(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)
 create mode 100644 drivers/usb/common/led.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 1/3] usb: gadget: Refactor request completion

2014-09-17 Thread Michal Sojka
All USB peripheral controller drivers called completion routines
directly. This patch moves the completion call from drivers to
usb_gadget_giveback_request(), in order to have a place where common
functionality can be added.

All places in drivers/usb/ matching [-.]complete( were replaced with a
call to usb_gadget_giveback_request(). This was compile-tested with all
ARM drivers enabled and runtime-tested for musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/chipidea/udc.c  |  6 +++---
 drivers/usb/dwc2/gadget.c   |  6 +++---
 drivers/usb/dwc3/gadget.c   |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c |  2 +-
 drivers/usb/gadget/udc/at91_udc.c   |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
 drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
 drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
 drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
 drivers/usb/gadget/udc/goku_udc.c   |  2 +-
 drivers/usb/gadget/udc/gr_udc.c |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
 drivers/usb/gadget/udc/m66592-udc.c |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
 drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
 drivers/usb/gadget/udc/net2272.c|  2 +-
 drivers/usb/gadget/udc/net2280.c|  2 +-
 drivers/usb/gadget/udc/omap_udc.c   |  2 +-
 drivers/usb/gadget/udc/pch_udc.c|  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
 drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
 drivers/usb/gadget/udc/udc-core.c   | 19 +++
 drivers/usb/musb/musb_gadget.c  |  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
 include/linux/usb/gadget.h  |  8 
 31 files changed, 68 insertions(+), 56 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b8125aa..0444d3f 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -627,7 +627,7 @@ __acquires(hwep-lock)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -922,7 +922,7 @@ __acquires(hwep-lock)
if ((hwep-type == USB_ENDPOINT_XFER_CONTROL) 
hwreq-req.length)
hweptemp = hwep-ci-ep0in;
-   hwreq-req.complete(hweptemp-ep, hwreq-req);
+   usb_gadget_giveback_request(hweptemp-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -1347,7 +1347,7 @@ static int ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 0ba9c33..5a524a6 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -987,8 +987,8 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg 
*hsotg,
hs_req = ep-req;
ep-req = NULL;
list_del_init(hs_req-queue);
-   hs_req-req.complete(ep-ep,
-hs_req-req);
+   usb_gadget_giveback_request(ep-ep,
+   
hs_req-req);
}
 
/* If we have pending request, then start it */
@@ -1245,7 +1245,7 @@ static void s3c_hsotg_complete_request(struct s3c_hsotg 
*hsotg,
 
if (hs_req-req.complete) {
spin_unlock(hsotg-lock);
-   hs_req-req.complete(hs_ep-ep, hs_req-req);
+   usb_gadget_giveback_request(hs_ep-ep, hs_req-req);
spin_lock(hsotg-lock);
}
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 349cacc..b4b7a6b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,7 +268,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
req-request.length, status);
 
spin_unlock(dwc-lock);
-   req-request.complete(dep-endpoint, req-request

Re: [PATCH v4 3/3] usb: Add LED triggers for USB activity

2014-08-29 Thread Michal Sojka
On Wed, Aug 27 2014, Greg Kroah-Hartman wrote:
 On Wed, Aug 27, 2014 at 10:58:00PM +0200, Michal Sojka wrote:
 With this patch, USB activity can be signaled by blinking a LED. There
 are two triggers, one for activity on USB host and one for USB gadget.
 
 Both trigger should work with all host/device controllers. Tested only
 with musb.
 
 Signed-off-by: Michal Sojka so...@merica.cz
 ---
  drivers/usb/Kconfig   | 11 
  drivers/usb/common/Makefile   |  1 +
  drivers/usb/common/led.c  | 56 
 +++
  drivers/usb/core/hcd.c|  2 ++
  drivers/usb/gadget/udc/udc-core.c |  4 +++
  include/linux/usb.h   | 12 +
  6 files changed, 86 insertions(+)
  create mode 100644 drivers/usb/common/led.c
 
 diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
 index e0cad441..fc90cda 100644
 --- a/drivers/usb/Kconfig
 +++ b/drivers/usb/Kconfig
 @@ -147,4 +147,15 @@ source drivers/usb/phy/Kconfig
  
  source drivers/usb/gadget/Kconfig
  
 +config USB_LED_TRIG
 +bool USB LED Triggers
 +depends on LEDS_CLASS  USB_COMMON
 +select LEDS_TRIGGERS

 I hate select lines, can't we just depend on LEDS_TRIGGERS as well as
 LEDS_CLASS?


 +help
 +  This option adds LED triggers for USB host and/or gadget activity.
 +
 +  Say Y here if you are working on a system with led-class supported
 +  LEDs and you want to use them as activity indicators for USB host or
 +  gadget.
 +
  endif # USB_SUPPORT
 diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
 index 052c120..ca2f8bd 100644
 --- a/drivers/usb/common/Makefile
 +++ b/drivers/usb/common/Makefile
 @@ -4,5 +4,6 @@
  
  obj-$(CONFIG_USB_COMMON)  += usb-common.o
  usb-common-y  += common.o
 +usb-common-$(CONFIG_USB_LED_TRIG) += led.o
  
  obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
 diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
 new file mode 100644
 index 000..af3ce2c
 --- /dev/null
 +++ b/drivers/usb/common/led.c
 @@ -0,0 +1,56 @@
 +/*
 + * LED Triggers for USB Activity
 + *
 + * Copyright 2014 Michal Sojka so...@merica.cz
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + *
 + */
 +
 +#include linux/module.h
 +#include linux/kernel.h
 +#include linux/init.h
 +#include linux/leds.h
 +#include linux/usb.h
 +
 +#define BLINK_DELAY 30
 +
 +static unsigned long usb_blink_delay = BLINK_DELAY;
 +
 +DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
 +DEFINE_LED_TRIGGER(ledtrig_usb_host);
 +
 +void usb_led_activity(enum usb_led_event ev)
 +{
 +struct led_trigger *trig = NULL;
 +
 +switch (ev) {
 +case USB_LED_EVENT_GADGET: trig = ledtrig_usb_gadget; break;
 +case USB_LED_EVENT_HOST:   trig = ledtrig_usb_host;break;
 +}

 Very odd formatting, please use the correct one and don't try to put
 case expressions all on one line.

 +led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);

 What happens if trig is NULL?

This will work correctly - I added a comment about it in v5.

 +}
 +EXPORT_SYMBOL(usb_led_activity);

 EXPORT_SYMBOL_GPL() please.

 +static int __init ledtrig_usb_init(void)
 +{
 +#ifdef CONFIG_USB_GADGET
 +led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
 +#endif
 +#ifdef CONFIG_USB
 +led_trigger_register_simple(usb-host, ledtrig_usb_host);
 +#endif

 Why not just always register both?

I didn't want to offer users a trigger that doesn't do anything useful
on their system. Since you are the second person suggesting registering
both, I did just that in v5.

 +return 0;
 +}
 +
 +static void __exit ledtrig_usb_exit(void)
 +{
 +led_trigger_unregister_simple(ledtrig_usb_gadget);
 +led_trigger_unregister_simple(ledtrig_usb_host);

 So you can unregister things that you never registered with no issues?

Yes, but it doesn't matter anymore in v5.

 +}
 +
 +module_init(ledtrig_usb_init);
 +module_exit(ledtrig_usb_exit);
 diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
 index 487abcf..409cb95 100644
 --- a/drivers/usb/core/hcd.c
 +++ b/drivers/usb/core/hcd.c
 @@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
  usbmon_urb_complete(hcd-self, urb, status);
  usb_anchor_suspend_wakeups(anchor);
  usb_unanchor_urb(urb);
 +if (likely(status == 0))
 +usb_led_activity(USB_LED_EVENT_HOST);

 That's a _really_ hot code path, how much is this going to cause in
 overhead?

I measured the overheads on ARM Cortex-A8 (TI AM335x) running on 600 MHz.

Duration of usb_led_activity():
- with no LED attached to the trigger:2 ± 1 µs
- with one GPIO LED attached to the trigger:  2 ± 1 µs or 8 ± 2 µs (two peaks 
in histogram)

Duration of functions calling usb_led_activity()
(with my patches applied and no led attached to the trigger

[PATCH v5 3/3] usb: Add LED triggers for USB activity

2014-08-29 Thread Michal Sojka
With this patch, USB activity can be signaled by blinking a LED. There
are two triggers, one for activity on USB host and one for USB gadget.

Both triggers should work with all host/device controllers. Tested only
with musb.

Performace: I measured performance overheads on ARM Cortex-A8 (TI
AM335x) running on 600 MHz.

Duration of usb_led_activity():
- with no LED attached to the trigger:2 ± 1 µs
- with one GPIO LED attached to the trigger:  2 ± 1 µs or 8 ± 2 µs (two peaks 
in histogram)

Duration of functions calling usb_led_activity() (with this patch
applied and no LED attached to the trigger):
- __usb_hcd_giveback_urb():10 - 25 µs
- usb_gadget_giveback_request(): 2 - 6 µs

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/Kconfig   | 10 +++
 drivers/usb/common/Makefile   |  1 +
 drivers/usb/common/led.c  | 57 +++
 drivers/usb/core/hcd.c|  2 ++
 drivers/usb/gadget/udc/udc-core.c |  4 +++
 include/linux/usb.h   | 12 +
 6 files changed, 86 insertions(+)
 create mode 100644 drivers/usb/common/led.c

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index e0cad441..9d9cc3b 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -147,4 +147,14 @@ source drivers/usb/phy/Kconfig
 
 source drivers/usb/gadget/Kconfig
 
+config USB_LED_TRIG
+   bool USB LED Triggers
+   depends on LEDS_CLASS  USB_COMMON  LEDS_TRIGGERS
+   help
+ This option adds LED triggers for USB host and/or gadget activity.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as activity indicators for USB host or
+ gadget.
+
 endif # USB_SUPPORT
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 052c120..ca2f8bd 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -4,5 +4,6 @@
 
 obj-$(CONFIG_USB_COMMON) += usb-common.o
 usb-common-y += common.o
+usb-common-$(CONFIG_USB_LED_TRIG) += led.o
 
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
new file mode 100644
index 000..df23da0
--- /dev/null
+++ b/drivers/usb/common/led.c
@@ -0,0 +1,57 @@
+/*
+ * LED Triggers for USB Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb.h
+
+#define BLINK_DELAY 30
+
+static unsigned long usb_blink_delay = BLINK_DELAY;
+
+DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
+DEFINE_LED_TRIGGER(ledtrig_usb_host);
+
+void usb_led_activity(enum usb_led_event ev)
+{
+   struct led_trigger *trig = NULL;
+
+   switch (ev) {
+   case USB_LED_EVENT_GADGET:
+   trig = ledtrig_usb_gadget;
+   break;
+   case USB_LED_EVENT_HOST:
+   trig = ledtrig_usb_host;
+   break;
+   }
+   /* led_trigger_blink_oneshot() handles trig == NULL gracefully */
+   led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
+}
+EXPORT_SYMBOL_GPL(usb_led_activity);
+
+
+static int __init ledtrig_usb_init(void)
+{
+   led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
+   led_trigger_register_simple(usb-host, ledtrig_usb_host);
+   return 0;
+}
+
+static void __exit ledtrig_usb_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_gadget);
+   led_trigger_unregister_simple(ledtrig_usb_host);
+}
+
+module_init(ledtrig_usb_init);
+module_exit(ledtrig_usb_exit);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..409cb95 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (likely(status == 0))
+   usb_led_activity(USB_LED_EVENT_HOST);
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index 29789f1..f272cf0 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -27,6 +27,7 @@
 
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include linux/usb.h
 
 /**
  * struct usb_udc - describes one usb device controller
@@ -116,6 +117,9 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
 {
+   if (likely(req-status == 0))
+   usb_led_activity(USB_LED_EVENT_GADGET);
+
if (likely(req

[PATCH v5 0/3] LED triggers for USB host and device

2014-08-29 Thread Michal Sojka

This adds LED triggers for USB host and device. First patch refactors
UDC drivers as requested by Felipe Balbi, second is a preparation for
the third, which adds the LED triggers.

Changes from v4:
- Replaced BUG_ON with pr_err (Alan Stern, greg k-h).
- Used proper coding style for switch statement (greg k-h).
- Added comment about NULL argument (greg k-h).
- EXPORT_SYMBOL changed to EXPORT_SYMBOL_GPL (greg k-h).
- Both triggers are now registerd even if host or gagdet subsystem
  is not enabled (Bryan Wu, greg k-h).
- Added performance numbers to the commit message of the last patch
  (greg k-h).

Changes from v3:
- usb_gadget_giveback_request() moved outside of CONFIG_HAS_DMA
  conditioned block.
- Added kernel-doc for usb_gadget_giveback_request() (Felipe Balbi).
- Removed outdated comment (Alan Stern).
- req-complete == NULL is now a bug. Previously, this was ignored
  (Alan Stern).
- File rename moved to a separate commit (greg k-h).

Changes from v2:
- Host/gadget triggers merged to a single file in usb/common/ (Felipe
  Balbi).
- UDC drivers refactored so that LED trigger works for all of them.

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/.
- Improved Kconfig help.
- Linked with other modules rather than being standalone modules.

Michal Sojka (3):
  usb: gadget: Refactor request completion
  usb: Rename usb-common.c
  usb: Add LED triggers for USB activity

 drivers/usb/Kconfig   | 10 +
 drivers/usb/chipidea/udc.c|  6 +--
 drivers/usb/common/Makefile   |  5 ++-
 drivers/usb/common/{usb-common.c = common.c} |  0
 drivers/usb/common/led.c  | 57 +++
 drivers/usb/core/hcd.c|  2 +
 drivers/usb/dwc2/gadget.c |  6 +--
 drivers/usb/dwc3/gadget.c |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c   |  2 +-
 drivers/usb/gadget/udc/at91_udc.c |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c   |  4 +-
 drivers/usb/gadget/udc/bcm63xx_udc.c  |  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c| 10 ++---
 drivers/usb/gadget/udc/fotg210-udc.c  |  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c   |  6 +--
 drivers/usb/gadget/udc/fsl_udc_core.c |  6 +--
 drivers/usb/gadget/udc/fusb300_udc.c  |  2 +-
 drivers/usb/gadget/udc/goku_udc.c |  2 +-
 drivers/usb/gadget/udc/gr_udc.c   |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c  |  2 +-
 drivers/usb/gadget/udc/m66592-udc.c   |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c  |  8 +---
 drivers/usb/gadget/udc/mv_udc_core.c  |  8 +---
 drivers/usb/gadget/udc/net2272.c  |  2 +-
 drivers/usb/gadget/udc/net2280.c  |  2 +-
 drivers/usb/gadget/udc/omap_udc.c |  2 +-
 drivers/usb/gadget/udc/pch_udc.c  |  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c   |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c   |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c|  3 +-
 drivers/usb/gadget/udc/s3c2410_udc.c  |  2 +-
 drivers/usb/gadget/udc/udc-core.c | 23 +++
 drivers/usb/musb/musb_gadget.c|  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c|  2 +-
 include/linux/usb.h   | 12 ++
 include/linux/usb/gadget.h|  8 
 37 files changed, 157 insertions(+), 57 deletions(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)
 create mode 100644 drivers/usb/common/led.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v5 1/3] usb: gadget: Refactor request completion

2014-08-29 Thread Michal Sojka
All USB peripheral controller drivers called completion routines
directly. This patch moves the completion call from drivers to
usb_gadget_giveback_request(), in order to have a place where common
functionality can be added.

All places in drivers/usb/ matching [-.]complete( were replaced with a
call to usb_gadget_giveback_request(). This was compile-tested with all
ARM drivers enabled and runtime-tested for musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/chipidea/udc.c  |  6 +++---
 drivers/usb/dwc2/gadget.c   |  6 +++---
 drivers/usb/dwc3/gadget.c   |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c |  2 +-
 drivers/usb/gadget/udc/at91_udc.c   |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
 drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
 drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
 drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
 drivers/usb/gadget/udc/goku_udc.c   |  2 +-
 drivers/usb/gadget/udc/gr_udc.c |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
 drivers/usb/gadget/udc/m66592-udc.c |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
 drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
 drivers/usb/gadget/udc/net2272.c|  2 +-
 drivers/usb/gadget/udc/net2280.c|  2 +-
 drivers/usb/gadget/udc/omap_udc.c   |  2 +-
 drivers/usb/gadget/udc/pch_udc.c|  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
 drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
 drivers/usb/gadget/udc/udc-core.c   | 19 +++
 drivers/usb/musb/musb_gadget.c  |  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
 include/linux/usb/gadget.h  |  8 
 31 files changed, 68 insertions(+), 56 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b8125aa..0444d3f 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -627,7 +627,7 @@ __acquires(hwep-lock)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -922,7 +922,7 @@ __acquires(hwep-lock)
if ((hwep-type == USB_ENDPOINT_XFER_CONTROL) 
hwreq-req.length)
hweptemp = hwep-ci-ep0in;
-   hwreq-req.complete(hweptemp-ep, hwreq-req);
+   usb_gadget_giveback_request(hweptemp-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -1347,7 +1347,7 @@ static int ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 0ba9c33..5a524a6 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -987,8 +987,8 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg 
*hsotg,
hs_req = ep-req;
ep-req = NULL;
list_del_init(hs_req-queue);
-   hs_req-req.complete(ep-ep,
-hs_req-req);
+   usb_gadget_giveback_request(ep-ep,
+   
hs_req-req);
}
 
/* If we have pending request, then start it */
@@ -1245,7 +1245,7 @@ static void s3c_hsotg_complete_request(struct s3c_hsotg 
*hsotg,
 
if (hs_req-req.complete) {
spin_unlock(hsotg-lock);
-   hs_req-req.complete(hs_ep-ep, hs_req-req);
+   usb_gadget_giveback_request(hs_ep-ep, hs_req-req);
spin_lock(hsotg-lock);
}
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 349cacc..b4b7a6b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,7 +268,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
req-request.length, status);
 
spin_unlock(dwc-lock);
-   req-request.complete(dep-endpoint, req-request

[PATCH v5 2/3] usb: Rename usb-common.c

2014-08-29 Thread Michal Sojka
In the next commit, we will want the usb-common module to be composed of
two object files. Since Kbuild cannot append another object to an
existing one, we need to rename usb-common.c to something
else (common.c) and create usb-common.o by linking the wanted objects
together. Currently, usb-common.o comprises only common.o.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/common/Makefile   | 4 +++-
 drivers/usb/common/{usb-common.c = common.c} | 0
 2 files changed, 3 insertions(+), 1 deletion(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)

diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 7526461..052c120 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -2,5 +2,7 @@
 # Makefile for the usb common parts.
 #
 
-obj-$(CONFIG_USB_COMMON) += usb-common.o
+obj-$(CONFIG_USB_COMMON) += usb-common.o
+usb-common-y += common.o
+
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/usb-common.c b/drivers/usb/common/common.c
similarity index 100%
rename from drivers/usb/common/usb-common.c
rename to drivers/usb/common/common.c
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 1/2] usb: gadget: Refactor request completion

2014-08-27 Thread Michal Sojka
All USB peripheral controller drivers called completion routines
directly. This patch moves the completion call from drivers to
usb_gadget_giveback_request(), in order to have a place where common
functionality can be added.

All places in drivers/usb/ matching [-.]complete( were replaced with a
call to usb_gadget_giveback_request(). This was compile-tested with all
ARM drivers enabled and runtime-tested for musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/chipidea/udc.c  |  6 +++---
 drivers/usb/dwc2/gadget.c   |  6 +++---
 drivers/usb/dwc3/gadget.c   |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c |  2 +-
 drivers/usb/gadget/udc/at91_udc.c   |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
 drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
 drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
 drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
 drivers/usb/gadget/udc/goku_udc.c   |  2 +-
 drivers/usb/gadget/udc/gr_udc.c |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
 drivers/usb/gadget/udc/m66592-udc.c |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
 drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
 drivers/usb/gadget/udc/net2272.c|  2 +-
 drivers/usb/gadget/udc/net2280.c|  2 +-
 drivers/usb/gadget/udc/omap_udc.c   |  2 +-
 drivers/usb/gadget/udc/pch_udc.c|  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
 drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
 drivers/usb/gadget/udc/udc-core.c   |  9 +
 drivers/usb/musb/musb_gadget.c  |  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
 include/linux/usb/gadget.h  |  8 
 31 files changed, 58 insertions(+), 56 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b8125aa..0444d3f 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -627,7 +627,7 @@ __acquires(hwep-lock)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -922,7 +922,7 @@ __acquires(hwep-lock)
if ((hwep-type == USB_ENDPOINT_XFER_CONTROL) 
hwreq-req.length)
hweptemp = hwep-ci-ep0in;
-   hwreq-req.complete(hweptemp-ep, hwreq-req);
+   usb_gadget_giveback_request(hweptemp-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -1347,7 +1347,7 @@ static int ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 0ba9c33..5a524a6 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -987,8 +987,8 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg 
*hsotg,
hs_req = ep-req;
ep-req = NULL;
list_del_init(hs_req-queue);
-   hs_req-req.complete(ep-ep,
-hs_req-req);
+   usb_gadget_giveback_request(ep-ep,
+   
hs_req-req);
}
 
/* If we have pending request, then start it */
@@ -1245,7 +1245,7 @@ static void s3c_hsotg_complete_request(struct s3c_hsotg 
*hsotg,
 
if (hs_req-req.complete) {
spin_unlock(hsotg-lock);
-   hs_req-req.complete(hs_ep-ep, hs_req-req);
+   usb_gadget_giveback_request(hs_ep-ep, hs_req-req);
spin_lock(hsotg-lock);
}
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 349cacc..b4b7a6b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,7 +268,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
req-request.length, status);
 
spin_unlock(dwc-lock);
-   req-request.complete(dep-endpoint, req-request

[PATCH v3 0/2] LED triggers for USB host and device

2014-08-27 Thread Michal Sojka
This adds LED triggers for USB host and device. First patch refactors
UDC drivers as requested by Felipe Balbi, second patch adds the LED
triggers.

Changes from v2:
- host/gadget triggers merged to a single file in usb/common/
- udc drivers refactored so that LED trigger works for all of them

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/
- Improved Kconfig help
- Linked with other modules rather than being standalone modules

Michal Sojka (2):
  usb: gadget: Refactor request completion
  usb: Add LED triggers for USB activity

 drivers/usb/Kconfig |  11 +++
 drivers/usb/chipidea/udc.c  |   6 +-
 drivers/usb/common/Makefile |   5 +-
 drivers/usb/common/common.c | 144 
 drivers/usb/common/led.c|  59 +
 drivers/usb/common/usb-common.c | 144 
 drivers/usb/core/hcd.c  |   2 +
 drivers/usb/dwc2/gadget.c   |   6 +-
 drivers/usb/dwc3/gadget.c   |   2 +-
 drivers/usb/gadget/udc/amd5536udc.c |   2 +-
 drivers/usb/gadget/udc/at91_udc.c   |   2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |   4 +-
 drivers/usb/gadget/udc/bcm63xx_udc.c|   2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  |  10 +--
 drivers/usb/gadget/udc/fotg210-udc.c|   2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |   6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |   6 +-
 drivers/usb/gadget/udc/fusb300_udc.c|   2 +-
 drivers/usb/gadget/udc/goku_udc.c   |   2 +-
 drivers/usb/gadget/udc/gr_udc.c |   2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|   2 +-
 drivers/usb/gadget/udc/m66592-udc.c |   2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|   8 +-
 drivers/usb/gadget/udc/mv_udc_core.c|   8 +-
 drivers/usb/gadget/udc/net2272.c|   2 +-
 drivers/usb/gadget/udc/net2280.c|   2 +-
 drivers/usb/gadget/udc/omap_udc.c   |   2 +-
 drivers/usb/gadget/udc/pch_udc.c|   2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |   2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |   2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |   2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |   3 +-
 drivers/usb/gadget/udc/s3c2410_udc.c|   2 +-
 drivers/usb/gadget/udc/udc-core.c   |  13 +++
 drivers/usb/musb/musb_gadget.c  |   2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |   2 +-
 include/linux/usb.h |  12 +++
 include/linux/usb/gadget.h  |   8 ++
 38 files changed, 294 insertions(+), 201 deletions(-)
 create mode 100644 drivers/usb/common/common.c
 create mode 100644 drivers/usb/common/led.c
 delete mode 100644 drivers/usb/common/usb-common.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3 2/2] usb: Add LED triggers for USB activity

2014-08-27 Thread Michal Sojka
With this patch, USB activity can be signaled by blinking a LED. There
are two triggers, one for activity on USB host and one for USB gadget.

Both trigger should work with all host/device controllers. Tested only
with musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/Kconfig   | 11 ++
 drivers/usb/common/Makefile   |  5 ++-
 drivers/usb/common/{usb-common.c = common.c} |  0
 drivers/usb/common/led.c  | 56 +++
 drivers/usb/core/hcd.c|  2 +
 drivers/usb/gadget/udc/udc-core.c |  4 ++
 include/linux/usb.h   | 12 ++
 7 files changed, 89 insertions(+), 1 deletion(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)
 create mode 100644 drivers/usb/common/led.c

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index e0cad441..fc90cda 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -147,4 +147,15 @@ source drivers/usb/phy/Kconfig
 
 source drivers/usb/gadget/Kconfig
 
+config USB_LED_TRIG
+   bool USB LED Triggers
+   depends on LEDS_CLASS  USB_COMMON
+   select LEDS_TRIGGERS
+   help
+ This option adds LED triggers for USB host and/or gadget activity.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as activity indicators for USB host or
+ gadget.
+
 endif # USB_SUPPORT
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 7526461..ca2f8bd 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -2,5 +2,8 @@
 # Makefile for the usb common parts.
 #
 
-obj-$(CONFIG_USB_COMMON) += usb-common.o
+obj-$(CONFIG_USB_COMMON) += usb-common.o
+usb-common-y += common.o
+usb-common-$(CONFIG_USB_LED_TRIG) += led.o
+
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/usb-common.c b/drivers/usb/common/common.c
similarity index 100%
rename from drivers/usb/common/usb-common.c
rename to drivers/usb/common/common.c
diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
new file mode 100644
index 000..af3ce2c
--- /dev/null
+++ b/drivers/usb/common/led.c
@@ -0,0 +1,56 @@
+/*
+ * LED Triggers for USB Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb.h
+
+#define BLINK_DELAY 30
+
+static unsigned long usb_blink_delay = BLINK_DELAY;
+
+DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
+DEFINE_LED_TRIGGER(ledtrig_usb_host);
+
+void usb_led_activity(enum usb_led_event ev)
+{
+   struct led_trigger *trig = NULL;
+
+   switch (ev) {
+   case USB_LED_EVENT_GADGET: trig = ledtrig_usb_gadget; break;
+   case USB_LED_EVENT_HOST:   trig = ledtrig_usb_host;break;
+   }
+   led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
+}
+EXPORT_SYMBOL(usb_led_activity);
+
+
+static int __init ledtrig_usb_init(void)
+{
+#ifdef CONFIG_USB_GADGET
+   led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
+#endif
+#ifdef CONFIG_USB
+   led_trigger_register_simple(usb-host, ledtrig_usb_host);
+#endif
+   return 0;
+}
+
+static void __exit ledtrig_usb_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_gadget);
+   led_trigger_unregister_simple(ledtrig_usb_host);
+}
+
+module_init(ledtrig_usb_init);
+module_exit(ledtrig_usb_exit);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..409cb95 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (likely(status == 0))
+   usb_led_activity(USB_LED_EVENT_HOST);
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index 2eb0ae4..2ce42f9 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -27,6 +27,7 @@
 
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include linux/usb.h
 
 /**
  * struct usb_udc - describes one usb device controller
@@ -105,6 +106,9 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
 {
+   if (likely(req-status == 0))
+   usb_led_activity(USB_LED_EVENT_GADGET);
+
/* complete() is from gadget layer,
 * eg fsg-bulk_in_complete() */
if (req-complete)
diff

Re: [PATCH v3 1/2] usb: gadget: Refactor request completion

2014-08-27 Thread Michal Sojka
On Wed, Aug 27 2014, Michal Sojka wrote:
 All USB peripheral controller drivers called completion routines
 directly. This patch moves the completion call from drivers to
 usb_gadget_giveback_request(), in order to have a place where common
 functionality can be added.

 All places in drivers/usb/ matching [-.]complete( were replaced with a
 call to usb_gadget_giveback_request(). This was compile-tested with all
 ARM drivers enabled and runtime-tested for musb.

[...]

 diff --git a/drivers/usb/gadget/udc/udc-core.c 
 b/drivers/usb/gadget/udc/udc-core.c
 index b0d9817..2eb0ae4 100644
 --- a/drivers/usb/gadget/udc/udc-core.c
 +++ b/drivers/usb/gadget/udc/udc-core.c
 @@ -102,6 +102,15 @@ void usb_gadget_unmap_request(struct usb_gadget *gadget,
  }
  EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
  
 +void usb_gadget_giveback_request(struct usb_ep *ep,
 + struct usb_request *req)
 +{
 + /* complete() is from gadget layer,
 +  * eg fsg-bulk_in_complete() */
 + if (req-complete)
 + req-complete(ep, req);
 +}
 +EXPORT_SYMBOL_GPL(usb_gadget_giveback_request);
  #endif   /* CONFIG_HAS_DMA */

#endif should be before usb_gadget_giveback_request(). I'll fix this in
v4.

-Michal
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 2/3] usb: Rename usb-common.c

2014-08-27 Thread Michal Sojka
In the next commit, we will want the usb-common module to be composed of
two object files. Since Kbuild cannot append another object to an
existing one, we need to rename usb-common.c to something
else (common.c) and create usb-common.o by linking the wanted objects
together. Currently, usb-common.o comprises only common.o.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/common/Makefile   | 4 +++-
 drivers/usb/common/{usb-common.c = common.c} | 0
 2 files changed, 3 insertions(+), 1 deletion(-)
 rename drivers/usb/common/{usb-common.c = common.c} (100%)

diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 7526461..052c120 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -2,5 +2,7 @@
 # Makefile for the usb common parts.
 #
 
-obj-$(CONFIG_USB_COMMON) += usb-common.o
+obj-$(CONFIG_USB_COMMON) += usb-common.o
+usb-common-y += common.o
+
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/usb-common.c b/drivers/usb/common/common.c
similarity index 100%
rename from drivers/usb/common/usb-common.c
rename to drivers/usb/common/common.c
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 3/3] usb: Add LED triggers for USB activity

2014-08-27 Thread Michal Sojka
With this patch, USB activity can be signaled by blinking a LED. There
are two triggers, one for activity on USB host and one for USB gadget.

Both trigger should work with all host/device controllers. Tested only
with musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/Kconfig   | 11 
 drivers/usb/common/Makefile   |  1 +
 drivers/usb/common/led.c  | 56 +++
 drivers/usb/core/hcd.c|  2 ++
 drivers/usb/gadget/udc/udc-core.c |  4 +++
 include/linux/usb.h   | 12 +
 6 files changed, 86 insertions(+)
 create mode 100644 drivers/usb/common/led.c

diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig
index e0cad441..fc90cda 100644
--- a/drivers/usb/Kconfig
+++ b/drivers/usb/Kconfig
@@ -147,4 +147,15 @@ source drivers/usb/phy/Kconfig
 
 source drivers/usb/gadget/Kconfig
 
+config USB_LED_TRIG
+   bool USB LED Triggers
+   depends on LEDS_CLASS  USB_COMMON
+   select LEDS_TRIGGERS
+   help
+ This option adds LED triggers for USB host and/or gadget activity.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as activity indicators for USB host or
+ gadget.
+
 endif # USB_SUPPORT
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index 052c120..ca2f8bd 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -4,5 +4,6 @@
 
 obj-$(CONFIG_USB_COMMON) += usb-common.o
 usb-common-y += common.o
+usb-common-$(CONFIG_USB_LED_TRIG) += led.o
 
 obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
diff --git a/drivers/usb/common/led.c b/drivers/usb/common/led.c
new file mode 100644
index 000..af3ce2c
--- /dev/null
+++ b/drivers/usb/common/led.c
@@ -0,0 +1,56 @@
+/*
+ * LED Triggers for USB Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb.h
+
+#define BLINK_DELAY 30
+
+static unsigned long usb_blink_delay = BLINK_DELAY;
+
+DEFINE_LED_TRIGGER(ledtrig_usb_gadget);
+DEFINE_LED_TRIGGER(ledtrig_usb_host);
+
+void usb_led_activity(enum usb_led_event ev)
+{
+   struct led_trigger *trig = NULL;
+
+   switch (ev) {
+   case USB_LED_EVENT_GADGET: trig = ledtrig_usb_gadget; break;
+   case USB_LED_EVENT_HOST:   trig = ledtrig_usb_host;break;
+   }
+   led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
+}
+EXPORT_SYMBOL(usb_led_activity);
+
+
+static int __init ledtrig_usb_init(void)
+{
+#ifdef CONFIG_USB_GADGET
+   led_trigger_register_simple(usb-gadget, ledtrig_usb_gadget);
+#endif
+#ifdef CONFIG_USB
+   led_trigger_register_simple(usb-host, ledtrig_usb_host);
+#endif
+   return 0;
+}
+
+static void __exit ledtrig_usb_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_gadget);
+   led_trigger_unregister_simple(ledtrig_usb_host);
+}
+
+module_init(ledtrig_usb_init);
+module_exit(ledtrig_usb_exit);
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..409cb95 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (likely(status == 0))
+   usb_led_activity(USB_LED_EVENT_HOST);
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/gadget/udc/udc-core.c 
b/drivers/usb/gadget/udc/udc-core.c
index c1df19b..9fc4a36 100644
--- a/drivers/usb/gadget/udc/udc-core.c
+++ b/drivers/usb/gadget/udc/udc-core.c
@@ -27,6 +27,7 @@
 
 #include linux/usb/ch9.h
 #include linux/usb/gadget.h
+#include linux/usb.h
 
 /**
  * struct usb_udc - describes one usb device controller
@@ -116,6 +117,9 @@ EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
 void usb_gadget_giveback_request(struct usb_ep *ep,
struct usb_request *req)
 {
+   if (likely(req-status == 0))
+   usb_led_activity(USB_LED_EVENT_GADGET);
+
BUG_ON(req-complete == NULL);
req-complete(ep, req);
 }
diff --git a/include/linux/usb.h b/include/linux/usb.h
index d2465bc..447a7e2 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -1862,6 +1862,18 @@ extern void usb_unregister_notify(struct notifier_block 
*nb);
 /* debugfs stuff */
 extern struct dentry *usb_debug_root;
 
+/* LED triggers */
+enum usb_led_event {
+   USB_LED_EVENT_HOST = 0,
+   USB_LED_EVENT_GADGET = 1,
+};
+
+#ifdef CONFIG_USB_LED_TRIG
+extern void usb_led_activity(enum usb_led_event ev);
+#else

[PATCH v4 1/3] usb: gadget: Refactor request completion

2014-08-27 Thread Michal Sojka
All USB peripheral controller drivers called completion routines
directly. This patch moves the completion call from drivers to
usb_gadget_giveback_request(), in order to have a place where common
functionality can be added.

All places in drivers/usb/ matching [-.]complete( were replaced with a
call to usb_gadget_giveback_request(). This was compile-tested with all
ARM drivers enabled and runtime-tested for musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/chipidea/udc.c  |  6 +++---
 drivers/usb/dwc2/gadget.c   |  6 +++---
 drivers/usb/dwc3/gadget.c   |  2 +-
 drivers/usb/gadget/udc/amd5536udc.c |  2 +-
 drivers/usb/gadget/udc/at91_udc.c   |  2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |  4 ++--
 drivers/usb/gadget/udc/bcm63xx_udc.c|  2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  | 10 +-
 drivers/usb/gadget/udc/fotg210-udc.c|  2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |  6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |  6 ++
 drivers/usb/gadget/udc/fusb300_udc.c|  2 +-
 drivers/usb/gadget/udc/goku_udc.c   |  2 +-
 drivers/usb/gadget/udc/gr_udc.c |  2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|  2 +-
 drivers/usb/gadget/udc/m66592-udc.c |  2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|  8 ++--
 drivers/usb/gadget/udc/mv_udc_core.c|  8 ++--
 drivers/usb/gadget/udc/net2272.c|  2 +-
 drivers/usb/gadget/udc/net2280.c|  2 +-
 drivers/usb/gadget/udc/omap_udc.c   |  2 +-
 drivers/usb/gadget/udc/pch_udc.c|  2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |  2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |  2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |  2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |  3 +--
 drivers/usb/gadget/udc/s3c2410_udc.c|  2 +-
 drivers/usb/gadget/udc/udc-core.c   | 17 +
 drivers/usb/musb/musb_gadget.c  |  2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |  2 +-
 include/linux/usb/gadget.h  |  8 
 31 files changed, 66 insertions(+), 56 deletions(-)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b8125aa..0444d3f 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -627,7 +627,7 @@ __acquires(hwep-lock)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -922,7 +922,7 @@ __acquires(hwep-lock)
if ((hwep-type == USB_ENDPOINT_XFER_CONTROL) 
hwreq-req.length)
hweptemp = hwep-ci-ep0in;
-   hwreq-req.complete(hweptemp-ep, hwreq-req);
+   usb_gadget_giveback_request(hweptemp-ep, hwreq-req);
spin_lock(hwep-lock);
}
}
@@ -1347,7 +1347,7 @@ static int ep_dequeue(struct usb_ep *ep, struct 
usb_request *req)
 
if (hwreq-req.complete != NULL) {
spin_unlock(hwep-lock);
-   hwreq-req.complete(hwep-ep, hwreq-req);
+   usb_gadget_giveback_request(hwep-ep, hwreq-req);
spin_lock(hwep-lock);
}
 
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 0ba9c33..5a524a6 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -987,8 +987,8 @@ static int s3c_hsotg_process_req_feature(struct s3c_hsotg 
*hsotg,
hs_req = ep-req;
ep-req = NULL;
list_del_init(hs_req-queue);
-   hs_req-req.complete(ep-ep,
-hs_req-req);
+   usb_gadget_giveback_request(ep-ep,
+   
hs_req-req);
}
 
/* If we have pending request, then start it */
@@ -1245,7 +1245,7 @@ static void s3c_hsotg_complete_request(struct s3c_hsotg 
*hsotg,
 
if (hs_req-req.complete) {
spin_unlock(hsotg-lock);
-   hs_req-req.complete(hs_ep-ep, hs_req-req);
+   usb_gadget_giveback_request(hs_ep-ep, hs_req-req);
spin_lock(hsotg-lock);
}
 
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 349cacc..b4b7a6b 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -268,7 +268,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct 
dwc3_request *req,
req-request.length, status);
 
spin_unlock(dwc-lock);
-   req-request.complete(dep-endpoint, req-request

[PATCH v4 0/3] LED triggers for USB host and device

2014-08-27 Thread Michal Sojka
This adds LED triggers for USB host and device. First patch refactors
UDC drivers as requested by Felipe Balbi, second is a preparation for
the third, which adds the LED triggers.

Changes from v3:
- usb_gadget_giveback_request() moved outside of CONFIG_HAS_DMA
  conditioned block.
- Added kernel-doc for usb_gadget_giveback_request() (Felipe Balbi).
- Removed outdated comment (Alan Stern).
- req-complete == NULL is now a bug. Previously, this was ignored
  (Alan Stern).
- File rename moved to a separate commit (greg k-h).

Changes from v2:
- Host/gadget triggers merged to a single file in usb/common/ (Felipe
  Balbi).
- UDC drivers refactored so that LED trigger works for all of them.

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/.
- Improved Kconfig help.
- Linked with other modules rather than being standalone modules.

Michal Sojka (2):
  usb: gadget: Refactor request completion
  usb: Add LED triggers for USB activity

 drivers/usb/Kconfig |  11 +++
 drivers/usb/chipidea/udc.c  |   6 +-
 drivers/usb/common/Makefile |   5 +-
 drivers/usb/common/common.c | 144 
 drivers/usb/common/led.c|  59 +
 drivers/usb/common/usb-common.c | 144 
 drivers/usb/core/hcd.c  |   2 +
 drivers/usb/dwc2/gadget.c   |   6 +-
 drivers/usb/dwc3/gadget.c   |   2 +-
 drivers/usb/gadget/udc/amd5536udc.c |   2 +-
 drivers/usb/gadget/udc/at91_udc.c   |   2 +-
 drivers/usb/gadget/udc/atmel_usba_udc.c |   4 +-
 drivers/usb/gadget/udc/bcm63xx_udc.c|   2 +-
 drivers/usb/gadget/udc/dummy_hcd.c  |  10 +--
 drivers/usb/gadget/udc/fotg210-udc.c|   2 +-
 drivers/usb/gadget/udc/fsl_qe_udc.c |   6 +-
 drivers/usb/gadget/udc/fsl_udc_core.c   |   6 +-
 drivers/usb/gadget/udc/fusb300_udc.c|   2 +-
 drivers/usb/gadget/udc/goku_udc.c   |   2 +-
 drivers/usb/gadget/udc/gr_udc.c |   2 +-
 drivers/usb/gadget/udc/lpc32xx_udc.c|   2 +-
 drivers/usb/gadget/udc/m66592-udc.c |   2 +-
 drivers/usb/gadget/udc/mv_u3d_core.c|   8 +-
 drivers/usb/gadget/udc/mv_udc_core.c|   8 +-
 drivers/usb/gadget/udc/net2272.c|   2 +-
 drivers/usb/gadget/udc/net2280.c|   2 +-
 drivers/usb/gadget/udc/omap_udc.c   |   2 +-
 drivers/usb/gadget/udc/pch_udc.c|   2 +-
 drivers/usb/gadget/udc/pxa25x_udc.c |   2 +-
 drivers/usb/gadget/udc/pxa27x_udc.c |   2 +-
 drivers/usb/gadget/udc/r8a66597-udc.c   |   2 +-
 drivers/usb/gadget/udc/s3c-hsudc.c  |   3 +-
 drivers/usb/gadget/udc/s3c2410_udc.c|   2 +-
 drivers/usb/gadget/udc/udc-core.c   |  13 +++
 drivers/usb/musb/musb_gadget.c  |   2 +-
 drivers/usb/renesas_usbhs/mod_gadget.c  |   2 +-
 include/linux/usb.h |  12 +++
 include/linux/usb/gadget.h  |   8 ++
 38 files changed, 294 insertions(+), 201 deletions(-)
 create mode 100644 drivers/usb/common/common.c
 create mode 100644 drivers/usb/common/led.c
 delete mode 100644 drivers/usb/common/usb-common.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/3] usb: Add LED trigger for USB host activity

2014-08-23 Thread Michal Sojka
Hi Bryan,

thanks for the review. See some comments below.

On Sat, Aug 23 2014, Bryan Wu wrote:
 On Fri, Aug 22, 2014 at 5:08 PM, Michal Sojka so...@merica.cz wrote:
 With this patch, USB host activity can be signaled by blinking a LED.

 This should work with all host controllers. Tested only with musb.

 Signed-off-by: Michal Sojka so...@merica.cz
 ---
  drivers/usb/core/Kconfig  |  9 +
  drivers/usb/core/Makefile |  1 +
  drivers/usb/core/hcd.c|  2 ++
  drivers/usb/core/led.c| 38 ++
  include/linux/usb/hcd.h   |  6 ++
  5 files changed, 56 insertions(+)
  create mode 100644 drivers/usb/core/led.c

 diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig
 index 1060657..8295f65 100644
 --- a/drivers/usb/core/Kconfig
 +++ b/drivers/usb/core/Kconfig
 @@ -90,3 +90,12 @@ config USB_OTG_FSM
   Implements OTG Finite State Machine as specified in On-The-Go
   and Embedded Host Supplement to the USB Revision 2.0 Specification.

 +config USB_HOST_LED
 +   bool USB Host LED Trigger
 +   depends on LEDS_CLASS
 +   select LEDS_TRIGGERS
 +   help
 + This option adds a LED trigger for USB host controllers.
 +
 + Say Y here if you are working on a system with led-class supported
 + LEDs and you want to use them as USB host activity indicators.
 diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
 index 2f6f932..324c8c9 100644
 --- a/drivers/usb/core/Makefile
 +++ b/drivers/usb/core/Makefile
 @@ -9,5 +9,6 @@ usbcore-y += port.o

  usbcore-$(CONFIG_PCI)  += hcd-pci.o
  usbcore-$(CONFIG_ACPI) += usb-acpi.o
 +usbcore-$(CONFIG_USB_HOST_LED) += led.o

  obj-$(CONFIG_USB)  += usbcore.o
 diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
 index 487abcf..46d9f3a 100644
 --- a/drivers/usb/core/hcd.c
 +++ b/drivers/usb/core/hcd.c
 @@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
 usbmon_urb_complete(hcd-self, urb, status);
 usb_anchor_suspend_wakeups(anchor);
 usb_unanchor_urb(urb);
 +   if (status == 0)
 +   usb_hcd_led_activity();

 /* pass ownership to the completion handler */
 urb-status = status;
 diff --git a/drivers/usb/core/led.c b/drivers/usb/core/led.c
 new file mode 100644
 index 000..49ff76c
 --- /dev/null
 +++ b/drivers/usb/core/led.c
 @@ -0,0 +1,38 @@
 +/*
 + * LED Trigger for USB Host Activity
 + *
 + * Copyright 2014 Michal Sojka so...@merica.cz
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + *
 + */
 +
 +#include linux/module.h
 +#include linux/kernel.h
 +#include linux/init.h
 +#include linux/leds.h
 +#include linux/usb/hcd.h
 +
 +#define BLINK_DELAY 30
 +
 +DEFINE_LED_TRIGGER(ledtrig_usb_hcd);

 Add one more trigger named ledtrig_usb_gadget

 +static unsigned long usb_hcd_blink_delay = BLINK_DELAY;
 +
 +void usb_hcd_led_activity(void)

 Give an input parameter like emum usb_led_event.
 USB_LED_EVENT_HOST = 0
 USB_LED_EVENT_GADGET = 1


 +{

 Add case for USB_LED_EVENT_HOST:
 +   led_trigger_blink_oneshot(ledtrig_usb_hcd,
 + usb_hcd_blink_delay, 
 usb_hcd_blink_delay, 0);

 Add case for USB_LED_EVENT_GADGET:
  led_trigger_blink_oneshot(ledtrig_usb_gadget,
  usb_gadget_blink_delay,
 usb_gadget_blink_delay, 0);

 +}
 +
 +int __init ledtrig_usb_hcd_init(void)
 +{
 +   led_trigger_register_simple(usb-host, ledtrig_usb_hcd);
 register one more trigger for gadget.

This way, the code will be full of #ifdefs. Is the following really what
you want? If you want to have it without #ifdefs, then I don't think it
is a good idea to offer users the usb-gadget trigger on systems without
usb gadget support.

#define BLINK_DELAY 30

static unsigned long usb_blink_delay = BLINK_DELAY;

enum usb_led_event {
USB_LED_EVENT_HOST = 0,
USB_LED_EVENT_GADGET = 1,
};

#ifdef CONFIG_USB_GADGET_LED
DEFINE_LED_TRIGGER(ledtrig_usbgadget);
#endif
#ifdef CONFIG_USB_HOST_LED
DEFINE_LED_TRIGGER(ledtrig_usb_hcd);
#endif

void usb_led_activity(enum usb_led_event ev)
{
struct led_trigger *trig;

switch (ev) {
#ifdef CONFIG_USB_GADGET_LED
case USB_LED_EVENT_GADGET: trig = ledtrig_usb_gadget; break;
#endif
#ifdef CONFIG_USB_HOST_LED
case USB_LED_EVENT_HOST:   trig = ledtrig_usb_hcd; break;
#endif
default:;
}
led_trigger_blink_oneshot(trig, usb_blink_delay, usb_blink_delay, 0);
}
EXPORT_SYMBOL(usb_led_activity);


int __init ledtrig_usb_init(void)
{
#ifdef CONFIG_USB_GADGET_LED
led_trigger_register_simple(usb-gadget, ledtrig_usbgadget);
#endif
#ifdef CONFIG_USB_HOST_LED
led_trigger_register_simple(usb-host, ledtrig_usb_hcd);
#endif
return 0;
}

void __exit ledtrig_usb_exit(void

[PATCH 1/2] leds: usb: Add LED trigger for USB gadget activity

2014-08-22 Thread Michal Sojka
With this patch, USB gadget activity can be signaled by blinking a LED.

Since there is no generic code where to put the trigger for all USB
controllers, each USB controller needs to call the trigger individually.
This patch adds the call only for the musb controller where I can test
it.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/leds/trigger/Kconfig |  8 ++
 drivers/leds/trigger/Makefile|  1 +
 drivers/leds/trigger/ledtrig-usbgadget.c | 45 
 drivers/usb/musb/musb_gadget.c   |  6 +++--
 include/linux/leds.h |  6 +
 5 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 drivers/leds/trigger/ledtrig-usbgadget.c

diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig
index 49794b4..9562963 100644
--- a/drivers/leds/trigger/Kconfig
+++ b/drivers/leds/trigger/Kconfig
@@ -41,6 +41,14 @@ config LEDS_TRIGGER_IDE_DISK
  This allows LEDs to be controlled by IDE disk activity.
  If unsure, say Y.
 
+config LEDS_TRIGGER_USBGADGET
+   bool LED USB Gadget Trigger
+   depends on (USB_MUSB_GADGET || USB_MUSB_DUAL_ROLE)
+   depends on LEDS_TRIGGERS
+   help
+ This allows LEDs to be controlled by USB gadget activity.
+ If unsure, say Y.
+
 config LEDS_TRIGGER_HEARTBEAT
tristate LED Heartbeat Trigger
depends on LEDS_TRIGGERS
diff --git a/drivers/leds/trigger/Makefile b/drivers/leds/trigger/Makefile
index 1abf48d..45917c0 100644
--- a/drivers/leds/trigger/Makefile
+++ b/drivers/leds/trigger/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_LEDS_TRIGGER_CPU)  += ledtrig-cpu.o
 obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)  += ledtrig-default-on.o
 obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT)   += ledtrig-transient.o
 obj-$(CONFIG_LEDS_TRIGGER_CAMERA)  += ledtrig-camera.o
+obj-$(CONFIG_LEDS_TRIGGER_USBGADGET)   += ledtrig-usbgadget.o
diff --git a/drivers/leds/trigger/ledtrig-usbgadget.c 
b/drivers/leds/trigger/ledtrig-usbgadget.c
new file mode 100644
index 000..1eb90da
--- /dev/null
+++ b/drivers/leds/trigger/ledtrig-usbgadget.c
@@ -0,0 +1,45 @@
+/*
+ * LED Trigger for USB Gadget Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+
+#define BLINK_DELAY 30
+
+DEFINE_LED_TRIGGER(ledtrig_usbgadget);
+static unsigned long usbgadget_blink_delay = BLINK_DELAY;
+
+void ledtrig_usbgadget_activity(void)
+{
+   led_trigger_blink_oneshot(ledtrig_usbgadget,
+ usbgadget_blink_delay, 
usbgadget_blink_delay, 0);
+}
+EXPORT_SYMBOL(ledtrig_usbgadget_activity);
+
+static int __init ledtrig_usbgadget_init(void)
+{
+   led_trigger_register_simple(usb-gadget, ledtrig_usbgadget);
+   return 0;
+}
+
+static void __exit ledtrig_usbgadget_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usbgadget);
+}
+
+module_init(ledtrig_usbgadget_init);
+module_exit(ledtrig_usbgadget_exit);
+
+MODULE_AUTHOR(Michal Sojka so...@merica.cz);
+MODULE_DESCRIPTION(LED Trigger for USB Gadget Activity);
+MODULE_LICENSE(GPL);
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index d4aa779..98f8b24 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -42,6 +42,7 @@
 #include linux/delay.h
 #include linux/dma-mapping.h
 #include linux/slab.h
+#include linux/leds.h
 
 #include musb_core.h
 
@@ -167,11 +168,12 @@ __acquires(ep-musb-lock)
if (!dma_mapping_error(musb-g.dev, request-dma))
unmap_dma_buffer(req, musb);
 
-   if (request-status == 0)
+   if (request-status == 0) {
dev_dbg(musb-controller, %s done request %p,  %d/%d\n,
ep-end_point.name, request,
req-request.actual, req-request.length);
-   else
+   ledtrig_usbgadget_activity();
+   } else
dev_dbg(musb-controller, %s request %p, %d/%d fault %d\n,
ep-end_point.name, request,
req-request.actual, req-request.length,
diff --git a/include/linux/leds.h b/include/linux/leds.h
index 0287ab2..5d9668e 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -218,6 +218,12 @@ extern void ledtrig_ide_activity(void);
 static inline void ledtrig_ide_activity(void) {}
 #endif
 
+#ifdef CONFIG_LEDS_TRIGGER_USBGADGET
+extern void ledtrig_usbgadget_activity(void);
+#else
+static inline void ledtrig_usbgadget_activity(void) {}
+#endif
+
 #if defined(CONFIG_LEDS_TRIGGER_CAMERA) || 
defined(CONFIG_LEDS_TRIGGER_CAMERA_MODULE)
 extern void ledtrig_flash_ctrl(bool on);
 extern void ledtrig_torch_ctrl(bool on);
-- 
2.1.0

Re: [PATCH 1/2] leds: usb: Add LED trigger for USB gadget activity

2014-08-22 Thread Michal Sojka
On Fri, Aug 22 2014, Greg Kroah-Hartman wrote:
 On Fri, Aug 22, 2014 at 10:39:03AM -0700, Bryan Wu wrote:
 On Fri, Aug 22, 2014 at 4:53 AM, Michal Sojka so...@merica.cz wrote:
  With this patch, USB gadget activity can be signaled by blinking a LED.
 
  Since there is no generic code where to put the trigger for all USB
  controllers, each USB controller needs to call the trigger individually.
  This patch adds the call only for the musb controller where I can test
  it.
 
 
 Generally I think one led trigger for both USB host and USB gadget
 activity is good enough. We don't need 2 same led trigger here.

 What about systems that have both running at the same time?  Don't you
 want individual control?

Yes, I have a device with two USB connectors (host, device) and a LED
next to each. From the LEDs it should be clear, which connector is being
used.

Thanks,
-Michal
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] leds: usb: Add LED trigger for USB gadget activity

2014-08-22 Thread Michal Sojka
Hi Felipe,

On Fri, Aug 22 2014, Felipe Balbi wrote:
 Hi,

 On Fri, Aug 22, 2014 at 01:53:12PM +0200, Michal Sojka wrote:
 With this patch, USB gadget activity can be signaled by blinking a LED.
 
 Since there is no generic code where to put the trigger for all USB
 controllers, each USB controller needs to call the trigger individually.
 This patch adds the call only for the musb controller where I can test
 it.
 
 Signed-off-by: Michal Sojka so...@merica.cz
 ---
  drivers/leds/trigger/Kconfig |  8 ++
  drivers/leds/trigger/Makefile|  1 +
  drivers/leds/trigger/ledtrig-usbgadget.c | 45 
 
  drivers/usb/musb/musb_gadget.c   |  6 +++--
  include/linux/leds.h |  6 +
  5 files changed, 64 insertions(+), 2 deletions(-)
  create mode 100644 drivers/leds/trigger/ledtrig-usbgadget.c
 
 diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig
 index 49794b4..9562963 100644
 --- a/drivers/leds/trigger/Kconfig
 +++ b/drivers/leds/trigger/Kconfig
 @@ -41,6 +41,14 @@ config LEDS_TRIGGER_IDE_DISK
This allows LEDs to be controlled by IDE disk activity.
If unsure, say Y.
  
 +config LEDS_TRIGGER_USBGADGET
 +bool LED USB Gadget Trigger
 +depends on (USB_MUSB_GADGET || USB_MUSB_DUAL_ROLE)
 +depends on LEDS_TRIGGERS
 +help
 +  This allows LEDs to be controlled by USB gadget activity.
 +  If unsure, say Y.
 +
  config LEDS_TRIGGER_HEARTBEAT
  tristate LED Heartbeat Trigger
  depends on LEDS_TRIGGERS
 diff --git a/drivers/leds/trigger/Makefile b/drivers/leds/trigger/Makefile
 index 1abf48d..45917c0 100644
 --- a/drivers/leds/trigger/Makefile
 +++ b/drivers/leds/trigger/Makefile
 @@ -8,3 +8,4 @@ obj-$(CONFIG_LEDS_TRIGGER_CPU)   += ledtrig-cpu.o
  obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON)   += ledtrig-default-on.o
  obj-$(CONFIG_LEDS_TRIGGER_TRANSIENT)+= ledtrig-transient.o
  obj-$(CONFIG_LEDS_TRIGGER_CAMERA)   += ledtrig-camera.o
 +obj-$(CONFIG_LEDS_TRIGGER_USBGADGET)+= ledtrig-usbgadget.o
 diff --git a/drivers/leds/trigger/ledtrig-usbgadget.c 
 b/drivers/leds/trigger/ledtrig-usbgadget.c
 new file mode 100644
 index 000..1eb90da
 --- /dev/null
 +++ b/drivers/leds/trigger/ledtrig-usbgadget.c
 @@ -0,0 +1,45 @@
 +/*
 + * LED Trigger for USB Gadget Activity
 + *
 + * Copyright 2014 Michal Sojka so...@merica.cz
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 + *
 + */
 +
 +#include linux/module.h
 +#include linux/kernel.h
 +#include linux/init.h
 +#include linux/leds.h
 +
 +#define BLINK_DELAY 30
 +
 +DEFINE_LED_TRIGGER(ledtrig_usbgadget);
 +static unsigned long usbgadget_blink_delay = BLINK_DELAY;
 +
 +void ledtrig_usbgadget_activity(void)
 +{
 +led_trigger_blink_oneshot(ledtrig_usbgadget,
 +  usbgadget_blink_delay, 
 usbgadget_blink_delay, 0);
 +}
 +EXPORT_SYMBOL(ledtrig_usbgadget_activity);
 +
 +static int __init ledtrig_usbgadget_init(void)
 +{
 +led_trigger_register_simple(usb-gadget, ledtrig_usbgadget);
 +return 0;
 +}
 +
 +static void __exit ledtrig_usbgadget_exit(void)
 +{
 +led_trigger_unregister_simple(ledtrig_usbgadget);
 +}
 +
 +module_init(ledtrig_usbgadget_init);
 +module_exit(ledtrig_usbgadget_exit);
 +
 +MODULE_AUTHOR(Michal Sojka so...@merica.cz);
 +MODULE_DESCRIPTION(LED Trigger for USB Gadget Activity);
 +MODULE_LICENSE(GPL);
 diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
 index d4aa779..98f8b24 100644
 --- a/drivers/usb/musb/musb_gadget.c
 +++ b/drivers/usb/musb/musb_gadget.c
 @@ -42,6 +42,7 @@
  #include linux/delay.h
  #include linux/dma-mapping.h
  #include linux/slab.h
 +#include linux/leds.h
  
  #include musb_core.h
  
 @@ -167,11 +168,12 @@ __acquires(ep-musb-lock)
  if (!dma_mapping_error(musb-g.dev, request-dma))
  unmap_dma_buffer(req, musb);
  
 -if (request-status == 0)
 +if (request-status == 0) {
  dev_dbg(musb-controller, %s done request %p,  %d/%d\n,
  ep-end_point.name, request,
  req-request.actual, req-request.length);
 -else
 +ledtrig_usbgadget_activity();

 looks like this should, somehow, be done at udc-core.c although you'd
 need some refactoring to make that happen. It shouldn't be too difficult
 to have a generic usb_gadget_giveback_request()

I'm sending a second version, where it is moved to udc directory. I'll
look at refactoring next week.

Thanks,
-Michal
--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 0/3] LED triggers for USB host and device

2014-08-22 Thread Michal Sojka
This adds LED triggers for USB host and device.

Changes from v1:
- Moved from drivers/leds/ to drivers/usb/
- Improved Kconfig help
- Linked with other modules rather than being standalone modules

Michal Sojka (3):
  usb: Add missing #include
  usb: Add LED trigger for USB host activity
  usb: Add LED trigger for USB gadget activity

 drivers/usb/core/Kconfig|  9 +
 drivers/usb/core/Makefile   |  1 +
 drivers/usb/core/hcd.c  |  2 ++
 drivers/usb/core/led.c  | 38 ++
 drivers/usb/gadget/Kconfig  | 12 
 drivers/usb/gadget/udc/Makefile |  5 -
 drivers/usb/gadget/udc/led.c| 38 ++
 drivers/usb/musb/musb_gadget.c  |  5 +++--
 include/linux/usb/gadget.h  | 10 ++
 include/linux/usb/hcd.h |  7 +++
 10 files changed, 124 insertions(+), 3 deletions(-)
 create mode 100644 drivers/usb/core/led.c
 create mode 100644 drivers/usb/gadget/udc/led.c

-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 2/3] usb: Add LED trigger for USB host activity

2014-08-22 Thread Michal Sojka
With this patch, USB host activity can be signaled by blinking a LED.

This should work with all host controllers. Tested only with musb.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/core/Kconfig  |  9 +
 drivers/usb/core/Makefile |  1 +
 drivers/usb/core/hcd.c|  2 ++
 drivers/usb/core/led.c| 38 ++
 include/linux/usb/hcd.h   |  6 ++
 5 files changed, 56 insertions(+)
 create mode 100644 drivers/usb/core/led.c

diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig
index 1060657..8295f65 100644
--- a/drivers/usb/core/Kconfig
+++ b/drivers/usb/core/Kconfig
@@ -90,3 +90,12 @@ config USB_OTG_FSM
  Implements OTG Finite State Machine as specified in On-The-Go
  and Embedded Host Supplement to the USB Revision 2.0 Specification.
 
+config USB_HOST_LED
+   bool USB Host LED Trigger
+   depends on LEDS_CLASS
+   select LEDS_TRIGGERS
+   help
+ This option adds a LED trigger for USB host controllers.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as USB host activity indicators.
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 2f6f932..324c8c9 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -9,5 +9,6 @@ usbcore-y += port.o
 
 usbcore-$(CONFIG_PCI)  += hcd-pci.o
 usbcore-$(CONFIG_ACPI) += usb-acpi.o
+usbcore-$(CONFIG_USB_HOST_LED) += led.o
 
 obj-$(CONFIG_USB)  += usbcore.o
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 487abcf..46d9f3a 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1664,6 +1664,8 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
usbmon_urb_complete(hcd-self, urb, status);
usb_anchor_suspend_wakeups(anchor);
usb_unanchor_urb(urb);
+   if (status == 0)
+   usb_hcd_led_activity();
 
/* pass ownership to the completion handler */
urb-status = status;
diff --git a/drivers/usb/core/led.c b/drivers/usb/core/led.c
new file mode 100644
index 000..49ff76c
--- /dev/null
+++ b/drivers/usb/core/led.c
@@ -0,0 +1,38 @@
+/*
+ * LED Trigger for USB Host Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+#include linux/usb/hcd.h
+
+#define BLINK_DELAY 30
+
+DEFINE_LED_TRIGGER(ledtrig_usb_hcd);
+static unsigned long usb_hcd_blink_delay = BLINK_DELAY;
+
+void usb_hcd_led_activity(void)
+{
+   led_trigger_blink_oneshot(ledtrig_usb_hcd,
+ usb_hcd_blink_delay, usb_hcd_blink_delay, 
0);
+}
+
+int __init ledtrig_usb_hcd_init(void)
+{
+   led_trigger_register_simple(usb-host, ledtrig_usb_hcd);
+   return 0;
+}
+
+void __exit ledtrig_usb_hcd_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usb_hcd);
+}
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index b43f0fe..eb5fa0f 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -700,6 +700,12 @@ extern struct rw_semaphore ehci_cf_port_reset_rwsem;
 #define USB_EHCI_LOADED2
 extern unsigned long usb_hcds_loaded;
 
+#ifdef CONFIG_USB_HOST_LED
+extern void usb_hcd_led_activity(void);
+#else
+static inline void usb_hcd_led_activity(void) {}
+#endif
+
 #endif /* __KERNEL__ */
 
 #endif /* __USB_CORE_HCD_H */
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 1/3] usb: Add missing #include

2014-08-22 Thread Michal Sojka
linux/usb/hcd.h needs the definition of struct usb_bus.

Signed-off-by: Michal Sojka so...@merica.cz
---
 include/linux/usb/hcd.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index 485cd5e..b43f0fe 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -23,6 +23,7 @@
 
 #include linux/rwsem.h
 #include linux/interrupt.h
+#include linux/usb.h
 
 #define MAX_TOPO_LEVEL 6
 
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 3/3] usb: Add LED trigger for USB gadget activity

2014-08-22 Thread Michal Sojka
With this patch, USB gadget activity can be signaled by blinking a LED.

Since there is no generic code where to put the trigger for all USB
controllers, each USB controller needs to call the trigger individually.
This patch adds the call only for the musb controller where I can test
it.

Signed-off-by: Michal Sojka so...@merica.cz
---
 drivers/usb/gadget/Kconfig  | 12 
 drivers/usb/gadget/udc/Makefile |  5 -
 drivers/usb/gadget/udc/led.c| 38 ++
 drivers/usb/musb/musb_gadget.c  |  5 +++--
 include/linux/usb/gadget.h  | 10 ++
 5 files changed, 67 insertions(+), 3 deletions(-)
 create mode 100644 drivers/usb/gadget/udc/led.c

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 5c822af..612c859 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -127,6 +127,18 @@ config USB_GADGET_STORAGE_NUM_BUFFERS
   a module parameter as well.
   If unsure, say 2.
 
+config USB_GADGET_LED
+   bool USB Gadget LED Trigger
+   depends on (USB_MUSB_GADGET || USB_MUSB_DUAL_ROLE)
+   depends on LEDS_CLASS
+   select LEDS_TRIGGERS
+   help
+ This option adds a LED trigger for USB gadgets. The trigger will
+ only work with supported USB device controllers.
+
+ Say Y here if you are working on a system with led-class supported
+ LEDs and you want to use them as USB gadget activity indicators.
+
 source drivers/usb/gadget/udc/Kconfig
 
 #
diff --git a/drivers/usb/gadget/udc/Makefile b/drivers/usb/gadget/udc/Makefile
index 4096122..acbe3ca 100644
--- a/drivers/usb/gadget/udc/Makefile
+++ b/drivers/usb/gadget/udc/Makefile
@@ -1,7 +1,10 @@
 #
 # USB peripheral controller drivers
 #
-obj-$(CONFIG_USB_GADGET)   += udc-core.o
+obj-$(CONFIG_USB_GADGET)   += udc.o
+udc-y  := udc-core.o
+udc-$(CONFIG_USB_GADGET_LED)   += led.o
+
 obj-$(CONFIG_USB_DUMMY_HCD)+= dummy_hcd.o
 obj-$(CONFIG_USB_NET2272)  += net2272.o
 obj-$(CONFIG_USB_NET2280)  += net2280.o
diff --git a/drivers/usb/gadget/udc/led.c b/drivers/usb/gadget/udc/led.c
new file mode 100644
index 000..29a8b3f
--- /dev/null
+++ b/drivers/usb/gadget/udc/led.c
@@ -0,0 +1,38 @@
+/*
+ * LED Trigger for USB Gadget Activity
+ *
+ * Copyright 2014 Michal Sojka so...@merica.cz
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/leds.h
+
+#define BLINK_DELAY 30
+
+DEFINE_LED_TRIGGER(ledtrig_usbgadget);
+static unsigned long usbgadget_blink_delay = BLINK_DELAY;
+
+void usb_gadget_led_activity(void)
+{
+   led_trigger_blink_oneshot(ledtrig_usbgadget,
+ usbgadget_blink_delay, 
usbgadget_blink_delay, 0);
+}
+EXPORT_SYMBOL(usb_gadget_led_activity);
+
+int __init ledtrig_usbgadget_init(void)
+{
+   led_trigger_register_simple(usb-gadget, ledtrig_usbgadget);
+   return 0;
+}
+
+void __exit ledtrig_usbgadget_exit(void)
+{
+   led_trigger_unregister_simple(ledtrig_usbgadget);
+}
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index d4aa779..0bf06f9 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -167,11 +167,12 @@ __acquires(ep-musb-lock)
if (!dma_mapping_error(musb-g.dev, request-dma))
unmap_dma_buffer(req, musb);
 
-   if (request-status == 0)
+   if (request-status == 0) {
dev_dbg(musb-controller, %s done request %p,  %d/%d\n,
ep-end_point.name, request,
req-request.actual, req-request.length);
-   else
+   usb_gadget_led_activity();
+   } else
dev_dbg(musb-controller, %s request %p, %d/%d fault %d\n,
ep-end_point.name, request,
req-request.actual, req-request.length,
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index c3a6185..69bd9bc 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -1025,4 +1025,14 @@ extern struct usb_ep *usb_ep_autoconfig_ss(struct 
usb_gadget *,
 
 extern void usb_ep_autoconfig_reset(struct usb_gadget *);
 
+/*-*/
+
+/* LED trigger */
+
+#ifdef CONFIG_USB_GADGET_LED
+extern void usb_gadget_led_activity(void);
+#else
+static inline void usb_gadget_led_activity(void) {}
+#endif
+
 #endif /* __LINUX_USB_GADGET_H */
-- 
2.1.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] USB: serial: ftdi_sio: Add Infineon Triboard

2014-07-10 Thread Michal Sojka
This adds support for Infineon TriBoard TC1798 [1]. Only interface 1
is used as serial line (see [2], Figure 8-6).

[1] 
http://www.infineon.com/cms/de/product/microcontroller/development-tools-software-and-kits/tricore-tm-development-tools-software-and-kits/starterkits-and-evaluation-boards/starter-kit-tc1798/channel.html?channel=db3a304333b8a7ca0133cfa3d73e4268
[2] 
http://www.infineon.com/dgdl/TriBoardManual-TC1798-V10.pdf?folderId=db3a304412b407950112b409ae7c0343fileId=db3a304333b8a7ca0133cfae99fe426a

Signed-off-by: Michal Sojka sojk...@fel.cvut.cz
---
 drivers/usb/serial/ftdi_sio.c | 2 ++
 drivers/usb/serial/ftdi_sio_ids.h | 6 ++
 2 files changed, 8 insertions(+)

diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 115662c1..0c2b6e0 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -944,6 +944,8 @@ static const struct usb_device_id id_table_combined[] = {
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_2_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_3_PID) },
{ USB_DEVICE(BRAINBOXES_VID, BRAINBOXES_US_842_4_PID) },
+   /* Infineon Devices */
+   { USB_DEVICE_INTERFACE_NUMBER(INFINEON_VID, INFINEON_TRIBOARD_PID, 1) },
{ } /* Terminating entry */
 };
 
diff --git a/drivers/usb/serial/ftdi_sio_ids.h 
b/drivers/usb/serial/ftdi_sio_ids.h
index 500474c..8d959a7 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -584,6 +584,12 @@
 #define RATOC_PRODUCT_ID_USB60F0xb020
 
 /*
+ * Infineon Technologies
+ */
+#define INFINEON_VID   0x058b
+#define INFINEON_TRIBOARD_PID  0x0028 /* DAS JTAG TriBoard TC1798 V1.0 */
+
+/*
  * Acton Research Corp.
  */
 #define ACTON_VID  0x0647  /* Vendor ID */
-- 
2.0.0

--
To unsubscribe from this list: send the line unsubscribe linux-usb in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html