int gpio_to_irq(unsigned gpio) { if (ssb_chipco_available(&ssb_bcm47xx.chipco)) return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; else if (ssb_extif_available(&ssb_bcm47xx.extif)) return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; else return -EINVAL; }
int pcibios_plat_dev_init(struct pci_dev *d) { struct resource *res; int pos, size; u32 *base; ssb_printk(KERN_INFO "PCI: Fixing up device %s\n", pci_name(d)); /* Fix up resource bases */ for (pos = 0; pos < 6; pos++) { res = &d->resource[pos]; if (res->flags & IORESOURCE_IO) base = &ssb_pcicore_pcibus_iobase; else base = &ssb_pcicore_pcibus_membase; if (res->end) { size = res->end - res->start + 1; if (*base & (size - 1)) *base = (*base + size) & ~(size - 1); res->start = *base; res->end = res->start + size - 1; *base += size; pci_write_config_dword(d, PCI_BASE_ADDRESS_0 + (pos << 2), res->start); } /* Fix up PCI bridge BAR0 only */ if (d->bus->number == 0 && PCI_SLOT(d->devfn) == 0) break; } /* Fix up interrupt lines */ d->irq = ssb_mips_irq(extpci_core->dev) + 2; pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq); return 0; }
int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { if (dev->bus->ops != &ssb_pcicore_pciops) { return -ENODEV; } return ssb_mips_irq(extpci_core->dev) + 2; }
/* PCI device IRQ mapping. */ int ssb_pcicore_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { if (dev->bus->ops != &ssb_pcicore_pciops) { /* This is not a device on the PCI-core bridge. */ return -ENODEV; } return ssb_mips_irq(extpci_core->dev) + 2; }
int gpio_to_irq(unsigned gpio) { switch (bcm47xx_bus_type) { #ifdef CONFIG_BCM47XX_SSB case BCM47XX_BUS_TYPE_SSB: if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco)) return ssb_mips_irq(bcm47xx_bus.ssb.chipco.dev) + 2; else if (ssb_extif_available(&bcm47xx_bus.ssb.extif)) return ssb_mips_irq(bcm47xx_bus.ssb.extif.dev) + 2; else return -EINVAL; #endif #ifdef CONFIG_BCM47XX_BCMA case BCM47XX_BUS_TYPE_BCMA: return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2; #endif } return -EINVAL; }
int ssb_gige_map_irq(struct ssb_device *sdev, const struct pci_dev *pdev) { struct ssb_gige *dev = ssb_get_drvdata(sdev); if (pdev->bus->ops != &dev->pci_ops) { /* The PCI device is not on this SSB GigE bridge device. */ return -ENODEV; } return ssb_mips_irq(sdev) + 2; }
int ssb_gige_map_irq(struct ssb_device *sdev, const struct pci_dev *pdev) { struct ssb_gige *dev = ssb_get_drvdata(sdev); if (pdev->bus->ops != &dev->pci_ops) { return -ENODEV; } return ssb_mips_irq(sdev) + 2; }
/* This function is called when doing a pci_enable_device(). * We must first check if the device is a device on the PCI-core bridge. */ int ssb_pcicore_plat_dev_init(struct pci_dev *d) { if (d->bus->ops != &ssb_pcicore_pciops) { /* This is not a device on the PCI-core bridge. */ return -ENODEV; } ssb_info("PCI: Fixing up device %s\n", pci_name(d)); /* Fix up interrupt lines */ d->irq = ssb_mips_irq(extpci_core->dev) + 2; pci_write_config_byte(d, PCI_INTERRUPT_LINE, d->irq); return 0; }
static void ssb_gpio_irq_extif_domain_exit(struct ssb_bus *bus) { struct ssb_extif *extif = &bus->extif; struct gpio_chip *chip = &bus->gpio; int gpio; if (bus->bustype != SSB_BUSTYPE_SSB) return; free_irq(ssb_mips_irq(bus->extif.dev) + 2, extif); for (gpio = 0; gpio < chip->ngpio; gpio++) { int irq = irq_find_mapping(bus->irq_domain, gpio); irq_dispose_mapping(irq); } irq_domain_remove(bus->irq_domain); }
static void ssb_gpio_irq_chipco_domain_exit(struct ssb_bus *bus) { struct ssb_chipcommon *chipco = &bus->chipco; struct gpio_chip *chip = &bus->gpio; int gpio; if (bus->bustype != SSB_BUSTYPE_SSB) return; chipco_mask32(chipco, SSB_CHIPCO_IRQMASK, ~SSB_CHIPCO_IRQ_GPIO); free_irq(ssb_mips_irq(bus->chipco.dev) + 2, chipco); for (gpio = 0; gpio < chip->ngpio; gpio++) { int irq = irq_find_mapping(bus->irq_domain, gpio); irq_dispose_mapping(irq); } irq_domain_remove(bus->irq_domain); }
static int ssb_gpio_irq_chipco_domain_init(struct ssb_bus *bus) { struct ssb_chipcommon *chipco = &bus->chipco; struct gpio_chip *chip = &bus->gpio; int gpio, hwirq, err; if (bus->bustype != SSB_BUSTYPE_SSB) return 0; bus->irq_domain = irq_domain_add_linear(NULL, chip->ngpio, &irq_domain_simple_ops, chipco); if (!bus->irq_domain) { err = -ENODEV; goto err_irq_domain; } for (gpio = 0; gpio < chip->ngpio; gpio++) { int irq = irq_create_mapping(bus->irq_domain, gpio); irq_set_chip_data(irq, bus); irq_set_chip_and_handler(irq, &ssb_gpio_irq_chipco_chip, handle_simple_irq); } hwirq = ssb_mips_irq(bus->chipco.dev) + 2; err = request_irq(hwirq, ssb_gpio_irq_chipco_handler, IRQF_SHARED, "gpio", bus); if (err) goto err_req_irq; ssb_chipco_gpio_intmask(&bus->chipco, ~0, 0); chipco_set32(chipco, SSB_CHIPCO_IRQMASK, SSB_CHIPCO_IRQ_GPIO); return 0; err_req_irq: for (gpio = 0; gpio < chip->ngpio; gpio++) { int irq = irq_find_mapping(bus->irq_domain, gpio); irq_dispose_mapping(irq); } irq_domain_remove(bus->irq_domain); err_irq_domain: return err; }
int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, struct pci_dev *pdev) { struct ssb_gige *dev = ssb_get_drvdata(sdev); struct resource *res; if (pdev->bus->ops != &dev->pci_ops) { /* The PCI device is not on this SSB GigE bridge device. */ return -ENODEV; } /* Fixup the PCI resources. */ res = &(pdev->resource[0]); res->flags = IORESOURCE_MEM | IORESOURCE_PCI_FIXED; res->name = dev->mem_resource.name; res->start = dev->mem_resource.start; res->end = dev->mem_resource.end; /* Fixup interrupt lines. */ pdev->irq = ssb_mips_irq(sdev) + 2; pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, pdev->irq); return 0; }
int ssb_gige_pcibios_plat_dev_init(struct ssb_device *sdev, struct pci_dev *pdev) { struct ssb_gige *dev = ssb_get_drvdata(sdev); struct resource *res; if (pdev->bus->ops != &dev->pci_ops) { return -ENODEV; } res = &(pdev->resource[0]); res->flags = IORESOURCE_MEM | IORESOURCE_PCI_FIXED; res->name = dev->mem_resource.name; res->start = dev->mem_resource.start; res->end = dev->mem_resource.end; pdev->irq = ssb_mips_irq(sdev) + 2; pci_write_config_byte(pdev, PCI_INTERRUPT_LINE, pdev->irq); return 0; }
int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) { return ssb_mips_irq(extpci_core->dev) + 2; }