.. | .. |
---|
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 = { |
---|