hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/pci/controller/dwc/pcie-armada8k.c
....@@ -25,10 +25,14 @@
2525
2626 #include "pcie-designware.h"
2727
28
+#define ARMADA8K_PCIE_MAX_LANES PCIE_LNK_X4
29
+
2830 struct armada8k_pcie {
2931 struct dw_pcie *pci;
3032 struct clk *clk;
3133 struct clk *clk_reg;
34
+ struct phy *phy[ARMADA8K_PCIE_MAX_LANES];
35
+ unsigned int phy_count;
3236 };
3337
3438 #define PCIE_VENDOR_REGS_OFFSET 0x8000
....@@ -55,7 +59,7 @@
5559 #define PCIE_ARUSER_REG (PCIE_VENDOR_REGS_OFFSET + 0x5C)
5660 #define PCIE_AWUSER_REG (PCIE_VENDOR_REGS_OFFSET + 0x60)
5761 /*
58
- * AR/AW Cache defauls: Normal memory, Write-Back, Read / Write
62
+ * AR/AW Cache defaults: Normal memory, Write-Back, Read / Write
5963 * allocate
6064 */
6165 #define ARCACHE_DEFAULT_VALUE 0x3511
....@@ -66,6 +70,75 @@
6670 #define AX_USER_DOMAIN_SHIFT 4
6771
6872 #define to_armada8k_pcie(x) dev_get_drvdata((x)->dev)
73
+
74
+static void armada8k_pcie_disable_phys(struct armada8k_pcie *pcie)
75
+{
76
+ int i;
77
+
78
+ for (i = 0; i < ARMADA8K_PCIE_MAX_LANES; i++) {
79
+ phy_power_off(pcie->phy[i]);
80
+ phy_exit(pcie->phy[i]);
81
+ }
82
+}
83
+
84
+static int armada8k_pcie_enable_phys(struct armada8k_pcie *pcie)
85
+{
86
+ int ret;
87
+ int i;
88
+
89
+ for (i = 0; i < ARMADA8K_PCIE_MAX_LANES; i++) {
90
+ ret = phy_init(pcie->phy[i]);
91
+ if (ret)
92
+ return ret;
93
+
94
+ ret = phy_set_mode_ext(pcie->phy[i], PHY_MODE_PCIE,
95
+ pcie->phy_count);
96
+ if (ret) {
97
+ phy_exit(pcie->phy[i]);
98
+ return ret;
99
+ }
100
+
101
+ ret = phy_power_on(pcie->phy[i]);
102
+ if (ret) {
103
+ phy_exit(pcie->phy[i]);
104
+ return ret;
105
+ }
106
+ }
107
+
108
+ return 0;
109
+}
110
+
111
+static int armada8k_pcie_setup_phys(struct armada8k_pcie *pcie)
112
+{
113
+ struct dw_pcie *pci = pcie->pci;
114
+ struct device *dev = pci->dev;
115
+ struct device_node *node = dev->of_node;
116
+ int ret = 0;
117
+ int i;
118
+
119
+ for (i = 0; i < ARMADA8K_PCIE_MAX_LANES; i++) {
120
+ pcie->phy[i] = devm_of_phy_get_by_index(dev, node, i);
121
+ if (IS_ERR(pcie->phy[i])) {
122
+ if (PTR_ERR(pcie->phy[i]) != -ENODEV)
123
+ return PTR_ERR(pcie->phy[i]);
124
+
125
+ pcie->phy[i] = NULL;
126
+ continue;
127
+ }
128
+
129
+ pcie->phy_count++;
130
+ }
131
+
132
+ /* Old bindings miss the PHY handle, so just warn if there is no PHY */
133
+ if (!pcie->phy_count)
134
+ dev_warn(dev, "No available PHY\n");
135
+
136
+ ret = armada8k_pcie_enable_phys(pcie);
137
+ if (ret)
138
+ dev_err(dev, "Failed to initialize PHY(s) (%d)\n", ret);
139
+
140
+ return ret;
141
+}
69142
70143 static int armada8k_pcie_link_up(struct dw_pcie *pci)
71144 {
....@@ -175,10 +248,8 @@
175248 pp->ops = &armada8k_pcie_host_ops;
176249
177250 pp->irq = platform_get_irq(pdev, 0);
178
- if (pp->irq < 0) {
179
- dev_err(dev, "failed to get irq for port\n");
251
+ if (pp->irq < 0)
180252 return pp->irq;
181
- }
182253
183254 ret = devm_request_irq(dev, pp->irq, armada8k_pcie_irq_handler,
184255 IRQF_SHARED, "armada8k-pcie", pcie);
....@@ -244,19 +315,24 @@
244315 base = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ctrl");
245316 pci->dbi_base = devm_pci_remap_cfg_resource(dev, base);
246317 if (IS_ERR(pci->dbi_base)) {
247
- dev_err(dev, "couldn't remap regs base %p\n", base);
248318 ret = PTR_ERR(pci->dbi_base);
249319 goto fail_clkreg;
250320 }
321
+
322
+ ret = armada8k_pcie_setup_phys(pcie);
323
+ if (ret)
324
+ goto fail_clkreg;
251325
252326 platform_set_drvdata(pdev, pcie);
253327
254328 ret = armada8k_add_pcie_port(pcie, pdev);
255329 if (ret)
256
- goto fail_clkreg;
330
+ goto disable_phy;
257331
258332 return 0;
259333
334
+disable_phy:
335
+ armada8k_pcie_disable_phys(pcie);
260336 fail_clkreg:
261337 clk_disable_unprepare(pcie->clk_reg);
262338 fail: