| .. | .. |
|---|
| 167 | 167 | int irq_misc; |
|---|
| 168 | 168 | u32 ecam_value; |
|---|
| 169 | 169 | u8 last_busno; |
|---|
| 170 | | - u8 root_busno; |
|---|
| 171 | 170 | struct nwl_msi msi; |
|---|
| 172 | 171 | struct irq_domain *legacy_irq_domain; |
|---|
| 173 | 172 | struct clk *clk; |
|---|
| .. | .. |
|---|
| 219 | 218 | struct nwl_pcie *pcie = bus->sysdata; |
|---|
| 220 | 219 | |
|---|
| 221 | 220 | /* Check link before accessing downstream ports */ |
|---|
| 222 | | - if (bus->number != pcie->root_busno) { |
|---|
| 221 | + if (!pci_is_root_bus(bus)) { |
|---|
| 223 | 222 | if (!nwl_pcie_link_up(pcie)) |
|---|
| 224 | 223 | return false; |
|---|
| 225 | | - } |
|---|
| 226 | | - |
|---|
| 227 | | - /* Only one device down on each root port */ |
|---|
| 228 | | - if (bus->number == pcie->root_busno && devfn > 0) |
|---|
| 224 | + } else if (devfn > 0) |
|---|
| 225 | + /* Only one device down on each root port */ |
|---|
| 229 | 226 | return false; |
|---|
| 230 | 227 | |
|---|
| 231 | 228 | return true; |
|---|
| .. | .. |
|---|
| 440 | 437 | #ifdef CONFIG_PCI_MSI |
|---|
| 441 | 438 | static struct irq_chip nwl_msi_irq_chip = { |
|---|
| 442 | 439 | .name = "nwl_pcie:msi", |
|---|
| 443 | | - .irq_enable = unmask_msi_irq, |
|---|
| 444 | | - .irq_disable = mask_msi_irq, |
|---|
| 445 | | - .irq_mask = mask_msi_irq, |
|---|
| 446 | | - .irq_unmask = unmask_msi_irq, |
|---|
| 447 | | - |
|---|
| 440 | + .irq_enable = pci_msi_unmask_irq, |
|---|
| 441 | + .irq_disable = pci_msi_mask_irq, |
|---|
| 442 | + .irq_mask = pci_msi_mask_irq, |
|---|
| 443 | + .irq_unmask = pci_msi_unmask_irq, |
|---|
| 448 | 444 | }; |
|---|
| 449 | 445 | |
|---|
| 450 | 446 | static struct msi_domain_info nwl_msi_domain_info = { |
|---|
| .. | .. |
|---|
| 589 | 585 | /* Get msi_1 IRQ number */ |
|---|
| 590 | 586 | msi->irq_msi1 = platform_get_irq_byname(pdev, "msi1"); |
|---|
| 591 | 587 | if (msi->irq_msi1 < 0) { |
|---|
| 592 | | - dev_err(dev, "failed to get IRQ#%d\n", msi->irq_msi1); |
|---|
| 593 | 588 | ret = -EINVAL; |
|---|
| 594 | 589 | goto err; |
|---|
| 595 | 590 | } |
|---|
| .. | .. |
|---|
| 600 | 595 | /* Get msi_0 IRQ number */ |
|---|
| 601 | 596 | msi->irq_msi0 = platform_get_irq_byname(pdev, "msi0"); |
|---|
| 602 | 597 | if (msi->irq_msi0 < 0) { |
|---|
| 603 | | - dev_err(dev, "failed to get IRQ#%d\n", msi->irq_msi0); |
|---|
| 604 | 598 | ret = -EINVAL; |
|---|
| 605 | 599 | goto err; |
|---|
| 606 | 600 | } |
|---|
| .. | .. |
|---|
| 731 | 725 | |
|---|
| 732 | 726 | /* Get misc IRQ number */ |
|---|
| 733 | 727 | pcie->irq_misc = platform_get_irq_byname(pdev, "misc"); |
|---|
| 734 | | - if (pcie->irq_misc < 0) { |
|---|
| 735 | | - dev_err(dev, "failed to get misc IRQ %d\n", |
|---|
| 736 | | - pcie->irq_misc); |
|---|
| 728 | + if (pcie->irq_misc < 0) |
|---|
| 737 | 729 | return -EINVAL; |
|---|
| 738 | | - } |
|---|
| 739 | 730 | |
|---|
| 740 | 731 | err = devm_request_irq(dev, pcie->irq_misc, |
|---|
| 741 | 732 | nwl_pcie_misc_handler, IRQF_SHARED, |
|---|
| .. | .. |
|---|
| 778 | 769 | struct platform_device *pdev) |
|---|
| 779 | 770 | { |
|---|
| 780 | 771 | struct device *dev = pcie->dev; |
|---|
| 781 | | - struct device_node *node = dev->of_node; |
|---|
| 782 | 772 | struct resource *res; |
|---|
| 783 | | - const char *type; |
|---|
| 784 | | - |
|---|
| 785 | | - /* Check for device type */ |
|---|
| 786 | | - type = of_get_property(node, "device_type", NULL); |
|---|
| 787 | | - if (!type || strcmp(type, "pci")) { |
|---|
| 788 | | - dev_err(dev, "invalid \"device_type\" %s\n", type); |
|---|
| 789 | | - return -EINVAL; |
|---|
| 790 | | - } |
|---|
| 791 | 773 | |
|---|
| 792 | 774 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "breg"); |
|---|
| 793 | 775 | pcie->breg_base = devm_ioremap_resource(dev, res); |
|---|
| .. | .. |
|---|
| 809 | 791 | |
|---|
| 810 | 792 | /* Get intx IRQ number */ |
|---|
| 811 | 793 | pcie->irq_intx = platform_get_irq_byname(pdev, "intx"); |
|---|
| 812 | | - if (pcie->irq_intx < 0) { |
|---|
| 813 | | - dev_err(dev, "failed to get intx IRQ %d\n", pcie->irq_intx); |
|---|
| 794 | + if (pcie->irq_intx < 0) |
|---|
| 814 | 795 | return pcie->irq_intx; |
|---|
| 815 | | - } |
|---|
| 816 | 796 | |
|---|
| 817 | 797 | irq_set_chained_handler_and_data(pcie->irq_intx, |
|---|
| 818 | 798 | nwl_pcie_leg_handler, pcie); |
|---|
| .. | .. |
|---|
| 829 | 809 | { |
|---|
| 830 | 810 | struct device *dev = &pdev->dev; |
|---|
| 831 | 811 | struct nwl_pcie *pcie; |
|---|
| 832 | | - struct pci_bus *bus; |
|---|
| 833 | | - struct pci_bus *child; |
|---|
| 834 | 812 | struct pci_host_bridge *bridge; |
|---|
| 835 | 813 | int err; |
|---|
| 836 | | - resource_size_t iobase = 0; |
|---|
| 837 | | - LIST_HEAD(res); |
|---|
| 838 | 814 | |
|---|
| 839 | 815 | bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie)); |
|---|
| 840 | 816 | if (!bridge) |
|---|
| .. | .. |
|---|
| 867 | 843 | return err; |
|---|
| 868 | 844 | } |
|---|
| 869 | 845 | |
|---|
| 870 | | - err = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff, &res, |
|---|
| 871 | | - &iobase); |
|---|
| 872 | | - if (err) { |
|---|
| 873 | | - dev_err(dev, "Getting bridge resources failed\n"); |
|---|
| 874 | | - return err; |
|---|
| 875 | | - } |
|---|
| 876 | | - |
|---|
| 877 | | - err = devm_request_pci_bus_resources(dev, &res); |
|---|
| 878 | | - if (err) |
|---|
| 879 | | - goto error; |
|---|
| 880 | | - |
|---|
| 881 | 846 | err = nwl_pcie_init_irq_domain(pcie); |
|---|
| 882 | 847 | if (err) { |
|---|
| 883 | 848 | dev_err(dev, "Failed creating IRQ Domain\n"); |
|---|
| 884 | | - goto error; |
|---|
| 849 | + return err; |
|---|
| 885 | 850 | } |
|---|
| 886 | 851 | |
|---|
| 887 | | - list_splice_init(&res, &bridge->windows); |
|---|
| 888 | | - bridge->dev.parent = dev; |
|---|
| 889 | 852 | bridge->sysdata = pcie; |
|---|
| 890 | | - bridge->busnr = pcie->root_busno; |
|---|
| 891 | 853 | bridge->ops = &nwl_pcie_ops; |
|---|
| 892 | | - bridge->map_irq = of_irq_parse_and_map_pci; |
|---|
| 893 | | - bridge->swizzle_irq = pci_common_swizzle; |
|---|
| 894 | 854 | |
|---|
| 895 | 855 | if (IS_ENABLED(CONFIG_PCI_MSI)) { |
|---|
| 896 | 856 | err = nwl_pcie_enable_msi(pcie); |
|---|
| 897 | 857 | if (err < 0) { |
|---|
| 898 | 858 | dev_err(dev, "failed to enable MSI support: %d\n", err); |
|---|
| 899 | | - goto error; |
|---|
| 859 | + return err; |
|---|
| 900 | 860 | } |
|---|
| 901 | 861 | } |
|---|
| 902 | 862 | |
|---|
| 903 | | - err = pci_scan_root_bus_bridge(bridge); |
|---|
| 904 | | - if (err) |
|---|
| 905 | | - goto error; |
|---|
| 906 | | - |
|---|
| 907 | | - bus = bridge->bus; |
|---|
| 908 | | - |
|---|
| 909 | | - pci_assign_unassigned_bus_resources(bus); |
|---|
| 910 | | - list_for_each_entry(child, &bus->children, node) |
|---|
| 911 | | - pcie_bus_configure_settings(child); |
|---|
| 912 | | - pci_bus_add_devices(bus); |
|---|
| 913 | | - return 0; |
|---|
| 914 | | - |
|---|
| 915 | | -error: |
|---|
| 916 | | - pci_free_resource_list(&res); |
|---|
| 917 | | - return err; |
|---|
| 863 | + return pci_host_probe(bridge); |
|---|
| 918 | 864 | } |
|---|
| 919 | 865 | |
|---|
| 920 | 866 | static struct platform_driver nwl_pcie_driver = { |
|---|