Message ID | 1346491586-23480-1-git-send-email-andrew@lunn.ch (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 09/01/2012 11:26 AM, Andrew Lunn wrote: > Based on previous work by Michael Walle and Jason Cooper. > > Made their work actually work, which required added interrupt from DT > and auxdata, along with setting the dma_mask, which DT does not > currently do. Andrew, you can add a Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> for DT-enabled Dove on both ehci controllers. One thing iI stumbled upon is that drivers/usb/Kconfig is missing PLAT_ORION for USB_ARCH_HAS_EHCI. I think it just worked until now because there is also PCI in this config option. IIRC it can be disabled now and therefore there should be an entry for PLAT_ORION. Sebastian
On Sat, 1 Sep 2012, Andrew Lunn wrote: > Based on previous work by Michael Walle and Jason Cooper. > > Made their work actually work, which required added interrupt from DT > and auxdata, along with setting the dma_mask, which DT does not > currently do. > > Signed-off-by: Andrew Lunn <andrew@lunn.ch> For the changes to ehci-orion.c: Acked-by: Alan Stern <stern@rowland.harvard.edu>
On Sat, Sep 01, 2012 at 11:26:25AM +0200, Andrew Lunn wrote: > Based on previous work by Michael Walle and Jason Cooper. > > Made their work actually work, which required added interrupt from DT > and auxdata, along with setting the dma_mask, which DT does not > currently do. > > Signed-off-by: Andrew Lunn <andrew@lunn.ch> Applied to: git://git.infradead.org/users/jcooper/linux.git kirkwood/dt thx, Jason.
Hi, Sorry for the late feedback but I didn't notice this until I looked at the pull request from Jason. Please go back and revisit these bindings. I'll merge in the current version but they need to be fixed up. Also, always cc devicetree-discuss and the DT maintainers on new bindings. On Sat, Sep 1, 2012 at 2:26 AM, Andrew Lunn <andrew@lunn.ch> wrote: > Based on previous work by Michael Walle and Jason Cooper. > > Made their work actually work, which required added interrupt from DT > and auxdata, along with setting the dma_mask, which DT does not > currently do. > > Signed-off-by: Andrew Lunn <andrew@lunn.ch> > --- > .../devicetree/bindings/usb/ehci-orion.txt | 19 +++++++ > drivers/usb/host/ehci-orion.c | 59 +++++++++++++++++++- > 2 files changed, 75 insertions(+), 3 deletions(-) > create mode 100644 Documentation/devicetree/bindings/usb/ehci-orion.txt > > diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt > new file mode 100644 > index 0000000..1bd704e > --- /dev/null > +++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt > @@ -0,0 +1,19 @@ > +* EHCI controller, Orion Marvell variants > + > +Required properties: > +- compatible: must be "marvell,orion-ehci" > +- reg: physical base address of the controller and length of memory mapped > + region. > +- interrupts: The EHCI interrupt > +- phy-version: Can be one of: > + "NA" - Don't touch the phy, something else has already configured it. > + "orion5x" - PHY setup as specified by the Orion5x Errata > + > +Example: > + > + ehci@50000 { > + compatible = "marvell,orion-ehci"; > + reg = <0x50000 0x1000>; > + interrupts = <19>; > + phy-version = "NA"; > + }; This isn't an appropriate binding for phy. I know, it maps straight over from the platform data, but it doesn't focus on what the actual hardware is. A couple of options. What probably makes most sense depending on how other phy bindings are moving ahead is to add a phy node under the ehci controller for the "orion5x" case, and have an appropriate compatible value there. No node means the same as "NA" in the above binding. Alternatively, have a phy phandle that points to the phy device if it sits on an i2c bus, etc. -Olof
> > +Required properties: > > +- compatible: must be "marvell,orion-ehci" > > +- reg: physical base address of the controller and length of memory mapped > > + region. > > +- interrupts: The EHCI interrupt > > +- phy-version: Can be one of: > > + "NA" - Don't touch the phy, something else has already configured it. > > + "orion5x" - PHY setup as specified by the Orion5x Errata > > + > > +Example: > > + > > + ehci@50000 { > > + compatible = "marvell,orion-ehci"; > > + reg = <0x50000 0x1000>; > > + interrupts = <19>; > > + phy-version = "NA"; > > + }; > > This isn't an appropriate binding for phy. I know, it maps straight > over from the platform data, but it doesn't focus on what the actual > hardware is. > > A couple of options. What probably makes most sense depending on how > other phy bindings are moving ahead is to add a phy node under the > ehci controller for the "orion5x" case, and have an appropriate > compatible value there. No node means the same as "NA" in the above > binding. Alternatively, have a phy phandle that points to the phy > device if it sits on an i2c bus, etc. I Olaf Could i suggest a third option: I just drop USB phy configuration all together. Only mach-orion5x needs this and nobody has shown any interest in moving mach-orion5x to DT. So i would just hard code it to "NA". If anybody does show interest in DT for orion5x, we can add a phy node under ehci as a pure extension which does not affect backward compatibility. Thanks Andrew
On Mon, Sep 24, 2012 at 09:13:53AM +0200, Andrew Lunn wrote: > > > +Required properties: > > > +- compatible: must be "marvell,orion-ehci" > > > +- reg: physical base address of the controller and length of memory mapped > > > + region. > > > +- interrupts: The EHCI interrupt > > > +- phy-version: Can be one of: > > > + "NA" - Don't touch the phy, something else has already configured it. > > > + "orion5x" - PHY setup as specified by the Orion5x Errata > > > + > > > +Example: > > > + > > > + ehci@50000 { > > > + compatible = "marvell,orion-ehci"; > > > + reg = <0x50000 0x1000>; > > > + interrupts = <19>; > > > + phy-version = "NA"; > > > + }; > > > > This isn't an appropriate binding for phy. I know, it maps straight > > over from the platform data, but it doesn't focus on what the actual > > hardware is. > > > > A couple of options. What probably makes most sense depending on how > > other phy bindings are moving ahead is to add a phy node under the > > ehci controller for the "orion5x" case, and have an appropriate > > compatible value there. No node means the same as "NA" in the above > > binding. Alternatively, have a phy phandle that points to the phy > > device if it sits on an i2c bus, etc. > > I Olaf > > Could i suggest a third option: > > I just drop USB phy configuration all together. Only mach-orion5x > needs this and nobody has shown any interest in moving mach-orion5x to > DT. So i would just hard code it to "NA". > > If anybody does show interest in DT for orion5x, we can add a phy node > under ehci as a pure extension which does not affect backward > compatibility. Yeah, that works too. -Olof
On Wed, Sep 26, 2012 at 04:49:41PM -0700, Olof Johansson wrote: > On Mon, Sep 24, 2012 at 09:13:53AM +0200, Andrew Lunn wrote: > > > > +Required properties: > > > > +- compatible: must be "marvell,orion-ehci" > > > > +- reg: physical base address of the controller and length of memory mapped > > > > + region. > > > > +- interrupts: The EHCI interrupt > > > > +- phy-version: Can be one of: > > > > + "NA" - Don't touch the phy, something else has already configured it. > > > > + "orion5x" - PHY setup as specified by the Orion5x Errata > > > > + > > > > +Example: > > > > + > > > > + ehci@50000 { > > > > + compatible = "marvell,orion-ehci"; > > > > + reg = <0x50000 0x1000>; > > > > + interrupts = <19>; > > > > + phy-version = "NA"; > > > > + }; > > > > > > This isn't an appropriate binding for phy. I know, it maps straight > > > over from the platform data, but it doesn't focus on what the actual > > > hardware is. > > > > > > A couple of options. What probably makes most sense depending on how > > > other phy bindings are moving ahead is to add a phy node under the > > > ehci controller for the "orion5x" case, and have an appropriate > > > compatible value there. No node means the same as "NA" in the above > > > binding. Alternatively, have a phy phandle that points to the phy > > > device if it sits on an i2c bus, etc. > > > > I Olaf > > > > Could i suggest a third option: > > > > I just drop USB phy configuration all together. Only mach-orion5x > > needs this and nobody has shown any interest in moving mach-orion5x to > > DT. So i would just hard code it to "NA". > > > > If anybody does show interest in DT for orion5x, we can add a phy node > > under ehci as a pure extension which does not affect backward > > compatibility. > > Yeah, that works too. Andrew, Did I miss the update of this series/patch? thx, Jason.
diff --git a/Documentation/devicetree/bindings/usb/ehci-orion.txt b/Documentation/devicetree/bindings/usb/ehci-orion.txt new file mode 100644 index 0000000..1bd704e --- /dev/null +++ b/Documentation/devicetree/bindings/usb/ehci-orion.txt @@ -0,0 +1,19 @@ +* EHCI controller, Orion Marvell variants + +Required properties: +- compatible: must be "marvell,orion-ehci" +- reg: physical base address of the controller and length of memory mapped + region. +- interrupts: The EHCI interrupt +- phy-version: Can be one of: + "NA" - Don't touch the phy, something else has already configured it. + "orion5x" - PHY setup as specified by the Orion5x Errata + +Example: + + ehci@50000 { + compatible = "marvell,orion-ehci"; + reg = <0x50000 0x1000>; + interrupts = <19>; + phy-version = "NA"; + }; diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index b34b928..605feb09 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c @@ -14,6 +14,9 @@ #include <linux/mbus.h> #include <linux/clk.h> #include <linux/platform_data/ehci-orion.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_irq.h> #define rdl(off) __raw_readl(hcd->regs + (off)) #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) @@ -181,6 +184,27 @@ ehci_orion_conf_mbus_windows(struct usb_hcd *hcd, } } +static const int get_phy_version(struct device_node *np) +{ + const char *pm; + int err; + + err = of_property_read_string(np, "phy-version", &pm); + + if (err < 0) + return err; + + + if (!strcasecmp(pm, "NA")) + return EHCI_PHY_NA; + if (!strcasecmp(pm, "orion5x")) + return EHCI_PHY_ORION; + + return -ENODEV; +} + +static u64 ehci_orion_dma_mask = DMA_BIT_MASK(32); + static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) { struct orion_ehci_data *pd = pdev->dev.platform_data; @@ -191,13 +215,17 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) struct clk *clk; void __iomem *regs; int irq, err; + enum orion_ehci_phy_ver phy_version; if (usb_disabled()) return -ENODEV; pr_debug("Initializing Orion-SoC USB Host Controller\n"); - irq = platform_get_irq(pdev, 0); + if (pdev->dev.of_node) + irq = irq_of_parse_and_map(pdev->dev.of_node, 0); + else + irq = platform_get_irq(pdev, 0); if (irq <= 0) { dev_err(&pdev->dev, "Found HC with no IRQ. Check %s setup!\n", @@ -215,6 +243,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) goto err1; } + /* + * Right now device-tree probed devices don't get dma_mask + * set. Since shared usb code relies on it, set it here for + * now. Once we have dma capability bindings this can go away. + */ + if (!pdev->dev.dma_mask) + pdev->dev.dma_mask = &ehci_orion_dma_mask; + if (!request_mem_region(res->start, resource_size(res), ehci_orion_hc_driver.description)) { dev_dbg(&pdev->dev, "controller already in use\n"); @@ -262,7 +298,14 @@ static int __devinit ehci_orion_drv_probe(struct platform_device *pdev) /* * setup Orion USB controller. */ - switch (pd->phy_version) { + if (pdev->dev.of_node) { + phy_version = get_phy_version(pdev->dev.of_node); + if (phy_version < 0) + goto err3; + } else + phy_version = pd->phy_version; + + switch (phy_version) { case EHCI_PHY_NA: /* dont change USB phy settings */ break; case EHCI_PHY_ORION: @@ -317,9 +360,19 @@ static int __exit ehci_orion_drv_remove(struct platform_device *pdev) MODULE_ALIAS("platform:orion-ehci"); +static const struct of_device_id ehci_orion_dt_ids[] __devinitdata = { + { .compatible = "marvell,orion-ehci", }, + {}, +}; +MODULE_DEVICE_TABLE(of, ehci_orion_dt_ids); + static struct platform_driver ehci_orion_driver = { .probe = ehci_orion_drv_probe, .remove = __exit_p(ehci_orion_drv_remove), .shutdown = usb_hcd_platform_shutdown, - .driver.name = "orion-ehci", + .driver = { + .name = "orion-ehci", + .owner = THIS_MODULE, + .of_match_table = of_match_ptr(ehci_orion_dt_ids), + }, };
Based on previous work by Michael Walle and Jason Cooper. Made their work actually work, which required added interrupt from DT and auxdata, along with setting the dma_mask, which DT does not currently do. Signed-off-by: Andrew Lunn <andrew@lunn.ch> --- .../devicetree/bindings/usb/ehci-orion.txt | 19 +++++++ drivers/usb/host/ehci-orion.c | 59 +++++++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 Documentation/devicetree/bindings/usb/ehci-orion.txt