2017-03-08 16:27:58

by Gregory CLEMENT

[permalink] [raw]
Subject: [PATCH 0/3] Add EHCI support for Armada 37xx

Hi,

The EHCI controller in the Armada 37xx SoCs is the one used on many
other mvebu SoCs such as the orion5x, the kirkwood, or the
armada. However, for Armada 37xx an extra initialization step is
needed: this is the purpose of the first patch.

The second patch allows to build the driver for the ARM64 Armada SoCs.

The last one enables the EHCI in the device tree.

Thanks,

Gregory

Gregory CLEMENT (2):
usb: host: Allow to build ehci orion with mvebu SoCs
ARM64: dts: marvell: armada-37xx: Add USB2 node

jinghua (1):
usb: orion-echi: Add support for the Armada 3700

.../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
arch/arm64/boot/dts/marvell/armada-3720-db.dts | 6 ++++
arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 7 ++++
drivers/usb/host/Kconfig | 2 +-
drivers/usb/host/ehci-orion.c | 39 ++++++++++++++++++++++
5 files changed, 56 insertions(+), 2 deletions(-)

--
2.11.0


2017-03-08 16:26:32

by Gregory CLEMENT

[permalink] [raw]
Subject: [PATCH 1/3] usb: orion-echi: Add support for the Armada 3700

From: jinghua <[email protected]>

- Add a new compatoble string for the Armada 3700 SoCs

- add sbuscfg support for orion usb controller driver. For the SoCs
without hlock, need to program BAWR/BARD/AHBBRST fields in the sbuscfg
register to guarantee the AHB master's burst would not overrun or
underrun the FIFO.

- the sbuscfg register has to be set after the usb controller reset,
otherwise the value would be overridden to 0. In order to do this, the
reset callback is registered.

[[email protected]: - reword commit and comments
- fix checkpatch warning]
Signed-off-by: jinghua <[email protected]>
Signed-off-by: Gregory CLEMENT <[email protected]>
---
.../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
drivers/usb/host/ehci-orion.c | 39 ++++++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt
index 17c3bc858b86..9dfffc9dffec 100644
--- a/Documentation/devicetree/bindings/usb/ehci-orion.txt
+++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt
@@ -1,7 +1,9 @@
* EHCI controller, Orion Marvell variants

Required properties:
-- compatible: must be "marvell,orion-ehci"
+- compatible: could be one of the following
+ "marvell,orion-ehci"
+ "marvell,armada-3700-ehci"
- reg: physical base address of the controller and length of memory mapped
region.
- interrupts: The EHCI interrupt
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
index ee8d5faa0194..cf778e166b90 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -47,6 +47,21 @@
#define USB_PHY_IVREF_CTRL 0x440
#define USB_PHY_TST_GRP_CTRL 0x450

+#define USB_SBUSCFG 0x90
+#define USB_SBUSCFG_BAWR 0x6
+#define USB_SBUSCFG_BARD 0x3
+#define USB_SBUSCFG_AHBBRST 0x0
+
+/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
+#define USB_SBUSCFG_BAWR_ALIGN_128B 0x3
+#define USB_SBUSCFG_BARD_ALIGN_128B 0x3
+/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
+#define USB_SBUSCFG_AHBBRST_INCR16 0x3
+
+#define USB_SBUSCFG_DEF_VAL ((USB_SBUSCFG_BAWR_ALIGN_128B << USB_SBUSCFG_BAWR) \
+ | (USB_SBUSCFG_BARD_ALIGN_128B << USB_SBUSCFG_BARD) \
+ | (USB_SBUSCFG_AHBBRST_INCR16 << USB_SBUSCFG_AHBBRST))
+
#define DRIVER_DESC "EHCI orion driver"

#define hcd_to_orion_priv(h) ((struct orion_ehci_hcd *)hcd_to_ehci(h)->priv)
@@ -151,8 +166,31 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd,
}
}

+static int ehci_orion_drv_reset(struct usb_hcd *hcd)
+{
+ struct device *dev = hcd->self.controller;
+ int retval;
+
+ retval = ehci_setup(hcd);
+ if (retval)
+ dev_err(dev, "ehci_setup failed %d\n", retval);
+
+ /*
+ * For SoC without hlock, need to program sbuscfg value to guarantee
+ * AHB master's burst would not overrun or underrun FIFO.
+ *
+ * sbuscfg reg has to be set after usb controller reset, otherwise
+ * the value would be override to 0.
+ */
+ if (of_device_is_compatible(dev->of_node, "marvell,armada-3700-ehci"))
+ wrl(USB_SBUSCFG, USB_SBUSCFG_DEF_VAL);
+
+ return retval;
+}
+
static const struct ehci_driver_overrides orion_overrides __initconst = {
.extra_priv_size = sizeof(struct orion_ehci_hcd),
+ .reset = ehci_orion_drv_reset,
};

static int ehci_orion_drv_probe(struct platform_device *pdev)
@@ -310,6 +348,7 @@ static int ehci_orion_drv_remove(struct platform_device *pdev)

static const struct of_device_id ehci_orion_dt_ids[] = {
{ .compatible = "marvell,orion-ehci", },
+ { .compatible = "marvell,armada-3700-ehci", },
{},
};
MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids);
--
2.11.0

2017-03-08 16:27:27

by Gregory CLEMENT

[permalink] [raw]
Subject: [PATCH 2/3] usb: host: Allow to build ehci orion with mvebu SoCs

The mvebu ARM64 SoCs no more select PLAT_ORION but some of them as the
Armada 37xx use the EHCI orion controller. This patch allow to build
the driver when ARCH_MVEBU is selected.

Signed-off-by: Gregory CLEMENT <[email protected]>
---
drivers/usb/host/Kconfig | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
index 407d947b34ea..870c42d89298 100644
--- a/drivers/usb/host/Kconfig
+++ b/drivers/usb/host/Kconfig
@@ -188,7 +188,7 @@ config USB_EHCI_HCD_OMAP

config USB_EHCI_HCD_ORION
tristate "Support for Marvell EBU on-chip EHCI USB controller"
- depends on USB_EHCI_HCD && PLAT_ORION
+ depends on USB_EHCI_HCD && PLAT_ORION || ARCH_MVEBU
default y
---help---
Enables support for the on-chip EHCI controller on Marvell's
--
2.11.0

2017-03-08 16:27:28

by Gregory CLEMENT

[permalink] [raw]
Subject: [PATCH 3/3] ARM64: dts: marvell: armada-37xx: Add USB2 node

Armada 37xx SoC embedded an EHCI controller. This patch adds the device
tree node enabling its support.

Signed-off-by: Gregory CLEMENT <[email protected]>
---
arch/arm64/boot/dts/marvell/armada-3720-db.dts | 6 ++++++
arch/arm64/boot/dts/marvell/armada-37xx.dtsi | 7 +++++++
2 files changed, 13 insertions(+)

diff --git a/arch/arm64/boot/dts/marvell/armada-3720-db.dts b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
index 864936acc316..aa39339b6582 100644
--- a/arch/arm64/boot/dts/marvell/armada-3720-db.dts
+++ b/arch/arm64/boot/dts/marvell/armada-3720-db.dts
@@ -134,6 +134,12 @@
status = "okay";
};

+/* CON27 */
+&usb2 {
+ status = "okay";
+};
+
+
&mdio {
status = "okay";
phy0: ethernet-phy@0 {
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index 4c7ff32acb97..25ae5ccaf1bf 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -204,6 +204,13 @@
status = "disabled";
};

+ usb2: usb@5e000 {
+ compatible = "marvell,armada-3700-ehci";
+ reg = <0x5e000 0x2000>;
+ interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
+ status = "disabled";
+ };
+
xor@60900 {
compatible = "marvell,armada-3700-xor";
reg = <0x60900 0x100
--
2.11.0

2017-03-08 16:59:27

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH 1/3] usb: orion-echi: Add support for the Armada 3700

Hi Gregory

> - Add a new compatoble string for the Armada 3700 SoCs

compatible

>
> - add sbuscfg support for orion usb controller driver. For the SoCs
> without hlock, need to program BAWR/BARD/AHBBRST fields in the sbuscfg
> register to guarantee the AHB master's burst would not overrun or
> underrun the FIFO.
>
> - the sbuscfg register has to be set after the usb controller reset,
> otherwise the value would be overridden to 0. In order to do this, the
> reset callback is registered.
>
> [[email protected]: - reword commit and comments
> - fix checkpatch warning]
> Signed-off-by: jinghua <[email protected]>
> Signed-off-by: Gregory CLEMENT <[email protected]>
> ---
> .../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
> drivers/usb/host/ehci-orion.c | 39 ++++++++++++++++++++++
> 2 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt
> index 17c3bc858b86..9dfffc9dffec 100644
> --- a/Documentation/devicetree/bindings/usb/ehci-orion.txt
> +++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt
> @@ -1,7 +1,9 @@
> * EHCI controller, Orion Marvell variants
>
> Required properties:
> -- compatible: must be "marvell,orion-ehci"
> +- compatible: could be one of the following

must, not could.

> + "marvell,orion-ehci"
> + "marvell,armada-3700-ehci"
> - reg: physical base address of the controller and length of memory mapped
> region.
> - interrupts: The EHCI interrupt
> diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c
> index ee8d5faa0194..cf778e166b90 100644
> --- a/drivers/usb/host/ehci-orion.c
> +++ b/drivers/usb/host/ehci-orion.c
> @@ -47,6 +47,21 @@
> #define USB_PHY_IVREF_CTRL 0x440
> #define USB_PHY_TST_GRP_CTRL 0x450
>
> +#define USB_SBUSCFG 0x90
> +#define USB_SBUSCFG_BAWR 0x6
> +#define USB_SBUSCFG_BARD 0x3
> +#define USB_SBUSCFG_AHBBRST 0x0

These three are all shifts. So i would suggest adding _SHIFT to the
end.

> +
> +/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
> +#define USB_SBUSCFG_BAWR_ALIGN_128B 0x3
> +#define USB_SBUSCFG_BARD_ALIGN_128B 0x3
> +/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
> +#define USB_SBUSCFG_AHBBRST_INCR16 0x3

You can then apply the shift here.

> +
> +#define USB_SBUSCFG_DEF_VAL ((USB_SBUSCFG_BAWR_ALIGN_128B << USB_SBUSCFG_BAWR) \
> + | (USB_SBUSCFG_BARD_ALIGN_128B << USB_SBUSCFG_BARD) \
> + | (USB_SBUSCFG_AHBBRST_INCR16 << USB_SBUSCFG_AHBBRST))

and this is then shorted.

Andrew

2017-03-08 17:22:30

by Gregory CLEMENT

[permalink] [raw]
Subject: Re: [PATCH 1/3] usb: orion-echi: Add support for the Armada 3700

Hi Andrew,

On mer., mars 08 2017, Andrew Lunn <[email protected]> wrote:

> Hi Gregory
[...]

Thanks for your comments I will fix the typos and the wording.



>> +#define USB_SBUSCFG 0x90
>> +#define USB_SBUSCFG_BAWR 0x6
>> +#define USB_SBUSCFG_BARD 0x3
>> +#define USB_SBUSCFG_AHBBRST 0x0
>
> These three are all shifts. So i would suggest adding _SHIFT to the
> end.

Actually I removed it to fit in the 80 character...

>
>> +
>> +/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
>> +#define USB_SBUSCFG_BAWR_ALIGN_128B 0x3
>> +#define USB_SBUSCFG_BARD_ALIGN_128B 0x3
>> +/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
>> +#define USB_SBUSCFG_AHBBRST_INCR16 0x3
>
> You can then apply the shift here.

... but I didn't think to this trick.

>
>> +
>> +#define USB_SBUSCFG_DEF_VAL ((USB_SBUSCFG_BAWR_ALIGN_128B << USB_SBUSCFG_BAWR) \
>> + | (USB_SBUSCFG_BARD_ALIGN_128B << USB_SBUSCFG_BARD) \
>> + | (USB_SBUSCFG_AHBBRST_INCR16 << USB_SBUSCFG_AHBBRST))
>
> and this is then shorted.

So I will do it in the v2.

Thanks

Gregory

>
> Andrew

--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

2017-03-08 17:24:20

by Gregory CLEMENT

[permalink] [raw]
Subject: Re: [PATCH 2/3] usb: host: Allow to build ehci orion with mvebu SoCs

Hi Andrew,

On mer., mars 08 2017, Andrew Lunn <[email protected]> wrote:

> On Wed, Mar 08, 2017 at 05:24:22PM +0100, Gregory CLEMENT wrote:
>> The mvebu ARM64 SoCs no more select PLAT_ORION but some of them as the
>> Armada 37xx use the EHCI orion controller. This patch allow to build
>> the driver when ARCH_MVEBU is selected.
>
> The mvebu ARM64 SoCs no longer selects PLAT_ORION. However Armada
> 37xx use the Orion EHCI controller. This patch allows the Orion EHCI
> driver to be built when ARCH_MVEBU is selected.

Thanks for this enhancement!

>
>> Signed-off-by: Gregory CLEMENT <[email protected]>
>> ---
>> drivers/usb/host/Kconfig | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
>> index 407d947b34ea..870c42d89298 100644
>> --- a/drivers/usb/host/Kconfig
>> +++ b/drivers/usb/host/Kconfig
>> @@ -188,7 +188,7 @@ config USB_EHCI_HCD_OMAP
>>
>> config USB_EHCI_HCD_ORION
>> tristate "Support for Marvell EBU on-chip EHCI USB controller"
>> - depends on USB_EHCI_HCD && PLAT_ORION
>> + depends on USB_EHCI_HCD && PLAT_ORION || ARCH_MVEBU
>
> I don't know the Kconfig language too well. Should this be:
>
>> + depends on USB_EHCI_HCD && (PLAT_ORION || ARCH_MVEBU)

Your version seems better.

Thanks,

Gregory

>
> Andrew
>
> _______________________________________________
> linux-arm-kernel mailing list
> [email protected]
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com

2017-03-08 17:40:14

by Andrew Lunn

[permalink] [raw]
Subject: Re: [PATCH 2/3] usb: host: Allow to build ehci orion with mvebu SoCs

On Wed, Mar 08, 2017 at 05:24:22PM +0100, Gregory CLEMENT wrote:
> The mvebu ARM64 SoCs no more select PLAT_ORION but some of them as the
> Armada 37xx use the EHCI orion controller. This patch allow to build
> the driver when ARCH_MVEBU is selected.

The mvebu ARM64 SoCs no longer selects PLAT_ORION. However Armada
37xx use the Orion EHCI controller. This patch allows the Orion EHCI
driver to be built when ARCH_MVEBU is selected.

> Signed-off-by: Gregory CLEMENT <[email protected]>
> ---
> drivers/usb/host/Kconfig | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
> index 407d947b34ea..870c42d89298 100644
> --- a/drivers/usb/host/Kconfig
> +++ b/drivers/usb/host/Kconfig
> @@ -188,7 +188,7 @@ config USB_EHCI_HCD_OMAP
>
> config USB_EHCI_HCD_ORION
> tristate "Support for Marvell EBU on-chip EHCI USB controller"
> - depends on USB_EHCI_HCD && PLAT_ORION
> + depends on USB_EHCI_HCD && PLAT_ORION || ARCH_MVEBU

I don't know the Kconfig language too well. Should this be:

> + depends on USB_EHCI_HCD && (PLAT_ORION || ARCH_MVEBU)

Andrew

2017-03-08 21:02:28

by Thomas Petazzoni

[permalink] [raw]
Subject: Re: [PATCH 1/3] usb: orion-echi: Add support for the Armada 3700

Hello,

On Wed, 8 Mar 2017 17:24:21 +0100, Gregory CLEMENT wrote:

> Signed-off-by: jinghua <[email protected]>

I think you need a full first name + last name for this Signed-off-by.

Best regards,

Thomas
--
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com