.. | .. |
---|
256 | 256 | return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_1); |
---|
257 | 257 | } |
---|
258 | 258 | |
---|
259 | | -struct pci_ecam_ops xgene_v1_pcie_ecam_ops = { |
---|
| 259 | +const struct pci_ecam_ops xgene_v1_pcie_ecam_ops = { |
---|
260 | 260 | .bus_shift = 16, |
---|
261 | 261 | .init = xgene_v1_pcie_ecam_init, |
---|
262 | 262 | .pci_ops = { |
---|
.. | .. |
---|
271 | 271 | return xgene_pcie_ecam_init(cfg, XGENE_PCIE_IP_VER_2); |
---|
272 | 272 | } |
---|
273 | 273 | |
---|
274 | | -struct pci_ecam_ops xgene_v2_pcie_ecam_ops = { |
---|
| 274 | +const struct pci_ecam_ops xgene_v2_pcie_ecam_ops = { |
---|
275 | 275 | .bus_shift = 16, |
---|
276 | 276 | .init = xgene_v2_pcie_ecam_init, |
---|
277 | 277 | .pci_ops = { |
---|
.. | .. |
---|
405 | 405 | xgene_pcie_writel(port, CFGCTL, EN_REG); |
---|
406 | 406 | } |
---|
407 | 407 | |
---|
408 | | -static int xgene_pcie_map_ranges(struct xgene_pcie_port *port, |
---|
409 | | - struct list_head *res, |
---|
410 | | - resource_size_t io_base) |
---|
| 408 | +static int xgene_pcie_map_ranges(struct xgene_pcie_port *port) |
---|
411 | 409 | { |
---|
| 410 | + struct pci_host_bridge *bridge = pci_host_bridge_from_priv(port); |
---|
412 | 411 | struct resource_entry *window; |
---|
413 | 412 | struct device *dev = port->dev; |
---|
414 | | - int ret; |
---|
415 | 413 | |
---|
416 | | - resource_list_for_each_entry(window, res) { |
---|
| 414 | + resource_list_for_each_entry(window, &bridge->windows) { |
---|
417 | 415 | struct resource *res = window->res; |
---|
418 | 416 | u64 restype = resource_type(res); |
---|
419 | 417 | |
---|
.. | .. |
---|
421 | 419 | |
---|
422 | 420 | switch (restype) { |
---|
423 | 421 | case IORESOURCE_IO: |
---|
424 | | - xgene_pcie_setup_ob_reg(port, res, OMR3BARL, io_base, |
---|
| 422 | + xgene_pcie_setup_ob_reg(port, res, OMR3BARL, |
---|
| 423 | + pci_pio_to_address(res->start), |
---|
425 | 424 | res->start - window->offset); |
---|
426 | | - ret = devm_pci_remap_iospace(dev, res, io_base); |
---|
427 | | - if (ret < 0) |
---|
428 | | - return ret; |
---|
429 | 425 | break; |
---|
430 | 426 | case IORESOURCE_MEM: |
---|
431 | 427 | if (res->flags & IORESOURCE_PREFETCH) |
---|
.. | .. |
---|
567 | 563 | xgene_pcie_writel(port, i, 0); |
---|
568 | 564 | } |
---|
569 | 565 | |
---|
570 | | -static int xgene_pcie_setup(struct xgene_pcie_port *port, struct list_head *res, |
---|
571 | | - resource_size_t io_base) |
---|
| 566 | +static int xgene_pcie_setup(struct xgene_pcie_port *port) |
---|
572 | 567 | { |
---|
573 | 568 | struct device *dev = port->dev; |
---|
574 | 569 | u32 val, lanes = 0, speed = 0; |
---|
.. | .. |
---|
580 | 575 | val = (XGENE_PCIE_DEVICEID << 16) | XGENE_PCIE_VENDORID; |
---|
581 | 576 | xgene_pcie_writel(port, BRIDGE_CFG_0, val); |
---|
582 | 577 | |
---|
583 | | - ret = xgene_pcie_map_ranges(port, res, io_base); |
---|
| 578 | + ret = xgene_pcie_map_ranges(port); |
---|
584 | 579 | if (ret) |
---|
585 | 580 | return ret; |
---|
586 | 581 | |
---|
.. | .. |
---|
607 | 602 | struct device *dev = &pdev->dev; |
---|
608 | 603 | struct device_node *dn = dev->of_node; |
---|
609 | 604 | struct xgene_pcie_port *port; |
---|
610 | | - resource_size_t iobase = 0; |
---|
611 | | - struct pci_bus *bus, *child; |
---|
612 | 605 | struct pci_host_bridge *bridge; |
---|
613 | 606 | int ret; |
---|
614 | | - LIST_HEAD(res); |
---|
615 | 607 | |
---|
616 | 608 | bridge = devm_pci_alloc_host_bridge(dev, sizeof(*port)); |
---|
617 | 609 | if (!bridge) |
---|
.. | .. |
---|
634 | 626 | if (ret) |
---|
635 | 627 | return ret; |
---|
636 | 628 | |
---|
637 | | - ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res, |
---|
638 | | - &iobase); |
---|
| 629 | + ret = xgene_pcie_setup(port); |
---|
639 | 630 | if (ret) |
---|
640 | 631 | return ret; |
---|
641 | 632 | |
---|
642 | | - ret = devm_request_pci_bus_resources(dev, &res); |
---|
643 | | - if (ret) |
---|
644 | | - goto error; |
---|
645 | | - |
---|
646 | | - ret = xgene_pcie_setup(port, &res, iobase); |
---|
647 | | - if (ret) |
---|
648 | | - goto error; |
---|
649 | | - |
---|
650 | | - list_splice_init(&res, &bridge->windows); |
---|
651 | | - bridge->dev.parent = dev; |
---|
652 | 633 | bridge->sysdata = port; |
---|
653 | | - bridge->busnr = 0; |
---|
654 | 634 | bridge->ops = &xgene_pcie_ops; |
---|
655 | | - bridge->map_irq = of_irq_parse_and_map_pci; |
---|
656 | | - bridge->swizzle_irq = pci_common_swizzle; |
---|
657 | 635 | |
---|
658 | | - ret = pci_scan_root_bus_bridge(bridge); |
---|
659 | | - if (ret < 0) |
---|
660 | | - goto error; |
---|
661 | | - |
---|
662 | | - bus = bridge->bus; |
---|
663 | | - |
---|
664 | | - pci_assign_unassigned_bus_resources(bus); |
---|
665 | | - list_for_each_entry(child, &bus->children, node) |
---|
666 | | - pcie_bus_configure_settings(child); |
---|
667 | | - pci_bus_add_devices(bus); |
---|
668 | | - return 0; |
---|
669 | | - |
---|
670 | | -error: |
---|
671 | | - pci_free_resource_list(&res); |
---|
672 | | - return ret; |
---|
| 636 | + return pci_host_probe(bridge); |
---|
673 | 637 | } |
---|
674 | 638 | |
---|
675 | 639 | static const struct of_device_id xgene_pcie_match_table[] = { |
---|