Re: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Giulio Bernardi

On 31/07/2015 23:02, Alan Stern wrote:

On Fri, 31 Jul 2015, Giulio Bernardi wrote:


P.S: it looks like scsi_dev_info_list_del_keyed() shares the same code, so maybe
it should be modified too?


You're right.  I'll split this into two patches: one to remove the
duplicate code, and one to fix the matching.  The patches are attached.
Please check that I haven't made any errors.

Alan Stern



These patches work perfectly for me.

Thank you,
Giulio
--
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 v3 2/5] dt-bindings: Add a binding for Mediatek xHCI host controller

2015-07-31 Thread chunfeng yun
hi,
On Fri, 2015-07-31 at 14:37 +0100, Mark Rutland wrote:
> Hi,
> 
> > > > + - mediatek,usb-wakeup: to access usb wakeup control register
> > > 
> > > What exactly does this property imply?
> > > 
> > There are some control registers for usb wakeup which are put in another
> > module, here to get the node of that module, and then use regmap and
> > syscon to operate it.
> 
> Ok. You need to specify the type of this property (i.e. that it is a
> phandle to a syscon node). The description makes it sound like a boolean.
> 
Is it ok to add a prefix of syscon, and name it syscon-usb-wakeup?

> > 
> > > > + - mediatek,wakeup-src: 1: ip sleep wakeup mode; 2: line state wakeup
> > > > +   mode; others means don't enable wakeup source of usb
> > > 
> > > This sounds like configuration rather than a hardware property. Why do
> > > you think this needs to be in the DT?
> > > 
> > Yes, it's better to put it in the DT. 
> 
> That doesn't answer my question.
> 
> _why_ do you think this needs to be in the DT? What do you think is
> better for it being there?
> 
It is unthoughtful to put it here;
There is different configuration on platforms, such as on tablet which
only needs line-state wakeup (because system can't enter suspend when
plug in usb cable, so don't need ip-sleep-wakeup to remote wakeup
system), and on box just needs ip-sleep wakeup mode. so it is better to
put in each board's dts.
 
> > 
> > > > + - mediatek,u2port-num: the number should not greater than the number
> > > > +   of phys
> > > 
> > > What exactly does this property imply?
> > > 
> > On some platform, it only makes use of partial usb ports, so disable
> > others to save power.
> 
> What exactly do you mean by "partial USB ports"?
> 
> If a phy isn't wired up, it won't be listed in the phys property, if it
> is then disabling it sounds like a run-time decision.
> 
Yes, you are right.
This confuse me a little before. It was a property of old phy driver at
first, and then ported it here, so did not remove it temp.
After I re-write the phy driver, I will remove it.

Thanks a lot.

> Thanks,
> Mark.


--
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 v3 3/5] usb: phy: add usb3.0 phy driver for mt65xx SoCs

2015-07-31 Thread chunfeng yun
On Fri, 2015-07-31 at 19:48 +0530, Kishon Vijay Abraham I wrote:
> Hi,
> 
> On Friday 31 July 2015 05:55 PM, chunfeng yun wrote:
> > hi,
> > On Tue, 2015-07-28 at 11:17 +0530, Kishon Vijay Abraham I wrote:
> >> Hi,
> >>
> >> On Sunday 26 July 2015 08:21 AM, chunfeng yun wrote:
> >>> hi,
> >>> On Wed, 2015-07-22 at 09:21 -0500, Felipe Balbi wrote:
>  Hi,
> 
>  On Wed, Jul 22, 2015 at 10:05:43PM +0800, Chunfeng Yun wrote:
> > support usb3.0 phy of mt65xx SoCs
> >
> > Signed-off-by: Chunfeng Yun 
> 
>  you missed Kishon here.
> 
> >>> Thank you.
> > ---
> >  drivers/phy/Kconfig   |   9 +
> >  drivers/phy/Makefile  |   1 +
> >  drivers/phy/phy-mt65xx-usb3.c | 426 
> > ++
> >  3 files changed, 436 insertions(+)
> >  create mode 100644 drivers/phy/phy-mt65xx-usb3.c
> >
> > diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> > index c0e6ede..019cf8b 100644
> > --- a/drivers/phy/Kconfig
> > +++ b/drivers/phy/Kconfig
> > @@ -193,6 +193,15 @@ config PHY_HIX5HD2_SATA
> > help
> >   Support for SATA PHY on Hisilicon hix5hd2 Soc.
> >  
> > +config PHY_MT65XX_USB3
> > +   tristate "Mediatek USB3.0 PHY Driver"
> > +   depends on ARCH_MEDIATEK && OF
> > +   select GENERIC_PHY
> > +   help
> > + Say 'Y' here to add support for Mediatek USB3.0 PHY driver
> > + for mt65xx SoCs. it supports two usb2.0 ports and
> > + one usb3.0 port.
> > +
> >  config PHY_SUN4I_USB
> > tristate "Allwinner sunxi SoC USB PHY driver"
> > depends on ARCH_SUNXI && HAS_IOMEM && OF
> > diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> > index f344e1b..3ceff2a 100644
> > --- a/drivers/phy/Makefile
> > +++ b/drivers/phy/Makefile
> > @@ -22,6 +22,7 @@ obj-$(CONFIG_TI_PIPE3)+= 
> > phy-ti-pipe3.o
> >  obj-$(CONFIG_TWL4030_USB)  += phy-twl4030-usb.o
> >  obj-$(CONFIG_PHY_EXYNOS5250_SATA)  += phy-exynos5250-sata.o
> >  obj-$(CONFIG_PHY_HIX5HD2_SATA) += phy-hix5hd2-sata.o
> > +obj-$(CONFIG_PHY_MT65XX_USB3)  += phy-mt65xx-usb3.o
> >  obj-$(CONFIG_PHY_SUN4I_USB)+= phy-sun4i-usb.o
> >  obj-$(CONFIG_PHY_SUN9I_USB)+= phy-sun9i-usb.o
> >  obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-exynos-usb2.o
> > diff --git a/drivers/phy/phy-mt65xx-usb3.c 
> > b/drivers/phy/phy-mt65xx-usb3.c
> > new file mode 100644
> > index 000..5da4534
> > --- /dev/null
> > +++ b/drivers/phy/phy-mt65xx-usb3.c
> > @@ -0,0 +1,426 @@
> > +/*
> > + * Copyright (c) 2015 MediaTek Inc.
> > + * Author: Chunfeng.Yun 
> > + *
> > + * This software is licensed under the terms of the GNU General Public
> > + * License version 2, as published by the Free Software Foundation, and
> > + * may be copied, distributed, and modified under those terms.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> >>
> >> Lot of these #include are not required. Add only those what are required by
> >> this driver.
> > The dummy header files will be removed later
> > 
> > +#include 
> > +
> > +/*
> > + * for sifslv2 register
> > + * relative to USB3_SIF2_BASE base address
> > + */
> > +#define SSUSB_SIFSLV_SPLLC (0x)
> > +#define SSUSB_SIFSLV_U2PHY_COM_BASE(0x0800)
> >>
> >> Looks like all this base address can come from dt.
> > The phy supports multi-ports, and these are sub-segment registers for
> > port0, and other ports can be calculated from the bases. So I think it's
> > better to use the same base address in dts
> 
> Nope. Except for the register offsets everything else can come from dt.
> > 
> > +#define SSUSB_SIFSLV_U3PHYD_BASE   (0x0900)
> > +#define SSUSB_USB30_PHYA_SIV_B_BASE(0x0b00)
> > +#define SSUSB_SIFSLV_U3PHYA_DA_BASE(0x0c00)
> > +
> > +/*port1 refs. +0x800(refer to port0)*/
> > +#define U3P_PORT_INTERVAL (0x800)  /*based on port0 */
> > +#define U3P_PHY_DELTA(index) ((U3P_PORT_INTERVAL) * (index))
> > +
> > +#define U3P_USBPHYACR0 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x)
> > +#define PA0_RG_U2PLL_FORCE_ON  (0x1 << 15)
> > +
> > +#define U3P_USBPHYACR2 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0008)
> > +#define PA2_RG_SIF_U2PLL_FOR

Re: [PATCH net-next] r8152: disable the capability of zero length

2015-07-31 Thread David Miller
From: Hayes Wang 
Date: Fri, 31 Jul 2015 11:23:39 +0800

> The UEFI driver would enable zero length, and the Linux driver doesn't
> need it. Zero length let the hw complete the transfer with length 0,
> when there is no received packet. It would add the load of USB host
> controller and reduce the performance.
> 
> Signed-off-by: Hayes Wang 

Applied.
--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Alan Stern
On Fri, 31 Jul 2015, Giulio Bernardi wrote:

> P.S: it looks like scsi_dev_info_list_del_keyed() shares the same code, so 
> maybe 
> it should be modified too?

You're right.  I'll split this into two patches: one to remove the
duplicate code, and one to fix the matching.  The patches are attached.  
Please check that I haven't made any errors.

Alan Stern
 drivers/scsi/scsi_devinfo.c |  114 
 1 file changed, 42 insertions(+), 72 deletions(-)

Index: usb-4.1/drivers/scsi/scsi_devinfo.c
===
--- usb-4.1.orig/drivers/scsi/scsi_devinfo.c
+++ usb-4.1/drivers/scsi/scsi_devinfo.c
@@ -390,25 +390,26 @@ int scsi_dev_info_list_add_keyed(int com
 EXPORT_SYMBOL(scsi_dev_info_list_add_keyed);
 
 /**
- * scsi_dev_info_list_del_keyed - remove one dev_info list entry.
+ * scsi_dev_info_list_find - find a matching dev_info list entry.
  * @vendor:vendor string
  * @model: model (product) string
  * @key:   specify list to use
  *
  * Description:
- * Remove and destroy one dev_info entry for @vendor, @model
+ * Finds the first dev_info entry matching @vendor, @model
  * in list specified by @key.
  *
- * Returns: 0 OK, -error on failure.
+ * Returns: pointer to matching entry, or ERR_PTR on failure.
  **/
-int scsi_dev_info_list_del_keyed(char *vendor, char *model, int key)
+static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
+   const char *model, int key)
 {
-   struct scsi_dev_info_list *devinfo, *found = NULL;
+   struct scsi_dev_info_list *devinfo;
struct scsi_dev_info_list_table *devinfo_table =
scsi_devinfo_lookup_by_key(key);
 
if (IS_ERR(devinfo_table))
-   return PTR_ERR(devinfo_table);
+   return (struct scsi_dev_info_list *) devinfo_table;
 
list_for_each_entry(devinfo, &devinfo_table->scsi_dev_info_list,
dev_info_list) {
@@ -452,25 +453,42 @@ int scsi_dev_info_list_del_keyed(char *v
if (memcmp(devinfo->model, model,
   min(max, strlen(devinfo->model
continue;
-   found = devinfo;
+   return devinfo;
} else {
if (!memcmp(devinfo->vendor, vendor,
 sizeof(devinfo->vendor)) &&
 !memcmp(devinfo->model, model,
  sizeof(devinfo->model)))
-   found = devinfo;
+   return devinfo;
}
-   if (found)
-   break;
}
 
-   if (found) {
-   list_del(&found->dev_info_list);
-   kfree(found);
-   return 0;
-   }
+   return ERR_PTR(-ENOENT);
+}
+
+/**
+ * scsi_dev_info_list_del_keyed - remove one dev_info list entry.
+ * @vendor:vendor string
+ * @model: model (product) string
+ * @key:   specify list to use
+ *
+ * Description:
+ * Remove and destroy one dev_info entry for @vendor, @model
+ * in list specified by @key.
+ *
+ * Returns: 0 OK, -error on failure.
+ **/
+int scsi_dev_info_list_del_keyed(char *vendor, char *model, int key)
+{
+   struct scsi_dev_info_list *found;
 
-   return -ENOENT;
+   found = scsi_dev_info_list_find(vendor, model, key);
+   if (IS_ERR(found))
+   return PTR_ERR(found);
+
+   list_del(&found->dev_info_list);
+   kfree(found);
+   return 0;
 }
 EXPORT_SYMBOL(scsi_dev_info_list_del_keyed);
 
@@ -565,64 +583,16 @@ int scsi_get_device_flags_keyed(struct s
int key)
 {
struct scsi_dev_info_list *devinfo;
-   struct scsi_dev_info_list_table *devinfo_table;
+   int err;
 
-   devinfo_table = scsi_devinfo_lookup_by_key(key);
+   devinfo = scsi_dev_info_list_find(vendor, model, key);
+   if (!IS_ERR(devinfo))
+   return devinfo->flags;
+
+   err = PTR_ERR(devinfo);
+   if (err != -ENOENT)
+   return err;
 
-   if (IS_ERR(devinfo_table))
-   return PTR_ERR(devinfo_table);
-
-   list_for_each_entry(devinfo, &devinfo_table->scsi_dev_info_list,
-   dev_info_list) {
-   if (devinfo->compatible) {
-   /*
-* Behave like the older version of get_device_flags.
-*/
-   size_t max;
-   /*
-* XXX why skip leading spaces? If an odd INQUIRY
-* value, that should have been part of the
-* scsi_static_device_list[] entry, such as "  FOO"
-* rather than "FOO". Since this code is already
-* here, and we don't 

Re: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Giulio Bernardi

On 31/07/2015 22:10, Giulio Bernardi wrote:

On 31/07/2015 20:36, Alan Stern wrote:


These things are not wildcards.  Go look more carefully at my patch and
figure out what is really happening.

Alan Stern



Ok, it turns out your patch is ok and I can confirm everything works as
expected:  this docking station is sometimes a bit loose so one of the drives
was not completely inserted (again). Sorry for this, and also for having been
too quick in making wrong assumptions.

Thank you again,
Giulio


P.S: it looks like scsi_dev_info_list_del_keyed() shares the same code, so maybe 
it should be modified too?

--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Giulio Bernardi

On 31/07/2015 20:36, Alan Stern wrote:


These things are not wildcards.  Go look more carefully at my patch and
figure out what is really happening.

Alan Stern



Ok, it turns out your patch is ok and I can confirm everything works as 
expected:  this docking station is sometimes a bit loose so one of the drives 
was not completely inserted (again). Sorry for this, and also for having been 
too quick in making wrong assumptions.


Thank you again,
Giulio
--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Alan Stern
On Fri, 31 Jul 2015, Giulio Bernardi wrote:

> Okay, i checked a little bit and now I understand, sorry. They are pointers 
> to 
> different offset of the same string (the inquiry result), that's why it's 
> only 
> meaningful to check first 8 and subsequent 16 characters. Sorry.
> 
> The problem is that:
> 
> {"", "Scanner"}
> and
> {"Inateck",""}
> 
> do match because an empty string always matches. So vendor matches because 
> the 
> entry from the list is empty, while model matches because the model of the 
> actual device is empty.

With my patch, empty strings do _not_ match.  Not unless _both_ strings 
are empty.

> I am trying to think what the right solution might be. The {"", "Scanner"} 
> case 
> seems to suggest that "" is meant as a wildcard.

No, it doesn't.  It means that the vendor is empty (all ' '
characters).

>  Maybe the right solution would 
> be that "" is a wildcard only in the device list, and not in the real device? 
> That is, if a real device has "" as a vendor/model string, it should only 
> match 
> a device from a list that has "", and not interpreted as a wildcard.

These things are not wildcards.  Go look more carefully at my patch and 
figure out what is really happening.

Alan Stern

--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Alan Stern
On Fri, 31 Jul 2015, Giulio Bernardi wrote:

> On 31/07/2015 18:05, Alan Stern wrote:
> > On Thu, 30 Jul 2015, Giulio Bernardi wrote:
> >
> >>> You should check that scsi_report_lun_scan() really does return 1.  If
> >>> it returns 0 instead (because BLIST_NOLUN is set in bflags or for any
> >>> other reason), that would cause the behavior you see.
> >>>
> >>
> >> I found the reason of this behavior: there is BLIST_NOLUN in bflags indeed.
> >> It is a bug in scsi_get_device_flags_keyed():
> >> In fact, my device reports these strings for model and vendor:
> >> vendor = "Inateck 0101"
> >> model = "0101"
> >
> > That's not quite right.  The vendor string is always exactly 8 bytes,
> > the model string is always exactly 16 bytes, and the revision string is
> > always exactly 4 bytes.  Therefore your device actually reports vendor
> > = "Inateck ", model = "", and revision = "0101".
> >
> >> and this matches with this entry in the global scsi device list:
> >> {"", "Scanner", "1.80", BLIST_NOLUN}
> >> In fact: the check on vendor passes because strlen(devinfo->vendor) == 0 so
> >> memcmp always passes, and the check on model passes because the code 
> >> assumes
> >> that max length of model is 16: when trimming the string (which is exactly 
> >> 16
> >> spaces followed by 0101) it ends up with an empty string, which then 
> >> matches
> >> whatever string for the same reason of the previous check.
> >
> > Yes, both of those checks are buggy.  I'm surprised they weren't fixed
> > long ago.
> >
> >> I am recompiling the kernel now, with max = 20 instead of max = 16 to see 
> >> if it
> >> works, but I don't know if other devices do exist with a longer model 
> >> string.
> >> Maybe those limits (8 for vendor, 16 for model) were true for real scsi 
> >> and not
> >> for USB devices?
> >
> > Those limits always hold for all SCSI devices, including USB.  They are
> > part of the SCSI specification.  The right way to fix this is to change
> > the tests, not to increase the max string length.  Does the patch below
> > fix the problem for you?
> >
> 
> I tried the patch but it doesn't work. I applied it without looking at it 
> before, but the problem is that actually "vendor" variable is really "Inateck 
>0101" (28 chars) and "model" is really "0101" 
> (20 
> chars): at least, that's the data that is passed to  
> scsi_get_device_flags_keyed().

Those variables are _not_ NUL-terminated strings.  They are simply 
character arrays.  model is an array of 8 characters and vendor is an 
array of 16 characters.

> So your code is never executed
> + while (max > 0 && model[max - 1] == ' ')
> + --max;
> + if (memcmp(devinfo->model, model, max) ||
> + devinfo->model[max])
> because max is already 0 from the previous loop.

You mean that the "while" loop terminates immediately.  That's okay; 
it's supposed to do that when every character in model is ' '.

The memcmp call should return 0 because max is 0.  But since 
devinfo->model[0] is 'S' (the first letter of "Scanner"), the "if" 
statement should succeed.  Therefore your device should not match the 
devinfo entry.

> Maybe I should see where vendor and model come from? Maybe they are 
> concatenated 
> from the original vendor and model values reported from the device, so that 
> might be why those strings are so long.

That is exactly where they come from.  The device does not report 
strings, however.  It reports an array of 28 characters (8 for the 
vendor, 16 for the model, and 4 for the revision).

Alan Stern

--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Giulio Bernardi

On 31/07/2015 20:05, Giulio Bernardi wrote:

On 31/07/2015 18:05, Alan Stern wrote:

On Thu, 30 Jul 2015, Giulio Bernardi wrote:


You should check that scsi_report_lun_scan() really does return 1.  If
it returns 0 instead (because BLIST_NOLUN is set in bflags or for any
other reason), that would cause the behavior you see.



I found the reason of this behavior: there is BLIST_NOLUN in bflags indeed.
It is a bug in scsi_get_device_flags_keyed():
In fact, my device reports these strings for model and vendor:
vendor = "Inateck 0101"
model = "0101"


That's not quite right.  The vendor string is always exactly 8 bytes,
the model string is always exactly 16 bytes, and the revision string is
always exactly 4 bytes.  Therefore your device actually reports vendor
= "Inateck ", model = "", and revision = "0101".


and this matches with this entry in the global scsi device list:
{"", "Scanner", "1.80", BLIST_NOLUN}
In fact: the check on vendor passes because strlen(devinfo->vendor) == 0 so
memcmp always passes, and the check on model passes because the code assumes
that max length of model is 16: when trimming the string (which is exactly 16
spaces followed by 0101) it ends up with an empty string, which then matches
whatever string for the same reason of the previous check.


Yes, both of those checks are buggy.  I'm surprised they weren't fixed
long ago.


I am recompiling the kernel now, with max = 20 instead of max = 16 to see if it
works, but I don't know if other devices do exist with a longer model string.
Maybe those limits (8 for vendor, 16 for model) were true for real scsi and not
for USB devices?


Those limits always hold for all SCSI devices, including USB.  They are
part of the SCSI specification.  The right way to fix this is to change
the tests, not to increase the max string length.  Does the patch below
fix the problem for you?



I tried the patch but it doesn't work. I applied it without looking at it
before, but the problem is that actually "vendor" variable is really "Inateck
   0101" (28 chars) and "model" is really "0101" (20
chars): at least, that's the data that is passed to  
scsi_get_device_flags_keyed().

So your code is never executed
+while (max > 0 && model[max - 1] == ' ')
+--max;
+if (memcmp(devinfo->model, model, max) ||
+devinfo->model[max])
because max is already 0 from the previous loop.

Maybe I should see where vendor and model come from? Maybe they are concatenated
from the original vendor and model values reported from the device, so that
might be why those strings are so long.

Giulio


Okay, i checked a little bit and now I understand, sorry. They are pointers to 
different offset of the same string (the inquiry result), that's why it's only 
meaningful to check first 8 and subsequent 16 characters. Sorry.


The problem is that:

{"", "Scanner"}
and
{"Inateck",""}

do match because an empty string always matches. So vendor matches because the 
entry from the list is empty, while model matches because the model of the 
actual device is empty.
I am trying to think what the right solution might be. The {"", "Scanner"} case 
seems to suggest that "" is meant as a wildcard. Maybe the right solution would 
be that "" is a wildcard only in the device list, and not in the real device? 
That is, if a real device has "" as a vendor/model string, it should only match 
a device from a list that has "", and not interpreted as a wildcard.


Giulio
--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Giulio Bernardi

On 31/07/2015 18:05, Alan Stern wrote:

On Thu, 30 Jul 2015, Giulio Bernardi wrote:


You should check that scsi_report_lun_scan() really does return 1.  If
it returns 0 instead (because BLIST_NOLUN is set in bflags or for any
other reason), that would cause the behavior you see.



I found the reason of this behavior: there is BLIST_NOLUN in bflags indeed.
It is a bug in scsi_get_device_flags_keyed():
In fact, my device reports these strings for model and vendor:
vendor = "Inateck 0101"
model = "0101"


That's not quite right.  The vendor string is always exactly 8 bytes,
the model string is always exactly 16 bytes, and the revision string is
always exactly 4 bytes.  Therefore your device actually reports vendor
= "Inateck ", model = "", and revision = "0101".


and this matches with this entry in the global scsi device list:
{"", "Scanner", "1.80", BLIST_NOLUN}
In fact: the check on vendor passes because strlen(devinfo->vendor) == 0 so
memcmp always passes, and the check on model passes because the code assumes
that max length of model is 16: when trimming the string (which is exactly 16
spaces followed by 0101) it ends up with an empty string, which then matches
whatever string for the same reason of the previous check.


Yes, both of those checks are buggy.  I'm surprised they weren't fixed
long ago.


I am recompiling the kernel now, with max = 20 instead of max = 16 to see if it
works, but I don't know if other devices do exist with a longer model string.
Maybe those limits (8 for vendor, 16 for model) were true for real scsi and not
for USB devices?


Those limits always hold for all SCSI devices, including USB.  They are
part of the SCSI specification.  The right way to fix this is to change
the tests, not to increase the max string length.  Does the patch below
fix the problem for you?



I tried the patch but it doesn't work. I applied it without looking at it 
before, but the problem is that actually "vendor" variable is really "Inateck 
  0101" (28 chars) and "model" is really "0101" (20 
chars): at least, that's the data that is passed to  scsi_get_device_flags_keyed().


So your code is never executed
+   while (max > 0 && model[max - 1] == ' ')
+   --max;
+   if (memcmp(devinfo->model, model, max) ||
+   devinfo->model[max])
because max is already 0 from the previous loop.

Maybe I should see where vendor and model come from? Maybe they are concatenated 
from the original vendor and model values reported from the device, so that 
might be why those strings are so long.


Giulio
--
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: Add commit 3f2cee73b650 ("USB: usbfs: allow URBs to be reaped after disconnection") to -stable

2015-07-31 Thread Greg KH
On Fri, Jul 31, 2015 at 10:56:20AM -0400, Alan Stern wrote:
> Greg:
> 
> The $SUBJECT commit was added in the 4.0 kernel, but I forgot to mark 
> it for inclusion in the -stable kernels.  The problem it fixes is a 
> nasty one, affecting people who use libusb: When a device is 
> disconnected while a libusb transfer is in progress, libusb never 
> receives a completion notification for the transfer.  This can result 
> in a hang or a segmentation error, depending on how the userspace 
> program tries to cope.
> 
> The patch may require some context adjustment before it will apply to 
> the longterm -stable trees, but I think it should be added.

Now queued up to 3.10 and 3.14-stable, thanks.

greg k-h
--
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] drivers: usb: fsl: Workaround for USB erratum-A005275

2015-07-31 Thread Alan Stern
On Fri, 31 Jul 2015, Nikhil Badola wrote:

> Incoming packets in high speed are randomly corrupted by h/w
> resulting in multiple errors. This workaround makes FS as
> default mode in all affected socs by disabling HS chirp
> signalling.This errata does not affect FS and LS mode.
> 
> Forces all HS devices to connect in FS mode for all socs
> affected by this erratum:
> P3041 and P2041 rev 1.0 and 1.1
> P5020 and P5010 rev 1.0 and 2.0
> P5040, P1010 and T4240 rev 1.0

Ooh, that's a really bad bug.  People will be pretty annoyed that they 
can't use high speed connections.

> --- a/drivers/usb/host/ehci-hub.c
> +++ b/drivers/usb/host/ehci-hub.c
> @@ -1222,6 +1222,13 @@ int ehci_hub_control(
>   ehci->reset_done [wIndex] = jiffies
>   + msecs_to_jiffies (50);
>   }
> +
> + /* Force full-speed connect for FSL high-speed erratum;
> +  * disable HS Chirp by setting PFSC bit
> +  */
> + if (ehci_has_fsl_hs_errata(ehci))
> + temp |= (1 << PORTSC_FSL_PFSC);
> +

This hunk was added in the wrong place.  It should come before the 
closing '}' above, not after.  That's because you don't want to force a 
full-speed connection if the device is already using low speed.

> --- a/drivers/usb/host/ehci.h
> +++ b/drivers/usb/host/ehci.h
> @@ -215,6 +215,7 @@ struct ehci_hcd { /* one per controller */
>   /* SILICON QUIRKS */
>   unsignedno_selective_suspend:1;
>   unsignedhas_fsl_port_bug:1; /* FreeScale */
> + unsignedhas_fsl_hs_errata:1;/* Freescale HS quirk */
>   unsignedbig_endian_mmio:1;
>   unsignedbig_endian_desc:1;
>   unsignedbig_endian_capbase:1;
> @@ -675,6 +676,17 @@ ehci_port_speed(struct ehci_hcd *ehci, unsigned int 
> portsc)
>  #define  ehci_port_speed(ehci, portsc)   USB_PORT_STAT_HIGH_SPEED
>  #endif
>  
> +#define PORTSC_FSL_PFSC  24  /* Port Force Full-Speed Connect */
> +
> +#if defined(CONFIG_PPC_85xx)
> +/* Some Freescale processors have an erratum (USB A-005275) in which
> + * incoming packets get corrupted in HS mode
> + */
> +#define ehci_has_fsl_hs_errata(e)((e)->has_fsl_hs_errata)
> +#else
> +#define ehci_has_fsl_hs_errata(e)(0)
> +#endif
> +
>  /*-*/

I would prefer it if you add your new hunk after this /*-...---*/ 
dividing line (that is, next to the ehci_has_fsl_portno_bug() code) 
instead of before the dividing line.

Otherwise this looks okay.

Alan Stern

--
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 v5 02/46] usb: gadget: add endpoint capabilities flags

2015-07-31 Thread David Laight
From: Robert Baldyga
> Sent: 31 July 2015 15:00
> Introduce struct usb_ep_caps which contains information about capabilities
> of usb endpoints - supported transfer types and directions. This structure
> should be filled by UDC driver for each of its endpoints, and will be
> used in epautoconf in new ep matching mechanism which will replace ugly
> guessing of endpoint capabilities basing on its name.
> 
> Signed-off-by: Robert Baldyga 
> ---
>  include/linux/usb/gadget.h | 21 +
>  1 file changed, 21 insertions(+)
> 
> diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> index 68fb5e8..a9a4959 100644
> --- a/include/linux/usb/gadget.h
> +++ b/include/linux/usb/gadget.h
> @@ -141,10 +141,29 @@ struct usb_ep_ops {
>  };
...
> +struct usb_ep_caps {
> + unsigned type_control:1;
> + unsigned type_iso:1;
> + unsigned type_bulk:1;
> + unsigned type_int:1;
> + unsigned dir_in:1;
> + unsigned dir_out:1;
> +};

With the way this is used (eg below from 13/46)

+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;

I think it would be more obvious if you used a u8 and explicit bitmasks.
The initialisation (as above) would the be explicitly assigning 'not supported'
to the other fields.
The compiler will also generate much better code...

David



Re: Fwd: [Bug 102101] USB 3 storage device disconnects after S3 resume,and re-enumerate it.

2015-07-31 Thread Alan Stern
On Fri, 31 Jul 2015, Aaron Zhou wrote:

> There is a USB 3 bug .
> Are you have any suggests?

Please try the 4.2-rc4 kernel.  The bug may have been fixed already.

Alan Stern

--
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: Multiple drives on JMS56x-based sata-usb docking station.

2015-07-31 Thread Alan Stern
On Thu, 30 Jul 2015, Giulio Bernardi wrote:

> > You should check that scsi_report_lun_scan() really does return 1.  If
> > it returns 0 instead (because BLIST_NOLUN is set in bflags or for any
> > other reason), that would cause the behavior you see.
> >
> 
> I found the reason of this behavior: there is BLIST_NOLUN in bflags indeed.
> It is a bug in scsi_get_device_flags_keyed():
> In fact, my device reports these strings for model and vendor:
> vendor = "Inateck 0101"
> model = "0101"

That's not quite right.  The vendor string is always exactly 8 bytes,
the model string is always exactly 16 bytes, and the revision string is
always exactly 4 bytes.  Therefore your device actually reports vendor
= "Inateck ", model = "", and revision = "0101".

> and this matches with this entry in the global scsi device list:
> {"", "Scanner", "1.80", BLIST_NOLUN}
> In fact: the check on vendor passes because strlen(devinfo->vendor) == 0 so 
> memcmp always passes, and the check on model passes because the code assumes 
> that max length of model is 16: when trimming the string (which is exactly 16 
> spaces followed by 0101) it ends up with an empty string, which then matches 
> whatever string for the same reason of the previous check.

Yes, both of those checks are buggy.  I'm surprised they weren't fixed 
long ago.

> I am recompiling the kernel now, with max = 20 instead of max = 16 to see if 
> it 
> works, but I don't know if other devices do exist with a longer model string. 
> Maybe those limits (8 for vendor, 16 for model) were true for real scsi and 
> not 
> for USB devices?

Those limits always hold for all SCSI devices, including USB.  They are
part of the SCSI specification.  The right way to fix this is to change
the tests, not to increase the max string length.  Does the patch below
fix the problem for you?

> However, who should I notify about the issue? linux-scsi mailing
> list? bugzilla?

If the patch works, I will submit it to the Linux SCSI maintainer.

> Thank you again for the support, I wouldn't have been able to
> discover this alone.

You're welcome.

Alan Stern



Index: usb-4.1/drivers/scsi/scsi_devinfo.c
===
--- usb-4.1.orig/drivers/scsi/scsi_devinfo.c
+++ usb-4.1/drivers/scsi/scsi_devinfo.c
@@ -592,16 +592,11 @@ int scsi_get_device_flags_keyed(struct s
max--;
vendor++;
}
-   /*
-* XXX removing the following strlen() would be
-* good, using it means that for a an entry not in
-* the list, we scan every byte of every vendor
-* listed in scsi_static_device_list[], and never match
-* a single one (and still have to compare at
-* least the first byte of each vendor).
-*/
-   if (memcmp(devinfo->vendor, vendor,
-   min(max, strlen(devinfo->vendor
+   /* Also skip trailing spaces */
+   while (max > 0 && vendor[max - 1] == ' ')
+   --max;
+   if (memcmp(devinfo->vendor, vendor, max) ||
+   devinfo->vendor[max])
continue;
/*
 * Skip spaces again.
@@ -611,8 +606,10 @@ int scsi_get_device_flags_keyed(struct s
max--;
model++;
}
-   if (memcmp(devinfo->model, model,
-  min(max, strlen(devinfo->model
+   while (max > 0 && model[max - 1] == ' ')
+   --max;
+   if (memcmp(devinfo->model, model, max) ||
+   devinfo->model[max])
continue;
return devinfo->flags;
} else {

--
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: linux-next: Tree for Jul 31 (usb/phy/phy-qcom-8x16-usb.c)

2015-07-31 Thread Randy Dunlap
On 07/30/15 22:47, Stephen Rothwell wrote:
> Hi all,
> 
> Changes since 20150730:
> 

on i386:

when CONFIG_EXTCON=m:


drivers/built-in.o: In function `phy_8x16_remove':
phy-qcom-8x16-usb.c:(.text+0x24170a): undefined reference to 
`extcon_unregister_interest'
drivers/built-in.o: In function `phy_8x16_init':
phy-qcom-8x16-usb.c:(.text+0x241d32): undefined reference to 
`extcon_get_cable_state'
drivers/built-in.o: In function `phy_8x16_probe':
phy-qcom-8x16-usb.c:(.text+0x24223c): undefined reference to 
`extcon_get_edev_by_phandle'
phy-qcom-8x16-usb.c:(.text+0x2424bd): undefined reference to 
`extcon_register_interest'
phy-qcom-8x16-usb.c:(.text+0x242582): undefined reference to 
`extcon_unregister_interest'



so config USB_QCOM_8X16_PHY needs to depend on EXTCON.

-- 
~Randy
--
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 v5 02/46] usb: gadget: add endpoint capabilities flags

2015-07-31 Thread Felipe Balbi
Hi,

On Fri, Jul 31, 2015 at 03:51:52PM +, David Laight wrote:
> From: Robert Baldyga
> > Sent: 31 July 2015 15:00
> > Introduce struct usb_ep_caps which contains information about capabilities
> > of usb endpoints - supported transfer types and directions. This structure
> > should be filled by UDC driver for each of its endpoints, and will be
> > used in epautoconf in new ep matching mechanism which will replace ugly
> > guessing of endpoint capabilities basing on its name.
> > 
> > Signed-off-by: Robert Baldyga 
> > ---
> >  include/linux/usb/gadget.h | 21 +
> >  1 file changed, 21 insertions(+)
> > 
> > diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
> > index 68fb5e8..a9a4959 100644
> > --- a/include/linux/usb/gadget.h
> > +++ b/include/linux/usb/gadget.h
> > @@ -141,10 +141,29 @@ struct usb_ep_ops {
> >  };
> ...
> > +struct usb_ep_caps {
> > +   unsigned type_control:1;
> > +   unsigned type_iso:1;
> > +   unsigned type_bulk:1;
> > +   unsigned type_int:1;
> > +   unsigned dir_in:1;
> > +   unsigned dir_out:1;
> > +};
> 
> With the way this is used (eg below from 13/46)
> 
> +
> + if (i == 0) {
> + ep->ep.caps.type_control = true;
> + } else {
> + ep->ep.caps.type_iso = true;
> + ep->ep.caps.type_bulk = true;
> + ep->ep.caps.type_int = true;
> + }
> +
> + ep->ep.caps.dir_in = true;
> + ep->ep.caps.dir_out = true;
> 
> I think it would be more obvious if you used a u8 and explicit bitmasks.
> The initialisation (as above) would the be explicitly assigning 'not 
> supported'
> to the other fields.
> The compiler will also generate much better code...

compiler should convert single bit flags into u32 just fine. It's all
static data anyway. Besides, single bit flags allow us to have as many
as we need without ending up with stuff like:

u32 flags;
u32 flags1;
u32 flags2;

etc. Just let the compiler do those conversions for us.

-- 
balbi


signature.asc
Description: Digital signature


Re: [PATCH v9 4/4] USB: io_ti: Add heartbeat to keep idle EP/416 ports from disconnecting

2015-07-31 Thread Peter Berger
On Fri, 2015-07-31 at 12:21 +0200, Johan Hovold wrote:
> On Fri, Jul 31, 2015 at 01:55:08AM -0500, Peter E. Berger wrote:
> > From: "Peter E. Berger" 
> > 
> > When using Edgeport/416 models with newer firmware (sometime after
> > firmware version 4.80.0), idle ports are automatically bounced
> > (disconnected and then reconnected) approximately every 60 seconds.
> > This breaks programs (e.g: minicom) where idle periods are common,
> > normal and expected.
> > 
> > I confirmed with the manufacturer (Digi International) that Edgeport/416
> > models now ship from the factory with firmware that expects periodic
> > "heartbeat" queries from the driver to keep idle ports alive.  This
> > patch implements heartbeat support using the mechanism Digi suggested
> > (periodically requesting an I2C descriptor address) that appears effective
> > on Edgeports running the newer firmware (that require it) and benign on
> > Edgeport devices running older firmware.  Since we know that Edgeport
> > firmware version 4.80 (the version distributed in /lib/firmware/down3.bin
> > and used for Edgeports that are either running still older versions or
> > have no onboard non-volatile firmware image) does not require heartbeat
> > support, this patch schedules heartbeats only on Edgeport/416 devices,
> > and only if they are running firmware versions newer than 4.80.
> > 
> > Signed-off-by: Peter E. Berger 
> 
> All now applied for 4.3 (this one with some really minor style changes).

Wonderful!  Thanks so much to you, Sergei, Oliver and Don for all your
thoughtful comments and patience in helping me get these patches into
shape.

Best regards,
 --Peter
> 
> Thanks again for fixing this!
> 
> Johan


--
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


Add commit 3f2cee73b650 ("USB: usbfs: allow URBs to be reaped after disconnection") to -stable

2015-07-31 Thread Alan Stern
Greg:

The $SUBJECT commit was added in the 4.0 kernel, but I forgot to mark 
it for inclusion in the -stable kernels.  The problem it fixes is a 
nasty one, affecting people who use libusb: When a device is 
disconnected while a libusb transfer is in progress, libusb never 
receives a completion notification for the transfer.  This can result 
in a hang or a segmentation error, depending on how the userspace 
program tries to cope.

The patch may require some context adjustment before it will apply to 
the longterm -stable trees, but I think it should be added.

Alan Stern

--
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] drivers/usb/: Simplify return statements

2015-07-31 Thread Felipe Balbi
Hi,

(no top-posting)

On Fri, Jul 31, 2015 at 05:06:07AM +, Karajgaonkar, Saurabh (S.) wrote:
> Sure, I'll do that. Just wanted to know whether I should split the
> patches and send them in this same mail thread (may be something like
> [PATCH 01/04 V2]) or should I start new threads and send them
> separately to the respective maintainers.

single thread is fine, maintainers will pick single patches.

-- 
balbi


signature.asc
Description: Digital signature


[PATCH v5 02/46] usb: gadget: add endpoint capabilities flags

2015-07-31 Thread Robert Baldyga
Introduce struct usb_ep_caps which contains information about capabilities
of usb endpoints - supported transfer types and directions. This structure
should be filled by UDC driver for each of its endpoints, and will be
used in epautoconf in new ep matching mechanism which will replace ugly
guessing of endpoint capabilities basing on its name.

Signed-off-by: Robert Baldyga 
---
 include/linux/usb/gadget.h | 21 +
 1 file changed, 21 insertions(+)

diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 68fb5e8..a9a4959 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -141,10 +141,29 @@ struct usb_ep_ops {
 };
 
 /**
+ * struct usb_ep_caps - endpoint capabilities description
+ * @type_control:Endpoint supports control type (reserved for ep0).
+ * @type_iso:Endpoint supports isochronous transfers.
+ * @type_bulk:Endpoint supports bulk transfers.
+ * @type_int:Endpoint supports interrupt transfers.
+ * @dir_in:Endpoint supports IN direction.
+ * @dir_out:Endpoint supports OUT direction.
+ */
+struct usb_ep_caps {
+   unsigned type_control:1;
+   unsigned type_iso:1;
+   unsigned type_bulk:1;
+   unsigned type_int:1;
+   unsigned dir_in:1;
+   unsigned dir_out:1;
+};
+
+/**
  * struct usb_ep - device side representation of USB endpoint
  * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk"
  * @ops: Function pointers used to access hardware-specific operations.
  * @ep_list:the gadget's ep_list holds all of its endpoints
+ * @caps:The structure describing types and directions supported by endoint.
  * @maxpacket:The maximum packet size used on this endpoint.  The initial
  * value can sometimes be reduced (hardware allowing), according to
  *  the endpoint descriptor used to configure the endpoint.
@@ -167,12 +186,14 @@ struct usb_ep_ops {
  * gadget->ep_list.  the control endpoint (gadget->ep0) is not in that list,
  * and is accessed only in response to a driver setup() callback.
  */
+
 struct usb_ep {
void*driver_data;
 
const char  *name;
const struct usb_ep_ops *ops;
struct list_headep_list;
+   struct usb_ep_caps  caps;
boolclaimed;
unsignedmaxpacket:16;
unsignedmaxpacket_limit:16;
-- 
1.9.1

--
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: [linux-sunxi] [PATCH v5 2/7] phy-sun4i-usb: Add extcon support for the otg phy (phy0)

2015-07-31 Thread Jonathan Liu

Hi Hans,

On 13/06/2015 10:37 PM, Hans de Goede wrote:

The sunxi musb glue needs to know if a host or normal usb cable is plugged
in, add extcon support so that the musb glue can monitor the host status.

Signed-off-by: Hans de Goede 
---
Changes in v5:
-Split out of the "Add id and vbus detection support" commit
-Ported to the new extcon API queued for 4.2
---
  drivers/phy/Kconfig |  1 +
  drivers/phy/phy-sun4i-usb.c | 32 +++-
  2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index a53bd5b..9841780 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -173,6 +173,7 @@ config PHY_SUN4I_USB
tristate "Allwinner sunxi SoC USB PHY driver"
depends on ARCH_SUNXI && HAS_IOMEM && OF
depends on RESET_CONTROLLER
+   depends on EXTCON
select GENERIC_PHY
help
  Enable this to support the transceiver that is part of Allwinner

Should probably add CONFIG_EXTCON=y to arch/arm/configs/sunxi_defconfig 
so that CONFIG_PHY_SUN4I_USB=y works out of the box.


Regards,
Jonathan
--
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: [linux-sunxi] [PATCH v5 2/7] phy-sun4i-usb: Add extcon support for the otg phy (phy0)

2015-07-31 Thread Hans de Goede

Hi,

On 31-07-15 16:23, Jonathan Liu wrote:

Hi Hans,

On 13/06/2015 10:37 PM, Hans de Goede wrote:

The sunxi musb glue needs to know if a host or normal usb cable is plugged
in, add extcon support so that the musb glue can monitor the host status.

Signed-off-by: Hans de Goede 
---
Changes in v5:
-Split out of the "Add id and vbus detection support" commit
-Ported to the new extcon API queued for 4.2
---
  drivers/phy/Kconfig |  1 +
  drivers/phy/phy-sun4i-usb.c | 32 +++-
  2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index a53bd5b..9841780 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -173,6 +173,7 @@ config PHY_SUN4I_USB
  tristate "Allwinner sunxi SoC USB PHY driver"
  depends on ARCH_SUNXI && HAS_IOMEM && OF
  depends on RESET_CONTROLLER
+depends on EXTCON
  select GENERIC_PHY
  help
Enable this to support the transceiver that is part of Allwinner


Should probably add CONFIG_EXTCON=y to arch/arm/configs/sunxi_defconfig so that 
CONFIG_PHY_SUN4I_USB=y works out of the box.


Right, ChenYu just send out 2 defconfig patches fixing this.

Thanks for the heads up.

Regards,

Hans
--
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 03/46] usb: gadget: add endpoint capabilities helper macros

2015-07-31 Thread Robert Baldyga
Add macros useful while initializing array of endpoint capabilities
structures. These macros makes structure initialization more compact
to decrease number of code lines and increase readability of code.

Signed-off-by: Robert Baldyga 
---
 include/linux/usb/gadget.h | 20 
 1 file changed, 20 insertions(+)

diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index a9a4959..82b5bcb 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -158,6 +158,26 @@ struct usb_ep_caps {
unsigned dir_out:1;
 };
 
+#define USB_EP_CAPS_TYPE_CONTROL 0x01
+#define USB_EP_CAPS_TYPE_ISO 0x02
+#define USB_EP_CAPS_TYPE_BULK0x04
+#define USB_EP_CAPS_TYPE_INT 0x08
+#define USB_EP_CAPS_TYPE_ALL \
+   (USB_EP_CAPS_TYPE_ISO | USB_EP_CAPS_TYPE_BULK | USB_EP_CAPS_TYPE_INT)
+#define USB_EP_CAPS_DIR_IN   0x01
+#define USB_EP_CAPS_DIR_OUT  0x02
+#define USB_EP_CAPS_DIR_ALL  (USB_EP_CAPS_DIR_IN | USB_EP_CAPS_DIR_OUT)
+
+#define USB_EP_CAPS(_type, _dir) \
+   { \
+   .type_control = !!(_type & USB_EP_CAPS_TYPE_CONTROL), \
+   .type_iso = !!(_type & USB_EP_CAPS_TYPE_ISO), \
+   .type_bulk = !!(_type & USB_EP_CAPS_TYPE_BULK), \
+   .type_int = !!(_type & USB_EP_CAPS_TYPE_INT), \
+   .dir_in = !!(_dir & USB_EP_CAPS_DIR_IN), \
+   .dir_out = !!(_dir & USB_EP_CAPS_DIR_OUT), \
+   }
+
 /**
  * struct usb_ep - device side representation of USB endpoint
  * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk"
-- 
1.9.1

--
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 01/46] usb: gadget: encapsulate endpoint claiming mechanism

2015-07-31 Thread Robert Baldyga
So far it was necessary for usb functions to set ep->driver_data in
endpoint obtained from autoconfig to non-null value, to indicate that
endpoint is claimed by function (in autoconfig it was checked if endpoint
has set this field to non-null value, and if it has, it was assumed that
it is claimed). It could cause bugs because if some function doesn't
set this field autoconfig could return the same endpoint more than one
time.

To help to avoid such bugs this patch adds claimed flag to struct usb_ep,
and  encapsulates endpoint claiming mechanism inside usb_ep_autoconfig_ss()
and usb_ep_autoconfig_reset(), so now usb functions don't need to perform
any additional actions to mark endpoint obtained from autoconfig as claimed.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 11 ++-
 include/linux/usb/gadget.h  |  1 +
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 919cdfd..8e00ca7 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -53,7 +53,7 @@ ep_matches (
int num_req_streams = 0;
 
/* endpoint already claimed? */
-   if (NULL != ep->driver_data)
+   if (ep->claimed)
return 0;
 
/* only support ep0 for portable CONTROL traffic */
@@ -240,7 +240,7 @@ find_ep (struct usb_gadget *gadget, const char *name)
  * updated with the assigned number of streams if it is
  * different from the original value. To prevent the endpoint
  * from being returned by a later autoconfig call, claim it by
- * assigning ep->driver_data to some non-null value.
+ * assigning ep->claimed to true.
  *
  * On failure, this returns a null endpoint descriptor.
  */
@@ -323,6 +323,7 @@ struct usb_ep *usb_ep_autoconfig_ss(
 found_ep:
ep->desc = NULL;
ep->comp_desc = NULL;
+   ep->claimed = true;
return ep;
 }
 EXPORT_SYMBOL_GPL(usb_ep_autoconfig_ss);
@@ -354,7 +355,7 @@ EXPORT_SYMBOL_GPL(usb_ep_autoconfig_ss);
  * descriptor bEndpointAddress.  For bulk endpoints, the wMaxPacket value
  * is initialized as if the endpoint were used at full speed.  To prevent
  * the endpoint from being returned by a later autoconfig call, claim it
- * by assigning ep->driver_data to some non-null value.
+ * by assigning ep->claimed to true.
  *
  * On failure, this returns a null endpoint descriptor.
  */
@@ -373,7 +374,7 @@ EXPORT_SYMBOL_GPL(usb_ep_autoconfig);
  *
  * Use this for devices where one configuration may need to assign
  * endpoint resources very differently from the next one.  It clears
- * state such as ep->driver_data and the record of assigned endpoints
+ * state such as ep->claimed and the record of assigned endpoints
  * used by usb_ep_autoconfig().
  */
 void usb_ep_autoconfig_reset (struct usb_gadget *gadget)
@@ -381,7 +382,7 @@ void usb_ep_autoconfig_reset (struct usb_gadget *gadget)
struct usb_ep   *ep;
 
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
-   ep->driver_data = NULL;
+   ep->claimed = false;
}
gadget->in_epnum = 0;
gadget->out_epnum = 0;
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 353a720..68fb5e8 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -173,6 +173,7 @@ struct usb_ep {
const char  *name;
const struct usb_ep_ops *ops;
struct list_headep_list;
+   boolclaimed;
unsignedmaxpacket:16;
unsignedmaxpacket_limit:16;
unsignedmax_streams:16;
-- 
1.9.1

--
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 07/46] usb: dwc3: gadget: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/dwc3/gadget.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 2feed9e..bd4c3db 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1715,6 +1715,19 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 
*dwc,
return ret;
}
 
+   if (epnum == 0 || epnum == 1) {
+   dep->endpoint.caps.type_control = true;
+   } else {
+   dep->endpoint.caps.type_iso = true;
+   dep->endpoint.caps.type_bulk = true;
+   dep->endpoint.caps.type_int = true;
+   }
+
+   if (direction)
+   dep->endpoint.caps.dir_in = true;
+   else
+   dep->endpoint.caps.dir_out = true;
+
INIT_LIST_HEAD(&dep->request_list);
INIT_LIST_HEAD(&dep->req_queued);
}
-- 
1.9.1

--
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 00/46] usb: gadget: rework ep matching and claiming mechanism

2015-07-31 Thread Robert Baldyga
Hello,

This patch series reworks endpoint matching and claiming mechanism in
epautoconf. From v2 there are couple of new patches adding 'ep_match'
to usb_gadget_ops and removing chip-specific quirk handling from generic
code of autoconfig.

I'm not sure if this patch set isn't too long, as it has 46 patches,
but I decided to send it as single series to avoid problems with patch
applying order.

The aim of whole patchset is to rework epautoconf code to get rid of
things like name-based endpoint matching and UDC name-based quirks in
generic code. These needed to do some modifications in framework like
adding 'endpoint capabilities flags' feature or adding 'match_ep'.

Following paragraphs contain brief description of what modifications are
done by particular parts of this patch set:

Patch (1) introduces new safer endpoint claiming method, basing on new
'claimed' flag. It was discussed here [1]. I proposed this solution over
year ago and it was accepted, but I apparently forgot to send the final
version of my patch.

Patches (2-3) add the 'capabilities flags' structure and helper macros.
This solution is inspired by the 'feature flags' originally proposed
by Felipe Balbi in 2013 [2], but unfortunately implementation of this
feature has never been completed.

Patches (4-36) add' capabilites flags' support to all UDC drivers present
in the kernel tree. It's needed to be done before replacing old endpoint
matching mechanism, otherwise UDC drivers which doesn't set 'capabilities
flags' won't work with new matching function.

Patch (37) finally replaces old endpoint matching method with the new
one basing on capabilities flags.

These changes aims to get rid of code, which guesses endpoint capabilities
basing on it's name, and introduce new better replacement. In result
we have better way to describe types and directions supported by each
endpoint.

For example the old name-based method didn't allow to have endpoint
supporing two types of transfers - there were only ability to support
one or all of endpoint types. The 'capabilities flags' feature supply
precise, flexible and extensible mechanism of description of endpoint
hardware limitations, which is desired for proper endpoint matching.

Patch (38) removes chip-specific quirk from ep_matches() function.

Patches (39-40) remove code modifying endpoint and descriptor structures
from ep_matches() function and cleans it up to make it simpler and more
readable.

Patch (41) add 'match_ep' callback to usb_gadget_ops and make use of
it in epautoconf. This callback allows UDC drivers to supply non-standard
endpoint matching algorithms.

Patches (42-43) move ep_matches() and find_ep() functions outside
epautoconf and rename them to usb_gadget_ep_match_desc() and
gadget_find_ep_by_name(). It's because they may be useful in 'match_ep'
callbacks in UDC drivers to avoid writing repetitive code.

Patches (44-46) move chip-specific enpoint matching algorithms from
generic code of usb_ep_autoconfig_ss() function to UDC controller drivers
using 'match_ep' callback.

In the result we have epautoconf source free of chip-specific code, plus
two new mechanisms allowing to handle non-standard hardware limitations.

[1] https://lkml.org/lkml/2014/6/16/94
[2] http://www.spinics.net/lists/linux-usb/msg99662.html

Best regards,
Robert Baldyga

Changelog:

v5:
- made code more grepable according to Felipe's suggestion

v4: https://lkml.org/lkml/2015/7/27/181
- addressed comments from Krzysztof Opasiak and Felipe Balbi

v3: https://lkml.org/lkml/2015/7/15/68
- addressed comments from Sergei Shtylyov

v2: https://lkml.org/lkml/2015/7/14/172
- remove PXA quirk from ep_matches() function without behaviour change
  using ep capabilities flags
- separate ep and desc configuration code from ep_match() function
- add 'ep_match' to usb_gadget_ops and move chip-specific endpoint
  matching algorithms from generic code to UDC controller drivers

v1: https://lkml.org/lkml/2015/7/8/436

Robert Baldyga (46):
  usb: gadget: encapsulate endpoint claiming mechanism
  usb: gadget: add endpoint capabilities flags
  usb: gadget: add endpoint capabilities helper macros
  staging: emxx_udc: add ep capabilities support
  usb: chipidea: udc: add ep capabilities support
  usb: dwc2: gadget: add ep capabilities support
  usb: dwc3: gadget: add ep capabilities support
  usb: gadget: amd5536udc: add ep capabilities support
  usb: gadget: at91_udc: add ep capabilities support
  usb: gadget: bcm63xx_udc: add ep capabilities support
  usb: gadget: bdc: add ep capabilities support
  usb: gadget: dummy-hcd: add ep capabilities support
  usb: gadget: fotg210-udc: add ep capabilities support
  usb: gadget: fsl_qe_udc: add ep capabilities support
  usb: gadget: fsl_udc_core: add ep capabilities support
  usb: gadget: fusb300_udc: add ep capabilities support
  usb: gadget: goku_udc: add ep capabilities support
  usb: gadget: gr_udc: add ep capabilities support
  usb: gadget: lpc32xx_udc: add ep capabilities support
  usb: 

[PATCH v5 06/46] usb: dwc2: gadget: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/dwc2/gadget.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 731b13d..3ee5b4c 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -3289,6 +3289,19 @@ static void s3c_hsotg_initep(struct dwc2_hsotg *hsotg,
usb_ep_set_maxpacket_limit(&hs_ep->ep, epnum ? 1024 : EP0_MPS_LIMIT);
hs_ep->ep.ops = &s3c_hsotg_ep_ops;
 
+   if (epnum == 0) {
+   hs_ep->ep.caps.type_control = true;
+   } else {
+   hs_ep->ep.caps.type_iso = true;
+   hs_ep->ep.caps.type_bulk = true;
+   hs_ep->ep.caps.type_int = true;
+   }
+
+   if (dir_in)
+   hs_ep->ep.caps.dir_in = true;
+   else
+   hs_ep->ep.caps.dir_out = true;
+
/*
 * if we're using dma, we need to set the next-endpoint pointer
 * to be something valid.
-- 
1.9.1

--
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 04/46] staging: emxx_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Fixed typo in "epc-nulk" to "epc-bulk".

Signed-off-by: Robert Baldyga 
---
 drivers/staging/emxx_udc/emxx_udc.c | 73 +
 1 file changed, 42 insertions(+), 31 deletions(-)

diff --git a/drivers/staging/emxx_udc/emxx_udc.c 
b/drivers/staging/emxx_udc/emxx_udc.c
index 3b7aa36..b6b76ff 100644
--- a/drivers/staging/emxx_udc/emxx_udc.c
+++ b/drivers/staging/emxx_udc/emxx_udc.c
@@ -3153,36 +3153,46 @@ static const struct usb_gadget_ops nbu2ss_gadget_ops = {
.ioctl  = nbu2ss_gad_ioctl,
 };
 
-static const char g_ep0_name[] = "ep0";
-static const char g_ep1_name[] = "ep1-bulk";
-static const char g_ep2_name[] = "ep2-bulk";
-static const char g_ep3_name[] = "ep3in-int";
-static const char g_ep4_name[] = "ep4-iso";
-static const char g_ep5_name[] = "ep5-iso";
-static const char g_ep6_name[] = "ep6-bulk";
-static const char g_ep7_name[] = "ep7-bulk";
-static const char g_ep8_name[] = "ep8in-int";
-static const char g_ep9_name[] = "ep9-iso";
-static const char g_epa_name[] = "epa-iso";
-static const char g_epb_name[] = "epb-bulk";
-static const char g_epc_name[] = "epc-nulk";
-static const char g_epd_name[] = "epdin-int";
-
-static const char *gp_ep_name[NUM_ENDPOINTS] = {
-   g_ep0_name,
-   g_ep1_name,
-   g_ep2_name,
-   g_ep3_name,
-   g_ep4_name,
-   g_ep5_name,
-   g_ep6_name,
-   g_ep7_name,
-   g_ep8_name,
-   g_ep9_name,
-   g_epa_name,
-   g_epb_name,
-   g_epc_name,
-   g_epd_name,
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} ep_info[NUM_ENDPOINTS] = {
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
+
+   EP_INFO("ep0",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep1-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep2-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep3in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep4-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep5-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep6-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep7-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep8in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep9-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("epa-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("epb-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("epc-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("epdin-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+
+#undef EP_INFO
 };
 
 /*-*/
@@ -3200,7 +3210,8 @@ static void __init nbu2ss_drv_ep_init(struct nbu2ss_udc 
*udc)
ep->desc = NULL;
 
ep->ep.driver_data = NULL;
-   ep->ep.name = gp_ep_name[i];
+   ep->ep.name = ep_info[i].name;
+   ep->ep.caps = ep_info[i].caps;
ep->ep.ops = &nbu2ss_ep_ops;
 
usb_ep_set_maxpacket_limit(&ep->ep,
-- 
1.9.1

--
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 13/46] usb: gadget: fotg210-udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/fotg210-udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/fotg210-udc.c 
b/drivers/usb/gadget/udc/fotg210-udc.c
index a99ed6d..6ba122c 100644
--- a/drivers/usb/gadget/udc/fotg210-udc.c
+++ b/drivers/usb/gadget/udc/fotg210-udc.c
@@ -1143,6 +1143,17 @@ static int fotg210_udc_probe(struct platform_device 
*pdev)
ep->ep.name = fotg210_ep_name[i];
ep->ep.ops = &fotg210_ep_ops;
usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40);
fotg210->gadget.ep0 = &fotg210->ep[0]->ep;
-- 
1.9.1

--
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 16/46] usb: gadget: fusb300_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/fusb300_udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/fusb300_udc.c 
b/drivers/usb/gadget/udc/fusb300_udc.c
index 3970f45..948845c 100644
--- a/drivers/usb/gadget/udc/fusb300_udc.c
+++ b/drivers/usb/gadget/udc/fusb300_udc.c
@@ -1450,6 +1450,17 @@ static int fusb300_probe(struct platform_device *pdev)
ep->ep.name = fusb300_ep_name[i];
ep->ep.ops = &fusb300_ep_ops;
usb_ep_set_maxpacket_limit(&ep->ep, HS_BULK_MAX_PACKET_SIZE);
+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
usb_ep_set_maxpacket_limit(&fusb300->ep[0]->ep, HS_CTL_MAX_PACKET_SIZE);
fusb300->ep[0]->epnum = 0;
-- 
1.9.1

--
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 14/46] usb: gadget: fsl_qe_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/fsl_qe_udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/fsl_qe_udc.c 
b/drivers/usb/gadget/udc/fsl_qe_udc.c
index e0822f1..5fb6f8b 100644
--- a/drivers/usb/gadget/udc/fsl_qe_udc.c
+++ b/drivers/usb/gadget/udc/fsl_qe_udc.c
@@ -2417,6 +2417,17 @@ static int qe_ep_config(struct qe_udc *udc, unsigned 
char pipe_num)
strcpy(ep->name, ep_name[pipe_num]);
ep->ep.name = ep_name[pipe_num];
 
+   if (pipe_num == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
+
ep->ep.ops = &qe_ep_ops;
ep->stopped = 1;
usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
-- 
1.9.1

--
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 15/46] usb: gadget: fsl_udc_core: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/fsl_udc_core.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/usb/gadget/udc/fsl_udc_core.c 
b/drivers/usb/gadget/udc/fsl_udc_core.c
index c60022b..aab5221 100644
--- a/drivers/usb/gadget/udc/fsl_udc_core.c
+++ b/drivers/usb/gadget/udc/fsl_udc_core.c
@@ -2313,6 +2313,19 @@ static int struct_ep_setup(struct fsl_udc *udc, unsigned 
char index,
ep->ep.ops = &fsl_ep_ops;
ep->stopped = 0;
 
+   if (index == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   if (index & 1)
+   ep->ep.caps.dir_in = true;
+   else
+   ep->ep.caps.dir_out = true;
+
/* for ep0: maxP defined in desc
 * for other eps, maxP is set by epautoconfig() called by gadget layer
 */
-- 
1.9.1

--
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 v3 3/5] usb: phy: add usb3.0 phy driver for mt65xx SoCs

2015-07-31 Thread Kishon Vijay Abraham I
Hi,

On Friday 31 July 2015 05:55 PM, chunfeng yun wrote:
> hi,
> On Tue, 2015-07-28 at 11:17 +0530, Kishon Vijay Abraham I wrote:
>> Hi,
>>
>> On Sunday 26 July 2015 08:21 AM, chunfeng yun wrote:
>>> hi,
>>> On Wed, 2015-07-22 at 09:21 -0500, Felipe Balbi wrote:
 Hi,

 On Wed, Jul 22, 2015 at 10:05:43PM +0800, Chunfeng Yun wrote:
> support usb3.0 phy of mt65xx SoCs
>
> Signed-off-by: Chunfeng Yun 

 you missed Kishon here.

>>> Thank you.
> ---
>  drivers/phy/Kconfig   |   9 +
>  drivers/phy/Makefile  |   1 +
>  drivers/phy/phy-mt65xx-usb3.c | 426 
> ++
>  3 files changed, 436 insertions(+)
>  create mode 100644 drivers/phy/phy-mt65xx-usb3.c
>
> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> index c0e6ede..019cf8b 100644
> --- a/drivers/phy/Kconfig
> +++ b/drivers/phy/Kconfig
> @@ -193,6 +193,15 @@ config PHY_HIX5HD2_SATA
>   help
> Support for SATA PHY on Hisilicon hix5hd2 Soc.
>  
> +config PHY_MT65XX_USB3
> + tristate "Mediatek USB3.0 PHY Driver"
> + depends on ARCH_MEDIATEK && OF
> + select GENERIC_PHY
> + help
> +   Say 'Y' here to add support for Mediatek USB3.0 PHY driver
> +   for mt65xx SoCs. it supports two usb2.0 ports and
> +   one usb3.0 port.
> +
>  config PHY_SUN4I_USB
>   tristate "Allwinner sunxi SoC USB PHY driver"
>   depends on ARCH_SUNXI && HAS_IOMEM && OF
> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> index f344e1b..3ceff2a 100644
> --- a/drivers/phy/Makefile
> +++ b/drivers/phy/Makefile
> @@ -22,6 +22,7 @@ obj-$(CONFIG_TI_PIPE3)  += 
> phy-ti-pipe3.o
>  obj-$(CONFIG_TWL4030_USB)+= phy-twl4030-usb.o
>  obj-$(CONFIG_PHY_EXYNOS5250_SATA)+= phy-exynos5250-sata.o
>  obj-$(CONFIG_PHY_HIX5HD2_SATA)   += phy-hix5hd2-sata.o
> +obj-$(CONFIG_PHY_MT65XX_USB3)+= phy-mt65xx-usb3.o
>  obj-$(CONFIG_PHY_SUN4I_USB)  += phy-sun4i-usb.o
>  obj-$(CONFIG_PHY_SUN9I_USB)  += phy-sun9i-usb.o
>  obj-$(CONFIG_PHY_SAMSUNG_USB2)   += phy-exynos-usb2.o
> diff --git a/drivers/phy/phy-mt65xx-usb3.c b/drivers/phy/phy-mt65xx-usb3.c
> new file mode 100644
> index 000..5da4534
> --- /dev/null
> +++ b/drivers/phy/phy-mt65xx-usb3.c
> @@ -0,0 +1,426 @@
> +/*
> + * Copyright (c) 2015 MediaTek Inc.
> + * Author: Chunfeng.Yun 
> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
>>
>> Lot of these #include are not required. Add only those what are required by
>> this driver.
> The dummy header files will be removed later
> 
> +#include 
> +
> +/*
> + * for sifslv2 register
> + * relative to USB3_SIF2_BASE base address
> + */
> +#define SSUSB_SIFSLV_SPLLC   (0x)
> +#define SSUSB_SIFSLV_U2PHY_COM_BASE  (0x0800)
>>
>> Looks like all this base address can come from dt.
> The phy supports multi-ports, and these are sub-segment registers for
> port0, and other ports can be calculated from the bases. So I think it's
> better to use the same base address in dts

Nope. Except for the register offsets everything else can come from dt.
> 
> +#define SSUSB_SIFSLV_U3PHYD_BASE (0x0900)
> +#define SSUSB_USB30_PHYA_SIV_B_BASE  (0x0b00)
> +#define SSUSB_SIFSLV_U3PHYA_DA_BASE  (0x0c00)
> +
> +/*port1 refs. +0x800(refer to port0)*/
> +#define U3P_PORT_INTERVAL (0x800)/*based on port0 */
> +#define U3P_PHY_DELTA(index) ((U3P_PORT_INTERVAL) * (index))
> +
> +#define U3P_USBPHYACR0   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x)
> +#define PA0_RG_U2PLL_FORCE_ON(0x1 << 15)
> +
> +#define U3P_USBPHYACR2   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0008)
> +#define PA2_RG_SIF_U2PLL_FORCE_EN(0x1 << 18)
> +
> +#define U3P_USBPHYACR5   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0014)
> +#define PA5_RG_U2_HSTX_SRCTRL(0x7 << 12)
> +#define PA5_RG_U2_HSTX_SRCTRL_VAL(x) ((0x7 & (x)) << 12)
> +#define PA5_RG_U2_HS_100U_U3_EN  (0x1 << 11)
> +
> +#define U3P_USBPHYACR6   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0018)
> +

[PATCH v5 10/46] usb: gadget: bcm63xx_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/bcm63xx_udc.c | 29 +
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/gadget/udc/bcm63xx_udc.c 
b/drivers/usb/gadget/udc/bcm63xx_udc.c
index 9db968b..8cbb003 100644
--- a/drivers/usb/gadget/udc/bcm63xx_udc.c
+++ b/drivers/usb/gadget/udc/bcm63xx_udc.c
@@ -44,9 +44,29 @@
 #define DRV_MODULE_NAME"bcm63xx_udc"
 
 static const char bcm63xx_ep0name[] = "ep0";
-static const char *const bcm63xx_ep_name[] = {
-   bcm63xx_ep0name,
-   "ep1in-bulk", "ep2out-bulk", "ep3in-int", "ep4out-int",
+
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} bcm63xx_ep_info[] = {
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
+
+   EP_INFO(bcm63xx_ep0name,
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep1in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep2out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep3in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep4out-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_OUT)),
+
+#undef EP_INFO
 };
 
 static bool use_fullspeed;
@@ -943,7 +963,8 @@ static int bcm63xx_init_udc_hw(struct bcm63xx_udc *udc)
for (i = 0; i < BCM63XX_NUM_EP; i++) {
struct bcm63xx_ep *bep = &udc->bep[i];
 
-   bep->ep.name = bcm63xx_ep_name[i];
+   bep->ep.name = bcm63xx_ep_info[i].name;
+   bep->ep.caps = bcm63xx_ep_info[i].caps;
bep->ep_num = i;
bep->ep.ops = &bcm63xx_udc_ep_ops;
list_add_tail(&bep->ep.ep_list, &udc->gadget.ep_list);
-- 
1.9.1

--
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 12/46] usb: gadget: dummy-hcd: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/dummy_hcd.c | 95 --
 1 file changed, 80 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/gadget/udc/dummy_hcd.c 
b/drivers/usb/gadget/udc/dummy_hcd.c
index 181112c..1379ad4 100644
--- a/drivers/usb/gadget/udc/dummy_hcd.c
+++ b/drivers/usb/gadget/udc/dummy_hcd.c
@@ -127,23 +127,87 @@ static inline struct dummy_request 
*usb_request_to_dummy_request
 
 static const char ep0name[] = "ep0";
 
-static const char *const ep_name[] = {
-   ep0name,/* everyone has ep0 */
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} ep_info[] = {
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
 
+   /* everyone has ep0 */
+   EP_INFO(ep0name,
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
/* act like a pxa250: fifteen fixed function endpoints */
-   "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int",
-   "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int",
-   "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso",
-   "ep15in-int",
-
+   EP_INFO("ep1in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep2out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep3in-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep4out-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep5in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep6in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep7out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep8in-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep9out-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep10in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep11in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep12out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep13in-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep14out-iso",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep15in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
/* or like sa1100: two fixed function endpoints */
-   "ep1out-bulk", "ep2in-bulk",
-
+   EP_INFO("ep1out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep2in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
/* and now some generic EPs so we have enough in multi config */
-   "ep3out", "ep4in", "ep5out", "ep6out", "ep7in", "ep8out", "ep9in",
-   "ep10out", "ep11out", "ep12in", "ep13out", "ep14in", "ep15out",
+   EP_INFO("ep3out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep4in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep5out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep6out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep7in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep8out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep9in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep10out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep11out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep12in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep13out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep14in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep15out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+
+#undef EP_INFO
 };
-#define DUMMY_ENDPOINTSARRAY_SIZE(ep_name)
+
+#define DUMMY_ENDPOINTSARRAY_SIZE(ep_info)
 
 /*-*/
 
@@ -938,9 +1002,10 @@ static void init_dummy_udc_hw(struct dummy *dum)
for (i =

[PATCH v5 09/46] usb: gadget: at91_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/at91_udc.c | 38 +-
 1 file changed, 29 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/gadget/udc/at91_udc.c 
b/drivers/usb/gadget/udc/at91_udc.c
index 32f50a7..d0d1894 100644
--- a/drivers/usb/gadget/udc/at91_udc.c
+++ b/drivers/usb/gadget/udc/at91_udc.c
@@ -59,15 +59,34 @@
 #defineDRIVER_VERSION  "3 May 2006"
 
 static const char driver_name [] = "at91_udc";
-static const char * const ep_names[] = {
-   "ep0",
-   "ep1",
-   "ep2",
-   "ep3-int",
-   "ep4",
-   "ep5",
+
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} ep_info[] = {
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
+
+   EP_INFO("ep0",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep1",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep2",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep3-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep4",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep5",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+
+#undef EP_INFO
 };
-#define ep0nameep_names[0]
+
+#define ep0nameep_info[0].name
 
 #define VBUS_POLL_TIMEOUT  msecs_to_jiffies(1000)
 
@@ -1831,7 +1850,8 @@ static int at91udc_probe(struct platform_device *pdev)
 
for (i = 0; i < NUM_ENDPOINTS; i++) {
ep = &udc->ep[i];
-   ep->ep.name = ep_names[i];
+   ep->ep.name = ep_info[i].name;
+   ep->ep.caps = ep_info[i].caps;
ep->ep.ops = &at91_ep_ops;
ep->udc = udc;
ep->int_mask = BIT(i);
-- 
1.9.1

--
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 08/46] usb: gadget: amd5536udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/amd5536udc.c | 88 -
 1 file changed, 78 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/udc/amd5536udc.c 
b/drivers/usb/gadget/udc/amd5536udc.c
index de7e5e2..fdacddb 100644
--- a/drivers/usb/gadget/udc/amd5536udc.c
+++ b/drivers/usb/gadget/udc/amd5536udc.c
@@ -138,15 +138,82 @@ static DECLARE_TASKLET(disconnect_tasklet, 
udc_tasklet_disconnect,
 
 /* endpoint names used for print */
 static const char ep0_string[] = "ep0in";
-static const char *const ep_string[] = {
-   ep0_string,
-   "ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk",
-   "ep6in-bulk", "ep7in-bulk", "ep8in-bulk", "ep9in-bulk", "ep10in-bulk",
-   "ep11in-bulk", "ep12in-bulk", "ep13in-bulk", "ep14in-bulk",
-   "ep15in-bulk", "ep0out", "ep1out-bulk", "ep2out-bulk", "ep3out-bulk",
-   "ep4out-bulk", "ep5out-bulk", "ep6out-bulk", "ep7out-bulk",
-   "ep8out-bulk", "ep9out-bulk", "ep10out-bulk", "ep11out-bulk",
-   "ep12out-bulk", "ep13out-bulk", "ep14out-bulk", "ep15out-bulk"
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} ep_info[] = {
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
+
+   EP_INFO(ep0_string,
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep1in-int",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep2in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep3in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep4in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep5in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep6in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep7in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep8in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep9in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep10in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep11in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep12in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep13in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep14in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep15in-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep0out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep1out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep2out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep3out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep4out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep5out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep6out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep7out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep8out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep9out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep10out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep11out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep12out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep13out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep14out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep15out-bulk",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
+
+#undef EP_INFO
 };
 
 /* DMA usage flag */
@@ -1517,7 +1584,8 @@ static void udc_setup_endpoints(struct udc *dev)
for (tmp = 0; tmp < UDC_EP_NUM; tmp++) {
ep = &dev->ep[tmp];
ep->dev = dev;
-   ep->ep.name

[PATCH v5 11/46] usb: gadget: bdc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/bdc/bdc_ep.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/gadget/udc/bdc/bdc_ep.c 
b/drivers/usb/gadget/udc/bdc/bdc_ep.c
index b04980c..f9a8f57 100644
--- a/drivers/usb/gadget/udc/bdc/bdc_ep.c
+++ b/drivers/usb/gadget/udc/bdc/bdc_ep.c
@@ -1952,12 +1952,18 @@ static int init_ep(struct bdc *bdc, u32 epnum, u32 dir)
ep->bdc = bdc;
ep->dir = dir;
 
+   if (dir)
+   ep->usb_ep.caps.dir_in = true;
+   else
+   ep->usb_ep.caps.dir_out = true;
+
/* ep->ep_num is the index inside bdc_ep */
if (epnum == 1) {
ep->ep_num = 1;
bdc->bdc_ep_array[ep->ep_num] = ep;
snprintf(ep->name, sizeof(ep->name), "ep%d", epnum - 1);
usb_ep_set_maxpacket_limit(&ep->usb_ep, EP0_MAX_PKT_SIZE);
+   ep->usb_ep.caps.type_control = true;
ep->comp_desc = NULL;
bdc->gadget.ep0 = &ep->usb_ep;
} else {
@@ -1971,6 +1977,9 @@ static int init_ep(struct bdc *bdc, u32 epnum, u32 dir)
 dir & 1 ? "in" : "out");
 
usb_ep_set_maxpacket_limit(&ep->usb_ep, 1024);
+   ep->usb_ep.caps.type_iso = true;
+   ep->usb_ep.caps.type_bulk = true;
+   ep->usb_ep.caps.type_int = true;
ep->usb_ep.max_streams = 0;
list_add_tail(&ep->usb_ep.ep_list, &bdc->gadget.ep_list);
}
-- 
1.9.1

--
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 31/46] usb: gadget: s3c2410_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/s3c2410_udc.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c 
b/drivers/usb/gadget/udc/s3c2410_udc.c
index 5d9aa81..eb3571e 100644
--- a/drivers/usb/gadget/udc/s3c2410_udc.c
+++ b/drivers/usb/gadget/udc/s3c2410_udc.c
@@ -1691,6 +1691,8 @@ static struct s3c2410_udc memory = {
.name   = ep0name,
.ops= &s3c2410_ep_ops,
.maxpacket  = EP0_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
},
@@ -1702,6 +1704,8 @@ static struct s3c2410_udc memory = {
.name   = "ep1-bulk",
.ops= &s3c2410_ep_ops,
.maxpacket  = EP_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
.fifo_size  = EP_FIFO_SIZE,
@@ -1714,6 +1718,8 @@ static struct s3c2410_udc memory = {
.name   = "ep2-bulk",
.ops= &s3c2410_ep_ops,
.maxpacket  = EP_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
.fifo_size  = EP_FIFO_SIZE,
@@ -1726,6 +1732,8 @@ static struct s3c2410_udc memory = {
.name   = "ep3-bulk",
.ops= &s3c2410_ep_ops,
.maxpacket  = EP_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
.fifo_size  = EP_FIFO_SIZE,
@@ -1738,6 +1746,8 @@ static struct s3c2410_udc memory = {
.name   = "ep4-bulk",
.ops= &s3c2410_ep_ops,
.maxpacket  = EP_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
.fifo_size  = EP_FIFO_SIZE,
-- 
1.9.1

--
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 39/46] usb: gadget: epautoconf: remove ep and desc configuration from ep_matches()

2015-07-31 Thread Robert Baldyga
As function ep_matches() is used to match endpoint with usb descriptor it's
highly unintuitive that it modifies endpoint and descriptor structures fields.
This patch moves code configuring ep and desc from ep_matches() to
usb_ep_autoconfig_ss(), so now function ep_matches() does nothing more than
its name suggests.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 66 +
 1 file changed, 34 insertions(+), 32 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 4f66e9d73..7bb28f1 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -82,13 +82,6 @@ ep_matches (
 
}
 
-   /*
-* If the protocol driver hasn't yet decided on wMaxPacketSize
-* and wants to know the maximum possible, provide the info.
-*/
-   if (desc->wMaxPacketSize == 0)
-   desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket_limit);
-
/* endpoint maxpacket size is an input parameter, except for bulk
 * where it's an output parameter representing the full speed limit.
 * the usb spec fixes high speed bulk maxpacket at 512 bytes.
@@ -119,31 +112,6 @@ ep_matches (
 
/* MATCH!! */
 
-   /* report address */
-   desc->bEndpointAddress &= USB_DIR_IN;
-   if (isdigit (ep->name [2])) {
-   u8  num = simple_strtoul (&ep->name [2], NULL, 10);
-   desc->bEndpointAddress |= num;
-   } else if (desc->bEndpointAddress & USB_DIR_IN) {
-   if (++gadget->in_epnum > 15)
-   return 0;
-   desc->bEndpointAddress = USB_DIR_IN | gadget->in_epnum;
-   } else {
-   if (++gadget->out_epnum > 15)
-   return 0;
-   desc->bEndpointAddress |= gadget->out_epnum;
-   }
-
-   /* report (variable) full speed bulk maxpacket */
-   if ((USB_ENDPOINT_XFER_BULK == type) && !ep_comp) {
-   int size = ep->maxpacket_limit;
-
-   /* min() doesn't work on bitfields with gcc-3.5 */
-   if (size > 64)
-   size = 64;
-   desc->wMaxPacketSize = cpu_to_le16(size);
-   }
-   ep->address = desc->bEndpointAddress;
return 1;
 }
 
@@ -280,6 +248,40 @@ struct usb_ep *usb_ep_autoconfig_ss(
/* Fail */
return NULL;
 found_ep:
+
+   /*
+* If the protocol driver hasn't yet decided on wMaxPacketSize
+* and wants to know the maximum possible, provide the info.
+*/
+   if (desc->wMaxPacketSize == 0)
+   desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket_limit);
+
+   /* report address */
+   desc->bEndpointAddress &= USB_DIR_IN;
+   if (isdigit(ep->name[2])) {
+   u8 num = simple_strtoul(&ep->name[2], NULL, 10);
+   desc->bEndpointAddress |= num;
+   } else if (desc->bEndpointAddress & USB_DIR_IN) {
+   if (++gadget->in_epnum > 15)
+   return 0;
+   desc->bEndpointAddress = USB_DIR_IN | gadget->in_epnum;
+   } else {
+   if (++gadget->out_epnum > 15)
+   return 0;
+   desc->bEndpointAddress |= gadget->out_epnum;
+   }
+
+   /* report (variable) full speed bulk maxpacket */
+   if ((type == USB_ENDPOINT_XFER_BULK) && !ep_comp) {
+   int size = ep->maxpacket_limit;
+
+   /* min() doesn't work on bitfields with gcc-3.5 */
+   if (size > 64)
+   size = 64;
+   desc->wMaxPacketSize = cpu_to_le16(size);
+   }
+
+   ep->address = desc->bEndpointAddress;
ep->desc = NULL;
ep->comp_desc = NULL;
ep->claimed = true;
-- 
1.9.1

--
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 23/46] usb: gadget: net2272: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/net2272.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/net2272.c b/drivers/usb/gadget/udc/net2272.c
index c2ed5da..18f5ebd 100644
--- a/drivers/usb/gadget/udc/net2272.c
+++ b/drivers/usb/gadget/udc/net2272.c
@@ -1404,6 +1404,17 @@ net2272_usb_reinit(struct net2272 *dev)
else
ep->fifo_size = 64;
net2272_ep_reset(ep);
+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64);
 
-- 
1.9.1

--
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 25/46] usb: gadget: omap_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/omap_udc.c | 22 ++
 1 file changed, 22 insertions(+)

diff --git a/drivers/usb/gadget/udc/omap_udc.c 
b/drivers/usb/gadget/udc/omap_udc.c
index e2fcdb8..9b7d394 100644
--- a/drivers/usb/gadget/udc/omap_udc.c
+++ b/drivers/usb/gadget/udc/omap_udc.c
@@ -2579,6 +2579,28 @@ omap_ep_setup(char *name, u8 addr, u8 type,
ep->double_buf = dbuf;
ep->udc = udc;
 
+   switch (type) {
+   case USB_ENDPOINT_XFER_CONTROL:
+   ep->ep.caps.type_control = true;
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
+   break;
+   case USB_ENDPOINT_XFER_ISOC:
+   ep->ep.caps.type_iso = true;
+   break;
+   case USB_ENDPOINT_XFER_BULK:
+   ep->ep.caps.type_bulk = true;
+   break;
+   case USB_ENDPOINT_XFER_INT:
+   ep->ep.caps.type_int = true;
+   break;
+   };
+
+   if (addr & USB_DIR_IN)
+   ep->ep.caps.dir_in = true;
+   else
+   ep->ep.caps.dir_out = true;
+
ep->ep.name = ep->name;
ep->ep.ops = &omap_ep_ops;
ep->maxpacket = maxp;
-- 
1.9.1

--
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 21/46] usb: gadget: mv_u3d_core: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/mv_u3d_core.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/gadget/udc/mv_u3d_core.c 
b/drivers/usb/gadget/udc/mv_u3d_core.c
index ea35a24..4c48969 100644
--- a/drivers/usb/gadget/udc/mv_u3d_core.c
+++ b/drivers/usb/gadget/udc/mv_u3d_core.c
@@ -1324,6 +1324,9 @@ static int mv_u3d_eps_init(struct mv_u3d *u3d)
ep->ep.ops = &mv_u3d_ep_ops;
ep->wedge = 0;
usb_ep_set_maxpacket_limit(&ep->ep, MV_U3D_EP0_MAX_PKT_SIZE);
+   ep->ep.caps.type_control = true;
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
ep->ep_num = 0;
ep->ep.desc = &mv_u3d_ep0_desc;
INIT_LIST_HEAD(&ep->queue);
@@ -1339,14 +1342,20 @@ static int mv_u3d_eps_init(struct mv_u3d *u3d)
if (i & 1) {
snprintf(name, sizeof(name), "ep%din", i >> 1);
ep->direction = MV_U3D_EP_DIR_IN;
+   ep->ep.caps.dir_in = true;
} else {
snprintf(name, sizeof(name), "ep%dout", i >> 1);
ep->direction = MV_U3D_EP_DIR_OUT;
+   ep->ep.caps.dir_out = true;
}
ep->u3d = u3d;
strncpy(ep->name, name, sizeof(ep->name));
ep->ep.name = ep->name;
 
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+
ep->ep.ops = &mv_u3d_ep_ops;
usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
ep->ep_num = i / 2;
-- 
1.9.1

--
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 24/46] usb: gadget: net2280: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/net2280.c | 67 +---
 1 file changed, 55 insertions(+), 12 deletions(-)

diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c
index 2bee912..872ca25 100644
--- a/drivers/usb/gadget/udc/net2280.c
+++ b/drivers/usb/gadget/udc/net2280.c
@@ -74,19 +74,58 @@ static const char driver_desc[] = DRIVER_DESC;
 
 static const u32 ep_bit[9] = { 0, 17, 2, 19, 4, 1, 18, 3, 20 };
 static const char ep0name[] = "ep0";
-static const char *const ep_name[] = {
-   ep0name,
-   "ep-a", "ep-b", "ep-c", "ep-d",
-   "ep-e", "ep-f", "ep-g", "ep-h",
-};
 
-/* Endpoint names for usb3380 advance mode */
-static const char *const ep_name_adv[] = {
-   ep0name,
-   "ep1in", "ep2out", "ep3in", "ep4out",
-   "ep1out", "ep2in", "ep3out", "ep4in",
+#define EP_INFO(_name, _caps) \
+   { \
+   .name = _name, \
+   .caps = _caps, \
+   }
+
+static const struct {
+   const char *name;
+   const struct usb_ep_caps caps;
+} ep_info_dft[] = { /* Default endpoint configuration */
+   EP_INFO(ep0name,
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-a",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-b",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-c",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-d",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-e",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-f",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-g",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep-h",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_ALL)),
+}, ep_info_adv[] = { /* Endpoints for usb3380 advance mode */
+   EP_INFO(ep0name,
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
+   EP_INFO("ep1in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep2out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep3in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep4out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep1out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep2in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
+   EP_INFO("ep3out",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
+   EP_INFO("ep4in",
+   USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
 };
 
+#undef EP_INFO
+
 /* mode 0 == ep-{a,b,c,d} 1K fifo each
  * mode 1 == ep-{a,b} 2K fifo each, ep-{c,d} unavailable
  * mode 2 == ep-a 2K fifo, ep-{b,c} 1K each, ep-d unavailable
@@ -2055,7 +2094,8 @@ static void usb_reinit_228x(struct net2280 *dev)
for (tmp = 0; tmp < 7; tmp++) {
struct net2280_ep   *ep = &dev->ep[tmp];
 
-   ep->ep.name = ep_name[tmp];
+   ep->ep.name = ep_info_dft[tmp].name;
+   ep->ep.caps = ep_info_dft[tmp].caps;
ep->dev = dev;
ep->num = tmp;
 
@@ -2095,7 +2135,10 @@ static void usb_reinit_338x(struct net2280 *dev)
for (i = 0; i < dev->n_ep; i++) {
struct net2280_ep *ep = &dev->ep[i];
 
-   ep->ep.name = dev->enhanced_mode ? ep_name_adv[i] : ep_name[i];
+   ep->ep.name = dev->enhanced_mode ? ep_info_adv[i].name :
+  ep_info_dft[i].name;
+   ep->ep.caps = dev->enhanced_mode ? ep_info_adv[i].caps :
+  ep_info_dft[i].caps;
ep->dev = dev;
ep->num = i;
 
-- 
1.9.1

--
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 22/46] usb: gadget: mv_udc_core: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/mv_udc_core.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/gadget/udc/mv_udc_core.c 
b/drivers/usb/gadget/udc/mv_udc_core.c
index 5da37c9..339af51 100644
--- a/drivers/usb/gadget/udc/mv_udc_core.c
+++ b/drivers/usb/gadget/udc/mv_udc_core.c
@@ -1257,6 +1257,9 @@ static int eps_init(struct mv_udc *udc)
ep->wedge = 0;
ep->stopped = 0;
usb_ep_set_maxpacket_limit(&ep->ep, EP0_MAX_PKT_SIZE);
+   ep->ep.caps.type_control = true;
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
ep->ep_num = 0;
ep->ep.desc = &mv_ep0_desc;
INIT_LIST_HEAD(&ep->queue);
@@ -1269,14 +1272,20 @@ static int eps_init(struct mv_udc *udc)
if (i % 2) {
snprintf(name, sizeof(name), "ep%din", i / 2);
ep->direction = EP_DIR_IN;
+   ep->ep.caps.dir_in = true;
} else {
snprintf(name, sizeof(name), "ep%dout", i / 2);
ep->direction = EP_DIR_OUT;
+   ep->ep.caps.dir_out = true;
}
ep->udc = udc;
strncpy(ep->name, name, sizeof(ep->name));
ep->ep.name = ep->name;
 
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+
ep->ep.ops = &mv_ep_ops;
ep->stopped = 0;
usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
-- 
1.9.1

--
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 20/46] usb: gadget: m66592-udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/m66592-udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/m66592-udc.c 
b/drivers/usb/gadget/udc/m66592-udc.c
index 9704053..b1cfa96 100644
--- a/drivers/usb/gadget/udc/m66592-udc.c
+++ b/drivers/usb/gadget/udc/m66592-udc.c
@@ -1644,6 +1644,17 @@ static int m66592_probe(struct platform_device *pdev)
ep->ep.name = m66592_ep_name[i];
ep->ep.ops = &m66592_ep_ops;
usb_ep_set_maxpacket_limit(&ep->ep, 512);
+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64);
m66592->ep[0].pipenum = 0;
-- 
1.9.1

--
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 19/46] usb: gadget: lpc32xx_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/lpc32xx_udc.c | 32 
 1 file changed, 32 insertions(+)

diff --git a/drivers/usb/gadget/udc/lpc32xx_udc.c 
b/drivers/usb/gadget/udc/lpc32xx_udc.c
index 3b6a785..00b5006 100644
--- a/drivers/usb/gadget/udc/lpc32xx_udc.c
+++ b/drivers/usb/gadget/udc/lpc32xx_udc.c
@@ -2575,6 +2575,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep0",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 0,
@@ -2586,6 +2588,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep1-int",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 2,
@@ -2597,6 +2601,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep2-bulk",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 4,
@@ -2608,6 +2614,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep3-iso",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 1023,
.hwep_num_base  = 6,
@@ -2619,6 +2627,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep4-int",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 8,
@@ -2630,6 +2640,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep5-bulk",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 10,
@@ -2641,6 +2653,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep6-iso",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 1023,
.hwep_num_base  = 12,
@@ -2652,6 +2666,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep7-int",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 14,
@@ -2663,6 +2679,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep8-bulk",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 64,
.hwep_num_base  = 16,
@@ -2674,6 +2692,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep9-iso",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_ALL),
},
.maxpacket  = 1023,
.hwep_num_base  = 18,
@@ -2685,6 +2705,8 @@ static const struct lpc32xx_udc controller_template = {
.ep = {
.name   = "ep10-int",
.ops= &lpc32xx_ep_ops,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
+   USB_EP_CAPS_DIR_ALL),
},
   

[PATCH v5 17/46] usb: gadget: goku_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/goku_udc.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/usb/gadget/udc/goku_udc.c 
b/drivers/usb/gadget/udc/goku_udc.c
index 9e8d842..46b8d14 100644
--- a/drivers/usb/gadget/udc/goku_udc.c
+++ b/drivers/usb/gadget/udc/goku_udc.c
@@ -1257,6 +1257,14 @@ static void udc_reinit (struct goku_udc *dev)
INIT_LIST_HEAD (&ep->queue);
 
ep_reset(NULL, ep);
+
+   if (i == 0)
+   ep->ep.caps.type_control = true;
+   else
+   ep->ep.caps.type_bulk = true;
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
 
dev->ep[0].reg_mode = NULL;
-- 
1.9.1

--
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 26/46] usb: gadget: pch_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/pch_udc.c | 14 --
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index dcf5def..fa9eb3c 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -2895,11 +2895,21 @@ static void pch_udc_pcd_reinit(struct pch_udc_dev *dev)
ep->in = ~i & 1;
ep->ep.name = ep_string[i];
ep->ep.ops = &pch_udc_ep_ops;
-   if (ep->in)
+   if (ep->in) {
ep->offset_addr = ep->num * UDC_EP_REG_SHIFT;
-   else
+   ep->ep.caps.dir_in = true;
+   } else {
ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) *
  UDC_EP_REG_SHIFT;
+   ep->ep.caps.dir_out = true;
+   }
+   if (i == UDC_EP0IN_IDX || i == UDC_EP0OUT_IDX) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
/* need to set ep->ep.maxpacket and set Default Configuration?*/
usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE);
list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);
-- 
1.9.1

--
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 38/46] usb: gadget: epautoconf: remove pxa quirk from ep_matches()

2015-07-31 Thread Robert Baldyga
The same effect can be achieved by using capabilities flags, so now we can
get rid of handling of hardware specific limitations in generic code.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 5 -
 drivers/usb/gadget/udc/pxa25x_udc.c | 9 +++--
 2 files changed, 3 insertions(+), 11 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index af4b10a..4f66e9d73 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -58,11 +58,6 @@ ep_matches (
 */
if (!ep->caps.type_int && !ep->caps.type_bulk)
return 0;
-   /* for now, avoid PXA "interrupt-in";
-* it's documented as never using DATA1.
-*/
-   if (gadget_is_pxa(gadget) && ep->caps.type_int)
-   return 0;
break;
}
 
diff --git a/drivers/usb/gadget/udc/pxa25x_udc.c 
b/drivers/usb/gadget/udc/pxa25x_udc.c
index b4d25dc..b82cb14 100644
--- a/drivers/usb/gadget/udc/pxa25x_udc.c
+++ b/drivers/usb/gadget/udc/pxa25x_udc.c
@@ -1899,8 +1899,7 @@ static struct pxa25x_udc memory = {
.name   = "ep5in-int",
.ops= &pxa25x_ep_ops,
.maxpacket  = INT_FIFO_SIZE,
-   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
-   USB_EP_CAPS_DIR_IN),
+   .caps   = USB_EP_CAPS(0, 0),
},
.dev= &memory,
.fifo_size  = INT_FIFO_SIZE,
@@ -1978,8 +1977,7 @@ static struct pxa25x_udc memory = {
.name   = "ep10in-int",
.ops= &pxa25x_ep_ops,
.maxpacket  = INT_FIFO_SIZE,
-   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
-   USB_EP_CAPS_DIR_IN),
+   .caps   = USB_EP_CAPS(0, 0),
},
.dev= &memory,
.fifo_size  = INT_FIFO_SIZE,
@@ -2057,8 +2055,7 @@ static struct pxa25x_udc memory = {
.name   = "ep15in-int",
.ops= &pxa25x_ep_ops,
.maxpacket  = INT_FIFO_SIZE,
-   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
-   USB_EP_CAPS_DIR_IN),
+   .caps   = USB_EP_CAPS(0, 0),
},
.dev= &memory,
.fifo_size  = INT_FIFO_SIZE,
-- 
1.9.1

--
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 27/46] usb: gadget: pxa25x_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/pxa25x_udc.c | 32 
 1 file changed, 32 insertions(+)

diff --git a/drivers/usb/gadget/udc/pxa25x_udc.c 
b/drivers/usb/gadget/udc/pxa25x_udc.c
index 27f9442..b4d25dc 100644
--- a/drivers/usb/gadget/udc/pxa25x_udc.c
+++ b/drivers/usb/gadget/udc/pxa25x_udc.c
@@ -1822,6 +1822,8 @@ static struct pxa25x_udc memory = {
.name   = ep0name,
.ops= &pxa25x_ep_ops,
.maxpacket  = EP0_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL,
+   USB_EP_CAPS_DIR_ALL),
},
.dev= &memory,
.reg_udccs  = &UDCCS0,
@@ -1834,6 +1836,8 @@ static struct pxa25x_udc memory = {
.name   = "ep1in-bulk",
.ops= &pxa25x_ep_ops,
.maxpacket  = BULK_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_IN),
},
.dev= &memory,
.fifo_size  = BULK_FIFO_SIZE,
@@ -1847,6 +1851,8 @@ static struct pxa25x_udc memory = {
.name   = "ep2out-bulk",
.ops= &pxa25x_ep_ops,
.maxpacket  = BULK_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_OUT),
},
.dev= &memory,
.fifo_size  = BULK_FIFO_SIZE,
@@ -1862,6 +1868,8 @@ static struct pxa25x_udc memory = {
.name   = "ep3in-iso",
.ops= &pxa25x_ep_ops,
.maxpacket  = ISO_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_IN),
},
.dev= &memory,
.fifo_size  = ISO_FIFO_SIZE,
@@ -1875,6 +1883,8 @@ static struct pxa25x_udc memory = {
.name   = "ep4out-iso",
.ops= &pxa25x_ep_ops,
.maxpacket  = ISO_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_OUT),
},
.dev= &memory,
.fifo_size  = ISO_FIFO_SIZE,
@@ -1889,6 +1899,8 @@ static struct pxa25x_udc memory = {
.name   = "ep5in-int",
.ops= &pxa25x_ep_ops,
.maxpacket  = INT_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_INT,
+   USB_EP_CAPS_DIR_IN),
},
.dev= &memory,
.fifo_size  = INT_FIFO_SIZE,
@@ -1904,6 +1916,8 @@ static struct pxa25x_udc memory = {
.name   = "ep6in-bulk",
.ops= &pxa25x_ep_ops,
.maxpacket  = BULK_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_IN),
},
.dev= &memory,
.fifo_size  = BULK_FIFO_SIZE,
@@ -1917,6 +1931,8 @@ static struct pxa25x_udc memory = {
.name   = "ep7out-bulk",
.ops= &pxa25x_ep_ops,
.maxpacket  = BULK_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
+   USB_EP_CAPS_DIR_OUT),
},
.dev= &memory,
.fifo_size  = BULK_FIFO_SIZE,
@@ -1931,6 +1947,8 @@ static struct pxa25x_udc memory = {
.name   = "ep8in-iso",
.ops= &pxa25x_ep_ops,
.maxpacket  = ISO_FIFO_SIZE,
+   .caps   = USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO,
+   USB_EP_CAPS_DIR_IN),
},
.dev= &memory,
.fifo_size  = ISO_FIFO_SIZE,
@@ -1944,6 +1962,8 @@ static struct pxa25x_udc memory = {
.name   = "ep9out-iso",
.ops= &pxa25x_ep_ops,
.maxpacket  = ISO_FI

[PATCH v5 35/46] usb: renesas: gadget: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/renesas_usbhs/mod_gadget.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c 
b/drivers/usb/renesas_usbhs/mod_gadget.c
index 494dfe0..de4f97d 100644
--- a/drivers/usb/renesas_usbhs/mod_gadget.c
+++ b/drivers/usb/renesas_usbhs/mod_gadget.c
@@ -1103,12 +1103,18 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
if (usbhsg_is_dcp(uep)) {
gpriv->gadget.ep0 = &uep->ep;
usb_ep_set_maxpacket_limit(&uep->ep, 64);
+   uep->ep.caps.type_control = true;
}
/* init normal pipe */
else {
usb_ep_set_maxpacket_limit(&uep->ep, 512);
+   uep->ep.caps.type_iso = true;
+   uep->ep.caps.type_bulk = true;
+   uep->ep.caps.type_int = true;
list_add_tail(&uep->ep.ep_list, &gpriv->gadget.ep_list);
}
+   uep->ep.caps.dir_in = true;
+   uep->ep.caps.dir_out = true;
}
 
ret = usb_add_gadget_udc(dev, &gpriv->gadget);
-- 
1.9.1

--
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 28/46] usb: gadget: pxa27x_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/pxa27x_udc.h | 40 +++--
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/gadget/udc/pxa27x_udc.h 
b/drivers/usb/gadget/udc/pxa27x_udc.h
index 11e1423..cea2cb7 100644
--- a/drivers/usb/gadget/udc/pxa27x_udc.h
+++ b/drivers/usb/gadget/udc/pxa27x_udc.h
@@ -234,25 +234,35 @@
 /*
  * Endpoint definition helpers
  */
-#define USB_EP_DEF(addr, bname, dir, type, maxpkt) \
-{ .usb_ep = { .name = bname, .ops = &pxa_ep_ops, .maxpacket = maxpkt, }, \
+#define USB_EP_DEF(addr, bname, dir, type, maxpkt, ctype, cdir) \
+{ .usb_ep = {  .name = bname, .ops = &pxa_ep_ops, .maxpacket = maxpkt, \
+   .caps = USB_EP_CAPS(ctype, cdir), }, \
   .desc = {.bEndpointAddress = addr | (dir ? USB_DIR_IN : 0), \
-   .bmAttributes = type, \
+   .bmAttributes = USB_ENDPOINT_XFER_ ## type, \
.wMaxPacketSize = maxpkt, }, \
   .dev = &memory \
 }
-#define USB_EP_BULK(addr, bname, dir) \
-  USB_EP_DEF(addr, bname, dir, USB_ENDPOINT_XFER_BULK, BULK_FIFO_SIZE)
-#define USB_EP_ISO(addr, bname, dir) \
-  USB_EP_DEF(addr, bname, dir, USB_ENDPOINT_XFER_ISOC, ISO_FIFO_SIZE)
-#define USB_EP_INT(addr, bname, dir) \
-  USB_EP_DEF(addr, bname, dir, USB_ENDPOINT_XFER_INT, INT_FIFO_SIZE)
-#define USB_EP_IN_BULK(n)  USB_EP_BULK(n, "ep" #n "in-bulk", 1)
-#define USB_EP_OUT_BULK(n) USB_EP_BULK(n, "ep" #n "out-bulk", 0)
-#define USB_EP_IN_ISO(n)   USB_EP_ISO(n,  "ep" #n "in-iso", 1)
-#define USB_EP_OUT_ISO(n)  USB_EP_ISO(n,  "ep" #n "out-iso", 0)
-#define USB_EP_IN_INT(n)   USB_EP_INT(n,  "ep" #n "in-int", 1)
-#define USB_EP_CTRLUSB_EP_DEF(0,  "ep0", 0, 0, EP0_FIFO_SIZE)
+#define USB_EP_BULK(addr, bname, dir, cdir) \
+   USB_EP_DEF(addr, bname, dir, BULK, BULK_FIFO_SIZE, \
+   USB_EP_CAPS_TYPE_BULK, cdir)
+#define USB_EP_ISO(addr, bname, dir, cdir) \
+   USB_EP_DEF(addr, bname, dir, ISOC, ISO_FIFO_SIZE, \
+   USB_EP_CAPS_TYPE_ISO, cdir)
+#define USB_EP_INT(addr, bname, dir, cdir) \
+   USB_EP_DEF(addr, bname, dir, INT, INT_FIFO_SIZE, \
+   USB_EP_CAPS_TYPE_INT, cdir)
+#define USB_EP_IN_BULK(n)  USB_EP_BULK(n, "ep" #n "in-bulk", 1, \
+   USB_EP_CAPS_DIR_IN)
+#define USB_EP_OUT_BULK(n) USB_EP_BULK(n, "ep" #n "out-bulk", 0, \
+   USB_EP_CAPS_DIR_OUT)
+#define USB_EP_IN_ISO(n)   USB_EP_ISO(n,  "ep" #n "in-iso", 1, \
+   USB_EP_CAPS_DIR_IN)
+#define USB_EP_OUT_ISO(n)  USB_EP_ISO(n,  "ep" #n "out-iso", 0, \
+   USB_EP_CAPS_DIR_OUT)
+#define USB_EP_IN_INT(n)   USB_EP_INT(n,  "ep" #n "in-int", 1, \
+   USB_EP_CAPS_DIR_IN)
+#define USB_EP_CTRLUSB_EP_DEF(0,  "ep0", 0, CONTROL, EP0_FIFO_SIZE, \
+   USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)
 
 #define PXA_EP_DEF(_idx, _addr, dir, _type, maxpkt, _config, iface, altset) \
 { \
-- 
1.9.1

--
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 37/46] usb: gadget: epautoconf: add endpoint capabilities flags verification

2015-07-31 Thread Robert Baldyga
Introduce endpoint matching mechanism basing on endpoint capabilities
flags. We check if endpoint supports transfer type and direction requested
in ep descriptor. Since we have this new endpoint matching mechanism
there is no need to have old code guessing endpoint capabilities basing
on its name, so we are getting rid of it. Remove also the obsolete comment.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 96 +
 1 file changed, 30 insertions(+), 66 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 8e00ca7..af4b10a 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -22,22 +22,6 @@
 
 #include "gadget_chips.h"
 
-/*
- * This should work with endpoints from controller drivers sharing the
- * same endpoint naming convention.  By example:
- *
- * - ep1, ep2, ... address is fixed, not direction or type
- * - ep1in, ep2out, ... address and direction are fixed, not type
- * - ep1-bulk, ep2-bulk, ... address and type are fixed, not direction
- * - ep1in-bulk, ep2out-iso, ... all three are fixed
- * - ep-* ... no functionality restrictions
- *
- * Type suffixes are "-bulk", "-iso", or "-int".  Numbers are decimal.
- * Less common restrictions are implied by gadget_is_*().
- *
- * NOTE:  each endpoint is unidirectional, as specified by its USB
- * descriptor; and isn't specific to a configuration or altsetting.
- */
 static int
 ep_matches (
struct usb_gadget   *gadget,
@@ -47,7 +31,6 @@ ep_matches (
 )
 {
u8  type;
-   const char  *tmp;
u16 max;
 
int num_req_streams = 0;
@@ -56,58 +39,39 @@ ep_matches (
if (ep->claimed)
return 0;
 
-   /* only support ep0 for portable CONTROL traffic */
type = usb_endpoint_type(desc);
-   if (USB_ENDPOINT_XFER_CONTROL == type)
-   return 0;
-
-   /* some other naming convention */
-   if ('e' != ep->name[0])
+   switch (type) {
+   case USB_ENDPOINT_XFER_CONTROL:
+   /* only support ep0 for portable CONTROL traffic */
return 0;
+   case USB_ENDPOINT_XFER_ISOC:
+   if (!ep->caps.type_iso)
+   return 0;
+   break;
+   case USB_ENDPOINT_XFER_BULK:
+   if (!ep->caps.type_bulk)
+   return 0;
+   break;
+   case USB_ENDPOINT_XFER_INT:
+   /* bulk endpoints handle interrupt transfers,
+* except the toggle-quirky iso-synch kind
+*/
+   if (!ep->caps.type_int && !ep->caps.type_bulk)
+   return 0;
+   /* for now, avoid PXA "interrupt-in";
+* it's documented as never using DATA1.
+*/
+   if (gadget_is_pxa(gadget) && ep->caps.type_int)
+   return 0;
+   break;
+   }
 
-   /* type-restriction:  "-iso", "-bulk", or "-int".
-* direction-restriction:  "in", "out".
-*/
-   if ('-' != ep->name[2]) {
-   tmp = strrchr (ep->name, '-');
-   if (tmp) {
-   switch (type) {
-   case USB_ENDPOINT_XFER_INT:
-   /* bulk endpoints handle interrupt transfers,
-* except the toggle-quirky iso-synch kind
-*/
-   if ('s' == tmp[2])  // == "-iso"
-   return 0;
-   /* for now, avoid PXA "interrupt-in";
-* it's documented as never using DATA1.
-*/
-   if (gadget_is_pxa (gadget)
-   && 'i' == tmp [1])
-   return 0;
-   break;
-   case USB_ENDPOINT_XFER_BULK:
-   if ('b' != tmp[1])  // != "-bulk"
-   return 0;
-   break;
-   case USB_ENDPOINT_XFER_ISOC:
-   if ('s' != tmp[2])  // != "-iso"
-   return 0;
-   }
-   } else {
-   tmp = ep->name + strlen (ep->name);
-   }
-
-   /* direction-restriction:  "..in-..", "out-.." */
-   tmp--;
-   if (!isdigit (*tmp)) {
-   if (desc->bEndpointAddress & USB_DIR_IN) {
-   if ('n' != *tmp)
-   return 0;
-   } else {
-   if ('t' != *tmp)
-   retur

[PATCH v5 29/46] usb: gadget: r8a66597-udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/r8a66597-udc.c | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/drivers/usb/gadget/udc/r8a66597-udc.c 
b/drivers/usb/gadget/udc/r8a66597-udc.c
index 0293f71..baa0609 100644
--- a/drivers/usb/gadget/udc/r8a66597-udc.c
+++ b/drivers/usb/gadget/udc/r8a66597-udc.c
@@ -1935,6 +1935,16 @@ static int r8a66597_probe(struct platform_device *pdev)
ep->ep.name = r8a66597_ep_name[i];
ep->ep.ops = &r8a66597_ep_ops;
usb_ep_set_maxpacket_limit(&ep->ep, 512);
+
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
}
usb_ep_set_maxpacket_limit(&r8a66597->ep[0].ep, 64);
r8a66597->ep[0].pipenum = 0;
-- 
1.9.1

--
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 36/46] usb: gadget: atmel_usba_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/atmel_usba_udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c 
b/drivers/usb/gadget/udc/atmel_usba_udc.c
index 37d414e..267d84f 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -2067,6 +2067,17 @@ static struct usba_ep * usba_udc_pdata(struct 
platform_device *pdev,
ep->can_dma = pdata->ep[i].can_dma;
ep->can_isoc = pdata->ep[i].can_isoc;
 
+   if (i == 0) {
+   ep->ep.caps.type_control = true;
+   } else {
+   ep->ep.caps.type_iso = ep->can_isoc;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
+   }
+
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
+
if (i)
list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
}
-- 
1.9.1

--
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 34/46] usb: musb: gadget: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/musb/musb_gadget.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 9e18178..4150baf 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1729,6 +1729,7 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, 
u8 epnum, int is_in)
INIT_LIST_HEAD(&ep->end_point.ep_list);
if (!epnum) {
usb_ep_set_maxpacket_limit(&ep->end_point, 64);
+   ep->end_point.caps.type_control = true;
ep->end_point.ops = &musb_g_ep0_ops;
musb->g.ep0 = &ep->end_point;
} else {
@@ -1736,9 +1737,20 @@ init_peripheral_ep(struct musb *musb, struct musb_ep 
*ep, u8 epnum, int is_in)
usb_ep_set_maxpacket_limit(&ep->end_point, 
hw_ep->max_packet_sz_tx);
else
usb_ep_set_maxpacket_limit(&ep->end_point, 
hw_ep->max_packet_sz_rx);
+   ep->end_point.caps.type_iso = true;
+   ep->end_point.caps.type_bulk = true;
+   ep->end_point.caps.type_int = true;
ep->end_point.ops = &musb_ep_ops;
list_add_tail(&ep->end_point.ep_list, &musb->g.ep_list);
}
+
+   if (!epnum || hw_ep->is_shared_fifo) {
+   ep->end_point.caps.dir_in = true;
+   ep->end_point.caps.dir_out = true;
+   } else if (is_in)
+   ep->end_point.caps.dir_in = true;
+   else
+   ep->end_point.caps.dir_out = true;
 }
 
 /*
-- 
1.9.1

--
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 33/46] usb: isp1760: udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/isp1760/isp1760-udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/isp1760/isp1760-udc.c 
b/drivers/usb/isp1760/isp1760-udc.c
index 3699962..1c3d0fd 100644
--- a/drivers/usb/isp1760/isp1760-udc.c
+++ b/drivers/usb/isp1760/isp1760-udc.c
@@ -1383,13 +1383,24 @@ static void isp1760_udc_init_eps(struct isp1760_udc 
*udc)
 */
if (ep_num == 0) {
usb_ep_set_maxpacket_limit(&ep->ep, 64);
+   ep->ep.caps.type_control = true;
+   ep->ep.caps.dir_in = true;
+   ep->ep.caps.dir_out = true;
ep->maxpacket = 64;
udc->gadget.ep0 = &ep->ep;
} else {
usb_ep_set_maxpacket_limit(&ep->ep, 512);
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
ep->maxpacket = 0;
list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
}
+
+   if (is_in)
+   ep->ep.caps.dir_in = true;
+   else
+   ep->ep.caps.dir_out = true;
}
 }
 
-- 
1.9.1

--
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 32/46] usb: gadget: udc-xilinx: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/udc-xilinx.c | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/usb/gadget/udc/udc-xilinx.c 
b/drivers/usb/gadget/udc/udc-xilinx.c
index 1f24274..1cbb0ac 100644
--- a/drivers/usb/gadget/udc/udc-xilinx.c
+++ b/drivers/usb/gadget/udc/udc-xilinx.c
@@ -1317,12 +1317,21 @@ static void xudc_eps_init(struct xusb_udc *udc)
snprintf(ep->name, EPNAME_SIZE, "ep%d", ep_number);
ep->ep_usb.name = ep->name;
ep->ep_usb.ops = &xusb_ep_ops;
+
+   ep->ep_usb.caps.type_iso = true;
+   ep->ep_usb.caps.type_bulk = true;
+   ep->ep_usb.caps.type_int = true;
} else {
ep->ep_usb.name = ep0name;
usb_ep_set_maxpacket_limit(&ep->ep_usb, EP0_MAX_PACKET);
ep->ep_usb.ops = &xusb_ep0_ops;
+
+   ep->ep_usb.caps.type_control = true;
}
 
+   ep->ep_usb.caps.dir_in = true;
+   ep->ep_usb.caps.dir_out = true;
+
ep->udc = udc;
ep->epnumber = ep_number;
ep->desc = NULL;
-- 
1.9.1

--
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 30/46] usb: gadget: s3c-hsudc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/s3c-hsudc.c | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/drivers/usb/gadget/udc/s3c-hsudc.c 
b/drivers/usb/gadget/udc/s3c-hsudc.c
index 85a712a..e9def42 100644
--- a/drivers/usb/gadget/udc/s3c-hsudc.c
+++ b/drivers/usb/gadget/udc/s3c-hsudc.c
@@ -1005,6 +1005,21 @@ static void s3c_hsudc_initep(struct s3c_hsudc *hsudc,
hsep->stopped = 0;
hsep->wedge = 0;
 
+   if (epnum == 0) {
+   hsep->ep.caps.type_control = true;
+   hsep->ep.caps.dir_in = true;
+   hsep->ep.caps.dir_out = true;
+   } else {
+   hsep->ep.caps.type_iso = true;
+   hsep->ep.caps.type_bulk = true;
+   hsep->ep.caps.type_int = true;
+   }
+
+   if (epnum & 1)
+   hsep->ep.caps.dir_in = true;
+   else
+   hsep->ep.caps.dir_out = true;
+
set_index(hsudc, epnum);
writel(hsep->ep.maxpacket, hsudc->regs + S3C_MPR);
 }
-- 
1.9.1

--
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 45/46] usb: gadget: goku_udc: add goku_match_ep() function

2015-07-31 Thread Robert Baldyga
Add 'match_ep' callback to utilize chip-specific knowledge in endpoint matching
process. Function does the same that was done by chip-specific code inside
of epautoconf. Now this code can be removed from there to separate generic code
from platform specific logic.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c   | 20 ++--
 drivers/usb/gadget/udc/goku_udc.c | 25 +
 2 files changed, 27 insertions(+), 18 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index d41fd82..da45371 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -86,24 +86,8 @@ struct usb_ep *usb_ep_autoconfig_ss(
/* First, apply chip-specific "best usage" knowledge.
 * This might make a good usb_gadget_ops hook ...
 */
-   if (gadget_is_goku (gadget)) {
-   if (USB_ENDPOINT_XFER_INT == type) {
-   /* single buffering is enough */
-   ep = gadget_find_ep_by_name(gadget, "ep3-bulk");
-   if (ep && usb_gadget_ep_match_desc(gadget,
-   ep, desc, ep_comp))
-   goto found_ep;
-   } else if (USB_ENDPOINT_XFER_BULK == type
-   && (USB_DIR_IN & desc->bEndpointAddress)) {
-   /* DMA may be available */
-   ep = gadget_find_ep_by_name(gadget, "ep2-bulk");
-   if (ep && usb_gadget_ep_match_desc(gadget,
-   ep, desc, ep_comp))
-   goto found_ep;
-   }
-
 #ifdef CONFIG_BLACKFIN
-   } else if (gadget_is_musbhdrc(gadget)) {
+   if (gadget_is_musbhdrc(gadget)) {
if ((USB_ENDPOINT_XFER_BULK == type) ||
(USB_ENDPOINT_XFER_ISOC == type)) {
if (USB_DIR_IN & desc->bEndpointAddress)
@@ -119,8 +103,8 @@ struct usb_ep *usb_ep_autoconfig_ss(
ep = NULL;
if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
goto found_ep;
-#endif
}
+#endif
 
/* Second, look at endpoints until an unclaimed one looks usable */
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
diff --git a/drivers/usb/gadget/udc/goku_udc.c 
b/drivers/usb/gadget/udc/goku_udc.c
index 46b8d14..d5a93ea 100644
--- a/drivers/usb/gadget/udc/goku_udc.c
+++ b/drivers/usb/gadget/udc/goku_udc.c
@@ -990,6 +990,30 @@ static int goku_get_frame(struct usb_gadget *_gadget)
return -EOPNOTSUPP;
 }
 
+static struct usb_ep *goku_match_ep(struct usb_gadget *g,
+   struct usb_endpoint_descriptor *desc,
+   struct usb_ss_ep_comp_descriptor *ep_comp)
+{
+   struct goku_udc *dev = to_goku_udc(g);
+   struct usb_ep *ep;
+   u8 type = usb_endpoint_type(desc);
+
+   if (type == USB_ENDPOINT_XFER_INT) {
+   /* single buffering is enough */
+   ep = &dev->ep[3].ep;
+   if (ep && usb_gadget_ep_match_desc(g, ep, desc, ep_comp))
+   return ep;
+   } else if (type == USB_ENDPOINT_XFER_BULK
+   && usb_endpoint_dir_in(desc)) {
+   /* DMA may be available */
+   ep = &dev->ep[2].ep;
+   if (ep && usb_gadget_ep_match_desc(g, ep, desc, ep_comp))
+   return ep;
+   }
+
+   return NULL;
+}
+
 static int goku_udc_start(struct usb_gadget *g,
struct usb_gadget_driver *driver);
 static int goku_udc_stop(struct usb_gadget *g);
@@ -998,6 +1022,7 @@ static const struct usb_gadget_ops goku_ops = {
.get_frame  = goku_get_frame,
.udc_start  = goku_udc_start,
.udc_stop   = goku_udc_stop,
+   .match_ep   = goku_match_ep,
// no remote wakeup
// not selfpowered
 };
-- 
1.9.1

--
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 44/46] usb: gadget: net2280: add net2280_match_ep() function

2015-07-31 Thread Robert Baldyga
Add 'match_ep' callback to utilize chip-specific knowledge in endpoint matching
process. Function does the same that was done by chip-specific code inside
of epautoconf. Now this code can be removed from there to separate generic code
from platform specific logic.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c  | 23 +--
 drivers/usb/gadget/udc/net2280.c | 31 +++
 2 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index cc0b084..d41fd82 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -86,28 +86,7 @@ struct usb_ep *usb_ep_autoconfig_ss(
/* First, apply chip-specific "best usage" knowledge.
 * This might make a good usb_gadget_ops hook ...
 */
-   if (gadget_is_net2280(gadget)) {
-   char name[8];
-
-   if (type == USB_ENDPOINT_XFER_INT) {
-   /* ep-e, ep-f are PIO with only 64 byte fifos */
-   ep = gadget_find_ep_by_name(gadget, "ep-e");
-   if (ep && usb_gadget_ep_match_desc(gadget,
-   ep, desc, ep_comp))
-   goto found_ep;
-   ep = gadget_find_ep_by_name(gadget, "ep-f");
-   if (ep && usb_gadget_ep_match_desc(gadget,
-   ep, desc, ep_comp))
-   goto found_ep;
-   }
-
-   /* USB3380: use same address for usb and hardware endpoints */
-   snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc),
-   usb_endpoint_dir_in(desc) ? "in" : "out");
-   ep = gadget_find_ep_by_name(gadget, name);
-   if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
-   goto found_ep;
-   } else if (gadget_is_goku (gadget)) {
+   if (gadget_is_goku (gadget)) {
if (USB_ENDPOINT_XFER_INT == type) {
/* single buffering is enough */
ep = gadget_find_ep_by_name(gadget, "ep3-bulk");
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c
index 872ca25..9d7eac1 100644
--- a/drivers/usb/gadget/udc/net2280.c
+++ b/drivers/usb/gadget/udc/net2280.c
@@ -1550,6 +1550,36 @@ static int net2280_pullup(struct usb_gadget *_gadget, 
int is_on)
return 0;
 }
 
+static struct usb_ep *net2280_match_ep(struct usb_gadget *_gadget,
+   struct usb_endpoint_descriptor *desc,
+   struct usb_ss_ep_comp_descriptor *ep_comp)
+{
+   char name[8];
+   struct usb_ep *ep;
+   u8 type;
+
+   type = usb_endpoint_type(desc);
+
+   if (type == USB_ENDPOINT_XFER_INT) {
+   /* ep-e, ep-f are PIO with only 64 byte fifos */
+   ep = gadget_find_ep_by_name(_gadget, "ep-e");
+   if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp))
+   return ep;
+   ep = gadget_find_ep_by_name(_gadget, "ep-f");
+   if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp))
+   return ep;
+   }
+
+   /* USB3380: use same address for usb and hardware endpoints */
+   snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc),
+   usb_endpoint_dir_in(desc) ? "in" : "out");
+   ep = gadget_find_ep_by_name(_gadget, name);
+   if (ep && usb_gadget_ep_match_desc(_gadget, ep, desc, ep_comp))
+   return ep;
+
+   return NULL;
+}
+
 static int net2280_start(struct usb_gadget *_gadget,
struct usb_gadget_driver *driver);
 static int net2280_stop(struct usb_gadget *_gadget);
@@ -1561,6 +1591,7 @@ static const struct usb_gadget_ops net2280_ops = {
.pullup = net2280_pullup,
.udc_start  = net2280_start,
.udc_stop   = net2280_stop,
+   .match_ep   = net2280_match_ep,
 };
 
 /*-*/
-- 
1.9.1

--
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 43/46] usb: gadget: move find_ep() from epautoconf to gadget.h

2015-07-31 Thread Robert Baldyga
Move find_ep() function to gadget.h, rename it to gadget_find_ep_by_name()
and make it static inline. It can be used in UDC drivers, especially in
'match_ep' callback after moving chip-specific endpoint matching logic from
epautoconf to UDC drivers.

Replace all calls of find_ep() function with gadget_find_ep_by_name().

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 30 +-
 include/linux/usb/gadget.h  | 18 ++
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 3f0a380..cc0b084 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -22,18 +22,6 @@
 
 #include "gadget_chips.h"
 
-static struct usb_ep *
-find_ep (struct usb_gadget *gadget, const char *name)
-{
-   struct usb_ep   *ep;
-
-   list_for_each_entry (ep, &gadget->ep_list, ep_list) {
-   if (0 == strcmp (ep->name, name))
-   return ep;
-   }
-   return NULL;
-}
-
 /**
  * usb_ep_autoconfig_ss() - choose an endpoint matching the ep
  * descriptor and ep companion descriptor
@@ -103,11 +91,11 @@ struct usb_ep *usb_ep_autoconfig_ss(
 
if (type == USB_ENDPOINT_XFER_INT) {
/* ep-e, ep-f are PIO with only 64 byte fifos */
-   ep = find_ep(gadget, "ep-e");
+   ep = gadget_find_ep_by_name(gadget, "ep-e");
if (ep && usb_gadget_ep_match_desc(gadget,
ep, desc, ep_comp))
goto found_ep;
-   ep = find_ep(gadget, "ep-f");
+   ep = gadget_find_ep_by_name(gadget, "ep-f");
if (ep && usb_gadget_ep_match_desc(gadget,
ep, desc, ep_comp))
goto found_ep;
@@ -116,20 +104,20 @@ struct usb_ep *usb_ep_autoconfig_ss(
/* USB3380: use same address for usb and hardware endpoints */
snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc),
usb_endpoint_dir_in(desc) ? "in" : "out");
-   ep = find_ep(gadget, name);
+   ep = gadget_find_ep_by_name(gadget, name);
if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
goto found_ep;
} else if (gadget_is_goku (gadget)) {
if (USB_ENDPOINT_XFER_INT == type) {
/* single buffering is enough */
-   ep = find_ep(gadget, "ep3-bulk");
+   ep = gadget_find_ep_by_name(gadget, "ep3-bulk");
if (ep && usb_gadget_ep_match_desc(gadget,
ep, desc, ep_comp))
goto found_ep;
} else if (USB_ENDPOINT_XFER_BULK == type
&& (USB_DIR_IN & desc->bEndpointAddress)) {
/* DMA may be available */
-   ep = find_ep(gadget, "ep2-bulk");
+   ep = gadget_find_ep_by_name(gadget, "ep2-bulk");
if (ep && usb_gadget_ep_match_desc(gadget,
ep, desc, ep_comp))
goto found_ep;
@@ -140,14 +128,14 @@ struct usb_ep *usb_ep_autoconfig_ss(
if ((USB_ENDPOINT_XFER_BULK == type) ||
(USB_ENDPOINT_XFER_ISOC == type)) {
if (USB_DIR_IN & desc->bEndpointAddress)
-   ep = find_ep (gadget, "ep5in");
+   ep = gadget_find_ep_by_name(gadget, "ep5in");
else
-   ep = find_ep (gadget, "ep6out");
+   ep = gadget_find_ep_by_name(gadget, "ep6out");
} else if (USB_ENDPOINT_XFER_INT == type) {
if (USB_DIR_IN & desc->bEndpointAddress)
-   ep = find_ep(gadget, "ep1in");
+   ep = gadget_find_ep_by_name(gadget, "ep1in");
else
-   ep = find_ep(gadget, "ep2out");
+   ep = gadget_find_ep_by_name(gadget, "ep2out");
} else
ep = NULL;
if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index e04fd63..6a413ab 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -639,6 +639,24 @@ static inline struct usb_gadget *dev_to_usb_gadget(struct 
device *dev)
 #define gadget_for_each_ep(tmp, gadget) \
list_for_each_entry(tmp, &(gadget)->ep_list, ep_list)
 
+/**
+ * gadget_find_ep_by_name - returns ep whose name is the same as sting passed

[PATCH v5 46/46] usb: musb: gadget: add musb_match_ep() function

2015-07-31 Thread Robert Baldyga
Add 'match_ep' callback to utilize chip-specific knowledge in endpoint matching
process. Function does the same that was done by chip-specific code inside
of epautoconf. Now this code can be removed from there to separate generic code
from platform specific logic.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 23 ---
 drivers/usb/musb/musb_gadget.c  | 34 ++
 2 files changed, 34 insertions(+), 23 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index da45371..254ece7 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -83,29 +83,6 @@ struct usb_ep *usb_ep_autoconfig_ss(
goto found_ep;
}
 
-   /* First, apply chip-specific "best usage" knowledge.
-* This might make a good usb_gadget_ops hook ...
-*/
-#ifdef CONFIG_BLACKFIN
-   if (gadget_is_musbhdrc(gadget)) {
-   if ((USB_ENDPOINT_XFER_BULK == type) ||
-   (USB_ENDPOINT_XFER_ISOC == type)) {
-   if (USB_DIR_IN & desc->bEndpointAddress)
-   ep = gadget_find_ep_by_name(gadget, "ep5in");
-   else
-   ep = gadget_find_ep_by_name(gadget, "ep6out");
-   } else if (USB_ENDPOINT_XFER_INT == type) {
-   if (USB_DIR_IN & desc->bEndpointAddress)
-   ep = gadget_find_ep_by_name(gadget, "ep1in");
-   else
-   ep = gadget_find_ep_by_name(gadget, "ep2out");
-   } else
-   ep = NULL;
-   if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
-   goto found_ep;
-   }
-#endif
-
/* Second, look at endpoints until an unclaimed one looks usable */
list_for_each_entry (ep, &gadget->ep_list, ep_list) {
if (usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 4150baf..02c3f8a 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1684,6 +1684,39 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, 
int is_on)
return 0;
 }
 
+#ifdef CONFIG_BLACKFIN
+static struct usb_ep *musb_match_ep(struct usb_gadget *g,
+   struct usb_endpoint_descriptor *desc,
+   struct usb_ss_ep_comp_descriptor *ep_comp)
+{
+   struct usb_ep *ep = NULL;
+   u8 type = usb_endpoint_type(desc);
+
+   switch(type) {
+   case USB_ENDPOINT_XFER_ISOC:
+   case USB_ENDPOINT_XFER_BULK:
+   if (usb_endpoint_dir_in(desc))
+   ep = gadget_find_ep_by_name(g, "ep5in");
+   else
+   ep = gadget_find_ep_by_name(g, "ep6out");
+   break;
+   case USB_ENDPOINT_XFER_INT:
+   if (usb_endpoint_dir_in(desc))
+   ep = gadget_find_ep_by_name(g, "ep1in");
+   else
+   ep = gadget_find_ep_by_name(g, "ep2out");
+   default:
+   }
+
+   if (ep && usb_gadget_ep_match_desc(g, ep, desc, ep_comp))
+   return ep;
+
+   return NULL;
+}
+#else
+#define musb_match_ep NULL
+#endif
+
 static int musb_gadget_start(struct usb_gadget *g,
struct usb_gadget_driver *driver);
 static int musb_gadget_stop(struct usb_gadget *g);
@@ -1697,6 +1730,7 @@ static const struct usb_gadget_ops musb_gadget_operations 
= {
.pullup = musb_gadget_pullup,
.udc_start  = musb_gadget_start,
.udc_stop   = musb_gadget_stop,
+   .match_ep   = musb_match_ep,
 };
 
 /* --- */
-- 
1.9.1

--
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 41/46] usb: gadget: add 'ep_match' callback to usb_gadget_ops

2015-07-31 Thread Robert Baldyga
Add callback that is called by epautoconf to allow UDC driver match the
best endpoint for specific descriptor. It's intended to supply mechanism
which allows to get rid of chip-specific endpoint matching code from
epautoconf.

If gadget has set 'ep_match' callback we prefer to call it first, and
if it fails to find matching endpoint, then we try to use default matching
algorithm.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 6 ++
 include/linux/usb/gadget.h  | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 4fa6f5d..1b1fee0 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -165,6 +165,12 @@ struct usb_ep *usb_ep_autoconfig_ss(
 
type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
 
+   if (gadget->ops->match_ep) {
+   ep = gadget->ops->match_ep(gadget, desc, ep_comp);
+   if (ep)
+   goto found_ep;
+   }
+
/* First, apply chip-specific "best usage" knowledge.
 * This might make a good usb_gadget_ops hook ...
 */
diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 82b5bcb..303214b 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -534,6 +534,9 @@ struct usb_gadget_ops {
int (*udc_start)(struct usb_gadget *,
struct usb_gadget_driver *);
int (*udc_stop)(struct usb_gadget *);
+   struct usb_ep *(*match_ep)(struct usb_gadget *,
+   struct usb_endpoint_descriptor *,
+   struct usb_ss_ep_comp_descriptor *);
 };
 
 /**
-- 
1.9.1

--
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 40/46] usb: gadget: epautoconf: rework ep_matches() function

2015-07-31 Thread Robert Baldyga
Rework ep_matches() function to make it shorter and more readable.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c | 87 +
 1 file changed, 35 insertions(+), 52 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 7bb28f1..4fa6f5d 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -30,16 +30,29 @@ ep_matches (
struct usb_ss_ep_comp_descriptor *ep_comp
 )
 {
-   u8  type;
-   u16 max;
-
-   int num_req_streams = 0;
+   u8  type;
+   u16 max;
+   int num_req_streams = 0;
 
/* endpoint already claimed? */
if (ep->claimed)
return 0;
 
type = usb_endpoint_type(desc);
+   max = 0x7ff & usb_endpoint_maxp(desc);
+
+   if (usb_endpoint_dir_in(desc) && !ep->caps.dir_in)
+   return 0;
+   else if (!ep->caps.dir_out)
+   return 0;
+
+   if (max > ep->maxpacket_limit)
+   return 0;
+
+   /* "high bandwidth" works only at high speed */
+   if (!gadget_is_dualspeed(gadget) && usb_endpoint_maxp(desc) & (3<<11))
+   return 0;
+
switch (type) {
case USB_ENDPOINT_XFER_CONTROL:
/* only support ep0 for portable CONTROL traffic */
@@ -47,66 +60,36 @@ ep_matches (
case USB_ENDPOINT_XFER_ISOC:
if (!ep->caps.type_iso)
return 0;
+   /* ISO:  limit 1023 bytes full speed,
+* 1024 high/super speed
+*/
+   if (!gadget_is_dualspeed(gadget) && max > 1023)
+   return 0;
break;
case USB_ENDPOINT_XFER_BULK:
if (!ep->caps.type_bulk)
return 0;
+   if (ep_comp && gadget_is_superspeed(gadget)) {
+   /* Get the number of required streams from the
+* EP companion descriptor and see if the EP
+* matches it
+*/
+   num_req_streams = ep_comp->bmAttributes & 0x1f;
+   if (num_req_streams > ep->max_streams)
+   return 0;
+   }
break;
case USB_ENDPOINT_XFER_INT:
-   /* bulk endpoints handle interrupt transfers,
+   /* Bulk endpoints handle interrupt transfers,
 * except the toggle-quirky iso-synch kind
 */
if (!ep->caps.type_int && !ep->caps.type_bulk)
return 0;
-   break;
-   }
-
-   if (usb_endpoint_dir_in(desc)) {
-   if (!ep->caps.dir_in)
-   return 0;
-   } else {
-   if (!ep->caps.dir_out)
-   return 0;
-   }
-
-   /*
-* Get the number of required streams from the EP companion
-* descriptor and see if the EP matches it
-*/
-   if (usb_endpoint_xfer_bulk(desc)) {
-   if (ep_comp && gadget->max_speed >= USB_SPEED_SUPER) {
-   num_req_streams = ep_comp->bmAttributes & 0x1f;
-   if (num_req_streams > ep->max_streams)
-   return 0;
-   }
-
-   }
-
-   /* endpoint maxpacket size is an input parameter, except for bulk
-* where it's an output parameter representing the full speed limit.
-* the usb spec fixes high speed bulk maxpacket at 512 bytes.
-*/
-   max = 0x7ff & usb_endpoint_maxp(desc);
-   switch (type) {
-   case USB_ENDPOINT_XFER_INT:
-   /* INT:  limit 64 bytes full speed, 1024 high/super speed */
+   /* INT:  limit 64 bytes full speed,
+* 1024 high/super speed
+*/
if (!gadget_is_dualspeed(gadget) && max > 64)
return 0;
-   /* FALLTHROUGH */
-
-   case USB_ENDPOINT_XFER_ISOC:
-   /* ISO:  limit 1023 bytes full speed, 1024 high/super speed */
-   if (ep->maxpacket_limit < max)
-   return 0;
-   if (!gadget_is_dualspeed(gadget) && max > 1023)
-   return 0;
-
-   /* BOTH:  "high bandwidth" works only at high speed */
-   if ((desc->wMaxPacketSize & cpu_to_le16(3<<11))) {
-   if (!gadget_is_dualspeed(gadget))
-   return 0;
-   /* configure your hardware with enough buffering!! */
-   }
break;
}
 
-- 
1.9.1

--
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 18/46] usb: gadget: gr_udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/udc/gr_udc.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/usb/gadget/udc/gr_udc.c b/drivers/usb/gadget/udc/gr_udc.c
index c886887..8aa2593 100644
--- a/drivers/usb/gadget/udc/gr_udc.c
+++ b/drivers/usb/gadget/udc/gr_udc.c
@@ -2018,12 +2018,23 @@ static int gr_ep_init(struct gr_udc *dev, int num, int 
is_in, u32 maxplimit)
 
usb_ep_set_maxpacket_limit(&ep->ep, MAX_CTRL_PL_SIZE);
ep->bytes_per_buffer = MAX_CTRL_PL_SIZE;
+
+   ep->ep.caps.type_control = true;
} else {
usb_ep_set_maxpacket_limit(&ep->ep, (u16)maxplimit);
list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);
+
+   ep->ep.caps.type_iso = true;
+   ep->ep.caps.type_bulk = true;
+   ep->ep.caps.type_int = true;
}
list_add_tail(&ep->ep_list, &dev->ep_list);
 
+   if (is_in)
+   ep->ep.caps.dir_in = true;
+   else
+   ep->ep.caps.dir_out = true;
+
ep->tailbuf = dma_alloc_coherent(dev->dev, ep->ep.maxpacket_limit,
 &ep->tailbuf_paddr, GFP_ATOMIC);
if (!ep->tailbuf)
-- 
1.9.1

--
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 42/46] usb: gadget: move ep_matches() from epautoconf to udc-core

2015-07-31 Thread Robert Baldyga
Move ep_matches() function to udc-core and rename it to
usb_gadget_ep_match_desc(). This function can be used by UDC drivers
in 'match_ep' callback to avoid writing lots of repetitive code.

Replace all calls of ep_matches() with usb_gadget_ep_match_desc().

Signed-off-by: Robert Baldyga 
---
 drivers/usb/gadget/epautoconf.c   | 95 +--
 drivers/usb/gadget/udc/udc-core.c | 69 
 include/linux/usb/gadget.h|  8 
 3 files changed, 88 insertions(+), 84 deletions(-)

diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 1b1fee0..3f0a380 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -22,82 +22,6 @@
 
 #include "gadget_chips.h"
 
-static int
-ep_matches (
-   struct usb_gadget   *gadget,
-   struct usb_ep   *ep,
-   struct usb_endpoint_descriptor  *desc,
-   struct usb_ss_ep_comp_descriptor *ep_comp
-)
-{
-   u8  type;
-   u16 max;
-   int num_req_streams = 0;
-
-   /* endpoint already claimed? */
-   if (ep->claimed)
-   return 0;
-
-   type = usb_endpoint_type(desc);
-   max = 0x7ff & usb_endpoint_maxp(desc);
-
-   if (usb_endpoint_dir_in(desc) && !ep->caps.dir_in)
-   return 0;
-   else if (!ep->caps.dir_out)
-   return 0;
-
-   if (max > ep->maxpacket_limit)
-   return 0;
-
-   /* "high bandwidth" works only at high speed */
-   if (!gadget_is_dualspeed(gadget) && usb_endpoint_maxp(desc) & (3<<11))
-   return 0;
-
-   switch (type) {
-   case USB_ENDPOINT_XFER_CONTROL:
-   /* only support ep0 for portable CONTROL traffic */
-   return 0;
-   case USB_ENDPOINT_XFER_ISOC:
-   if (!ep->caps.type_iso)
-   return 0;
-   /* ISO:  limit 1023 bytes full speed,
-* 1024 high/super speed
-*/
-   if (!gadget_is_dualspeed(gadget) && max > 1023)
-   return 0;
-   break;
-   case USB_ENDPOINT_XFER_BULK:
-   if (!ep->caps.type_bulk)
-   return 0;
-   if (ep_comp && gadget_is_superspeed(gadget)) {
-   /* Get the number of required streams from the
-* EP companion descriptor and see if the EP
-* matches it
-*/
-   num_req_streams = ep_comp->bmAttributes & 0x1f;
-   if (num_req_streams > ep->max_streams)
-   return 0;
-   }
-   break;
-   case USB_ENDPOINT_XFER_INT:
-   /* Bulk endpoints handle interrupt transfers,
-* except the toggle-quirky iso-synch kind
-*/
-   if (!ep->caps.type_int && !ep->caps.type_bulk)
-   return 0;
-   /* INT:  limit 64 bytes full speed,
-* 1024 high/super speed
-*/
-   if (!gadget_is_dualspeed(gadget) && max > 64)
-   return 0;
-   break;
-   }
-
-   /* MATCH!! */
-
-   return 1;
-}
-
 static struct usb_ep *
 find_ep (struct usb_gadget *gadget, const char *name)
 {
@@ -180,10 +104,12 @@ struct usb_ep *usb_ep_autoconfig_ss(
if (type == USB_ENDPOINT_XFER_INT) {
/* ep-e, ep-f are PIO with only 64 byte fifos */
ep = find_ep(gadget, "ep-e");
-   if (ep && ep_matches(gadget, ep, desc, ep_comp))
+   if (ep && usb_gadget_ep_match_desc(gadget,
+   ep, desc, ep_comp))
goto found_ep;
ep = find_ep(gadget, "ep-f");
-   if (ep && ep_matches(gadget, ep, desc, ep_comp))
+   if (ep && usb_gadget_ep_match_desc(gadget,
+   ep, desc, ep_comp))
goto found_ep;
}
 
@@ -191,20 +117,21 @@ struct usb_ep *usb_ep_autoconfig_ss(
snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc),
usb_endpoint_dir_in(desc) ? "in" : "out");
ep = find_ep(gadget, name);
-   if (ep && ep_matches(gadget, ep, desc, ep_comp))
+   if (ep && usb_gadget_ep_match_desc(gadget, ep, desc, ep_comp))
goto found_ep;
} else if (gadget_is_goku (gadget)) {
if (USB_ENDPOINT_XFER_INT == type) {
/* single buffering is enough */
ep = find_ep(gadget, "ep3-bulk");
-   if (ep && ep_matches(gadget, ep, desc, ep_comp))
+   if (ep && usb_gadget_ep_

[PATCH v5 05/46] usb: chipidea: udc: add ep capabilities support

2015-07-31 Thread Robert Baldyga
Convert endpoint configuration to new capabilities model.

Signed-off-by: Robert Baldyga 
---
 drivers/usb/chipidea/udc.c | 14 ++
 1 file changed, 14 insertions(+)

diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index b7cca3e..4aaa476 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1624,6 +1624,20 @@ static int init_eps(struct ci_hdrc *ci)
 
hwep->ep.name  = hwep->name;
hwep->ep.ops   = &usb_ep_ops;
+
+   if (i == 0) {
+   hwep->ep.caps.type_control = true;
+   } else {
+   hwep->ep.caps.type_iso = true;
+   hwep->ep.caps.type_bulk = true;
+   hwep->ep.caps.type_int = true;
+   }
+
+   if (j == TX)
+   hwep->ep.caps.dir_in = true;
+   else
+   hwep->ep.caps.dir_out = true;
+
/*
 * for ep0: maxP defined in desc, for other
 * eps, maxP is set by epautoconfig() called
-- 
1.9.1

--
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] usb: gadget: mass_storage: Use static array for luns

2015-07-31 Thread Felipe Balbi
Hi,

On Fri, Jul 31, 2015 at 02:08:04PM +0200, Krzysztof Opasiak wrote:
> Hi,
> 
> On 07/30/2015 06:43 PM, Felipe Balbi wrote:
> >Hi,
> >
> >On Thu, Jul 23, 2015 at 07:57:49PM +0200, Krzysztof Opasiak wrote:
> >>This patch replace dynamicly allocated luns array with static one.
> >>This simplifies the code of mass storage function and modules.
> >>
> >>Signed-off-by: Krzysztof Opasiak 
> >>Acked-by: Michal Nazarewicz 
> >
> >this actually regresses g_mass_storage:
> >
> ># modprobe g_mass_storage removable=1
> >[   40.115294] Mass Storage Function, version: 2009/09/11
> >[   40.120680] LUN: removable file: (no medium)
> >[   40.125374] Unable to handle kernel NULL pointer dereference at virtual 
> >address 0054
> >[   40.133863] pgd = ed574000
> >[   40.136689] [0054] *pgd=
> >[   40.140429] Internal error: Oops: 5 [#1] SMP ARM
> >[   40.145238] Modules linked in: g_mass_storage(+) usb_f_mass_storage 
> >libcomposite xhci_plat_hcd xhci_hcd usbcore joydev dwc3 udc_core usb_common 
> >evdev cpufreq_dt omapfb snd_soc_evm thermal_sys cfbfillrect cfbimgblt 
> >cfbcopyarea matrix_keypad hwmon leds_gpio led_class matrix_keymap pwm_bl 
> >panel_dpi snd_soc_tlv320aic3x snd_soc_davinci_mcasp snd_soc_edma 
> >snd_soc_omap snd_soc_core omapdss snd_compress snd_pcm_dmaengine snd_pcm 
> >dwc3_omap snd_timer lis3lv02d_i2c extcon pwm_tiecap snd lis3lv02d 
> >input_polldev soundcore rtc_omap spi_ti_qspi omap_wdt tps65218_pwrbutton 
> >phy_omap_usb2 ipv6 autofs4
> >[   40.199522] CPU: 0 PID: 244 Comm: modprobe Not tainted 
> >4.2.0-rc4-00060-g691ddfcf5846 #755
> >[   40.208039] Hardware name: Generic AM43 (Flattened Device Tree)
> >[   40.214210] task: ed01e240 ti: ee7be000 task.ti: ee7be000
> >[   40.219843] PC is at kernfs_find_ns+0xc/0x138
> >[   40.224381] LR is at kernfs_find_and_get_ns+0x30/0x4c
> >[   40.229649] pc : []lr : []psr: 200f0013
> >[   40.229649] sp : ee7bfc68  ip : 0002  fp : bf0aa740
> >[   40.241609] r10: bf0aa788  r9 : ed3353c0  r8 : 
> >[   40.247055] r7 :   r6 : c06466a4  r5 :   r4 : c0917840
> >[   40.253851] r3 : c093c5d4  r2 :   r1 : c06466a4  r0 : 
> >[   40.260651] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment 
> >user
> >[   40.268085] Control: 10c5387d  Table: ad574059  DAC: 0015
> >[   40.274069] Process modprobe (pid: 244, stack limit = 0xee7be218)
> >[   40.280415] Stack: (0xee7bfc68 to 0xee7c)
> >[   40.284959] fc60:   c0917840  c06466a4  
> >ed214400 c01de664
> >[   40.293478] fc80:  c09474d0 ee56f438 ee56f430  c01e13d4 
> > c09474a0
> >[   40.301996] fca0: ee56f438 c03f6384 ee56f430 ee56f430 ed214598 c03ec6d0 
> >bf0aa788 c008e820
> >[   40.310519] fcc0: c015a7d4 ed01e240 ee56f430 ed2144d0 ed214598 ed21450c 
> >ed214400 c03ec8b8
> >[   40.319048] fce0: ee56f400 bf10f304 ee533e00 ee533e04 bf0aa980 bf0aa54c 
> >0001 bf10f374
> >[   40.327572] fd00: bf115840 bf07ec18 fff0 bf0aa0a0 c05fe878 0001 
> > 0100
> >[   40.336089] fd20: ed506098    bf2f8528 c0979e80 
> >600f0093 c0091548
> >[   40.344612] fd40: 0001 0080  bf2f8528  ed01e768 
> >ed01e240 0004
> >[   40.353137] fd60: 0006 12d341e8 bf0aa788 c008e820 c06008b8 ed01e240 
> >0001 bf0aa694
> >[   40.361654] fd80:  c008e984 a00f0013 ed506088 ed506088 c06008b8 
> > 
> >[   40.370172] fda0:   ed335301 0002  ed3353c0 
> >bf0aa6bc 
> >[   40.378690] fdc0: ed506170  12d341e8 bf07ea84 bf2e7d08 ee53b000 
> >bf0aa6bc ee53b000
> >[   40.387207] fde0: bf0aa6bc ed2cbd00 ee53b008  12d341e8 bf0aa788 
> >bf0aa740 bf2e7b90
> >[   40.395724] fe00:  bf2e8308 bf0aa6bc ed2cbd00 bf0b bf2e7d44 
> > c08c9ea0
> >[   40.404241] fe20: c08c9ea0 c00097a4 0001   c0150fe4 
> > eeef9000
> >[   40.412766] fe40: ef7c8460 4000 001e c008ec68 ee5e1e40 00d0 
> >00d0 c015ba10
> >[   40.421283] fe60: ee7bff58 c008ec68 c08c63a8 600f0013 a00f0013 bf0aa740 
> >bf0aa740 c0979fd4
> >[   40.429811] fe80: ee5e1e40 ed2cbe40 0001 bf0aa788 bf0aa740 c05f7d28 
> >c0979fd4 0001
> >[   40.438334] fea0: ee7bff58 c0979fd4 0001 c00c88c4 bf0aa74c 7fff 
> > c00c606c
> >[   40.446857] fec0: c1153024 0124 bf0aa74c bf0aa95c ee7bff60 f03a29a4 
> >bf0aa74c 
> >[   40.455381] fee0: 02e401dd  000f 000181a4 0001  
> > 
> >[   40.463900] ff00:       
> > 
> >[   40.472424] ff20:     7f643410  
> >0005 7f643410
> >[   40.480941] ff40: 017b c000f724 ee7be000  7f6431c8 c00c91c0 
> >f0385000 0001d9f4
> >[   40.489471] ff60: f03a2314 f039a942 f039b5e0 09a8 0e38  
> > 
> >[   40.497993] ff80: 002a 002b 0012 0

Re: [PATCH v4 2/5] dt-bindings: Add a binding for Mediatek xHCI host controller

2015-07-31 Thread Mark Rutland
Hi,

Sorry for my late reply to a prior version of this series, but I still
have concerns with some of the properties.

I'll repeat those below.

On Fri, Jul 31, 2015 at 02:03:53PM +0100, Chunfeng Yun wrote:
> add a DT binding documentation of xHCI host controller for the
> MT8173 SoC from Mediatek.
> 
> Signed-off-by: Chunfeng Yun 
> ---
>  .../devicetree/bindings/usb/mt8173-xhci.txt| 51 
> ++
>  1 file changed, 51 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/usb/mt8173-xhci.txt
> 
> diff --git a/Documentation/devicetree/bindings/usb/mt8173-xhci.txt 
> b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
> new file mode 100644
> index 000..364be5a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
> @@ -0,0 +1,51 @@
> +MT65XX xhci
> +
> +The device node for Mediatek SOC usb3.0 host controller
> +
> +Required properties:
> + - compatible : Supports "mediatek,mt8173-xhci"

s/Supports/should contain/

> + - reg : Specifies physical base address and size of the registers,
> + the first one for MAC, the second for IPPC
> + - interrupts : Interrupt mode, number and trigger mode

Just specify what this logically corresponds to; the format of the
interrupts proeprty depends on the interrupt controller.

> + - power-domains : To enable usb's mtcmos

Please describe what this contains. I assume you exped a single power
domain to be described, covering the whole xHCI controller?

> + - vusb33-supply : Regulator of usb avdd3.3v
> + - clocks : Must support all clocks that xhci needs

- clocks: a list of phandle + clock-specifier pairs, one for each entry
  in clock-names.

> + - clock-names : Should be "sys_mac" for sys and mac clocks, and
> + "wakeup_deb_p0", "wakeup_deb_p1" for wakeup debounce control
> + clocks

This would be better as a list, e.g.

- clock-names: should contain:
  * "sys_mac" 
  * "wakeup_deb_p0" 
  * "wakeup_deb_p1" 

Is sys_mac a single clock input line? Or is it jsut the case that a
single line feeds two inputs currently? if the latter they should be
separate entries.

> + - phys : List of PHY specifiers (used by generic PHY framework).

The bracketed part should go. The bidnigns should know nothing of Linux
internals.

> + - phy-names : Must be "usb-phy0", "usb-phy1",.., "usb-phyN", based on
> + the number of PHYs as specified in @phys property.

This is useless.

You either don't need names, and can acquire the phys by index, or you
need names which correspond to those on the data sheet for the xHCI
controller.

> + - mediatek,usb-wakeup : To access usb wakeup control register

Please describe what this points to (I guess it's a syscon)/

> + - mediatek,wakeup-src : 1: Ip sleep wakeup mode; 2: line state wakeup
> + mode; others means don't enable wakeup source of usb

This sounds like a runtime decision.

_why_ do you think this needs to be in the DT?

> + - mediatek,u2port-num : The number should not greater than the number
> + of phys

This is useless. Either this is implied by the entries in the phys
property, or it should be a runtime decision.

Thanks,
Mark.

> +
> +Optional properties:
> + - vbus-supply : Reference to the VBUS regulator;
> +
> +Example:
> +usb: usb@1127 {
> + compatible = "mediatek,mt8173-xhci";
> + reg = <0 0x1127 0 0x4000>,
> +   <0 0x1128 0 0x0800>;
> + interrupts = ;
> + power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
> + clocks = <&topckgen CLK_TOP_USB30_SEL>,
> +  <&pericfg CLK_PERI_USB0>,
> +  <&pericfg CLK_PERI_USB1>;
> + clock-names = "sys_mac",
> +   "wakeup_deb_p0",
> +   "wakeup_deb_p1";
> + phys = <&u3phy 0>, <&u3phy 1>;
> + phy-names = "usb-phy0", "usb-phy1";
> + vusb33-supply = <&mt6397_vusb_reg>;
> + vbus-supply = <&usb_p1_vbus>;
> + usb3-lpm-capable;
> + mediatek,usb-wakeup = <&pericfg>;
> + mediatek,wakeup-src = <1>;
> + mediatek,u2port-num = <2>;
> + status = "okay";
> +};
> -- 
> 1.8.1.1.dirty
> 
--
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 v3 2/5] dt-bindings: Add a binding for Mediatek xHCI host controller

2015-07-31 Thread Mark Rutland
Hi,

> > > + - mediatek,usb-wakeup: to access usb wakeup control register
> > 
> > What exactly does this property imply?
> > 
> There are some control registers for usb wakeup which are put in another
> module, here to get the node of that module, and then use regmap and
> syscon to operate it.

Ok. You need to specify the type of this property (i.e. that it is a
phandle to a syscon node). The description makes it sound like a boolean.

> 
> > > + - mediatek,wakeup-src: 1: ip sleep wakeup mode; 2: line state wakeup
> > > + mode; others means don't enable wakeup source of usb
> > 
> > This sounds like configuration rather than a hardware property. Why do
> > you think this needs to be in the DT?
> > 
> Yes, it's better to put it in the DT. 

That doesn't answer my question.

_why_ do you think this needs to be in the DT? What do you think is
better for it being there?

> 
> > > + - mediatek,u2port-num: the number should not greater than the number
> > > + of phys
> > 
> > What exactly does this property imply?
> > 
> On some platform, it only makes use of partial usb ports, so disable
> others to save power.

What exactly do you mean by "partial USB ports"?

If a phy isn't wired up, it won't be listed in the phys property, if it
is then disabling it sounds like a run-time decision.

Thanks,
Mark.
--
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 1/5] dt-bindings: Add usb3.0 phy binding for MT65xx SoCs

2015-07-31 Thread Chunfeng Yun
add a DT binding documentation of usb3.0 phy for MT65xx
SoCs from Mediatek.

Signed-off-by: Chunfeng Yun 
---
 .../devicetree/bindings/phy/phy-mt65xx-usb.txt  | 21 +
 1 file changed, 21 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/phy/phy-mt65xx-usb.txt

diff --git a/Documentation/devicetree/bindings/phy/phy-mt65xx-usb.txt 
b/Documentation/devicetree/bindings/phy/phy-mt65xx-usb.txt
new file mode 100644
index 000..752abc0
--- /dev/null
+++ b/Documentation/devicetree/bindings/phy/phy-mt65xx-usb.txt
@@ -0,0 +1,21 @@
+MT65xx USB3.0 PHY
+
+The device node for Mediatek SOC usb3.0 phy
+
+Required properties:
+ - compatible : Should be "mediatek,mt8173-u3phy"
+ - reg: Offset and length of registers for phy domain
+ - clocks : must support all clocks that phy need
+ - clock-names: should be "u3phya_ref" for u3phya reference clock.
+ - #phy-cells : must be 1 for the phy
+
+Example:
+
+u3phy: usb-phy@1129 {
+   compatible = "mediatek,mt8173-u3phy";
+   reg = <0 0x1129 0 0x3000>;
+   clocks = <&apmixedsys CLK_APMIXED_REF2USB_TX>;
+   clock-names = "u3phya_ref";
+   #phy-cells = <1>;
+   status = "okay";
+};
-- 
1.8.1.1.dirty

--
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


Mediatek xHCI support

2015-07-31 Thread Chunfeng Yun
>From 8babf12102cda26752771c1aebd0aff38514847f Mon Sep 17 00:00:00 2001
From: Chunfeng Yun 
Date: Fri, 31 Jul 2015 20:44:17 +0800
Subject: [PATCH v4 0/5] Mediatek xHCI support

The patch supports MediaTek's xHCI controller.

There are some differences from xHCI spec:
1. The interval is specified in 250 * 8ns increments for Interrupt Moderation
Interval(IMODI) of the Interrupter Moderation(IMOD) register, it is 8 times as
much as that defined in xHCI spec.

2. For the value of TD Size in Normal TRB, MTK's xHCI controller defines a
number of packets that remain to be transferred for a TD after processing all
Max packets in all previous TRBs,that means don't include the current TRB's,
but in xHCI spec it includes the current ones.

3. To minimize the scheduling effort for synchronous endpoints in xHC, the MTK
architecture defines some extra SW scheduling parameters for HW. According to
these parameters provided by SW, the xHC can easily decide whether a
synchronous endpoint should be scheduled in a specific uFrame. The extra SW
scheduling parameters are put into reserved DWs in Slot and Endpoint Context.
And a bandwidth scheduler algorithm is added to support such feature.

A usb3.0 phy driver is also added which used by mt65xx SoCs platform, it
supports two usb2.0 ports and one usb3.0 port.

Change in v4:
1. descripte more exactly for each specifiers in binding file
2. use BIT() to define a bit mask mcro

Chunfeng Yun (5):
  dt-bindings: Add usb3.0 phy binding for MT65xx SoCs
  dt-bindings: Add a binding for Mediatek xHCI host controller
  usb: phy: add usb3.0 phy driver for mt65xx SoCs
  xhci: mediatek: support MTK xHCI host controller
  arm64: dts: mediatek: add xHCI & usb phy for mt8173

 .../devicetree/bindings/phy/phy-mt65xx-usb.txt |  21 +
 .../devicetree/bindings/usb/mt8173-xhci.txt|  51 ++
 arch/arm64/boot/dts/mediatek/mt8173-evb.dts|  17 +
 arch/arm64/boot/dts/mediatek/mt8173.dtsi   |  29 +
 drivers/phy/Kconfig|   9 +
 drivers/phy/Makefile   |   1 +
 drivers/phy/phy-mt65xx-usb3.c  | 419 +++
 drivers/usb/host/Kconfig   |   9 +
 drivers/usb/host/Makefile  |   4 +
 drivers/usb/host/xhci-mtk-sch.c| 436 +++
 drivers/usb/host/xhci-mtk.c| 836 +
 drivers/usb/host/xhci-mtk.h| 135 
 drivers/usb/host/xhci-ring.c   |  35 +-
 drivers/usb/host/xhci.c|  19 +-
 drivers/usb/host/xhci.h|   1 +
 15 files changed, 2015 insertions(+), 7 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/phy/phy-mt65xx-usb.txt
 create mode 100644 Documentation/devicetree/bindings/usb/mt8173-xhci.txt
 create mode 100644 drivers/phy/phy-mt65xx-usb3.c
 create mode 100644 drivers/usb/host/xhci-mtk-sch.c
 create mode 100644 drivers/usb/host/xhci-mtk.c
 create mode 100644 drivers/usb/host/xhci-mtk.h

--
1.8.1.1.dirty


--
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/5] dt-bindings: Add a binding for Mediatek xHCI host controller

2015-07-31 Thread Chunfeng Yun
add a DT binding documentation of xHCI host controller for the
MT8173 SoC from Mediatek.

Signed-off-by: Chunfeng Yun 
---
 .../devicetree/bindings/usb/mt8173-xhci.txt| 51 ++
 1 file changed, 51 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/usb/mt8173-xhci.txt

diff --git a/Documentation/devicetree/bindings/usb/mt8173-xhci.txt 
b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
new file mode 100644
index 000..364be5a
--- /dev/null
+++ b/Documentation/devicetree/bindings/usb/mt8173-xhci.txt
@@ -0,0 +1,51 @@
+MT65XX xhci
+
+The device node for Mediatek SOC usb3.0 host controller
+
+Required properties:
+ - compatible : Supports "mediatek,mt8173-xhci"
+ - reg : Specifies physical base address and size of the registers,
+   the first one for MAC, the second for IPPC
+ - interrupts : Interrupt mode, number and trigger mode
+ - power-domains : To enable usb's mtcmos
+ - vusb33-supply : Regulator of usb avdd3.3v
+ - clocks : Must support all clocks that xhci needs
+ - clock-names : Should be "sys_mac" for sys and mac clocks, and
+   "wakeup_deb_p0", "wakeup_deb_p1" for wakeup debounce control
+   clocks
+ - phys : List of PHY specifiers (used by generic PHY framework).
+ - phy-names : Must be "usb-phy0", "usb-phy1",.., "usb-phyN", based on
+   the number of PHYs as specified in @phys property.
+ - usb3-lpm-capable : Supports USB3 LPM
+ - mediatek,usb-wakeup : To access usb wakeup control register
+ - mediatek,wakeup-src : 1: Ip sleep wakeup mode; 2: line state wakeup
+   mode; others means don't enable wakeup source of usb
+ - mediatek,u2port-num : The number should not greater than the number
+   of phys
+
+Optional properties:
+ - vbus-supply : Reference to the VBUS regulator;
+
+Example:
+usb: usb@1127 {
+   compatible = "mediatek,mt8173-xhci";
+   reg = <0 0x1127 0 0x4000>,
+ <0 0x1128 0 0x0800>;
+   interrupts = ;
+   power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
+   clocks = <&topckgen CLK_TOP_USB30_SEL>,
+<&pericfg CLK_PERI_USB0>,
+<&pericfg CLK_PERI_USB1>;
+   clock-names = "sys_mac",
+ "wakeup_deb_p0",
+ "wakeup_deb_p1";
+   phys = <&u3phy 0>, <&u3phy 1>;
+   phy-names = "usb-phy0", "usb-phy1";
+   vusb33-supply = <&mt6397_vusb_reg>;
+   vbus-supply = <&usb_p1_vbus>;
+   usb3-lpm-capable;
+   mediatek,usb-wakeup = <&pericfg>;
+   mediatek,wakeup-src = <1>;
+   mediatek,u2port-num = <2>;
+   status = "okay";
+};
-- 
1.8.1.1.dirty

--
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/5] usb: phy: add usb3.0 phy driver for mt65xx SoCs

2015-07-31 Thread Chunfeng Yun
support usb3.0 phy of mt65xx SoCs

Signed-off-by: Chunfeng Yun 
---
 drivers/phy/Kconfig   |   9 +
 drivers/phy/Makefile  |   1 +
 drivers/phy/phy-mt65xx-usb3.c | 419 ++
 3 files changed, 429 insertions(+)
 create mode 100644 drivers/phy/phy-mt65xx-usb3.c

diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index c0e6ede..019cf8b 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -193,6 +193,15 @@ config PHY_HIX5HD2_SATA
help
  Support for SATA PHY on Hisilicon hix5hd2 Soc.
 
+config PHY_MT65XX_USB3
+   tristate "Mediatek USB3.0 PHY Driver"
+   depends on ARCH_MEDIATEK && OF
+   select GENERIC_PHY
+   help
+ Say 'Y' here to add support for Mediatek USB3.0 PHY driver
+ for mt65xx SoCs. it supports two usb2.0 ports and
+ one usb3.0 port.
+
 config PHY_SUN4I_USB
tristate "Allwinner sunxi SoC USB PHY driver"
depends on ARCH_SUNXI && HAS_IOMEM && OF
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index f344e1b..3ceff2a 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_TI_PIPE3)+= 
phy-ti-pipe3.o
 obj-$(CONFIG_TWL4030_USB)  += phy-twl4030-usb.o
 obj-$(CONFIG_PHY_EXYNOS5250_SATA)  += phy-exynos5250-sata.o
 obj-$(CONFIG_PHY_HIX5HD2_SATA) += phy-hix5hd2-sata.o
+obj-$(CONFIG_PHY_MT65XX_USB3)  += phy-mt65xx-usb3.o
 obj-$(CONFIG_PHY_SUN4I_USB)+= phy-sun4i-usb.o
 obj-$(CONFIG_PHY_SUN9I_USB)+= phy-sun9i-usb.o
 obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-exynos-usb2.o
diff --git a/drivers/phy/phy-mt65xx-usb3.c b/drivers/phy/phy-mt65xx-usb3.c
new file mode 100644
index 000..1d2f2e0
--- /dev/null
+++ b/drivers/phy/phy-mt65xx-usb3.c
@@ -0,0 +1,419 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Author: Chunfeng.Yun 
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/*
+ * for sifslv2 register
+ * relative to USB3_SIF2_BASE base address
+ */
+#define SSUSB_SIFSLV_SPLLC 0x
+#define SSUSB_SIFSLV_U2PHY_COM_BASE0x0800
+#define SSUSB_SIFSLV_U3PHYD_BASE   0x0900
+#define SSUSB_USB30_PHYA_SIV_B_BASE0x0b00
+#define SSUSB_SIFSLV_U3PHYA_DA_BASE0x0c00
+
+/*port1 refs. +0x800(refer to port0)*/
+#define U3P_PORT_INTERVAL  0x800   /*based on port0 */
+#define U3P_PHY_DELTA(index)   ((U3P_PORT_INTERVAL) * (index))
+
+#define U3P_USBPHYACR0 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x)
+#define PA0_RG_U2PLL_FORCE_ON  BIT(15)
+
+#define U3P_USBPHYACR2 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0008)
+#define PA2_RG_SIF_U2PLL_FORCE_EN  BIT(18)
+
+#define U3P_USBPHYACR5 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0014)
+#define PA5_RG_U2_HSTX_SRCTRL  (0x7 << 12)
+#define PA5_RG_U2_HSTX_SRCTRL_VAL(x)   ((0x7 & (x)) << 12)
+#define PA5_RG_U2_HS_100U_U3_ENBIT(11)
+
+#define U3P_USBPHYACR6 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0018)
+#define PA6_RG_U2_ISO_EN   BIT(31)
+#define PA6_RG_U2_BC11_SW_EN   BIT(23)
+#define PA6_RG_U2_OTG_VBUSCMP_EN   BIT(20)
+
+#define U3P_U2PHYACR4  (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0020)
+#define P2C_RG_USB20_GPIO_CTL  BIT(9)
+#define P2C_USB20_GPIO_MODEBIT(8)
+#define P2C_U2_GPIO_CTR_MSK(P2C_RG_USB20_GPIO_CTL | P2C_USB20_GPIO_MODE)
+
+#define U3D_U2PHYDCR0  (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0060)
+#define P2C_RG_SIF_U2PLL_FORCE_ON  BIT(24)
+
+#define U3P_U2PHYDTM0  (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0068)
+#define P2C_FORCE_UART_EN  BIT(26)
+#define P2C_FORCE_DATAIN   BIT(23)
+#define P2C_FORCE_DM_PULLDOWN  BIT(21)
+#define P2C_FORCE_DP_PULLDOWN  BIT(20)
+#define P2C_FORCE_XCVRSEL  BIT(19)
+#define P2C_FORCE_SUSPENDM BIT(18)
+#define P2C_FORCE_TERMSEL  BIT(17)
+#define P2C_RG_DATAIN  (0xf << 10)
+#define P2C_RG_DATAIN_VAL(x)   ((0xf & (x)) << 10)
+#define P2C_RG_DMPULLDOWN  BIT(7)
+#define P2C_RG_DPPULLDOWN  BIT(6)
+#define P2C_RG_XCVRSEL (0x3 << 4)
+#define P2C_RG_XCVRSEL_VAL(x)  ((0x3 & (x)) << 4)
+#define P2C_RG_SUSPENDMBIT(3)
+#define P2C_RG_TERMSEL BIT(2)
+#define P2C_DTM0_PART_MASK \
+   (P2C_FORCE_DATAIN | P2C_FORCE_DM_PULLDOWN | \
+   P2C_FORCE_DP_PULLDOWN | P2C_FORCE_XCVRSEL | \
+   P2C_FORCE_TERM

[PATCH v4 4/5] xhci: mediatek: support MTK xHCI host controller

2015-07-31 Thread Chunfeng Yun
MTK xhci host controller defines some extra SW scheduling
parameters for HW to minimize the scheduling effort for
synchronous and interrupt endpoints. The parameters are
put into reseved DWs of slot context and endpoint context

Signed-off-by: Chunfeng Yun 
---
 drivers/usb/host/Kconfig|   9 +
 drivers/usb/host/Makefile   |   4 +
 drivers/usb/host/xhci-mtk-sch.c | 436 +
 drivers/usb/host/xhci-mtk.c | 836 
 drivers/usb/host/xhci-mtk.h | 135 +++
 drivers/usb/host/xhci-ring.c|  35 +-
 drivers/usb/host/xhci.c |  19 +-
 drivers/usb/host/xhci.h |   1 +
 8 files changed, 1468 insertions(+), 7 deletions(-)
 create mode 100644 drivers/usb/host/xhci-mtk-sch.c
 create mode 100644 drivers/usb/host/xhci-mtk.c
 create mode 100644 drivers/usb/host/xhci-mtk.h

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 8afc3c1..358ab6d 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -34,6 +34,15 @@ config USB_XHCI_PCI
 config USB_XHCI_PLATFORM
tristate
 
+config USB_XHCI_MTK
+   tristate "xHCI support for Mediatek MT65xx"
+   select MFD_SYSCON
+   depends on ARCH_MEDIATEK || COMPILE_TEST
+   ---help---
+ Say 'Y' to enable the support for the xHCI host controller
+ found in Mediatek MT65xx SoCs.
+ If unsure, say N.
+
 config USB_XHCI_MVEBU
tristate "xHCI support for Marvell Armada 375/38x"
select USB_XHCI_PLATFORM
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
index 754efaa..00401f9 100644
--- a/drivers/usb/host/Makefile
+++ b/drivers/usb/host/Makefile
@@ -13,6 +13,9 @@ fhci-$(CONFIG_FHCI_DEBUG) += fhci-dbg.o
 xhci-hcd-y := xhci.o xhci-mem.o
 xhci-hcd-y += xhci-ring.o xhci-hub.o xhci-dbg.o
 xhci-hcd-y += xhci-trace.o
+ifneq ($(CONFIG_USB_XHCI_MTK), )
+   xhci-hcd-y += xhci-mtk-sch.o
+endif
 
 xhci-plat-hcd-y := xhci-plat.o
 ifneq ($(CONFIG_USB_XHCI_MVEBU), )
@@ -30,6 +33,7 @@ endif
 
 obj-$(CONFIG_USB_XHCI_PCI) += xhci-pci.o
 obj-$(CONFIG_USB_XHCI_PLATFORM) += xhci-plat-hcd.o
+obj-$(CONFIG_USB_XHCI_MTK) += xhci-mtk.o
 
 obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o
 obj-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o
diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c
new file mode 100644
index 000..d4b41a6
--- /dev/null
+++ b/drivers/usb/host/xhci-mtk-sch.c
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 2015 MediaTek Inc.
+ * Author:
+ *  Zhigang.Wei 
+ *  Chunfeng.Yun 
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include 
+#include 
+#include 
+
+#include "xhci.h"
+#include "xhci-mtk.h"
+
+#define SS_BW_BOUNDARY 51000
+/* table 5-5. High-speed Isoc Transaction Limits in usb_20 spec */
+#define HS_BW_BOUNDARY 6144
+/* usb2 spec section11.18.1: at most 188 FS bytes per microframe */
+#define FS_PAYLOAD_MAX 188
+
+/* mtk scheduler bitmasks */
+#define EP_BPKTS(p)((p) & 0x3f)
+#define EP_BCSCOUNT(p) (((p) & 0x7) << 8)
+#define EP_BBM(p)  ((p) << 11)
+#define EP_BOFFSET(p)  ((p) & 0x3fff)
+#define EP_BREPEAT(p)  (((p) & 0x7fff) << 16)
+
+static int is_fs_or_ls(enum usb_device_speed speed)
+{
+   return speed == USB_SPEED_FULL || speed == USB_SPEED_LOW;
+}
+
+static int get_bw_index(struct xhci_hcd *xhci, struct usb_device *udev,
+   struct usb_host_endpoint *ep)
+{
+   int bw_index;
+   int port_id;
+   struct xhci_virt_device *virt_dev;
+
+   virt_dev = xhci->devs[udev->slot_id];
+   port_id = virt_dev->real_port;
+
+   if (udev->speed == USB_SPEED_SUPER) {
+   if (usb_endpoint_dir_out(&ep->desc))
+   bw_index = (port_id - 1) * 2;
+   else
+   bw_index = (port_id - 1) * 2 + 1;
+   } else {
+   bw_index = port_id + xhci->num_usb3_ports - 1;
+   }
+
+   return bw_index;
+}
+
+static void setup_sch_info(struct usb_device *udev,
+   struct xhci_ep_ctx *ep_ctx, struct mu3h_sch_ep_info *sch_ep)
+{
+   u32 ep_type;
+   u32 ep_interval;
+   u32 max_packet_size;
+   u32 max_burst;
+   u32 mult;
+   u32 esit_pkts;
+
+   ep_type = CTX_TO_EP_TYPE(le32_to_cpu(ep_ctx->ep_info2));
+   ep_interval = CTX_TO_EP_INTERVAL(le32_to_cpu(ep_ctx->ep_info));
+   max_packet_size = MAX_PACKET_DECODED(le32_to_cpu(ep_ctx->ep_info2));
+   max_burst = CTX_TO_MAX_BURST(le32_to_cpu(ep_ctx->ep_info2));
+   mult = CTX_TO_EP_MULT(le32_to_cpu(ep_ctx->ep_info));
+
+   sch_ep->ep_type = ep_type;
+   sch

[PATCH v4 5/5] arm64: dts: mediatek: add xHCI & usb phy for mt8173

2015-07-31 Thread Chunfeng Yun
add xHCI and phy drivers for MT8173-EVB

Signed-off-by: Chunfeng Yun 
---
 arch/arm64/boot/dts/mediatek/mt8173-evb.dts | 17 +
 arch/arm64/boot/dts/mediatek/mt8173.dtsi| 29 +
 2 files changed, 46 insertions(+)

diff --git a/arch/arm64/boot/dts/mediatek/mt8173-evb.dts 
b/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
index f433c21..f9bbabd 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
+++ b/arch/arm64/boot/dts/mediatek/mt8173-evb.dts
@@ -13,6 +13,7 @@
  */
 
 /dts-v1/;
+#include 
 #include "mt8173.dtsi"
 
 / {
@@ -32,6 +33,15 @@
};
 
chosen { };
+
+   usb_p1_vbus: regulator@0 {
+   compatible = "regulator-fixed";
+   regulator-name = "usb_vbus";
+   regulator-min-microvolt = <500>;
+   regulator-max-microvolt = <500>;
+   gpio = <&pio 130 GPIO_ACTIVE_HIGH>;
+   enable-active-high;
+   };
 };
 
 &pwrap {
@@ -211,3 +221,10 @@
 &uart0 {
status = "okay";
 };
+
+&usb {
+   vusb33-supply = <&mt6397_vusb_reg>;
+   vbus-supply = <&usb_p1_vbus>;
+   mediatek,wakeup-src = <1>;
+   mediatek,u2port-num = <2>;
+};
diff --git a/arch/arm64/boot/dts/mediatek/mt8173.dtsi 
b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
index 0696f8f..8fa9ae8 100644
--- a/arch/arm64/boot/dts/mediatek/mt8173.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8173.dtsi
@@ -14,6 +14,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include "mt8173-pinfunc.h"
 
@@ -393,6 +394,34 @@
#size-cells = <0>;
status = "disabled";
};
+
+   usb: usb@1127 {
+   compatible = "mediatek,mt8173-xhci";
+   reg = <0 0x1127 0 0x4000>,
+ <0 0x1128 0 0x0800>;
+   interrupts = ;
+   power-domains = <&scpsys MT8173_POWER_DOMAIN_USB>;
+   clocks = <&topckgen CLK_TOP_USB30_SEL>,
+<&pericfg CLK_PERI_USB0>,
+<&pericfg CLK_PERI_USB1>;
+   clock-names = "sys_mac",
+ "wakeup_deb_p0",
+ "wakeup_deb_p1";
+   phys = <&u3phy 0>, <&u3phy 1>;
+   phy-names = "usb-phy0", "usb-phy1";
+   usb3-lpm-capable;
+   mediatek,usb-wakeup = <&pericfg>;
+   status = "okay";
+   };
+
+   u3phy: usb-phy@1129 {
+   compatible = "mediatek,mt8173-u3phy";
+   reg = <0 0x1129 0 0x3000>;
+   clocks = <&apmixedsys CLK_APMIXED_REF2USB_TX>;
+   clock-names = "u3phya_ref";
+   #phy-cells = <1>;
+   status = "okay";
+   };
};
 };
 
-- 
1.8.1.1.dirty

--
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 v3 3/5] usb: phy: add usb3.0 phy driver for mt65xx SoCs

2015-07-31 Thread chunfeng yun
hi Ricky,
On Mon, 2015-07-27 at 21:58 +0800, Ricky Liang wrote:
> Hi Chungfeng,
> 
> Comments inline.
> 
> On Wed, Jul 22, 2015 at 10:05 PM, Chunfeng Yun
>  wrote:
> > support usb3.0 phy of mt65xx SoCs
> >
> > Signed-off-by: Chunfeng Yun 
> > ---
> >  drivers/phy/Kconfig   |   9 +
> >  drivers/phy/Makefile  |   1 +
> >  drivers/phy/phy-mt65xx-usb3.c | 426 
> > ++
> >  3 files changed, 436 insertions(+)
> >  create mode 100644 drivers/phy/phy-mt65xx-usb3.c
> >
> > diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> > index c0e6ede..019cf8b 100644
> > --- a/drivers/phy/Kconfig
> > +++ b/drivers/phy/Kconfig
> > @@ -193,6 +193,15 @@ config PHY_HIX5HD2_SATA
> > help
> >   Support for SATA PHY on Hisilicon hix5hd2 Soc.
> >
> > +config PHY_MT65XX_USB3
> > +   tristate "Mediatek USB3.0 PHY Driver"
> > +   depends on ARCH_MEDIATEK && OF
> > +   select GENERIC_PHY
> > +   help
> > + Say 'Y' here to add support for Mediatek USB3.0 PHY driver
> > + for mt65xx SoCs. it supports two usb2.0 ports and
> > + one usb3.0 port.
> > +
> >  config PHY_SUN4I_USB
> > tristate "Allwinner sunxi SoC USB PHY driver"
> > depends on ARCH_SUNXI && HAS_IOMEM && OF
> > diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> > index f344e1b..3ceff2a 100644
> > --- a/drivers/phy/Makefile
> > +++ b/drivers/phy/Makefile
> > @@ -22,6 +22,7 @@ obj-$(CONFIG_TI_PIPE3)+= 
> > phy-ti-pipe3.o
> >  obj-$(CONFIG_TWL4030_USB)  += phy-twl4030-usb.o
> >  obj-$(CONFIG_PHY_EXYNOS5250_SATA)  += phy-exynos5250-sata.o
> >  obj-$(CONFIG_PHY_HIX5HD2_SATA) += phy-hix5hd2-sata.o
> > +obj-$(CONFIG_PHY_MT65XX_USB3)  += phy-mt65xx-usb3.o
> >  obj-$(CONFIG_PHY_SUN4I_USB)+= phy-sun4i-usb.o
> >  obj-$(CONFIG_PHY_SUN9I_USB)+= phy-sun9i-usb.o
> >  obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-exynos-usb2.o
> > diff --git a/drivers/phy/phy-mt65xx-usb3.c b/drivers/phy/phy-mt65xx-usb3.c
> > new file mode 100644
> > index 000..5da4534
> > --- /dev/null
> > +++ b/drivers/phy/phy-mt65xx-usb3.c
> > @@ -0,0 +1,426 @@
> > +/*
> > + * Copyright (c) 2015 MediaTek Inc.
> > + * Author: Chunfeng.Yun 
> > + *
> > + * This software is licensed under the terms of the GNU General Public
> > + * License version 2, as published by the Free Software Foundation, and
> > + * may be copied, distributed, and modified under those terms.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +/*
> > + * for sifslv2 register
> > + * relative to USB3_SIF2_BASE base address
> > + */
> > +#define SSUSB_SIFSLV_SPLLC (0x)
> > +#define SSUSB_SIFSLV_U2PHY_COM_BASE(0x0800)
> > +#define SSUSB_SIFSLV_U3PHYD_BASE   (0x0900)
> > +#define SSUSB_USB30_PHYA_SIV_B_BASE(0x0b00)
> > +#define SSUSB_SIFSLV_U3PHYA_DA_BASE(0x0c00)
> 
> You don't need () here. Same for all following numeric constants.
> 
Ok, I will delete them.

> > +
> > +/*port1 refs. +0x800(refer to port0)*/
> > +#define U3P_PORT_INTERVAL (0x800)  /*based on port0 */
> > +#define U3P_PHY_DELTA(index) ((U3P_PORT_INTERVAL) * (index))
> 
> Indent with tab. It might also be a good idea to align the
> indentations of all the macros.
> 
OK
> > +
> > +#define U3P_USBPHYACR0 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x)
> > +#define PA0_RG_U2PLL_FORCE_ON  (0x1 << 15)
> 
> Use BIT() instead? Same for all following (0x1 << xx) macros.
> 
I'll do it.

thanks.
> > +
> > +#define U3P_USBPHYACR2 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0008)
> > +#define PA2_RG_SIF_U2PLL_FORCE_EN  (0x1 << 18)
> > +
> > +#define U3P_USBPHYACR5 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0014)
> > +#define PA5_RG_U2_HSTX_SRCTRL  (0x7 << 12)
> > +#define PA5_RG_U2_HSTX_SRCTRL_VAL(x)   ((0x7 & (x)) << 12)
> > +#define PA5_RG_U2_HS_100U_U3_EN(0x1 << 11)
> > +
> > +#define U3P_USBPHYACR6 (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0018)
> > +#define PA6_RG_U2_ISO_EN   (0x1 << 31)
> > +#define PA6_RG_U2_BC11_SW_EN   (0x1 << 23)
> > +#define PA6_RG_U2_OTG_VBUSCMP_EN   (0x1 << 20)
> > +
> > +#define U3P_U2PHYACR4  (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0020)
> > +#define P2C_RG_USB20_GPIO_CTL  (0x1 << 9)
> > +#define P2C_USB20_GPIO_MODE(0x1 << 8)
> > +#define P2C_U2_GPIO_CTR_MSK(P2C_RG_USB20_GPIO_CTL | 
> > P2C_USB20_GPIO_MODE)
> > +
> > +#define U3D_U2PHYDCR0  (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0060)
> > +#define P2C_RG_SIF_U2PLL_FORCE_ON  (0x1 << 24)
> > +
> > +#define U3P_U2PHYDTM0  (SSUSB_SIFSL

Re: [PATCH v3 3/5] usb: phy: add usb3.0 phy driver for mt65xx SoCs

2015-07-31 Thread chunfeng yun
hi,
On Tue, 2015-07-28 at 11:17 +0530, Kishon Vijay Abraham I wrote:
> Hi,
> 
> On Sunday 26 July 2015 08:21 AM, chunfeng yun wrote:
> > hi,
> > On Wed, 2015-07-22 at 09:21 -0500, Felipe Balbi wrote:
> >> Hi,
> >>
> >> On Wed, Jul 22, 2015 at 10:05:43PM +0800, Chunfeng Yun wrote:
> >>> support usb3.0 phy of mt65xx SoCs
> >>>
> >>> Signed-off-by: Chunfeng Yun 
> >>
> >> you missed Kishon here.
> >>
> > Thank you.
> >>> ---
> >>>  drivers/phy/Kconfig   |   9 +
> >>>  drivers/phy/Makefile  |   1 +
> >>>  drivers/phy/phy-mt65xx-usb3.c | 426 
> >>> ++
> >>>  3 files changed, 436 insertions(+)
> >>>  create mode 100644 drivers/phy/phy-mt65xx-usb3.c
> >>>
> >>> diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
> >>> index c0e6ede..019cf8b 100644
> >>> --- a/drivers/phy/Kconfig
> >>> +++ b/drivers/phy/Kconfig
> >>> @@ -193,6 +193,15 @@ config PHY_HIX5HD2_SATA
> >>>   help
> >>> Support for SATA PHY on Hisilicon hix5hd2 Soc.
> >>>  
> >>> +config PHY_MT65XX_USB3
> >>> + tristate "Mediatek USB3.0 PHY Driver"
> >>> + depends on ARCH_MEDIATEK && OF
> >>> + select GENERIC_PHY
> >>> + help
> >>> +   Say 'Y' here to add support for Mediatek USB3.0 PHY driver
> >>> +   for mt65xx SoCs. it supports two usb2.0 ports and
> >>> +   one usb3.0 port.
> >>> +
> >>>  config PHY_SUN4I_USB
> >>>   tristate "Allwinner sunxi SoC USB PHY driver"
> >>>   depends on ARCH_SUNXI && HAS_IOMEM && OF
> >>> diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
> >>> index f344e1b..3ceff2a 100644
> >>> --- a/drivers/phy/Makefile
> >>> +++ b/drivers/phy/Makefile
> >>> @@ -22,6 +22,7 @@ obj-$(CONFIG_TI_PIPE3)  += 
> >>> phy-ti-pipe3.o
> >>>  obj-$(CONFIG_TWL4030_USB)+= phy-twl4030-usb.o
> >>>  obj-$(CONFIG_PHY_EXYNOS5250_SATA)+= phy-exynos5250-sata.o
> >>>  obj-$(CONFIG_PHY_HIX5HD2_SATA)   += phy-hix5hd2-sata.o
> >>> +obj-$(CONFIG_PHY_MT65XX_USB3)+= phy-mt65xx-usb3.o
> >>>  obj-$(CONFIG_PHY_SUN4I_USB)  += phy-sun4i-usb.o
> >>>  obj-$(CONFIG_PHY_SUN9I_USB)  += phy-sun9i-usb.o
> >>>  obj-$(CONFIG_PHY_SAMSUNG_USB2)   += phy-exynos-usb2.o
> >>> diff --git a/drivers/phy/phy-mt65xx-usb3.c b/drivers/phy/phy-mt65xx-usb3.c
> >>> new file mode 100644
> >>> index 000..5da4534
> >>> --- /dev/null
> >>> +++ b/drivers/phy/phy-mt65xx-usb3.c
> >>> @@ -0,0 +1,426 @@
> >>> +/*
> >>> + * Copyright (c) 2015 MediaTek Inc.
> >>> + * Author: Chunfeng.Yun 
> >>> + *
> >>> + * This software is licensed under the terms of the GNU General Public
> >>> + * License version 2, as published by the Free Software Foundation, and
> >>> + * may be copied, distributed, and modified under those terms.
> >>> + *
> >>> + * This program is distributed in the hope that it will be useful,
> >>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> >>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> >>> + * GNU General Public License for more details.
> >>> + *
> >>> + */
> >>> +
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> >>> +#include 
> 
> Lot of these #include are not required. Add only those what are required by
> this driver.
The dummy header files will be removed later

> >>> +#include 
> >>> +
> >>> +/*
> >>> + * for sifslv2 register
> >>> + * relative to USB3_SIF2_BASE base address
> >>> + */
> >>> +#define SSUSB_SIFSLV_SPLLC   (0x)
> >>> +#define SSUSB_SIFSLV_U2PHY_COM_BASE  (0x0800)
> 
> Looks like all this base address can come from dt.
The phy supports multi-ports, and these are sub-segment registers for
port0, and other ports can be calculated from the bases. So I think it's
better to use the same base address in dts

> >>> +#define SSUSB_SIFSLV_U3PHYD_BASE (0x0900)
> >>> +#define SSUSB_USB30_PHYA_SIV_B_BASE  (0x0b00)
> >>> +#define SSUSB_SIFSLV_U3PHYA_DA_BASE  (0x0c00)
> >>> +
> >>> +/*port1 refs. +0x800(refer to port0)*/
> >>> +#define U3P_PORT_INTERVAL (0x800)/*based on port0 */
> >>> +#define U3P_PHY_DELTA(index) ((U3P_PORT_INTERVAL) * (index))
> >>> +
> >>> +#define U3P_USBPHYACR0   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x)
> >>> +#define PA0_RG_U2PLL_FORCE_ON(0x1 << 15)
> >>> +
> >>> +#define U3P_USBPHYACR2   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0008)
> >>> +#define PA2_RG_SIF_U2PLL_FORCE_EN(0x1 << 18)
> >>> +
> >>> +#define U3P_USBPHYACR5   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0014)
> >>> +#define PA5_RG_U2_HSTX_SRCTRL(0x7 << 12)
> >>> +#define PA5_RG_U2_HSTX_SRCTRL_VAL(x) ((0x7 & (x)) << 12)
> >>> +#define PA5_RG_U2_HS_100U_U3_EN  (0x1 << 11)
> >>> +
> >>> +#define U3P_USBPHYACR6   (SSUSB_SIFSLV_U2PHY_COM_BASE + 0x0018)
> >>> +#define PA6_RG_U2_ISO_EN (0x1 << 31)
> >>> +#define PA6_RG_U2_BC11_SW_EN (0x1 << 23)
> >>> +#define PA6_RG_U2_OTG_VBUSCMP_EN (0x1 << 20)
> >

Re: [PATCH] usb: gadget: mass_storage: Use static array for luns

2015-07-31 Thread Krzysztof Opasiak

Hi,

On 07/30/2015 06:43 PM, Felipe Balbi wrote:

Hi,

On Thu, Jul 23, 2015 at 07:57:49PM +0200, Krzysztof Opasiak wrote:

This patch replace dynamicly allocated luns array with static one.
This simplifies the code of mass storage function and modules.

Signed-off-by: Krzysztof Opasiak 
Acked-by: Michal Nazarewicz 


this actually regresses g_mass_storage:

# modprobe g_mass_storage removable=1
[   40.115294] Mass Storage Function, version: 2009/09/11
[   40.120680] LUN: removable file: (no medium)
[   40.125374] Unable to handle kernel NULL pointer dereference at virtual 
address 0054
[   40.133863] pgd = ed574000
[   40.136689] [0054] *pgd=
[   40.140429] Internal error: Oops: 5 [#1] SMP ARM
[   40.145238] Modules linked in: g_mass_storage(+) usb_f_mass_storage 
libcomposite xhci_plat_hcd xhci_hcd usbcore joydev dwc3 udc_core usb_common 
evdev cpufreq_dt omapfb snd_soc_evm thermal_sys cfbfillrect cfbimgblt 
cfbcopyarea matrix_keypad hwmon leds_gpio led_class matrix_keymap pwm_bl 
panel_dpi snd_soc_tlv320aic3x snd_soc_davinci_mcasp snd_soc_edma snd_soc_omap 
snd_soc_core omapdss snd_compress snd_pcm_dmaengine snd_pcm dwc3_omap snd_timer 
lis3lv02d_i2c extcon pwm_tiecap snd lis3lv02d input_polldev soundcore rtc_omap 
spi_ti_qspi omap_wdt tps65218_pwrbutton phy_omap_usb2 ipv6 autofs4
[   40.199522] CPU: 0 PID: 244 Comm: modprobe Not tainted 
4.2.0-rc4-00060-g691ddfcf5846 #755
[   40.208039] Hardware name: Generic AM43 (Flattened Device Tree)
[   40.214210] task: ed01e240 ti: ee7be000 task.ti: ee7be000
[   40.219843] PC is at kernfs_find_ns+0xc/0x138
[   40.224381] LR is at kernfs_find_and_get_ns+0x30/0x4c
[   40.229649] pc : []lr : []psr: 200f0013
[   40.229649] sp : ee7bfc68  ip : 0002  fp : bf0aa740
[   40.241609] r10: bf0aa788  r9 : ed3353c0  r8 : 
[   40.247055] r7 :   r6 : c06466a4  r5 :   r4 : c0917840
[   40.253851] r3 : c093c5d4  r2 :   r1 : c06466a4  r0 : 
[   40.260651] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   40.268085] Control: 10c5387d  Table: ad574059  DAC: 0015
[   40.274069] Process modprobe (pid: 244, stack limit = 0xee7be218)
[   40.280415] Stack: (0xee7bfc68 to 0xee7c)
[   40.284959] fc60:   c0917840  c06466a4  
ed214400 c01de664
[   40.293478] fc80:  c09474d0 ee56f438 ee56f430  c01e13d4 
 c09474a0
[   40.301996] fca0: ee56f438 c03f6384 ee56f430 ee56f430 ed214598 c03ec6d0 
bf0aa788 c008e820
[   40.310519] fcc0: c015a7d4 ed01e240 ee56f430 ed2144d0 ed214598 ed21450c 
ed214400 c03ec8b8
[   40.319048] fce0: ee56f400 bf10f304 ee533e00 ee533e04 bf0aa980 bf0aa54c 
0001 bf10f374
[   40.327572] fd00: bf115840 bf07ec18 fff0 bf0aa0a0 c05fe878 0001 
 0100
[   40.336089] fd20: ed506098    bf2f8528 c0979e80 
600f0093 c0091548
[   40.344612] fd40: 0001 0080  bf2f8528  ed01e768 
ed01e240 0004
[   40.353137] fd60: 0006 12d341e8 bf0aa788 c008e820 c06008b8 ed01e240 
0001 bf0aa694
[   40.361654] fd80:  c008e984 a00f0013 ed506088 ed506088 c06008b8 
 
[   40.370172] fda0:   ed335301 0002  ed3353c0 
bf0aa6bc 
[   40.378690] fdc0: ed506170  12d341e8 bf07ea84 bf2e7d08 ee53b000 
bf0aa6bc ee53b000
[   40.387207] fde0: bf0aa6bc ed2cbd00 ee53b008  12d341e8 bf0aa788 
bf0aa740 bf2e7b90
[   40.395724] fe00:  bf2e8308 bf0aa6bc ed2cbd00 bf0b bf2e7d44 
 c08c9ea0
[   40.404241] fe20: c08c9ea0 c00097a4 0001   c0150fe4 
 eeef9000
[   40.412766] fe40: ef7c8460 4000 001e c008ec68 ee5e1e40 00d0 
00d0 c015ba10
[   40.421283] fe60: ee7bff58 c008ec68 c08c63a8 600f0013 a00f0013 bf0aa740 
bf0aa740 c0979fd4
[   40.429811] fe80: ee5e1e40 ed2cbe40 0001 bf0aa788 bf0aa740 c05f7d28 
c0979fd4 0001
[   40.438334] fea0: ee7bff58 c0979fd4 0001 c00c88c4 bf0aa74c 7fff 
 c00c606c
[   40.446857] fec0: c1153024 0124 bf0aa74c bf0aa95c ee7bff60 f03a29a4 
bf0aa74c 
[   40.455381] fee0: 02e401dd  000f 000181a4 0001  
 
[   40.463900] ff00:       
 
[   40.472424] ff20:     7f643410  
0005 7f643410
[   40.480941] ff40: 017b c000f724 ee7be000  7f6431c8 c00c91c0 
f0385000 0001d9f4
[   40.489471] ff60: f03a2314 f039a942 f039b5e0 09a8 0e38  
 
[   40.497993] ff80: 002a 002b 0012 0016 000b  
 000b
[   40.506537] ffa0: 000b c000f540  000b 0005 7f643410 
 7f6431b0
[   40.515062] ffc0:  000b 000b 017b 0004 000b 
000b 7f6431c8
[   40.523579] ffe0: bea6a9a0 bea6a990 7f62643f b6f52812 600f0030 0005 
0001bccc 0098b800
[   40.532117] [] (kernfs_find_ns) from [] 

Re: [PATCH] usb: gadget: mass_storage: Fix freeing luns sysfs implementation

2015-07-31 Thread Michal Nazarewicz
On Fri, Jul 31 2015, Krzysztof Opasiak wrote:
> Use device_is_registered() instad of sysfs flag to determine if
> we should free sysfs representation of particular LUN.
[…]
>
> Signed-off-by: Krzysztof Opasiak 

Acked-by: Michal Nazarewicz 

> ---
>  drivers/usb/gadget/function/f_mass_storage.c |   12 ++--
>  drivers/usb/gadget/function/f_mass_storage.h |2 +-
>  2 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/usb/gadget/function/f_mass_storage.c 
> b/drivers/usb/gadget/function/f_mass_storage.c
> index f94a8e2..9870913 100644
> --- a/drivers/usb/gadget/function/f_mass_storage.c
> +++ b/drivers/usb/gadget/function/f_mass_storage.c
> @@ -2742,9 +2742,9 @@ error_release:
>  }
>  EXPORT_SYMBOL_GPL(fsg_common_set_num_buffers);
>  
> -void fsg_common_remove_lun(struct fsg_lun *lun, bool sysfs)
> +void fsg_common_remove_lun(struct fsg_lun *lun)
>  {
> - if (sysfs)
> + if (device_is_registered(&lun->dev))
>   device_unregister(&lun->dev);
>   fsg_lun_close(lun);
>   kfree(lun);
> @@ -2757,7 +2757,7 @@ static void _fsg_common_remove_luns(struct fsg_common 
> *common, int n)
>  
>   for (i = 0; i < n; ++i)
>   if (common->luns[i]) {
> - fsg_common_remove_lun(common->luns[i], common->sysfs);
> + fsg_common_remove_lun(common->luns[i]);
>   common->luns[i] = NULL;
>   }
>  }
> @@ -2950,7 +2950,7 @@ int fsg_common_create_lun(struct fsg_common *common, 
> struct fsg_lun_config *cfg,
>   return 0;
>  
>  error_lun:
> - if (common->sysfs)
> + if (device_is_registered(&lun->dev))
>   device_unregister(&lun->dev);
>   fsg_lun_close(lun);
>   common->luns[id] = NULL;
> @@ -3038,7 +3038,7 @@ static void fsg_common_release(struct kref *ref)
>   if (!lun)
>   continue;
>   fsg_lun_close(lun);
> - if (common->sysfs)
> + if (device_is_registered(&lun->dev))
>   device_unregister(&lun->dev);
>   kfree(lun);
>   }
> @@ -3363,7 +3363,7 @@ static void fsg_lun_drop(struct config_group *group, 
> struct config_item *item)
>   unregister_gadget_item(gadget);
>   }
>  
> - fsg_common_remove_lun(lun_opts->lun, fsg_opts->common->sysfs);
> + fsg_common_remove_lun(lun_opts->lun);
>   fsg_opts->common->luns[lun_opts->lun_id] = NULL;
>   lun_opts->lun_id = 0;
>   mutex_unlock(&fsg_opts->lock);
> diff --git a/drivers/usb/gadget/function/f_mass_storage.h 
> b/drivers/usb/gadget/function/f_mass_storage.h
> index b4866fc..37bc94c 100644
> --- a/drivers/usb/gadget/function/f_mass_storage.h
> +++ b/drivers/usb/gadget/function/f_mass_storage.h
> @@ -137,7 +137,7 @@ void fsg_common_free_buffers(struct fsg_common *common);
>  int fsg_common_set_cdev(struct fsg_common *common,
>   struct usb_composite_dev *cdev, bool can_stall);
>  
> -void fsg_common_remove_lun(struct fsg_lun *lun, bool sysfs);
> +void fsg_common_remove_lun(struct fsg_lun *lun);
>  
>  void fsg_common_remove_luns(struct fsg_common *common);
>  
> -- 
> 1.7.9.5
>

-- 
Best regards, _ _
.o. | Liege of Serenely Enlightened Majesty of  o' \,=./ `o
..o | Computer Science,  Michał “mina86” Nazarewicz(o o)
ooo +--ooO--(_)--Ooo--
--
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] usb: gadget: mass_storage: Use static array for luns

2015-07-31 Thread Krzysztof Opasiak
This patch replace dynamicly allocated luns array with static one.
This simplifies the code of mass storage function and modules.

Signed-off-by: Krzysztof Opasiak 
Acked-by: Michal Nazarewicz 
--
IMPORTANT:

This patch depends on patch:
usb: gadget: mass_storage: Fix freeing luns sysfs implementation
http://marc.info/?l=linux-usb&m=143834268900540&w=2

Changes since v1:
- remove all luns before creating new
(call fsg_common_remove_luns() in fsg_common_create_luns())
---
 drivers/usb/gadget/function/f_mass_storage.c |  127 ++
 drivers/usb/gadget/function/f_mass_storage.h |4 -
 drivers/usb/gadget/legacy/acm_ms.c   |6 --
 drivers/usb/gadget/legacy/mass_storage.c |6 --
 drivers/usb/gadget/legacy/multi.c|6 --
 drivers/usb/gadget/legacy/nokia.c|   14 +--
 6 files changed, 50 insertions(+), 113 deletions(-)

diff --git a/drivers/usb/gadget/function/f_mass_storage.c 
b/drivers/usb/gadget/function/f_mass_storage.c
index 9870913..04c3bb6 100644
--- a/drivers/usb/gadget/function/f_mass_storage.c
+++ b/drivers/usb/gadget/function/f_mass_storage.c
@@ -279,9 +279,8 @@ struct fsg_common {
int cmnd_size;
u8  cmnd[MAX_COMMAND_SIZE];
 
-   unsigned intnluns;
unsigned intlun;
-   struct fsg_lun  **luns;
+   struct fsg_lun  *luns[FSG_MAX_LUNS];
struct fsg_lun  *curlun;
 
unsigned intbulk_out_maxpacket;
@@ -490,6 +489,16 @@ static void bulk_out_complete(struct usb_ep *ep, struct 
usb_request *req)
spin_unlock(&common->lock);
 }
 
+static int _fsg_common_get_max_lun(struct fsg_common *common)
+{
+   int i = ARRAY_SIZE(common->luns) - 1;
+
+   while (i >= 0 && !common->luns[i])
+   --i;
+
+   return i;
+}
+
 static int fsg_setup(struct usb_function *f,
 const struct usb_ctrlrequest *ctrl)
 {
@@ -533,7 +542,7 @@ static int fsg_setup(struct usb_function *f,
w_length != 1)
return -EDOM;
VDBG(fsg, "get max LUN\n");
-   *(u8 *)req->buf = fsg->common->nluns - 1;
+   *(u8 *)req->buf = _fsg_common_get_max_lun(fsg->common);
 
/* Respond with data/status */
req->length = min((u16)1, w_length);
@@ -2131,8 +2140,9 @@ static int received_cbw(struct fsg_dev *fsg, struct 
fsg_buffhd *bh)
}
 
/* Is the CBW meaningful? */
-   if (cbw->Lun >= FSG_MAX_LUNS || cbw->Flags & ~US_BULK_FLAG_IN ||
-   cbw->Length <= 0 || cbw->Length > MAX_COMMAND_SIZE) {
+   if (cbw->Lun >= ARRAY_SIZE(common->luns) ||
+   cbw->Flags & ~US_BULK_FLAG_IN || cbw->Length <= 0 ||
+   cbw->Length > MAX_COMMAND_SIZE) {
DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, "
"cmdlen %u\n",
cbw->Lun, cbw->Flags, cbw->Length);
@@ -2159,7 +2169,7 @@ static int received_cbw(struct fsg_dev *fsg, struct 
fsg_buffhd *bh)
if (common->data_size == 0)
common->data_dir = DATA_DIR_NONE;
common->lun = cbw->Lun;
-   if (common->lun < common->nluns)
+   if (common->lun < ARRAY_SIZE(common->luns))
common->curlun = common->luns[common->lun];
else
common->curlun = NULL;
@@ -2307,7 +2317,7 @@ reset:
}
 
common->running = 1;
-   for (i = 0; i < common->nluns; ++i)
+   for (i = 0; i < ARRAY_SIZE(common->luns); ++i)
if (common->luns[i])
common->luns[i]->unit_attention_data =
SS_RESET_OCCURRED;
@@ -2409,7 +2419,7 @@ static void handle_exception(struct fsg_common *common)
if (old_state == FSG_STATE_ABORT_BULK_OUT)
common->state = FSG_STATE_STATUS_PHASE;
else {
-   for (i = 0; i < common->nluns; ++i) {
+   for (i = 0; i < ARRAY_SIZE(common->luns); ++i) {
curlun = common->luns[i];
if (!curlun)
continue;
@@ -2453,7 +2463,7 @@ static void handle_exception(struct fsg_common *common)
 * a waste of time.  Ditto for the INTERFACE_CHANGE and
 * CONFIG_CHANGE cases.
 */
-   /* for (i = 0; i < common->nluns; ++i) */
+   /* for (i = 0; i < common->ARRAY_SIZE(common->luns); ++i) */
/*  if (common->luns[i]) */
/*  common->luns[i]->unit_attention_data = */
/*  SS_RESET_OCCURRED;  */
@@ -2552,12 +2562,11 @@ static int fsg_main_thread(void *common_)
 
if (!common->ops || !common->ops->thread_exits
 || common->ops->thread_exits(common) < 0) {
-   struct fsg_lun **curlun_it = common->luns;
- 

[PATCH] usb: gadget: mass_storage: Fix freeing luns sysfs implementation

2015-07-31 Thread Krzysztof Opasiak
Use device_is_registered() instad of sysfs flag to determine if
we should free sysfs representation of particular LUN.

sysfs flag in fsg common determines if luns attributes should be
exposed using sysfs. This flag is used when creating and freeing
luns. Unfortunately there is no guarantee that this flag will not
be changed between creation and removal of particular LUN. Especially
because of lun.0 which is created during allocating instance of
function. This may lead to resource leak or NULL pointer dereference:

[   62.539925] Unable to handle kernel NULL pointer dereference at virtual 
address 0044
[   62.548014] pgd = ec994000
[   62.550679] [0044] *pgd=6d7be831, *pte=, *ppte=
[   62.556933] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
[   62.562310] Modules linked in: g_mass_storage(+)
[   62.566916] CPU: 2 PID: 613 Comm: insmod Not tainted 
4.2.0-rc4-00077-ge29ee91-dirty #125
[   62.574984] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[   62.581061] task: eca56e80 ti: eca76000 task.ti: eca76000
[   62.586450] PC is at kernfs_find_ns+0x8/0xe8
[   62.590698] LR is at kernfs_find_and_get_ns+0x30/0x48
[   62.595732] pc : []lr : []psr: 40010053
[   62.595732] sp : eca77c40  ip : eca77c38  fp : 08c1
[   62.607187] r10: 0001  r9 : c0082f38  r8 : ed41ce40
[   62.612395] r7 : c05c1484  r6 :   r5 :   r4 : c0814488
[   62.618904] r3 :   r2 :   r1 : c05c1484  r0 : 
[   62.625417] Flags: nZcv  IRQs on  FIQs off  Mode SVC_32  ISA ARM  Segment 
user
[   62.632620] Control: 10c5387d  Table: 6c99404a  DAC: 0015
[   62.638348] Process insmod (pid: 613, stack limit = 0xeca76210)
[   62.644251] Stack: (0xeca77c40 to 0xeca78000)
[   62.648594] 7c40: c0814488   c05c1484 ed41ce40 c0127b88 
 c0824888
[   62.656753] 7c60: ed41d038 ed41d030 ed41d000 c012af4c  c0824858 
ed41d038 c02e3314
[   62.664912] 7c80: ed41d030  ed41ce04 c02d9e8c c070eda8 eca77cb4 
08c1 c058317c
[   62.673071] 7ca0: 08c1 ed41d030 ed41ce00 ed41ce04 ed41d000 c02da044 
ed41cf48 c0375870
[   62.681230] 7cc0: ed9d3c04 ed9d3c00 ed52df80 bf000940 fff0 c03758f4 
c03758c0 
[   62.689389] 7ce0: bf000564 c03614e0 ed9d3c04 bf000194 c0082f38 0001 
 c100
[   62.697548] 7d00: c0814488 c0814488 c086b1dc c05893a8  ed7e8320 
 c0128b88
[   62.705707] 7d20: ed8a6b40   ed410500 ed8a6b40 c0594818 
ed7e8320 
[   62.713867] 7d40:  c0129f20  c082c444 ed8a6b40 c012a684 
1000 
[   62.722026] 7d60: c0594818 c082c444   ed52df80 ed52df80 
 
[   62.730185] 7d80:   0001 0002 ed8e9b70 ed52df80 
bf0006d0 
[   62.738345] 7da0: ed8e9b70 ed410500 ed618340 c036129c ed8c1c00 bf0006d0 
c080b158 ed8c1c00
[   62.746504] 7dc0: bf0006d0 c080b158 ed8c1c08 ed410500 c0082f38 ed618340 
08c1 c03640ac
[   62.754663] 7de0:  bf0006d0 c082c8dc c080b158 c080b158 c03642d4 
 bf003000
[   62.762822] 7e00:  c0009784  0001  c05849b0 
0002 ee7ab780
[   62.770981] 7e20: 0002 ed4105c0 c53e 00d0 c0808600 eca77e5c 
0004 
[   62.779140] 7e40: bf00 c0095680 c08075a0 ee001f00 ed4105c0 c00cadc0 
ed52df80 bf000780
[   62.787300] 7e60: ed4105c0 bf000780 0001 bf0007c8 c0082f38 ed618340 
08c1 c0083e24
[   62.795459] 7e80: 0001 bf000780 0001 eca77f58 0001 bf000780 
0001 c00857f4
[   62.803618] 7ea0: bf00078c 7fff  c00835b4 eca77f58  
c0082fac eca77f58
[   62.811777] 7ec0: f05038c0 0003b008 bf000904   bf00078c 
6e72656b 6c65
[   62.819936] 7ee0:       
 
[   62.828095] 7f00:       
 
[   62.836255] 7f20:       
0003 0003b008
[   62.844414] 7f40: 017b c000f5c8 eca76000  0003b008 c0085df8 
f04ef000 0001b8a9
[   62.852573] 7f60: f0503258 f05030c2 f0509fe8 0968 0dc8  
 
[   62.860732] 7f80: 0029 002a 0011  000a  
33f6eb00 0003b008
[   62.868892] 7fa0: bef01cac c000f400 33f6eb00 0003b008 0003 0003b008 
 0003
[   62.877051] 7fc0: 33f6eb00 0003b008 bef01cac 017b  0003b008 
000b 0003b008
[   62.885210] 7fe0: bef01ae0 bef01ad0 0001dc23 b6e8c162 800b0070 0003 
c0c0c0c0 c0c0c0c0
[   62.893380] [] (kernfs_find_ns) from [] 
(pm_qos_latency_tolerance_attr_group+0x0/0x10)
[   62.903005] Code: e28dd00c e8bd80f0 e92d41f0 e2923000 (e1d0e4b4)
[   62.909115] ---[ end trace 02fb4373ef095c7b ]---

Signed-off-by: Krzysztof Opasiak 
---
 drivers/usb/gadget/function/f_mass_storage.c |   12 ++--
 drivers/usb/gadget/function/f_mass_storage.h |2 +-
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/driver

Re: [PATCH v9 4/4] USB: io_ti: Add heartbeat to keep idle EP/416 ports from disconnecting

2015-07-31 Thread Johan Hovold
On Fri, Jul 31, 2015 at 01:55:08AM -0500, Peter E. Berger wrote:
> From: "Peter E. Berger" 
> 
> When using Edgeport/416 models with newer firmware (sometime after
> firmware version 4.80.0), idle ports are automatically bounced
> (disconnected and then reconnected) approximately every 60 seconds.
> This breaks programs (e.g: minicom) where idle periods are common,
> normal and expected.
> 
> I confirmed with the manufacturer (Digi International) that Edgeport/416
> models now ship from the factory with firmware that expects periodic
> "heartbeat" queries from the driver to keep idle ports alive.  This
> patch implements heartbeat support using the mechanism Digi suggested
> (periodically requesting an I2C descriptor address) that appears effective
> on Edgeports running the newer firmware (that require it) and benign on
> Edgeport devices running older firmware.  Since we know that Edgeport
> firmware version 4.80 (the version distributed in /lib/firmware/down3.bin
> and used for Edgeports that are either running still older versions or
> have no onboard non-volatile firmware image) does not require heartbeat
> support, this patch schedules heartbeats only on Edgeport/416 devices,
> and only if they are running firmware versions newer than 4.80.
> 
> Signed-off-by: Peter E. Berger 

All now applied for 4.3 (this one with some really minor style changes).

Thanks again for fixing this!

Johan
--
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 v9 3/4] USB: io_ti: Add firmware image sanity checks

2015-07-31 Thread Johan Hovold
On Fri, Jul 31, 2015 at 01:55:07AM -0500, Peter E. Berger wrote:
> From: "Peter E. Berger" 
 
> +static int check_fw_sanity(struct edgeport_serial *serial,
> + const struct firmware *fw)
> +{
> + u16 length_total;
> + u8 checksum = 0;
> + int pos;
> + struct device *dev = &serial->serial->interface->dev;
> + struct edgeport_fw_hdr *fw_hdr = (struct edgeport_fw_hdr *)fw->data;
> +
> + if (fw->size < sizeof(struct edgeport_fw_hdr)) {
> + dev_err(dev, "incomplete fw header\n");
> + return -EINVAL;
> + }
> +
> + length_total = le16_to_cpu(fw_hdr->length) +
> + sizeof(struct edgeport_fw_hdr);
> +
> + if (fw->size != length_total) {
> + dev_err(dev, "bad fw size (expected: %u, got: %zu)\n",
> + length_total, fw->size);
> + return -EINVAL;
> + }
> +
> + for (pos = sizeof(struct edgeport_fw_hdr); pos < fw->size; ++pos)
> + checksum = (checksum + fw->data[pos]) & 0xFF;

I simplified this to

checksum += fw->data[pos];

before applying.

Thanks,
Johan
--
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 3/3] doc: usb: gadget-testing: using the updated testusb.c

2015-07-31 Thread Peter Chen
testusb.c at http://www.linux-usb.org/usbtest/ is out of date,
using the one at the kernel source folder.

Cc: 
Signed-off-by: Peter Chen 
---
 Documentation/usb/gadget-testing.txt | 7 ++-
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/Documentation/usb/gadget-testing.txt 
b/Documentation/usb/gadget-testing.txt
index 5926780..b24d3ef 100644
--- a/Documentation/usb/gadget-testing.txt
+++ b/Documentation/usb/gadget-testing.txt
@@ -237,9 +237,7 @@ Testing the LOOPBACK function
 -
 
 device: run the gadget
-host: test-usb
-
-http://www.linux-usb.org/usbtest/testusb.c
+host: test-usb (tools/usb/testusb.c)
 
 8. MASS STORAGE function
 
@@ -586,9 +584,8 @@ Testing the SOURCESINK function
 ---
 
 device: run the gadget
-host: test-usb
+host: test-usb (tools/usb/testusb.c)
 
-http://www.linux-usb.org/usbtest/testusb.c
 
 16. UAC1 function
 =
-- 
1.9.1

--
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 1/3] Doc: ABI: testing: configfs-usb-gadget-loopback

2015-07-31 Thread Peter Chen
Fix the name of attribute

Cc: 
Signed-off-by: Peter Chen 
---
 Documentation/ABI/testing/configfs-usb-gadget-loopback | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/configfs-usb-gadget-loopback 
b/Documentation/ABI/testing/configfs-usb-gadget-loopback
index 9aae5bf..06beefb 100644
--- a/Documentation/ABI/testing/configfs-usb-gadget-loopback
+++ b/Documentation/ABI/testing/configfs-usb-gadget-loopback
@@ -5,4 +5,4 @@ Description:
The attributes:
 
qlen- depth of loopback queue
-   bulk_buflen - buffer length
+   buflen  - buffer length
-- 
1.9.1

--
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 2/3] Doc: ABI: testing: configfs-usb-gadget-sourcesink

2015-07-31 Thread Peter Chen
Fix the name of attribute

Cc: 
Signed-off-by: Peter Chen 
---
 Documentation/ABI/testing/configfs-usb-gadget-sourcesink | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/configfs-usb-gadget-sourcesink 
b/Documentation/ABI/testing/configfs-usb-gadget-sourcesink
index 29477c3..bc7ff73 100644
--- a/Documentation/ABI/testing/configfs-usb-gadget-sourcesink
+++ b/Documentation/ABI/testing/configfs-usb-gadget-sourcesink
@@ -9,4 +9,4 @@ Description:
isoc_maxpacket  - 0 - 1023 (fs), 0 - 1024 (hs/ss)
isoc_mult   - 0..2 (hs/ss only)
isoc_maxburst   - 0..15 (ss only)
-   qlen- buffer length
+   buflen  - buffer length
-- 
1.9.1

--
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 3/3] phy-sun4i-usb: Only check vbus-det on power-on on boards with vbus-det

2015-07-31 Thread Hans de Goede
data->vbus_det is always 1 on boards without a (working) vbus-det, skip
the vbus_det test on such boards.

This fixes the sun4i usb phy code never turning on Vbus on such boards.

Signed-off-by: Hans de Goede 
---
 drivers/phy/phy-sun4i-usb.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index ddb9fd2..12c5e4eb 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -328,7 +328,8 @@ static int sun4i_usb_phy_power_on(struct phy *_phy)
return 0;
 
/* For phy0 only turn on Vbus if we don't have an ext. Vbus */
-   if (phy->index == 0 && data->vbus_det)
+   if (phy->index == 0 && sun4i_usb_phy0_have_vbus_det(data) &&
+   data->vbus_det)
return 0;
 
ret = regulator_enable(phy->vbus);
-- 
2.4.3

--
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 0/3] phy-sun4i-usb: 3 misc. fixes

2015-07-31 Thread Hans de Goede
Hi Kishon,

Here are 3 small patches for the phy-sun4i-usb code.

The first patch is a small bugfix for building the sun4i musb code as
module which seems to have fallen through the cracks.

The second patch is a preparation patch for the third patch which
fixes the case of boards with a working VBus regulator, but broken
VBus detection support, yes unfortunately such boards exist.

Can you please merge these 3 into linux-phy/next ?

Thanks & Regards,

Hans
--
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 1/3] phy-sun4i-usb: Add missing EXPORT_SYMBOL for sun4i_usb_phy_set_squelch_detect

2015-07-31 Thread Hans de Goede
sun4i_usb_phy_set_squelch_detect is used by other code, which may be built
as a module, so it should be exported.

Signed-off-by: Hans de Goede 
---
Changes in v6:
-New patch in v6 of the sunxi musb support series
---
 drivers/phy/phy-sun4i-usb.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index 5138843..d514a9b 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -347,6 +347,7 @@ void sun4i_usb_phy_set_squelch_detect(struct phy *_phy, 
bool enabled)
 
sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2);
 }
+EXPORT_SYMBOL(sun4i_usb_phy_set_squelch_detect);
 
 static struct phy_ops sun4i_usb_phy_ops = {
.init   = sun4i_usb_phy_init,
-- 
2.4.3

--
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 2/3] phy-sun4i-sub: Move vbus-detect helper functions up in the file

2015-07-31 Thread Hans de Goede
Move vbus-detect helper functions up in the file, just moving some code
around, no functional changes what so ever.

Signed-off-by: Hans de Goede 
---
 drivers/phy/phy-sun4i-usb.c | 48 ++---
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index d514a9b..ddb9fd2 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -294,6 +294,30 @@ static int sun4i_usb_phy_exit(struct phy *_phy)
return 0;
 }
 
+static int sun4i_usb_phy0_get_vbus_det(struct sun4i_usb_phy_data *data)
+{
+   if (data->vbus_det_gpio)
+   return gpiod_get_value_cansleep(data->vbus_det_gpio);
+
+   if (data->vbus_power_supply) {
+   union power_supply_propval val;
+   int r;
+
+   r = power_supply_get_property(data->vbus_power_supply,
+ POWER_SUPPLY_PROP_PRESENT, &val);
+   if (r == 0)
+   return val.intval;
+   }
+
+   /* Fallback: report vbus as high */
+   return 1;
+}
+
+static bool sun4i_usb_phy0_have_vbus_det(struct sun4i_usb_phy_data *data)
+{
+   return data->vbus_det_gpio || data->vbus_power_supply;
+}
+
 static int sun4i_usb_phy_power_on(struct phy *_phy)
 {
struct sun4i_usb_phy *phy = phy_get_drvdata(_phy);
@@ -357,30 +381,6 @@ static struct phy_ops sun4i_usb_phy_ops = {
.owner  = THIS_MODULE,
 };
 
-static int sun4i_usb_phy0_get_vbus_det(struct sun4i_usb_phy_data *data)
-{
-   if (data->vbus_det_gpio)
-   return gpiod_get_value_cansleep(data->vbus_det_gpio);
-
-   if (data->vbus_power_supply) {
-   union power_supply_propval val;
-   int r;
-
-   r = power_supply_get_property(data->vbus_power_supply,
- POWER_SUPPLY_PROP_PRESENT, &val);
-   if (r == 0)
-   return val.intval;
-   }
-
-   /* Fallback: report vbus as high */
-   return 1;
-}
-
-static bool sun4i_usb_phy0_have_vbus_det(struct sun4i_usb_phy_data *data)
-{
-   return data->vbus_det_gpio || data->vbus_power_supply;
-}
-
 static void sun4i_usb_phy0_id_vbus_det_scan(struct work_struct *work)
 {
struct sun4i_usb_phy_data *data =
-- 
2.4.3

--
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


Fwd: [Bug 102101] USB 3 storage device disconnects after S3 resume,and re-enumerate it.

2015-07-31 Thread Aaron Zhou
There is a USB 3 bug .
Are you have any suggests?

Aaron Chou

-- Forwarded message --
From:  
Date: Wed, Jul 29, 2015 at 10:13 PM
Subject: [Bug 102101] USB 3 storage device disconnects after S3
resume,and re-enumerate it.
To: zhoubb.aa...@gmail.com


https://bugzilla.kernel.org/show_bug.cgi?id=102101

--- Comment #1 from Greg Kroah-Hartman  ---
On Wed, Jul 29, 2015 at 07:52:12AM +, bugzilla-dae...@bugzilla.kernel.org
wrote:
> https://bugzilla.kernel.org/show_bug.cgi?id=102101
>
> Bug ID: 102101
>Summary: USB 3 storage device disconnects after S3 resume,and
> re-enumerate it.

Please send to the linux-usb@vger.kernel.org mailing list.

--
You are receiving this mail because:
You reported the bug.
--
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