2  * Glue code for the ISP1760 driver and bus
 
   3  * Currently there is support for
 
   7  * (c) 2007 Sebastian Siewior <bigeasy@linutronix.de>
 
  11 #include <linux/usb.h>
 
  14 #include "../core/hcd.h"
 
  15 #include "isp1760-hcd.h"
 
  17 #ifdef CONFIG_USB_ISP1760_OF
 
  19 #include <linux/of_platform.h>
 
  22 #ifdef CONFIG_USB_ISP1760_PCI
 
  23 #include <linux/pci.h>
 
  26 #ifdef CONFIG_USB_ISP1760_OF
 
  27 static int of_isp1760_probe(struct of_device *dev,
 
  28                 const struct of_device_id *match)
 
  31         struct device_node *dp = dev->node;
 
  33         struct resource memory;
 
  38         const unsigned int *prop;
 
  39         unsigned int devflags = 0;
 
  41         ret = of_address_to_resource(dp, 0, &memory);
 
  45         res = request_mem_region(memory.start, memory.end - memory.start + 1,
 
  50         res_len = memory.end - memory.start + 1;
 
  52         if (of_irq_map_one(dp, 0, &oirq)) {
 
  57         virq = irq_create_of_mapping(oirq.controller, oirq.specifier,
 
  60         if (of_device_is_compatible(dp, "nxp,usb-isp1761"))
 
  61                 devflags |= ISP1760_FLAG_ISP1761;
 
  63         if (of_get_property(dp, "port1-disable", NULL) != NULL)
 
  64                 devflags |= ISP1760_FLAG_PORT1_DIS;
 
  66         /* Some systems wire up only 16 of the 32 data lines */
 
  67         prop = of_get_property(dp, "bus-width", NULL);
 
  68         if (prop && *prop == 16)
 
  69                 devflags |= ISP1760_FLAG_BUS_WIDTH_16;
 
  71         if (of_get_property(dp, "port1-otg", NULL) != NULL)
 
  72                 devflags |= ISP1760_FLAG_OTG_EN;
 
  74         if (of_get_property(dp, "analog-oc", NULL) != NULL)
 
  75                 devflags |= ISP1760_FLAG_ANALOG_OC;
 
  77         if (of_get_property(dp, "dack-polarity", NULL) != NULL)
 
  78                 devflags |= ISP1760_FLAG_DACK_POL_HIGH;
 
  80         if (of_get_property(dp, "dreq-polarity", NULL) != NULL)
 
  81                 devflags |= ISP1760_FLAG_DREQ_POL_HIGH;
 
  83         hcd = isp1760_register(memory.start, res_len, virq,
 
  84                 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev),
 
  91         dev_set_drvdata(&dev->dev, hcd);
 
  95         release_mem_region(memory.start, memory.end - memory.start + 1);
 
  99 static int of_isp1760_remove(struct of_device *dev)
 
 101         struct usb_hcd *hcd = dev_get_drvdata(&dev->dev);
 
 103         dev_set_drvdata(&dev->dev, NULL);
 
 107         release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
 
 112 static struct of_device_id of_isp1760_match[] = {
 
 114                 .compatible = "nxp,usb-isp1760",
 
 117                 .compatible = "nxp,usb-isp1761",
 
 121 MODULE_DEVICE_TABLE(of, of_isp1760_match);
 
 123 static struct of_platform_driver isp1760_of_driver = {
 
 124         .name           = "nxp-isp1760",
 
 125         .match_table    = of_isp1760_match,
 
 126         .probe          = of_isp1760_probe,
 
 127         .remove         = of_isp1760_remove,
 
 131 #ifdef CONFIG_USB_ISP1760_PCI
 
 132 static u32 nxp_pci_io_base;
 
 134 static u32 pci_mem_phy0;
 
 136 static u8 __iomem *chip_addr;
 
 137 static u8 __iomem *iobase;
 
 139 static int __devinit isp1761_pci_probe(struct pci_dev *dev,
 
 140                 const struct pci_device_id *id)
 
 148         unsigned int devflags = 0;
 
 153         if (pci_enable_device(dev) < 0)
 
 159         /* Grab the PLX PCI mem maped port start address we need  */
 
 160         nxp_pci_io_base = pci_resource_start(dev, 0);
 
 161         iolength = pci_resource_len(dev, 0);
 
 163         if (!request_mem_region(nxp_pci_io_base, iolength, "ISP1761 IO MEM")) {
 
 164                 printk(KERN_ERR "request region #1\n");
 
 168         iobase = ioremap_nocache(nxp_pci_io_base, iolength);
 
 170                 printk(KERN_ERR "ioremap #1\n");
 
 171                 release_mem_region(nxp_pci_io_base, iolength);
 
 174         /* Grab the PLX PCI shared memory of the ISP 1761 we need  */
 
 175         pci_mem_phy0 = pci_resource_start(dev, 3);
 
 176         length = pci_resource_len(dev, 3);
 
 178         if (length < 0xffff) {
 
 179                 printk(KERN_ERR "memory length for this resource is less than "
 
 181                 release_mem_region(nxp_pci_io_base, iolength);
 
 186         if (!request_mem_region(pci_mem_phy0, length, "ISP-PCI")) {
 
 187                 printk(KERN_ERR "host controller already in use\n");
 
 188                 release_mem_region(nxp_pci_io_base, iolength);
 
 193         /* bad pci latencies can contribute to overruns */
 
 194         pci_read_config_byte(dev, PCI_LATENCY_TIMER, &latency);
 
 196                 pci_read_config_byte(dev, PCI_MAX_LAT, &limit);
 
 197                 if (limit && limit < latency)
 
 198                         pci_write_config_byte(dev, PCI_LATENCY_TIMER, limit);
 
 201         /* Try to check whether we can access Scratch Register of
 
 202          * Host Controller or not. The initial PCI access is retried until
 
 203          * local init for the PCI bridge is completed
 
 207         while ((reg_data != 0xFACE) && retry_count) {
 
 208                 /*by default host is in 16bit mode, so
 
 209                  * io operations at this stage must be 16 bit
 
 211                 writel(0xface, chip_addr + HC_SCRATCH_REG);
 
 213                 reg_data = readl(chip_addr + HC_SCRATCH_REG);
 
 217         /* Host Controller presence is detected by writing to scratch register
 
 218          * and reading back and checking the contents are same or not
 
 220         if (reg_data != 0xFACE) {
 
 221                 err("scratch register mismatch %x", reg_data);
 
 227         status = readl(iobase + 0x68);
 
 229         writel(status, iobase + 0x68);
 
 231         dev->dev.dma_mask = NULL;
 
 232         hcd = isp1760_register(pci_mem_phy0, length, dev->irq,
 
 233                 IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev),
 
 235         pci_set_drvdata(dev, hcd);
 
 241         release_mem_region(pci_mem_phy0, length);
 
 242         release_mem_region(nxp_pci_io_base, iolength);
 
 245 static void isp1761_pci_remove(struct pci_dev *dev)
 
 249         hcd = pci_get_drvdata(dev);
 
 253         release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
 
 256         pci_disable_device(dev);
 
 261         release_mem_region(nxp_pci_io_base, iolength);
 
 262         release_mem_region(pci_mem_phy0, length);
 
 265 static void isp1761_pci_shutdown(struct pci_dev *dev)
 
 267         printk(KERN_ERR "ips1761_pci_shutdown\n");
 
 270 static const struct pci_device_id isp1760_plx [] = { {
 
 271         /* handle any USB 2.0 EHCI controller */
 
 272         PCI_DEVICE_CLASS(((PCI_CLASS_BRIDGE_OTHER << 8) | (0x06 << 16)), ~0),
 
 275 { /* end: all zeroes */ }
 
 277 MODULE_DEVICE_TABLE(pci, isp1760_plx);
 
 279 static struct pci_driver isp1761_pci_driver = {
 
 281         .id_table =     isp1760_plx,
 
 282         .probe =        isp1761_pci_probe,
 
 283         .remove =       isp1761_pci_remove,
 
 284         .shutdown =     isp1761_pci_shutdown,
 
 288 static int __init isp1760_init(void)
 
 294 #ifdef CONFIG_USB_ISP1760_OF
 
 295         ret = of_register_platform_driver(&isp1760_of_driver);
 
 301 #ifdef CONFIG_USB_ISP1760_PCI
 
 302         ret = pci_register_driver(&isp1761_pci_driver);
 
 308 #ifdef CONFIG_USB_ISP1760_PCI
 
 311 #ifdef CONFIG_USB_ISP1760_OF
 
 312         of_unregister_platform_driver(&isp1760_of_driver);
 
 317 module_init(isp1760_init);
 
 319 static void __exit isp1760_exit(void)
 
 321 #ifdef CONFIG_USB_ISP1760_OF
 
 322         of_unregister_platform_driver(&isp1760_of_driver);
 
 324 #ifdef CONFIG_USB_ISP1760_PCI
 
 325         pci_unregister_driver(&isp1761_pci_driver);
 
 329 module_exit(isp1760_exit);