Lines Matching refs:pcie

309 	struct tegra_pcie *pcie;  member
328 static inline void afi_writel(struct tegra_pcie *pcie, u32 value, in afi_writel() argument
331 writel(value, pcie->afi + offset); in afi_writel()
334 static inline u32 afi_readl(struct tegra_pcie *pcie, unsigned long offset) in afi_readl() argument
336 return readl(pcie->afi + offset); in afi_readl()
339 static inline void pads_writel(struct tegra_pcie *pcie, u32 value, in pads_writel() argument
342 writel(value, pcie->pads + offset); in pads_writel()
345 static inline u32 pads_readl(struct tegra_pcie *pcie, unsigned long offset) in pads_readl() argument
347 return readl(pcie->pads + offset); in pads_readl()
382 static struct tegra_pcie_bus *tegra_pcie_bus_alloc(struct tegra_pcie *pcie, in tegra_pcie_bus_alloc() argument
387 phys_addr_t cs = pcie->cs->start; in tegra_pcie_bus_alloc()
414 dev_err(pcie->dev, "ioremap_page_range() failed: %d\n", in tegra_pcie_bus_alloc()
433 static void __iomem *tegra_pcie_bus_map(struct tegra_pcie *pcie, in tegra_pcie_bus_map() argument
438 list_for_each_entry(bus, &pcie->buses, list) in tegra_pcie_bus_map()
442 bus = tegra_pcie_bus_alloc(pcie, busnr); in tegra_pcie_bus_map()
446 list_add_tail(&bus->list, &pcie->buses); in tegra_pcie_bus_map()
455 struct tegra_pcie *pcie = sys_to_pcie(bus->sysdata); in tegra_pcie_conf_address() local
462 list_for_each_entry(port, &pcie->ports, list) { in tegra_pcie_conf_address()
469 addr = tegra_pcie_bus_map(pcie, bus->number); in tegra_pcie_conf_address()
471 dev_err(pcie->dev, in tegra_pcie_conf_address()
516 value = afi_readl(port->pcie, ctrl); in tegra_pcie_port_reset()
518 afi_writel(port->pcie, value, ctrl); in tegra_pcie_port_reset()
522 value = afi_readl(port->pcie, ctrl); in tegra_pcie_port_reset()
524 afi_writel(port->pcie, value, ctrl); in tegra_pcie_port_reset()
529 const struct tegra_pcie_soc_data *soc = port->pcie->soc_data; in tegra_pcie_port_enable()
534 value = afi_readl(port->pcie, ctrl); in tegra_pcie_port_enable()
542 afi_writel(port->pcie, value, ctrl); in tegra_pcie_port_enable()
549 const struct tegra_pcie_soc_data *soc = port->pcie->soc_data; in tegra_pcie_port_disable()
554 value = afi_readl(port->pcie, ctrl); in tegra_pcie_port_disable()
556 afi_writel(port->pcie, value, ctrl); in tegra_pcie_port_disable()
559 value = afi_readl(port->pcie, ctrl); in tegra_pcie_port_disable()
565 afi_writel(port->pcie, value, ctrl); in tegra_pcie_port_disable()
570 struct tegra_pcie *pcie = port->pcie; in tegra_pcie_port_free() local
572 devm_iounmap(pcie->dev, port->base); in tegra_pcie_port_free()
573 devm_release_mem_region(pcie->dev, port->regs.start, in tegra_pcie_port_free()
576 devm_kfree(pcie->dev, port); in tegra_pcie_port_free()
598 struct tegra_pcie *pcie = sys_to_pcie(sys); in tegra_pcie_setup() local
601 err = devm_request_resource(pcie->dev, &pcie->all, &pcie->mem); in tegra_pcie_setup()
605 err = devm_request_resource(pcie->dev, &pcie->all, &pcie->prefetch); in tegra_pcie_setup()
609 pci_add_resource_offset(&sys->resources, &pcie->mem, sys->mem_offset); in tegra_pcie_setup()
610 pci_add_resource_offset(&sys->resources, &pcie->prefetch, in tegra_pcie_setup()
612 pci_add_resource(&sys->resources, &pcie->busn); in tegra_pcie_setup()
614 pci_ioremap_io(pcie->pio.start, pcie->io.start); in tegra_pcie_setup()
621 struct tegra_pcie *pcie = sys_to_pcie(pdev->bus->sysdata); in tegra_pcie_map_irq() local
628 irq = pcie->irq; in tegra_pcie_map_irq()
635 struct tegra_pcie *pcie = sys_to_pcie(sys); in tegra_pcie_scan_bus() local
638 bus = pci_create_root_bus(pcie->dev, sys->busnr, &tegra_pcie_ops, sys, in tegra_pcie_scan_bus()
667 struct tegra_pcie *pcie = arg; in tegra_pcie_isr() local
670 code = afi_readl(pcie, AFI_INTR_CODE) & AFI_INTR_CODE_MASK; in tegra_pcie_isr()
671 signature = afi_readl(pcie, AFI_INTR_SIGNATURE); in tegra_pcie_isr()
672 afi_writel(pcie, 0, AFI_INTR_CODE); in tegra_pcie_isr()
685 dev_dbg(pcie->dev, "%s, signature: %08x\n", err_msg[code], in tegra_pcie_isr()
688 dev_err(pcie->dev, "%s, signature: %08x\n", err_msg[code], in tegra_pcie_isr()
693 u32 fpci = afi_readl(pcie, AFI_UPPER_FPCI_ADDRESS) & 0xff; in tegra_pcie_isr()
697 dev_dbg(pcie->dev, " FPCI address: %10llx\n", address); in tegra_pcie_isr()
699 dev_err(pcie->dev, " FPCI address: %10llx\n", address); in tegra_pcie_isr()
713 static void tegra_pcie_setup_translations(struct tegra_pcie *pcie) in tegra_pcie_setup_translations() argument
719 size = resource_size(pcie->cs); in tegra_pcie_setup_translations()
720 axi_address = pcie->cs->start; in tegra_pcie_setup_translations()
721 afi_writel(pcie, axi_address, AFI_AXI_BAR0_START); in tegra_pcie_setup_translations()
722 afi_writel(pcie, size >> 12, AFI_AXI_BAR0_SZ); in tegra_pcie_setup_translations()
723 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR0); in tegra_pcie_setup_translations()
727 size = resource_size(&pcie->io); in tegra_pcie_setup_translations()
728 axi_address = pcie->io.start; in tegra_pcie_setup_translations()
729 afi_writel(pcie, axi_address, AFI_AXI_BAR1_START); in tegra_pcie_setup_translations()
730 afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ); in tegra_pcie_setup_translations()
731 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1); in tegra_pcie_setup_translations()
734 fpci_bar = (((pcie->prefetch.start >> 12) & 0x0fffffff) << 4) | 0x1; in tegra_pcie_setup_translations()
735 size = resource_size(&pcie->prefetch); in tegra_pcie_setup_translations()
736 axi_address = pcie->prefetch.start; in tegra_pcie_setup_translations()
737 afi_writel(pcie, axi_address, AFI_AXI_BAR2_START); in tegra_pcie_setup_translations()
738 afi_writel(pcie, size >> 12, AFI_AXI_BAR2_SZ); in tegra_pcie_setup_translations()
739 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR2); in tegra_pcie_setup_translations()
742 fpci_bar = (((pcie->mem.start >> 12) & 0x0fffffff) << 4) | 0x1; in tegra_pcie_setup_translations()
743 size = resource_size(&pcie->mem); in tegra_pcie_setup_translations()
744 axi_address = pcie->mem.start; in tegra_pcie_setup_translations()
745 afi_writel(pcie, axi_address, AFI_AXI_BAR3_START); in tegra_pcie_setup_translations()
746 afi_writel(pcie, size >> 12, AFI_AXI_BAR3_SZ); in tegra_pcie_setup_translations()
747 afi_writel(pcie, fpci_bar, AFI_FPCI_BAR3); in tegra_pcie_setup_translations()
750 afi_writel(pcie, 0, AFI_AXI_BAR4_START); in tegra_pcie_setup_translations()
751 afi_writel(pcie, 0, AFI_AXI_BAR4_SZ); in tegra_pcie_setup_translations()
752 afi_writel(pcie, 0, AFI_FPCI_BAR4); in tegra_pcie_setup_translations()
754 afi_writel(pcie, 0, AFI_AXI_BAR5_START); in tegra_pcie_setup_translations()
755 afi_writel(pcie, 0, AFI_AXI_BAR5_SZ); in tegra_pcie_setup_translations()
756 afi_writel(pcie, 0, AFI_FPCI_BAR5); in tegra_pcie_setup_translations()
759 afi_writel(pcie, PHYS_OFFSET, AFI_CACHE_BAR0_ST); in tegra_pcie_setup_translations()
760 afi_writel(pcie, 0, AFI_CACHE_BAR0_SZ); in tegra_pcie_setup_translations()
761 afi_writel(pcie, 0, AFI_CACHE_BAR1_ST); in tegra_pcie_setup_translations()
762 afi_writel(pcie, 0, AFI_CACHE_BAR1_SZ); in tegra_pcie_setup_translations()
765 afi_writel(pcie, 0, AFI_MSI_FPCI_BAR_ST); in tegra_pcie_setup_translations()
766 afi_writel(pcie, 0, AFI_MSI_BAR_SZ); in tegra_pcie_setup_translations()
767 afi_writel(pcie, 0, AFI_MSI_AXI_BAR_ST); in tegra_pcie_setup_translations()
768 afi_writel(pcie, 0, AFI_MSI_BAR_SZ); in tegra_pcie_setup_translations()
771 static int tegra_pcie_pll_wait(struct tegra_pcie *pcie, unsigned long timeout) in tegra_pcie_pll_wait() argument
773 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_pll_wait()
779 value = pads_readl(pcie, soc->pads_pll_ctl); in tegra_pcie_pll_wait()
787 static int tegra_pcie_phy_enable(struct tegra_pcie *pcie) in tegra_pcie_phy_enable() argument
789 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_phy_enable()
794 pads_writel(pcie, 0x0, PADS_CTL_SEL); in tegra_pcie_phy_enable()
797 value = pads_readl(pcie, PADS_CTL); in tegra_pcie_phy_enable()
799 pads_writel(pcie, value, PADS_CTL); in tegra_pcie_phy_enable()
805 value = pads_readl(pcie, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
808 pads_writel(pcie, value, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
811 value = pads_readl(pcie, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
813 pads_writel(pcie, value, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
818 value = pads_readl(pcie, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
820 pads_writel(pcie, value, soc->pads_pll_ctl); in tegra_pcie_phy_enable()
824 pads_writel(pcie, value, PADS_REFCLK_CFG0); in tegra_pcie_phy_enable()
826 pads_writel(pcie, PADS_REFCLK_CFG_VALUE, PADS_REFCLK_CFG1); in tegra_pcie_phy_enable()
829 err = tegra_pcie_pll_wait(pcie, 500); in tegra_pcie_phy_enable()
831 dev_err(pcie->dev, "PLL failed to lock: %d\n", err); in tegra_pcie_phy_enable()
836 value = pads_readl(pcie, PADS_CTL); in tegra_pcie_phy_enable()
838 pads_writel(pcie, value, PADS_CTL); in tegra_pcie_phy_enable()
841 value = pads_readl(pcie, PADS_CTL); in tegra_pcie_phy_enable()
843 pads_writel(pcie, value, PADS_CTL); in tegra_pcie_phy_enable()
848 static int tegra_pcie_enable_controller(struct tegra_pcie *pcie) in tegra_pcie_enable_controller() argument
850 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_enable_controller()
856 if (pcie->phy) { in tegra_pcie_enable_controller()
857 value = afi_readl(pcie, AFI_PLLE_CONTROL); in tegra_pcie_enable_controller()
860 afi_writel(pcie, value, AFI_PLLE_CONTROL); in tegra_pcie_enable_controller()
865 afi_writel(pcie, 0, AFI_PEXBIAS_CTRL_0); in tegra_pcie_enable_controller()
868 value = afi_readl(pcie, AFI_PCIE_CONFIG); in tegra_pcie_enable_controller()
870 value |= AFI_PCIE_CONFIG_PCIE_DISABLE_ALL | pcie->xbar_config; in tegra_pcie_enable_controller()
872 list_for_each_entry(port, &pcie->ports, list) in tegra_pcie_enable_controller()
875 afi_writel(pcie, value, AFI_PCIE_CONFIG); in tegra_pcie_enable_controller()
878 value = afi_readl(pcie, AFI_FUSE); in tegra_pcie_enable_controller()
880 afi_writel(pcie, value, AFI_FUSE); in tegra_pcie_enable_controller()
882 value = afi_readl(pcie, AFI_FUSE); in tegra_pcie_enable_controller()
884 afi_writel(pcie, value, AFI_FUSE); in tegra_pcie_enable_controller()
887 if (!pcie->phy) in tegra_pcie_enable_controller()
888 err = tegra_pcie_phy_enable(pcie); in tegra_pcie_enable_controller()
890 err = phy_power_on(pcie->phy); in tegra_pcie_enable_controller()
893 dev_err(pcie->dev, "failed to power on PHY: %d\n", err); in tegra_pcie_enable_controller()
898 reset_control_deassert(pcie->pcie_xrst); in tegra_pcie_enable_controller()
901 value = afi_readl(pcie, AFI_CONFIGURATION); in tegra_pcie_enable_controller()
903 afi_writel(pcie, value, AFI_CONFIGURATION); in tegra_pcie_enable_controller()
912 afi_writel(pcie, value, AFI_AFI_INTR_ENABLE); in tegra_pcie_enable_controller()
913 afi_writel(pcie, 0xffffffff, AFI_SM_INTR_ENABLE); in tegra_pcie_enable_controller()
916 afi_writel(pcie, AFI_INTR_MASK_INT_MASK, AFI_INTR_MASK); in tegra_pcie_enable_controller()
919 afi_writel(pcie, 0, AFI_FPCI_ERROR_MASKS); in tegra_pcie_enable_controller()
924 static void tegra_pcie_power_off(struct tegra_pcie *pcie) in tegra_pcie_power_off() argument
930 err = phy_power_off(pcie->phy); in tegra_pcie_power_off()
932 dev_warn(pcie->dev, "failed to power off PHY: %d\n", err); in tegra_pcie_power_off()
934 reset_control_assert(pcie->pcie_xrst); in tegra_pcie_power_off()
935 reset_control_assert(pcie->afi_rst); in tegra_pcie_power_off()
936 reset_control_assert(pcie->pex_rst); in tegra_pcie_power_off()
940 err = regulator_bulk_disable(pcie->num_supplies, pcie->supplies); in tegra_pcie_power_off()
942 dev_warn(pcie->dev, "failed to disable regulators: %d\n", err); in tegra_pcie_power_off()
945 static int tegra_pcie_power_on(struct tegra_pcie *pcie) in tegra_pcie_power_on() argument
947 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_power_on()
950 reset_control_assert(pcie->pcie_xrst); in tegra_pcie_power_on()
951 reset_control_assert(pcie->afi_rst); in tegra_pcie_power_on()
952 reset_control_assert(pcie->pex_rst); in tegra_pcie_power_on()
957 err = regulator_bulk_enable(pcie->num_supplies, pcie->supplies); in tegra_pcie_power_on()
959 dev_err(pcie->dev, "failed to enable regulators: %d\n", err); in tegra_pcie_power_on()
962 pcie->pex_clk, in tegra_pcie_power_on()
963 pcie->pex_rst); in tegra_pcie_power_on()
965 dev_err(pcie->dev, "powerup sequence failed: %d\n", err); in tegra_pcie_power_on()
969 reset_control_deassert(pcie->afi_rst); in tegra_pcie_power_on()
971 err = clk_prepare_enable(pcie->afi_clk); in tegra_pcie_power_on()
973 dev_err(pcie->dev, "failed to enable AFI clock: %d\n", err); in tegra_pcie_power_on()
978 err = clk_prepare_enable(pcie->cml_clk); in tegra_pcie_power_on()
980 dev_err(pcie->dev, "failed to enable CML clock: %d\n", in tegra_pcie_power_on()
986 err = clk_prepare_enable(pcie->pll_e); in tegra_pcie_power_on()
988 dev_err(pcie->dev, "failed to enable PLLE clock: %d\n", err); in tegra_pcie_power_on()
995 static int tegra_pcie_clocks_get(struct tegra_pcie *pcie) in tegra_pcie_clocks_get() argument
997 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_clocks_get()
999 pcie->pex_clk = devm_clk_get(pcie->dev, "pex"); in tegra_pcie_clocks_get()
1000 if (IS_ERR(pcie->pex_clk)) in tegra_pcie_clocks_get()
1001 return PTR_ERR(pcie->pex_clk); in tegra_pcie_clocks_get()
1003 pcie->afi_clk = devm_clk_get(pcie->dev, "afi"); in tegra_pcie_clocks_get()
1004 if (IS_ERR(pcie->afi_clk)) in tegra_pcie_clocks_get()
1005 return PTR_ERR(pcie->afi_clk); in tegra_pcie_clocks_get()
1007 pcie->pll_e = devm_clk_get(pcie->dev, "pll_e"); in tegra_pcie_clocks_get()
1008 if (IS_ERR(pcie->pll_e)) in tegra_pcie_clocks_get()
1009 return PTR_ERR(pcie->pll_e); in tegra_pcie_clocks_get()
1012 pcie->cml_clk = devm_clk_get(pcie->dev, "cml"); in tegra_pcie_clocks_get()
1013 if (IS_ERR(pcie->cml_clk)) in tegra_pcie_clocks_get()
1014 return PTR_ERR(pcie->cml_clk); in tegra_pcie_clocks_get()
1020 static int tegra_pcie_resets_get(struct tegra_pcie *pcie) in tegra_pcie_resets_get() argument
1022 pcie->pex_rst = devm_reset_control_get(pcie->dev, "pex"); in tegra_pcie_resets_get()
1023 if (IS_ERR(pcie->pex_rst)) in tegra_pcie_resets_get()
1024 return PTR_ERR(pcie->pex_rst); in tegra_pcie_resets_get()
1026 pcie->afi_rst = devm_reset_control_get(pcie->dev, "afi"); in tegra_pcie_resets_get()
1027 if (IS_ERR(pcie->afi_rst)) in tegra_pcie_resets_get()
1028 return PTR_ERR(pcie->afi_rst); in tegra_pcie_resets_get()
1030 pcie->pcie_xrst = devm_reset_control_get(pcie->dev, "pcie_x"); in tegra_pcie_resets_get()
1031 if (IS_ERR(pcie->pcie_xrst)) in tegra_pcie_resets_get()
1032 return PTR_ERR(pcie->pcie_xrst); in tegra_pcie_resets_get()
1037 static int tegra_pcie_get_resources(struct tegra_pcie *pcie) in tegra_pcie_get_resources() argument
1039 struct platform_device *pdev = to_platform_device(pcie->dev); in tegra_pcie_get_resources()
1043 err = tegra_pcie_clocks_get(pcie); in tegra_pcie_get_resources()
1049 err = tegra_pcie_resets_get(pcie); in tegra_pcie_get_resources()
1055 pcie->phy = devm_phy_optional_get(pcie->dev, "pcie"); in tegra_pcie_get_resources()
1056 if (IS_ERR(pcie->phy)) { in tegra_pcie_get_resources()
1057 err = PTR_ERR(pcie->phy); in tegra_pcie_get_resources()
1062 err = phy_init(pcie->phy); in tegra_pcie_get_resources()
1068 err = tegra_pcie_power_on(pcie); in tegra_pcie_get_resources()
1075 pcie->pads = devm_ioremap_resource(&pdev->dev, pads); in tegra_pcie_get_resources()
1076 if (IS_ERR(pcie->pads)) { in tegra_pcie_get_resources()
1077 err = PTR_ERR(pcie->pads); in tegra_pcie_get_resources()
1082 pcie->afi = devm_ioremap_resource(&pdev->dev, afi); in tegra_pcie_get_resources()
1083 if (IS_ERR(pcie->afi)) { in tegra_pcie_get_resources()
1084 err = PTR_ERR(pcie->afi); in tegra_pcie_get_resources()
1095 pcie->cs = devm_request_mem_region(pcie->dev, res->start, in tegra_pcie_get_resources()
1097 if (!pcie->cs) { in tegra_pcie_get_resources()
1109 pcie->irq = err; in tegra_pcie_get_resources()
1111 err = request_irq(pcie->irq, tegra_pcie_isr, IRQF_SHARED, "PCIE", pcie); in tegra_pcie_get_resources()
1120 tegra_pcie_power_off(pcie); in tegra_pcie_get_resources()
1124 static int tegra_pcie_put_resources(struct tegra_pcie *pcie) in tegra_pcie_put_resources() argument
1128 if (pcie->irq > 0) in tegra_pcie_put_resources()
1129 free_irq(pcie->irq, pcie); in tegra_pcie_put_resources()
1131 tegra_pcie_power_off(pcie); in tegra_pcie_put_resources()
1133 err = phy_exit(pcie->phy); in tegra_pcie_put_resources()
1135 dev_err(pcie->dev, "failed to teardown PHY: %d\n", err); in tegra_pcie_put_resources()
1173 struct tegra_pcie *pcie = data; in tegra_pcie_msi_irq() local
1174 struct tegra_msi *msi = &pcie->msi; in tegra_pcie_msi_irq()
1178 unsigned long reg = afi_readl(pcie, AFI_MSI_VEC0 + i * 4); in tegra_pcie_msi_irq()
1186 afi_writel(pcie, 1 << offset, AFI_MSI_VEC0 + i * 4); in tegra_pcie_msi_irq()
1193 dev_info(pcie->dev, "unhandled MSI\n"); in tegra_pcie_msi_irq()
1199 dev_info(pcie->dev, "unexpected MSI\n"); in tegra_pcie_msi_irq()
1203 reg = afi_readl(pcie, AFI_MSI_VEC0 + i * 4); in tegra_pcie_msi_irq()
1277 static int tegra_pcie_enable_msi(struct tegra_pcie *pcie) in tegra_pcie_enable_msi() argument
1279 struct platform_device *pdev = to_platform_device(pcie->dev); in tegra_pcie_enable_msi()
1280 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_enable_msi()
1281 struct tegra_msi *msi = &pcie->msi; in tegra_pcie_enable_msi()
1288 msi->chip.dev = pcie->dev; in tegra_pcie_enable_msi()
1292 msi->domain = irq_domain_add_linear(pcie->dev->of_node, INT_PCI_MSI_NR, in tegra_pcie_enable_msi()
1308 tegra_msi_irq_chip.name, pcie); in tegra_pcie_enable_msi()
1318 afi_writel(pcie, base >> soc->msi_base_shift, AFI_MSI_FPCI_BAR_ST); in tegra_pcie_enable_msi()
1319 afi_writel(pcie, base, AFI_MSI_AXI_BAR_ST); in tegra_pcie_enable_msi()
1321 afi_writel(pcie, 1, AFI_MSI_BAR_SZ); in tegra_pcie_enable_msi()
1324 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC0); in tegra_pcie_enable_msi()
1325 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC1); in tegra_pcie_enable_msi()
1326 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC2); in tegra_pcie_enable_msi()
1327 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC3); in tegra_pcie_enable_msi()
1328 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC4); in tegra_pcie_enable_msi()
1329 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC5); in tegra_pcie_enable_msi()
1330 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC6); in tegra_pcie_enable_msi()
1331 afi_writel(pcie, 0xffffffff, AFI_MSI_EN_VEC7); in tegra_pcie_enable_msi()
1334 reg = afi_readl(pcie, AFI_INTR_MASK); in tegra_pcie_enable_msi()
1336 afi_writel(pcie, reg, AFI_INTR_MASK); in tegra_pcie_enable_msi()
1345 static int tegra_pcie_disable_msi(struct tegra_pcie *pcie) in tegra_pcie_disable_msi() argument
1347 struct tegra_msi *msi = &pcie->msi; in tegra_pcie_disable_msi()
1352 value = afi_readl(pcie, AFI_INTR_MASK); in tegra_pcie_disable_msi()
1354 afi_writel(pcie, value, AFI_INTR_MASK); in tegra_pcie_disable_msi()
1357 afi_writel(pcie, 0, AFI_MSI_EN_VEC0); in tegra_pcie_disable_msi()
1358 afi_writel(pcie, 0, AFI_MSI_EN_VEC1); in tegra_pcie_disable_msi()
1359 afi_writel(pcie, 0, AFI_MSI_EN_VEC2); in tegra_pcie_disable_msi()
1360 afi_writel(pcie, 0, AFI_MSI_EN_VEC3); in tegra_pcie_disable_msi()
1361 afi_writel(pcie, 0, AFI_MSI_EN_VEC4); in tegra_pcie_disable_msi()
1362 afi_writel(pcie, 0, AFI_MSI_EN_VEC5); in tegra_pcie_disable_msi()
1363 afi_writel(pcie, 0, AFI_MSI_EN_VEC6); in tegra_pcie_disable_msi()
1364 afi_writel(pcie, 0, AFI_MSI_EN_VEC7); in tegra_pcie_disable_msi()
1369 free_irq(msi->irq, pcie); in tegra_pcie_disable_msi()
1382 static int tegra_pcie_get_xbar_config(struct tegra_pcie *pcie, u32 lanes, in tegra_pcie_get_xbar_config() argument
1385 struct device_node *np = pcie->dev->of_node; in tegra_pcie_get_xbar_config()
1390 dev_info(pcie->dev, "4x1, 1x1 configuration\n"); in tegra_pcie_get_xbar_config()
1395 dev_info(pcie->dev, "2x1, 1x1 configuration\n"); in tegra_pcie_get_xbar_config()
1402 dev_info(pcie->dev, "4x1, 2x1 configuration\n"); in tegra_pcie_get_xbar_config()
1407 dev_info(pcie->dev, "2x3 configuration\n"); in tegra_pcie_get_xbar_config()
1412 dev_info(pcie->dev, "4x1, 1x2 configuration\n"); in tegra_pcie_get_xbar_config()
1419 dev_info(pcie->dev, "single-mode configuration\n"); in tegra_pcie_get_xbar_config()
1424 dev_info(pcie->dev, "dual-mode configuration\n"); in tegra_pcie_get_xbar_config()
1462 static int tegra_pcie_get_legacy_regulators(struct tegra_pcie *pcie) in tegra_pcie_get_legacy_regulators() argument
1464 struct device_node *np = pcie->dev->of_node; in tegra_pcie_get_legacy_regulators()
1467 pcie->num_supplies = 3; in tegra_pcie_get_legacy_regulators()
1469 pcie->num_supplies = 2; in tegra_pcie_get_legacy_regulators()
1471 if (pcie->num_supplies == 0) { in tegra_pcie_get_legacy_regulators()
1472 dev_err(pcie->dev, "device %s not supported in legacy mode\n", in tegra_pcie_get_legacy_regulators()
1477 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies, in tegra_pcie_get_legacy_regulators()
1478 sizeof(*pcie->supplies), in tegra_pcie_get_legacy_regulators()
1480 if (!pcie->supplies) in tegra_pcie_get_legacy_regulators()
1483 pcie->supplies[0].supply = "pex-clk"; in tegra_pcie_get_legacy_regulators()
1484 pcie->supplies[1].supply = "vdd"; in tegra_pcie_get_legacy_regulators()
1486 if (pcie->num_supplies > 2) in tegra_pcie_get_legacy_regulators()
1487 pcie->supplies[2].supply = "avdd"; in tegra_pcie_get_legacy_regulators()
1489 return devm_regulator_bulk_get(pcie->dev, pcie->num_supplies, in tegra_pcie_get_legacy_regulators()
1490 pcie->supplies); in tegra_pcie_get_legacy_regulators()
1502 static int tegra_pcie_get_regulators(struct tegra_pcie *pcie, u32 lane_mask) in tegra_pcie_get_regulators() argument
1504 struct device_node *np = pcie->dev->of_node; in tegra_pcie_get_regulators()
1508 pcie->num_supplies = 7; in tegra_pcie_get_regulators()
1510 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies, in tegra_pcie_get_regulators()
1511 sizeof(*pcie->supplies), in tegra_pcie_get_regulators()
1513 if (!pcie->supplies) in tegra_pcie_get_regulators()
1516 pcie->supplies[i++].supply = "avddio-pex"; in tegra_pcie_get_regulators()
1517 pcie->supplies[i++].supply = "dvddio-pex"; in tegra_pcie_get_regulators()
1518 pcie->supplies[i++].supply = "avdd-pex-pll"; in tegra_pcie_get_regulators()
1519 pcie->supplies[i++].supply = "hvdd-pex"; in tegra_pcie_get_regulators()
1520 pcie->supplies[i++].supply = "hvdd-pex-pll-e"; in tegra_pcie_get_regulators()
1521 pcie->supplies[i++].supply = "vddio-pex-ctl"; in tegra_pcie_get_regulators()
1522 pcie->supplies[i++].supply = "avdd-pll-erefe"; in tegra_pcie_get_regulators()
1534 pcie->num_supplies = 4 + (need_pexa ? 2 : 0) + in tegra_pcie_get_regulators()
1537 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies, in tegra_pcie_get_regulators()
1538 sizeof(*pcie->supplies), in tegra_pcie_get_regulators()
1540 if (!pcie->supplies) in tegra_pcie_get_regulators()
1543 pcie->supplies[i++].supply = "avdd-pex-pll"; in tegra_pcie_get_regulators()
1544 pcie->supplies[i++].supply = "hvdd-pex"; in tegra_pcie_get_regulators()
1545 pcie->supplies[i++].supply = "vddio-pex-ctl"; in tegra_pcie_get_regulators()
1546 pcie->supplies[i++].supply = "avdd-plle"; in tegra_pcie_get_regulators()
1549 pcie->supplies[i++].supply = "avdd-pexa"; in tegra_pcie_get_regulators()
1550 pcie->supplies[i++].supply = "vdd-pexa"; in tegra_pcie_get_regulators()
1554 pcie->supplies[i++].supply = "avdd-pexb"; in tegra_pcie_get_regulators()
1555 pcie->supplies[i++].supply = "vdd-pexb"; in tegra_pcie_get_regulators()
1558 pcie->num_supplies = 5; in tegra_pcie_get_regulators()
1560 pcie->supplies = devm_kcalloc(pcie->dev, pcie->num_supplies, in tegra_pcie_get_regulators()
1561 sizeof(*pcie->supplies), in tegra_pcie_get_regulators()
1563 if (!pcie->supplies) in tegra_pcie_get_regulators()
1566 pcie->supplies[0].supply = "avdd-pex"; in tegra_pcie_get_regulators()
1567 pcie->supplies[1].supply = "vdd-pex"; in tegra_pcie_get_regulators()
1568 pcie->supplies[2].supply = "avdd-pex-pll"; in tegra_pcie_get_regulators()
1569 pcie->supplies[3].supply = "avdd-plle"; in tegra_pcie_get_regulators()
1570 pcie->supplies[4].supply = "vddio-pex-clk"; in tegra_pcie_get_regulators()
1573 if (of_regulator_bulk_available(pcie->dev->of_node, pcie->supplies, in tegra_pcie_get_regulators()
1574 pcie->num_supplies)) in tegra_pcie_get_regulators()
1575 return devm_regulator_bulk_get(pcie->dev, pcie->num_supplies, in tegra_pcie_get_regulators()
1576 pcie->supplies); in tegra_pcie_get_regulators()
1583 dev_info(pcie->dev, "using legacy DT binding for power supplies\n"); in tegra_pcie_get_regulators()
1585 devm_kfree(pcie->dev, pcie->supplies); in tegra_pcie_get_regulators()
1586 pcie->num_supplies = 0; in tegra_pcie_get_regulators()
1588 return tegra_pcie_get_legacy_regulators(pcie); in tegra_pcie_get_regulators()
1591 static int tegra_pcie_parse_dt(struct tegra_pcie *pcie) in tegra_pcie_parse_dt() argument
1593 const struct tegra_pcie_soc_data *soc = pcie->soc_data; in tegra_pcie_parse_dt()
1594 struct device_node *np = pcie->dev->of_node, *port; in tegra_pcie_parse_dt()
1602 memset(&pcie->all, 0, sizeof(pcie->all)); in tegra_pcie_parse_dt()
1603 pcie->all.flags = IORESOURCE_MEM; in tegra_pcie_parse_dt()
1604 pcie->all.name = np->full_name; in tegra_pcie_parse_dt()
1605 pcie->all.start = ~0; in tegra_pcie_parse_dt()
1606 pcie->all.end = 0; in tegra_pcie_parse_dt()
1609 dev_err(pcie->dev, "missing \"ranges\" property\n"); in tegra_pcie_parse_dt()
1620 memcpy(&pcie->pio, &res, sizeof(res)); in tegra_pcie_parse_dt()
1621 pcie->pio.name = np->full_name; in tegra_pcie_parse_dt()
1631 pcie->io.start = range.cpu_addr; in tegra_pcie_parse_dt()
1632 pcie->io.end = range.cpu_addr + range.size - 1; in tegra_pcie_parse_dt()
1633 pcie->io.flags = IORESOURCE_MEM; in tegra_pcie_parse_dt()
1634 pcie->io.name = "I/O"; in tegra_pcie_parse_dt()
1636 memcpy(&res, &pcie->io, sizeof(res)); in tegra_pcie_parse_dt()
1641 memcpy(&pcie->prefetch, &res, sizeof(res)); in tegra_pcie_parse_dt()
1642 pcie->prefetch.name = "prefetchable"; in tegra_pcie_parse_dt()
1644 memcpy(&pcie->mem, &res, sizeof(res)); in tegra_pcie_parse_dt()
1645 pcie->mem.name = "non-prefetchable"; in tegra_pcie_parse_dt()
1650 if (res.start <= pcie->all.start) in tegra_pcie_parse_dt()
1651 pcie->all.start = res.start; in tegra_pcie_parse_dt()
1653 if (res.end >= pcie->all.end) in tegra_pcie_parse_dt()
1654 pcie->all.end = res.end; in tegra_pcie_parse_dt()
1657 err = devm_request_resource(pcie->dev, &iomem_resource, &pcie->all); in tegra_pcie_parse_dt()
1661 err = of_pci_parse_bus_range(np, &pcie->busn); in tegra_pcie_parse_dt()
1663 dev_err(pcie->dev, "failed to parse ranges property: %d\n", in tegra_pcie_parse_dt()
1665 pcie->busn.name = np->name; in tegra_pcie_parse_dt()
1666 pcie->busn.start = 0; in tegra_pcie_parse_dt()
1667 pcie->busn.end = 0xff; in tegra_pcie_parse_dt()
1668 pcie->busn.flags = IORESOURCE_BUS; in tegra_pcie_parse_dt()
1679 dev_err(pcie->dev, "failed to parse address: %d\n", in tegra_pcie_parse_dt()
1687 dev_err(pcie->dev, "invalid port number: %d\n", index); in tegra_pcie_parse_dt()
1695 dev_err(pcie->dev, "failed to parse # of lanes: %d\n", in tegra_pcie_parse_dt()
1701 dev_err(pcie->dev, "invalid # of lanes: %u\n", value); in tegra_pcie_parse_dt()
1715 rp = devm_kzalloc(pcie->dev, sizeof(*rp), GFP_KERNEL); in tegra_pcie_parse_dt()
1721 dev_err(pcie->dev, "failed to parse address: %d\n", in tegra_pcie_parse_dt()
1729 rp->pcie = pcie; in tegra_pcie_parse_dt()
1731 rp->base = devm_ioremap_resource(pcie->dev, &rp->regs); in tegra_pcie_parse_dt()
1735 list_add_tail(&rp->list, &pcie->ports); in tegra_pcie_parse_dt()
1738 err = tegra_pcie_get_xbar_config(pcie, lanes, &pcie->xbar_config); in tegra_pcie_parse_dt()
1740 dev_err(pcie->dev, "invalid lane configuration\n"); in tegra_pcie_parse_dt()
1744 err = tegra_pcie_get_regulators(pcie, mask); in tegra_pcie_parse_dt()
1781 dev_err(port->pcie->dev, "link %u down, retrying\n", in tegra_pcie_port_check_link()
1804 static int tegra_pcie_enable(struct tegra_pcie *pcie) in tegra_pcie_enable() argument
1809 list_for_each_entry_safe(port, tmp, &pcie->ports, list) { in tegra_pcie_enable()
1810 dev_info(pcie->dev, "probing port %u, using %u lanes\n", in tegra_pcie_enable()
1818 dev_info(pcie->dev, "link %u down, ignoring\n", port->index); in tegra_pcie_enable()
1827 hw.msi_ctrl = &pcie->msi.chip; in tegra_pcie_enable()
1831 hw.private_data = (void **)&pcie; in tegra_pcie_enable()
1837 pci_common_init_dev(pcie->dev, &hw); in tegra_pcie_enable()
1888 struct tegra_pcie *pcie = s->private; in tegra_pcie_ports_seq_start() local
1890 if (list_empty(&pcie->ports)) in tegra_pcie_ports_seq_start()
1895 return seq_list_start(&pcie->ports, *pos); in tegra_pcie_ports_seq_start()
1900 struct tegra_pcie *pcie = s->private; in tegra_pcie_ports_seq_next() local
1902 return seq_list_next(v, &pcie->ports, pos); in tegra_pcie_ports_seq_next()
1952 struct tegra_pcie *pcie = inode->i_private; in tegra_pcie_ports_open() local
1961 s->private = pcie; in tegra_pcie_ports_open()
1974 static int tegra_pcie_debugfs_init(struct tegra_pcie *pcie) in tegra_pcie_debugfs_init() argument
1978 pcie->debugfs = debugfs_create_dir("pcie", NULL); in tegra_pcie_debugfs_init()
1979 if (!pcie->debugfs) in tegra_pcie_debugfs_init()
1982 file = debugfs_create_file("ports", S_IFREG | S_IRUGO, pcie->debugfs, in tegra_pcie_debugfs_init()
1983 pcie, &tegra_pcie_ports_ops); in tegra_pcie_debugfs_init()
1990 debugfs_remove_recursive(pcie->debugfs); in tegra_pcie_debugfs_init()
1991 pcie->debugfs = NULL; in tegra_pcie_debugfs_init()
1998 struct tegra_pcie *pcie; in tegra_pcie_probe() local
2005 pcie = devm_kzalloc(&pdev->dev, sizeof(*pcie), GFP_KERNEL); in tegra_pcie_probe()
2006 if (!pcie) in tegra_pcie_probe()
2009 INIT_LIST_HEAD(&pcie->buses); in tegra_pcie_probe()
2010 INIT_LIST_HEAD(&pcie->ports); in tegra_pcie_probe()
2011 pcie->soc_data = match->data; in tegra_pcie_probe()
2012 pcie->dev = &pdev->dev; in tegra_pcie_probe()
2014 err = tegra_pcie_parse_dt(pcie); in tegra_pcie_probe()
2020 err = tegra_pcie_get_resources(pcie); in tegra_pcie_probe()
2026 err = tegra_pcie_enable_controller(pcie); in tegra_pcie_probe()
2031 tegra_pcie_setup_translations(pcie); in tegra_pcie_probe()
2034 err = tegra_pcie_enable_msi(pcie); in tegra_pcie_probe()
2043 err = tegra_pcie_enable(pcie); in tegra_pcie_probe()
2050 err = tegra_pcie_debugfs_init(pcie); in tegra_pcie_probe()
2056 platform_set_drvdata(pdev, pcie); in tegra_pcie_probe()
2061 tegra_pcie_disable_msi(pcie); in tegra_pcie_probe()
2063 tegra_pcie_put_resources(pcie); in tegra_pcie_probe()