Lines Matching +full:pci +full:- +full:phy

1 // SPDX-License-Identifier: GPL-2.0
3 * pcie-dra7xx - PCIe controller driver for TI DRA7xx SoCs
5 * Copyright (C) 2013-2014 Texas Instruments Incorporated - https://www.ti.com
22 #include <linux/pci.h>
23 #include <linux/phy/phy.h>
32 #include "../../pci.h"
33 #include "pcie-designware.h"
89 struct dw_pcie *pci; member
91 int phy_count; /* DT phy-names count */
92 struct phy **phy; member
103 #define to_dra7xx_pcie(x) dev_get_drvdata((x)->dev)
107 return readl(pcie->base + offset); in dra7xx_pcie_readl()
113 writel(value, pcie->base + offset); in dra7xx_pcie_writel()
116 static u64 dra7xx_pcie_cpu_addr_fixup(struct dw_pcie *pci, u64 cpu_addr) in dra7xx_pcie_cpu_addr_fixup() argument
121 static int dra7xx_pcie_link_up(struct dw_pcie *pci) in dra7xx_pcie_link_up() argument
123 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_link_up()
129 static void dra7xx_pcie_stop_link(struct dw_pcie *pci) in dra7xx_pcie_stop_link() argument
131 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_stop_link()
139 static int dra7xx_pcie_establish_link(struct dw_pcie *pci) in dra7xx_pcie_establish_link() argument
141 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_establish_link()
142 struct device *dev = pci->dev; in dra7xx_pcie_establish_link()
145 if (dw_pcie_link_up(pci)) { in dra7xx_pcie_establish_link()
183 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dra7xx_pcie_host_init() local
184 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_host_init()
195 irq_set_chip_data(irq, domain->host_data); in dra7xx_pcie_intx_map()
207 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dra7xx_pcie_handle_msi() local
211 val = dw_pcie_readl_dbi(pci, PCIE_MSI_INTR0_STATUS + in dra7xx_pcie_handle_msi()
218 generic_handle_domain_irq(pp->irq_domain, in dra7xx_pcie_handle_msi()
229 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dra7xx_pcie_handle_msi_irq() local
232 num_ctrls = pp->num_vectors / MAX_MSI_IRQS_PER_CTRL; in dra7xx_pcie_handle_msi_irq()
250 dev_warn_ratelimited(pci->dev, in dra7xx_pcie_handle_msi_irq()
259 struct dw_pcie *pci; in dra7xx_pcie_msi_irq_handler() local
266 pci = to_dw_pcie_from_pp(pp); in dra7xx_pcie_msi_irq_handler()
267 dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_msi_irq_handler()
281 generic_handle_domain_irq(dra7xx->irq_domain, bit); in dra7xx_pcie_msi_irq_handler()
291 struct dw_pcie *pci = dra7xx->pci; in dra7xx_pcie_irq_handler() local
292 struct device *dev = pci->dev; in dra7xx_pcie_irq_handler()
293 struct dw_pcie_ep *ep = &pci->ep; in dra7xx_pcie_irq_handler()
318 "Power Management Event Turn-Off message received\n"); in dra7xx_pcie_irq_handler()
322 "Power Management Turn-Off Ack message received\n"); in dra7xx_pcie_irq_handler()
331 if (dra7xx->mode == DW_PCIE_EP_TYPE) in dra7xx_pcie_irq_handler()
333 dev_dbg(dev, "Link-up state change\n"); in dra7xx_pcie_irq_handler()
349 struct dw_pcie *pci = to_dw_pcie_from_pp(pp); in dra7xx_pcie_init_irq_domain() local
350 struct device *dev = pci->dev; in dra7xx_pcie_init_irq_domain()
351 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_init_irq_domain()
352 struct device_node *node = dev->of_node; in dra7xx_pcie_init_irq_domain()
357 return -ENODEV; in dra7xx_pcie_init_irq_domain()
360 irq_set_chained_handler_and_data(pp->irq, dra7xx_pcie_msi_irq_handler, in dra7xx_pcie_init_irq_domain()
362 dra7xx->irq_domain = irq_domain_add_linear(pcie_intc_node, PCI_NUM_INTX, in dra7xx_pcie_init_irq_domain()
365 if (!dra7xx->irq_domain) { in dra7xx_pcie_init_irq_domain()
367 return -ENODEV; in dra7xx_pcie_init_irq_domain()
379 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dra7xx_pcie_ep_init() local
380 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_ep_init()
384 dw_pcie_ep_reset_bar(pci, bar); in dra7xx_pcie_ep_init()
401 reg = (interrupt_num - 1) << MSI_VECTOR_SHIFT; in dra7xx_pcie_raise_msi_irq()
409 struct dw_pcie *pci = to_dw_pcie_from_ep(ep); in dra7xx_pcie_raise_irq() local
410 struct dra7xx_pcie *dra7xx = to_dra7xx_pcie(pci); in dra7xx_pcie_raise_irq()
420 dev_err(pci->dev, "UNKNOWN IRQ type\n"); in dra7xx_pcie_raise_irq()
449 struct device *dev = &pdev->dev; in dra7xx_add_pcie_ep()
450 struct dw_pcie *pci = dra7xx->pci; in dra7xx_add_pcie_ep() local
452 ep = &pci->ep; in dra7xx_add_pcie_ep()
453 ep->ops = &pcie_ep_ops; in dra7xx_add_pcie_ep()
455 pci->dbi_base = devm_platform_ioremap_resource_byname(pdev, "ep_dbics"); in dra7xx_add_pcie_ep()
456 if (IS_ERR(pci->dbi_base)) in dra7xx_add_pcie_ep()
457 return PTR_ERR(pci->dbi_base); in dra7xx_add_pcie_ep()
459 pci->dbi_base2 = in dra7xx_add_pcie_ep()
461 if (IS_ERR(pci->dbi_base2)) in dra7xx_add_pcie_ep()
462 return PTR_ERR(pci->dbi_base2); in dra7xx_add_pcie_ep()
477 pci_epc_init_notify(ep->epc); in dra7xx_add_pcie_ep()
486 struct dw_pcie *pci = dra7xx->pci; in dra7xx_add_pcie_port() local
487 struct dw_pcie_rp *pp = &pci->pp; in dra7xx_add_pcie_port()
488 struct device *dev = pci->dev; in dra7xx_add_pcie_port()
490 pp->irq = platform_get_irq(pdev, 1); in dra7xx_add_pcie_port()
491 if (pp->irq < 0) in dra7xx_add_pcie_port()
492 return pp->irq; in dra7xx_add_pcie_port()
495 pp->msi_irq[0] = -ENODEV; in dra7xx_add_pcie_port()
501 pci->dbi_base = devm_platform_ioremap_resource_byname(pdev, "rc_dbics"); in dra7xx_add_pcie_port()
502 if (IS_ERR(pci->dbi_base)) in dra7xx_add_pcie_port()
503 return PTR_ERR(pci->dbi_base); in dra7xx_add_pcie_port()
505 pp->ops = &dra7xx_pcie_host_ops; in dra7xx_add_pcie_port()
525 int phy_count = dra7xx->phy_count; in dra7xx_pcie_disable_phy()
527 while (phy_count--) { in dra7xx_pcie_disable_phy()
528 phy_power_off(dra7xx->phy[phy_count]); in dra7xx_pcie_disable_phy()
529 phy_exit(dra7xx->phy[phy_count]); in dra7xx_pcie_disable_phy()
535 int phy_count = dra7xx->phy_count; in dra7xx_pcie_enable_phy()
540 ret = phy_set_mode(dra7xx->phy[i], PHY_MODE_PCIE); in dra7xx_pcie_enable_phy()
544 ret = phy_init(dra7xx->phy[i]); in dra7xx_pcie_enable_phy()
548 ret = phy_power_on(dra7xx->phy[i]); in dra7xx_pcie_enable_phy()
550 phy_exit(dra7xx->phy[i]); in dra7xx_pcie_enable_phy()
558 while (--i >= 0) { in dra7xx_pcie_enable_phy()
559 phy_power_off(dra7xx->phy[i]); in dra7xx_pcie_enable_phy()
560 phy_exit(dra7xx->phy[i]); in dra7xx_pcie_enable_phy()
596 .compatible = "ti,dra7-pcie",
600 .compatible = "ti,dra7-pcie-ep",
604 .compatible = "ti,dra746-pcie-rc",
608 .compatible = "ti,dra726-pcie-rc",
612 .compatible = "ti,dra746-pcie-ep",
616 .compatible = "ti,dra726-pcie-ep",
627 * Access to the PCIe slave port that are not 32-bit aligned will result
629 * byte and half-word accesses are not possible to byte offset 0x1, 0x2, or
637 struct device_node *np = dev->of_node; in dra7xx_pcie_unaligned_memaccess()
641 regmap = syscon_regmap_lookup_by_phandle_args(np, "ti,syscon-unaligned-access", in dra7xx_pcie_unaligned_memaccess()
644 dev_dbg(dev, "can't get ti,syscon-unaligned-access\n"); in dra7xx_pcie_unaligned_memaccess()
645 return -EINVAL; in dra7xx_pcie_unaligned_memaccess()
658 struct device_node *np = dev->of_node; in dra7xx_pcie_configure_two_lane()
664 pcie_syscon = syscon_regmap_lookup_by_phandle_args(np, "ti,syscon-lane-sel", in dra7xx_pcie_configure_two_lane()
667 dev_err(dev, "unable to get ti,syscon-lane-sel\n"); in dra7xx_pcie_configure_two_lane()
668 return -EINVAL; in dra7xx_pcie_configure_two_lane()
685 struct phy **phy; in dra7xx_pcie_probe() local
688 struct dw_pcie *pci; in dra7xx_pcie_probe() local
690 struct device *dev = &pdev->dev; in dra7xx_pcie_probe()
691 struct device_node *np = dev->of_node; in dra7xx_pcie_probe()
700 return -EINVAL; in dra7xx_pcie_probe()
702 mode = (enum dw_pcie_device_mode)data->mode; in dra7xx_pcie_probe()
703 b1co_mode_sel_mask = data->b1co_mode_sel_mask; in dra7xx_pcie_probe()
707 return -ENOMEM; in dra7xx_pcie_probe()
709 pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL); in dra7xx_pcie_probe()
710 if (!pci) in dra7xx_pcie_probe()
711 return -ENOMEM; in dra7xx_pcie_probe()
713 pci->dev = dev; in dra7xx_pcie_probe()
714 pci->ops = &dw_pcie_ops; in dra7xx_pcie_probe()
724 phy_count = of_property_count_strings(np, "phy-names"); in dra7xx_pcie_probe()
730 phy = devm_kcalloc(dev, phy_count, sizeof(*phy), GFP_KERNEL); in dra7xx_pcie_probe()
731 if (!phy) in dra7xx_pcie_probe()
732 return -ENOMEM; in dra7xx_pcie_probe()
736 return -ENOMEM; in dra7xx_pcie_probe()
738 dra7xx->clk = devm_clk_get_optional(dev, NULL); in dra7xx_pcie_probe()
739 if (IS_ERR(dra7xx->clk)) in dra7xx_pcie_probe()
740 return dev_err_probe(dev, PTR_ERR(dra7xx->clk), in dra7xx_pcie_probe()
743 ret = clk_prepare_enable(dra7xx->clk); in dra7xx_pcie_probe()
748 snprintf(name, sizeof(name), "pcie-phy%d", i); in dra7xx_pcie_probe()
749 phy[i] = devm_phy_get(dev, name); in dra7xx_pcie_probe()
750 if (IS_ERR(phy[i])) in dra7xx_pcie_probe()
751 return PTR_ERR(phy[i]); in dra7xx_pcie_probe()
753 link[i] = device_link_add(dev, &phy[i]->dev, DL_FLAG_STATELESS); in dra7xx_pcie_probe()
755 ret = -EINVAL; in dra7xx_pcie_probe()
760 dra7xx->base = base; in dra7xx_pcie_probe()
761 dra7xx->phy = phy; in dra7xx_pcie_probe()
762 dra7xx->pci = pci; in dra7xx_pcie_probe()
763 dra7xx->phy_count = phy_count; in dra7xx_pcie_probe()
768 dra7xx->phy_count = 1; /* Fallback to x1 lane mode */ in dra7xx_pcie_probe()
773 dev_err(dev, "failed to enable phy\n"); in dra7xx_pcie_probe()
789 dev_err(&pdev->dev, "gpio request failed, ret %d\n", ret); in dra7xx_pcie_probe()
800 ret = -ENODEV; in dra7xx_pcie_probe()
817 ret = -ENODEV; in dra7xx_pcie_probe()
835 dra7xx->mode = mode; in dra7xx_pcie_probe()
839 "dra7xx-pcie-main", dra7xx); in dra7xx_pcie_probe()
848 if (dra7xx->mode == DW_PCIE_RC_TYPE) in dra7xx_pcie_probe()
849 dw_pcie_host_deinit(&dra7xx->pci->pp); in dra7xx_pcie_probe()
851 dw_pcie_ep_deinit(&dra7xx->pci->ep); in dra7xx_pcie_probe()
860 while (--i >= 0) in dra7xx_pcie_probe()
869 struct dw_pcie *pci = dra7xx->pci; in dra7xx_pcie_suspend() local
872 if (dra7xx->mode != DW_PCIE_RC_TYPE) in dra7xx_pcie_suspend()
876 val = dw_pcie_readl_dbi(pci, PCI_COMMAND); in dra7xx_pcie_suspend()
878 dw_pcie_writel_dbi(pci, PCI_COMMAND, val); in dra7xx_pcie_suspend()
886 struct dw_pcie *pci = dra7xx->pci; in dra7xx_pcie_resume() local
889 if (dra7xx->mode != DW_PCIE_RC_TYPE) in dra7xx_pcie_resume()
893 val = dw_pcie_readl_dbi(pci, PCI_COMMAND); in dra7xx_pcie_resume()
895 dw_pcie_writel_dbi(pci, PCI_COMMAND, val); in dra7xx_pcie_resume()
916 dev_err(dev, "failed to enable phy\n"); in dra7xx_pcie_resume_noirq()
925 struct device *dev = &pdev->dev; in dra7xx_pcie_shutdown()
929 dra7xx_pcie_stop_link(dra7xx->pci); in dra7xx_pcie_shutdown()
938 clk_disable_unprepare(dra7xx->clk); in dra7xx_pcie_shutdown()
950 .name = "dra7-pcie",