[PATCHv4 4/9] usb: vt8500: Add devicetree support for vt8500-ehci and -uhci.
Add devicetree support for vt8500-ehci. Convert vt8500-uhci to a generic non-pci platform-uhci with device tree support. Signed-off-by: Tony Prisk --- drivers/usb/host/Kconfig |4 +- drivers/usb/host/ehci-vt8500.c | 25 -- drivers/usb/host/uhci-hcd.c |5 ++ drivers/usb/host/uhci-platform.c | 169 ++ 4 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 drivers/usb/host/uhci-platform.c diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index dcfaaa9..d7a6b10 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -450,7 +450,7 @@ config USB_OHCI_LITTLE_ENDIAN config USB_UHCI_HCD tristate "UHCI HCD (most Intel and VIA) support" - depends on USB && (PCI || SPARC_LEON) + depends on USB && (PCI || SPARC_LEON || ARCH_VT8500) ---help--- The Universal Host Controller Interface is a standard by Intel for accessing the USB hardware in the PC (which is also called the USB @@ -468,7 +468,7 @@ config USB_UHCI_HCD config USB_UHCI_SUPPORT_NON_PCI_HC bool depends on USB_UHCI_HCD - default y if SPARC_LEON + default y if (SPARC_LEON || ARCH_VT8500) config USB_UHCI_BIG_ENDIAN_MMIO bool diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index c1eda73..0e1637b 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c @@ -16,6 +16,7 @@ * */ +#include #include static int ehci_update_device(struct usb_hcd *hcd, struct usb_device *udev) @@ -84,20 +85,23 @@ static const struct hc_driver vt8500_ehci_hc_driver = { .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, }; +static u64 wmt_ehci_dma_mask = DMA_BIT_MASK(32); + static int vt8500_ehci_drv_probe(struct platform_device *pdev) { struct usb_hcd *hcd; struct ehci_hcd *ehci; struct resource *res; + int irq; int ret; if (usb_disabled()) return -ENODEV; - if (pdev->resource[1].flags != IORESOURCE_IRQ) { - pr_debug("resource[1] is not IORESOURCE_IRQ"); - return -ENOMEM; - } + /* devicetree created devices don't specify a dma mask */ + if (!pdev->dev.dma_mask) + pdev->dev.dma_mask = _ehci_dma_mask; + hcd = usb_create_hcd(_ehci_hc_driver, >dev, "VT8500"); if (!hcd) return -ENOMEM; @@ -134,8 +138,9 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) ehci_reset(ehci); - ret = usb_add_hcd(hcd, pdev->resource[1].start, - IRQF_SHARED); + irq = platform_get_irq(pdev, 0); + + ret = usb_add_hcd(hcd, irq, IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); return ret; @@ -162,6 +167,11 @@ static int vt8500_ehci_drv_remove(struct platform_device *pdev) return 0; } +static const struct of_device_id vt8500_ehci_ids[] = { + { .compatible = "via,vt8500-ehci", }, + {} +}; + static struct platform_driver vt8500_ehci_driver = { .probe = vt8500_ehci_drv_probe, .remove = vt8500_ehci_drv_remove, @@ -169,7 +179,10 @@ static struct platform_driver vt8500_ehci_driver = { .driver = { .name = "vt8500-ehci", .owner = THIS_MODULE, + .of_match_table = of_match_ptr(vt8500_ehci_ids), } }; MODULE_ALIAS("platform:vt8500-ehci"); +MODULE_LICENSE("GPL v2"); +MODULE_DEVICE_TABLE(of, vt8500_ehci_ids); diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index e4db350..5da5c99 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -846,6 +846,11 @@ static const char hcd_name[] = "uhci_hcd"; #define PLATFORM_DRIVERuhci_grlib_driver #endif +#ifdef CONFIG_ARCH_VT8500 +#include "uhci-platform.c" +#define PLATFORM_DRIVERuhci_platform_driver +#endif + #if !defined(PCI_DRIVER) && !defined(PLATFORM_DRIVER) #error "missing bus glue for uhci-hcd" #endif diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c new file mode 100644 index 000..35ca094 --- /dev/null +++ b/drivers/usb/host/uhci-platform.c @@ -0,0 +1,169 @@ +/* + * Generic UHCI HCD (Host Controller Driver) for Platform Devices + * + * Copyright (c) 2011 Tony Prisk + * + * This file is based on uhci-grlib.c + * (C) Copyright 2004-2007 Alan Stern, st...@rowland.harvard.edu + */ + +#include +#include + +static int uhci_platform_init(struct usb_hcd *hcd) +{ + struct uhci_hcd *uhci = hcd_to_uhci(hcd); + + uhci->rh_numports = uhci_count_ports(hcd); + + /* Set up pointers to to generic functions */ + uhci->reset_hc = uhci_generic_reset_hc; + uhci->check_and_reset_hc = uhci_generic_check_and_reset_hc; + + /* No special actions need to be taken
[PATCHv4 4/9] usb: vt8500: Add devicetree support for vt8500-ehci and -uhci.
Add devicetree support for vt8500-ehci. Convert vt8500-uhci to a generic non-pci platform-uhci with device tree support. Signed-off-by: Tony Prisk li...@prisktech.co.nz --- drivers/usb/host/Kconfig |4 +- drivers/usb/host/ehci-vt8500.c | 25 -- drivers/usb/host/uhci-hcd.c |5 ++ drivers/usb/host/uhci-platform.c | 169 ++ 4 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 drivers/usb/host/uhci-platform.c diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index dcfaaa9..d7a6b10 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig @@ -450,7 +450,7 @@ config USB_OHCI_LITTLE_ENDIAN config USB_UHCI_HCD tristate UHCI HCD (most Intel and VIA) support - depends on USB (PCI || SPARC_LEON) + depends on USB (PCI || SPARC_LEON || ARCH_VT8500) ---help--- The Universal Host Controller Interface is a standard by Intel for accessing the USB hardware in the PC (which is also called the USB @@ -468,7 +468,7 @@ config USB_UHCI_HCD config USB_UHCI_SUPPORT_NON_PCI_HC bool depends on USB_UHCI_HCD - default y if SPARC_LEON + default y if (SPARC_LEON || ARCH_VT8500) config USB_UHCI_BIG_ENDIAN_MMIO bool diff --git a/drivers/usb/host/ehci-vt8500.c b/drivers/usb/host/ehci-vt8500.c index c1eda73..0e1637b 100644 --- a/drivers/usb/host/ehci-vt8500.c +++ b/drivers/usb/host/ehci-vt8500.c @@ -16,6 +16,7 @@ * */ +#include linux/of.h #include linux/platform_device.h static int ehci_update_device(struct usb_hcd *hcd, struct usb_device *udev) @@ -84,20 +85,23 @@ static const struct hc_driver vt8500_ehci_hc_driver = { .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete, }; +static u64 wmt_ehci_dma_mask = DMA_BIT_MASK(32); + static int vt8500_ehci_drv_probe(struct platform_device *pdev) { struct usb_hcd *hcd; struct ehci_hcd *ehci; struct resource *res; + int irq; int ret; if (usb_disabled()) return -ENODEV; - if (pdev-resource[1].flags != IORESOURCE_IRQ) { - pr_debug(resource[1] is not IORESOURCE_IRQ); - return -ENOMEM; - } + /* devicetree created devices don't specify a dma mask */ + if (!pdev-dev.dma_mask) + pdev-dev.dma_mask = wmt_ehci_dma_mask; + hcd = usb_create_hcd(vt8500_ehci_hc_driver, pdev-dev, VT8500); if (!hcd) return -ENOMEM; @@ -134,8 +138,9 @@ static int vt8500_ehci_drv_probe(struct platform_device *pdev) ehci_reset(ehci); - ret = usb_add_hcd(hcd, pdev-resource[1].start, - IRQF_SHARED); + irq = platform_get_irq(pdev, 0); + + ret = usb_add_hcd(hcd, irq, IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); return ret; @@ -162,6 +167,11 @@ static int vt8500_ehci_drv_remove(struct platform_device *pdev) return 0; } +static const struct of_device_id vt8500_ehci_ids[] = { + { .compatible = via,vt8500-ehci, }, + {} +}; + static struct platform_driver vt8500_ehci_driver = { .probe = vt8500_ehci_drv_probe, .remove = vt8500_ehci_drv_remove, @@ -169,7 +179,10 @@ static struct platform_driver vt8500_ehci_driver = { .driver = { .name = vt8500-ehci, .owner = THIS_MODULE, + .of_match_table = of_match_ptr(vt8500_ehci_ids), } }; MODULE_ALIAS(platform:vt8500-ehci); +MODULE_LICENSE(GPL v2); +MODULE_DEVICE_TABLE(of, vt8500_ehci_ids); diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index e4db350..5da5c99 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -846,6 +846,11 @@ static const char hcd_name[] = uhci_hcd; #define PLATFORM_DRIVERuhci_grlib_driver #endif +#ifdef CONFIG_ARCH_VT8500 +#include uhci-platform.c +#define PLATFORM_DRIVERuhci_platform_driver +#endif + #if !defined(PCI_DRIVER) !defined(PLATFORM_DRIVER) #error missing bus glue for uhci-hcd #endif diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c new file mode 100644 index 000..35ca094 --- /dev/null +++ b/drivers/usb/host/uhci-platform.c @@ -0,0 +1,169 @@ +/* + * Generic UHCI HCD (Host Controller Driver) for Platform Devices + * + * Copyright (c) 2011 Tony Prisk li...@prisktech.co.nz + * + * This file is based on uhci-grlib.c + * (C) Copyright 2004-2007 Alan Stern, st...@rowland.harvard.edu + */ + +#include linux/of.h +#include linux/platform_device.h + +static int uhci_platform_init(struct usb_hcd *hcd) +{ + struct uhci_hcd *uhci = hcd_to_uhci(hcd); + + uhci-rh_numports = uhci_count_ports(hcd); + + /* Set up pointers to to generic functions */ + uhci-reset_hc = uhci_generic_reset_hc; +