Add Aspeed AST2700 ehci support
Subsystems (3)
cover Add Aspeed AST2700 ehci support
This series adds support for the EHCI controller found in Aspeed's new AST2700 SoC.
Ryan Chen (2):
dt-bindings: usb: ehci: Add Aspeed AST2700 compatible
usb: ehci: Add Aspeed AST2700 support
.../devicetree/bindings/usb/generic-ehci.yaml | 1 + drivers/usb/host/ehci-platform.c | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-)
Signature · 1 line
2.34.1
PATCH 1/2 dt-bindings: usb: ehci: Add Aspeed AST2700 compatible
Add the compatible string for Aspeed AST2700 SoC.
--- Documentation/devicetree/bindings/usb/generic-ehci.yaml | 1 + 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/usb/generic-ehci.yaml +1 -0
@@ -46,6 +46,7 @@ properties: - aspeed,ast2400-ehci - aspeed,ast2500-ehci - aspeed,ast2600-ehci + - aspeed,ast2700-ehci - brcm,bcm3384-ehci - brcm,bcm63268-ehci - brcm,bcm6328-ehci
Signature · 1 line
2.34.1
Re: [PATCH 1/2] dt-bindings: usb: ehci: Add Aspeed AST2700 compatible
PATCH 2/2 usb: ehci: Add Aspeed AST2700 support
In reply to Ryan ChenUnlike earlier Aspeed SoCs (AST2400/2500/2600) which are limited to 32-bit DMA addressing, the EHCI controller in AST2700 supports 64-bit DMA. Update the EHCI platform driver to make use of this capability by selecting a 64-bit DMA mask when the "aspeed,ast2700-ehci" compatible is present in device tree.
--- drivers/usb/host/ehci-platform.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)
drivers/usb/host/ehci-platform.c +21 -5
@@ -27,6 +27,7 @@#include <linux/io.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/reset.h> #include <linux/sys_soc.h>
@@ -122,10 +123,18 @@ static const struct ehci_driver_overrides platform_overrides __initconst = { .extra_priv_size = sizeof(struct ehci_platform_priv), }; +#define EHCI_PDATA_COMMON \ + .power_on = ehci_platform_power_on, \ + .power_suspend = ehci_platform_power_off, \ + .power_off = ehci_platform_power_off +static struct usb_ehci_pdata ehci_platform_defaults = { - .power_on = ehci_platform_power_on, - .power_suspend = ehci_platform_power_off, - .power_off = ehci_platform_power_off, +EHCI_PDATA_COMMON , +}; + +static const struct usb_ehci_pdata ehci_ast2700_platform = { +EHCI_PDATA_COMMON , + .dma_mask_64 =1 , };/**
@@ -239,6 +248,7 @@ static int ehci_platform_probe(struct platform_device *dev)struct usb_hcd *hcd;struct resource *res_mem;struct usb_ehci_pdata *pdata =dev_get_platdata (&dev->dev); +const struct of_device_id *match;struct ehci_platform_priv *priv;struct ehci_hcd *ehci;int err, irq, clk =0 ;
@@ -250,7 +260,10 @@ static int ehci_platform_probe(struct platform_device *dev)* Use reasonable defaults so platforms don't have to provide these * with DT probing on ARM. */ -if (!pdata) + match =of_match_device (dev->dev.driver->of_match_table, &dev->dev); +if (match && match->data) + pdata = (struct usb_ehci_pdata *)match->data; +else if (!pdata) pdata = &ehci_platform_defaults; err = dma_coerce_mask_and_coherent(&dev->dev,
@@ -298,7 +311,9 @@ static int ehci_platform_probe(struct platform_device *dev)if (of_device_is_compatible (dev->dev.of_node,"aspeed,ast2500-ehci" ) ||of_device_is_compatible (dev->dev.of_node, -"aspeed,ast2600-ehci" )) +"aspeed,ast2600-ehci" ) || +of_device_is_compatible (dev->dev.of_node, +"aspeed,ast2700-ehci" )) ehci->is_aspeed =1 ;if (soc_device_match (quirk_poll_match))
@@ -485,6 +500,7 @@ static const struct of_device_id vt8500_ehci_ids[] = { { .compatible = "wm,prizm-ehci", }, { .compatible = "generic-ehci", }, { .compatible = "cavium,octeon-6335-ehci", }, + { .compatible = "aspeed,ast2700-ehci", .data = &ehci_ast2700_platform }, {} }; MODULE_DEVICE_TABLE(of, vt8500_ehci_ids);
Signature · 1 line
2.34.1
Alan Stern
maintainerRe: [PATCH 2/2] usb: ehci: Add Aspeed AST2700 support
Quoted 33 lines · Ryan Chen
Unlike earlier Aspeed SoCs (AST2400/2500/2600) which are limited to 32-bit DMA addressing, the EHCI controller in AST2700 supports 64-bit DMA. Update the EHCI platform driver to make use of this capability by selecting a 64-bit DMA mask when the "aspeed,ast2700-ehci" compatible is present in device tree.
Signed-off-by Ryan Chen <[email protected]>--- drivers/usb/host/ehci-platform.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)drivers/usb/host/ehci-platform.c +6
-0@@ -27,6 +27,7 @@#include <linux/io.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/reset.h> #include <linux/sys_soc.h> @@ -122,10 +123,18 @@ static const struct ehci_driver_overrides platform_overrides __initconst = { .extra_priv_size = sizeof(struct ehci_platform_priv), }; +#define EHCI_PDATA_COMMON \ + .power_on = ehci_platform_power_on, \ + .power_suspend = ehci_platform_power_off, \ + .power_off = ehci_platform_power_off +static struct usb_ehci_pdata ehci_platform_defaults = {
drivers/usb/host/ehci-platform.c static const struct ehci_driver_overrides platform_overrides __initconst = { · line 138
Quoted 10 lines
drivers/usb/host/ehci-platform.c +6
-3- .power_on = ehci_platform_power_on, - .power_suspend = ehci_platform_power_off, - .power_off = ehci_platform_power_off, + EHCI_PDATA_COMMON, +}; + +static const struct usb_ehci_pdata ehci_ast2700_platform = { +EHCI_PDATA_COMMON , + .dma_mask_64 =1 , };
Arggh! This is dreadful. Just have two copies of the initializers.
Better yet, change your of_match data into a boolean property for overriding the default DMA mask and then use the original ehci_platform_defaults structure. Look at ohci_platform_probe() in ohci-platform.c for an example.
Quoted 11 lines
drivers/usb/host/ehci-platform.c +1
-0/** @@ -239,6 +248,7 @@ static int ehci_platform_probe(struct platform_device *dev)struct usb_hcd *hcd;struct resource *res_mem;struct usb_ehci_pdata *pdata =dev_get_platdata (&dev->dev); +const struct of_device_id *match;struct ehci_platform_priv *priv;struct ehci_hcd *ehci;int err, irq, clk =0 ;
drivers/usb/host/ehci-platform.c static int ehci_platform_probe(struct platform_device *dev) · line 265
Quoted 7 lines
drivers/usb/host/ehci-platform.c +3
-1@@ -250,7 +260,10 @@ static int ehci_platform_probe(struct platform_device *dev)* Use reasonable defaults so platforms don't have to provide these * with DT probing on ARM. */ -if (!pdata) + match =of_match_device (dev->dev.driver->of_match_table, &dev->dev); +if (match && match->data) + pdata = (struct usb_ehci_pdata *)match->data;
Do you really want the of_match data to override the platform data? Consider a system that has both. Which one do you think would be more important?
(If you take my suggestion above, this question becomes moot.)
Alan Stern
Quoted 26 lines
drivers/usb/host/ehci-platform.c +5
-1+else if (!pdata) pdata = &ehci_platform_defaults; err = dma_coerce_mask_and_coherent(&dev->dev,@@ -298,7 +311,9 @@ static int ehci_platform_probe(struct platform_device *dev)if (of_device_is_compatible (dev->dev.of_node,"aspeed,ast2500-ehci" ) ||of_device_is_compatible (dev->dev.of_node, -"aspeed,ast2600-ehci" )) +"aspeed,ast2600-ehci" ) || +of_device_is_compatible (dev->dev.of_node, +"aspeed,ast2700-ehci" )) ehci->is_aspeed =1 ;if (soc_device_match (quirk_poll_match))@@ -485,6 +500,7 @@ static const struct of_device_id vt8500_ehci_ids[] = { { .compatible = "wm,prizm-ehci", }, { .compatible = "generic-ehci", }, { .compatible = "cavium,octeon-6335-ehci", }, + { .compatible = "aspeed,ast2700-ehci", .data = &ehci_ast2700_platform }, {} }; MODULE_DEVICE_TABLE(of, vt8500_ehci_ids);Signature · 1 line
2.34.1
RE: [PATCH 2/2] usb: ehci: Add Aspeed AST2700 support
Quoted 51 lines
Subject: Re: [PATCH 2/2] usb: ehci: Add Aspeed AST2700 support
drivers/usb/host/ehci-platform.c static const struct ehci_driver_overrides
Quoted 25 lines · Ryan Chen
Unlike earlier Aspeed SoCs (AST2400/2500/2600) which are limited to 32-bit DMA addressing, the EHCI controller in AST2700 supports 64-bit DMA. Update the EHCI platform driver to make use of this capability by selecting a 64-bit DMA mask when the "aspeed,ast2700-ehci" compatible is present in device tree.
Signed-off-by Ryan Chen <[email protected]>--- drivers/usb/host/ehci-platform.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-)drivers/usb/host/ehci-platform.c +1
-0@@ -27,6 +27,7 @@#include <linux/io.h> #include <linux/module.h> #include <linux/of.h> +#include <linux/of_device.h> #include <linux/platform_device.h> #include <linux/reset.h> #include <linux/sys_soc.h> @@ -122,10 +123,18 @@ static const struct ehci_driver_overrides
platform_overrides__initconst= {Quoted 9 lines
drivers/usb/host/ehci-platform.c +5
-0.extra_priv_size = sizeof(struct ehci_platform_priv), }; +#define EHCI_PDATA_COMMON \ + .power_on = ehci_platform_power_on, \ + .power_suspend = ehci_platform_power_off, \ + .power_off = ehci_platform_power_off +static struct usb_ehci_pdata ehci_platform_defaults = {drivers/usb/host/ehci-platform.c static const struct ehci_driver_overrides platform_overrides __initconst = { · line 138
Quoted 10 lines
drivers/usb/host/ehci-platform.c +6
-3- .power_on = ehci_platform_power_on, - .power_suspend = ehci_platform_power_off, - .power_off = ehci_platform_power_off, + EHCI_PDATA_COMMON, +}; + +static const struct usb_ehci_pdata ehci_ast2700_platform = { +EHCI_PDATA_COMMON , + .dma_mask_64 =1 , };Arggh! This is dreadful. Just have two copies of the initializers.
Quoted 4 lines
Better yet, change your
of_matchdata into a boolean property for overriding the default DMA mask and then use the originalehci_platform_defaultsstructure. Look atohci_platform_probe()inohci-platform.cfor an example.
Sorry, I may not see the implement on ohci probe.
https://github.com/torvalds/linux/blob/master/drivers/usb/host/ohci-platform.c#L100-L111
But I think I will modify by following.
if (!pdata)
pdata = &ehci_platform_defaults;
match = of_match_device(dev->dev.driver->of_match_table, &dev->dev); if (match && match->data)
pdata->dma_mask_64 = 1;
err = dma_coerce_mask_and_coherent(&dev->dev,
dma64 ? DMA_BIT_MASK(64) : DMA_BIT_MASK(32));
and
+ { .compatible = "aspeed,ast2700-ehci", .data = (void *)1 },
Thanks.
Quoted 56 lines
drivers/usb/host/ehci-platform.c static int ehci_platform_probe(struct
Quoted 3 lines
drivers/usb/host/ehci-platform.c +0
-0/** @@ -239,6 +248,7 @@ static int ehci_platform_probe(struct
platform_device*dev)drivers/usb/host/ehci-platform.c static int ehci_platform_probe(struct
Quoted 8 lines
drivers/usb/host/ehci-platform.c +1
-0struct usb_hcd *hcd;struct resource *res_mem;struct usb_ehci_pdata *pdata =dev_get_platdata (&dev->dev); +const struct of_device_id *match;struct ehci_platform_priv *priv;struct ehci_hcd *ehci;int err, irq, clk =0 ;@@ -250,7 +260,10 @@ static int ehci_platform_probe(struct
platform_device*dev)drivers/usb/host/ehci-platform.c static int ehci_platform_probe(struct platform_device *dev) · line 265
Quoted 7 lines
drivers/usb/host/ehci-platform.c +3
-1* Use reasonable defaults so platforms don't have to provide these * with DT probing on ARM. */ -if (!pdata) + match =of_match_device (dev->dev.driver->of_match_table, &dev->dev); +if (match && match->data) + pdata = (struct usb_ehci_pdata *)match->data;Do you really want the
of_matchdata to override the platform data? Consider a system that has both. Which one do you think would be more important?(If you take my suggestion above, this question becomes moot.)
Alan Stern
drivers/usb/host/ehci-platform.c static int ehci_platform_probe(struct
Quoted 5 lines
drivers/usb/host/ehci-platform.c +1
-0+else if (!pdata) pdata = &ehci_platform_defaults; err = dma_coerce_mask_and_coherent(&dev->dev,@@ -298,7 +311,9 @@ static int ehci_platform_probe(struct
platform_device*dev)Quoted 21 lines
drivers/usb/host/ehci-platform.c +4
-2if (of_device_is_compatible (dev->dev.of_node,"aspeed,ast2500-ehci" ) ||of_device_is_compatible (dev->dev.of_node, -"aspeed,ast2600-ehci" )) +"aspeed,ast2600-ehci" ) || +of_device_is_compatible (dev->dev.of_node, +"aspeed,ast2700-ehci" )) ehci->is_aspeed =1 ;if (soc_device_match (quirk_poll_match))@@ -485,6 +500,7 @@ static const struct of_device_id vt8500_ehci_ids[] = { { .compatible = "wm,prizm-ehci", }, { .compatible = "generic-ehci", }, { .compatible = "cavium,octeon-6335-ehci", }, + { .compatible = "aspeed,ast2700-ehci", .data = &ehci_ast2700_platform }, {} }; MODULE_DEVICE_TABLE(of, vt8500_ehci_ids); --2.34.1