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.
This forth version really takes into account the review from Alan Stern.
Again sorry for the noise.
Thanks,
Gregory
Changelog:
v3-> v4:
- Remove the _SHIFT define and use their value directly, suggested by
Alan Stern
- Remove unnecessary error message in ehci_orion_drv_reset() ,
suggested by Alan Stern
- Exit ehci_orion_drv_reset() if ehci_setup() failed, suggested by
Alan Stern
v2-> v3:
- Add Reviewed-by flag from Andrew Lunn
v1 -> v2:
- Fix typo in commit log of the patch 1, suggested by Andrew Lunn
- Fix wording in the device tree binding documenation, suggested by
Andrew Lunn
- Make new define symbol name more clear by adding _SHIFT to the end,
suggested by Andrew Lunn
- Use a full first name + last name for the Signed-off-by and the
Authorship i oatch 1, suggested by Thomas Petazzoni.
- Improve the commit log of the patch 2, suggested by Andrew Lunn
- Fix Kconfig logic, suggested by Andrew Lunn
Gregory CLEMENT (2):
usb: host: Allow to build ehci orion with mvebu SoCs
ARM64: dts: marvell: armada-37xx: Add USB2 node
Hua Jing (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 | 36 ++++++++++++++++++++++
5 files changed, 53 insertions(+), 2 deletions(-)
--
2.11.0
The mvebu ARM64 SoCs no longer select 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.
Reviewed-by: Andrew Lunn <[email protected]>
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..54bdd76c7f03 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
Armada 37xx SoC embedded an EHCI controller. This patch adds the device
tree node enabling its support.
Reviewed-by: Andrew Lunn <[email protected]>
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 cf0c2f9ebd7d..7639518d8ee1 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
From: Hua Jing <[email protected]>
- Add a new compatible 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 error path in ehci_orion_drv_reset()
- fix checkpatch warning]
Signed-off-by: Hua Jing <[email protected]>
Signed-off-by: Gregory CLEMENT <[email protected]>
Reviewed-by: Andrew Lunn <[email protected]>
---
.../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
drivers/usb/host/ehci-orion.c | 36 ++++++++++++++++++++++
2 files changed, 39 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt
index 17c3bc858b86..2855bae79fda 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: must 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..1aec87ec68df 100644
--- a/drivers/usb/host/ehci-orion.c
+++ b/drivers/usb/host/ehci-orion.c
@@ -47,6 +47,18 @@
#define USB_PHY_IVREF_CTRL 0x440
#define USB_PHY_TST_GRP_CTRL 0x450
+#define USB_SBUSCFG 0x90
+
+/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
+#define USB_SBUSCFG_BAWR_ALIGN_128B (0x3 << 6)
+#define USB_SBUSCFG_BARD_ALIGN_128B (0x3 << 3)
+/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
+#define USB_SBUSCFG_AHBBRST_INCR16 (0x3 << 0)
+
+#define USB_SBUSCFG_DEF_VAL (USB_SBUSCFG_BAWR_ALIGN_128B \
+ | USB_SBUSCFG_BARD_ALIGN_128B \
+ | USB_SBUSCFG_AHBBRST_INCR16)
+
#define DRIVER_DESC "EHCI orion driver"
#define hcd_to_orion_priv(h) ((struct orion_ehci_hcd *)hcd_to_ehci(h)->priv)
@@ -151,8 +163,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 ret;
+
+ ret = ehci_setup(hcd);
+ if (ret)
+ return ret;
+
+ /*
+ * 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 ret;
+}
+
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 +345,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
On Thu, 9 Mar 2017, Gregory CLEMENT wrote:
> From: Hua Jing <[email protected]>
>
> - Add a new compatible 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 error path in ehci_orion_drv_reset()
> - fix checkpatch warning]
> Signed-off-by: Hua Jing <[email protected]>
> Signed-off-by: Gregory CLEMENT <[email protected]>
> Reviewed-by: Andrew Lunn <[email protected]>
Acked-by: Alan Stern <[email protected]>
> ---
> .../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
> drivers/usb/host/ehci-orion.c | 36 ++++++++++++++++++++++
> 2 files changed, 39 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt
> index 17c3bc858b86..2855bae79fda 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: must 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..1aec87ec68df 100644
> --- a/drivers/usb/host/ehci-orion.c
> +++ b/drivers/usb/host/ehci-orion.c
> @@ -47,6 +47,18 @@
> #define USB_PHY_IVREF_CTRL 0x440
> #define USB_PHY_TST_GRP_CTRL 0x450
>
> +#define USB_SBUSCFG 0x90
> +
> +/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
> +#define USB_SBUSCFG_BAWR_ALIGN_128B (0x3 << 6)
> +#define USB_SBUSCFG_BARD_ALIGN_128B (0x3 << 3)
> +/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
> +#define USB_SBUSCFG_AHBBRST_INCR16 (0x3 << 0)
> +
> +#define USB_SBUSCFG_DEF_VAL (USB_SBUSCFG_BAWR_ALIGN_128B \
> + | USB_SBUSCFG_BARD_ALIGN_128B \
> + | USB_SBUSCFG_AHBBRST_INCR16)
> +
> #define DRIVER_DESC "EHCI orion driver"
>
> #define hcd_to_orion_priv(h) ((struct orion_ehci_hcd *)hcd_to_ehci(h)->priv)
> @@ -151,8 +163,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 ret;
> +
> + ret = ehci_setup(hcd);
> + if (ret)
> + return ret;
> +
> + /*
> + * 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 ret;
> +}
> +
> 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 +345,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);
>
Hi Alan,
On jeu., mars 09 2017, Alan Stern <[email protected]> wrote:
> On Thu, 9 Mar 2017, Gregory CLEMENT wrote:
>
>> From: Hua Jing <[email protected]>
>>
>> - Add a new compatible 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 error path in ehci_orion_drv_reset()
>> - fix checkpatch warning]
>> Signed-off-by: Hua Jing <[email protected]>
>> Signed-off-by: Gregory CLEMENT <[email protected]>
>> Reviewed-by: Andrew Lunn <[email protected]>
>
> Acked-by: Alan Stern <[email protected]>
Thanks!
And what about the second patch "usb: host: Allow to build ehci orion
with mvebu SoCs " ?
I don't remember what is the workflow for the usb subsystem. Will you do
a pull request to GKH? Or maybe he collects himself the patch once you
give your acked-by.
I will take care of the third patch and apply on the mvebu/dt64 branch
now that you agree the extension for the driver.
Gregory
>
>> ---
>> .../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
>> drivers/usb/host/ehci-orion.c | 36 ++++++++++++++++++++++
>> 2 files changed, 39 insertions(+), 1 deletion(-)
>>
>> diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt
>> index 17c3bc858b86..2855bae79fda 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: must 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..1aec87ec68df 100644
>> --- a/drivers/usb/host/ehci-orion.c
>> +++ b/drivers/usb/host/ehci-orion.c
>> @@ -47,6 +47,18 @@
>> #define USB_PHY_IVREF_CTRL 0x440
>> #define USB_PHY_TST_GRP_CTRL 0x450
>>
>> +#define USB_SBUSCFG 0x90
>> +
>> +/* BAWR = BARD = 3 : Align read/write bursts packets larger than 128 bytes */
>> +#define USB_SBUSCFG_BAWR_ALIGN_128B (0x3 << 6)
>> +#define USB_SBUSCFG_BARD_ALIGN_128B (0x3 << 3)
>> +/* AHBBRST = 3 : Align AHB Burst to INCR16 (64 bytes) */
>> +#define USB_SBUSCFG_AHBBRST_INCR16 (0x3 << 0)
>> +
>> +#define USB_SBUSCFG_DEF_VAL (USB_SBUSCFG_BAWR_ALIGN_128B \
>> + | USB_SBUSCFG_BARD_ALIGN_128B \
>> + | USB_SBUSCFG_AHBBRST_INCR16)
>> +
>> #define DRIVER_DESC "EHCI orion driver"
>>
>> #define hcd_to_orion_priv(h) ((struct orion_ehci_hcd *)hcd_to_ehci(h)->priv)
>> @@ -151,8 +163,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 ret;
>> +
>> + ret = ehci_setup(hcd);
>> + if (ret)
>> + return ret;
>> +
>> + /*
>> + * 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 ret;
>> +}
>> +
>> 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 +345,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);
>>
>
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
On Fri, Mar 10, 2017 at 10:55:23AM +0100, Gregory CLEMENT wrote:
> Hi Alan,
>
> On jeu., mars 09 2017, Alan Stern <[email protected]> wrote:
>
> > On Thu, 9 Mar 2017, Gregory CLEMENT wrote:
> >
> >> From: Hua Jing <[email protected]>
> >>
> >> - Add a new compatible 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 error path in ehci_orion_drv_reset()
> >> - fix checkpatch warning]
> >> Signed-off-by: Hua Jing <[email protected]>
> >> Signed-off-by: Gregory CLEMENT <[email protected]>
> >> Reviewed-by: Andrew Lunn <[email protected]>
> >
> > Acked-by: Alan Stern <[email protected]>
>
> Thanks!
>
> And what about the second patch "usb: host: Allow to build ehci orion
> with mvebu SoCs " ?
>
> I don't remember what is the workflow for the usb subsystem. Will you do
> a pull request to GKH? Or maybe he collects himself the patch once you
> give your acked-by.
>
> I will take care of the third patch and apply on the mvebu/dt64 branch
> now that you agree the extension for the driver.
I'll take all of these once they look "good enough". Give me a week or
so to get to all of the pending patches in my queue...
thanks,
greg k-h
On Thu, Mar 09, 2017 at 06:52:56PM +0100, Gregory CLEMENT wrote:
> From: Hua Jing <[email protected]>
s/echi/ehci/ in the subject.
>
> - Add a new compatible 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 error path in ehci_orion_drv_reset()
> - fix checkpatch warning]
> Signed-off-by: Hua Jing <[email protected]>
> Signed-off-by: Gregory CLEMENT <[email protected]>
> Reviewed-by: Andrew Lunn <[email protected]>
> ---
> .../devicetree/bindings/usb/ehci-orion.txt | 4 ++-
Otherwise,
Acked-by: Rob Herring <[email protected]>
> drivers/usb/host/ehci-orion.c | 36 ++++++++++++++++++++++
> 2 files changed, 39 insertions(+), 1 deletion(-)