hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/pci/controller/pcie-rockchip.c
....@@ -14,7 +14,8 @@
1414 #include <linux/clk.h>
1515 #include <linux/delay.h>
1616 #include <linux/gpio/consumer.h>
17
-#include <linux/of_address.h>
17
+#include <linux/iopoll.h>
18
+#include <linux/module.h>
1819 #include <linux/of_pci.h>
1920 #include <linux/phy/phy.h>
2021 #include <linux/platform_device.h>
....@@ -28,8 +29,6 @@
2829 struct device *dev = rockchip->dev;
2930 struct platform_device *pdev = to_platform_device(dev);
3031 struct device_node *node = dev->of_node;
31
- struct device_node *mem;
32
- struct resource reg;
3332 struct resource *regs;
3433 int err;
3534
....@@ -48,9 +47,8 @@
4847 return -EINVAL;
4948 }
5049
51
- regs = platform_get_resource_byname(pdev, IORESOURCE_MEM,
52
- "apb-base");
53
- rockchip->apb_base = devm_ioremap_resource(dev, regs);
50
+ rockchip->apb_base =
51
+ devm_platform_ioremap_resource_byname(pdev, "apb-base");
5452 if (IS_ERR(rockchip->apb_base))
5553 return PTR_ERR(rockchip->apb_base);
5654
....@@ -86,7 +84,7 @@
8684 }
8785
8886 rockchip->mgmt_sticky_rst = devm_reset_control_get_exclusive(dev,
89
- "mgmt-sticky");
87
+ "mgmt-sticky");
9088 if (IS_ERR(rockchip->mgmt_sticky_rst)) {
9189 if (PTR_ERR(rockchip->mgmt_sticky_rst) != -EPROBE_DEFER)
9290 dev_err(dev, "missing mgmt-sticky reset property in node\n");
....@@ -122,11 +120,11 @@
122120 }
123121
124122 if (rockchip->is_rc) {
125
- rockchip->ep_gpio = devm_gpiod_get_optional(dev, "ep", GPIOD_OUT_HIGH);
126
- if (IS_ERR(rockchip->ep_gpio)) {
127
- dev_err(dev, "invalid ep-gpios property in node\n");
128
- return PTR_ERR(rockchip->ep_gpio);
129
- }
123
+ rockchip->ep_gpio = devm_gpiod_get_optional(dev, "ep",
124
+ GPIOD_OUT_HIGH);
125
+ if (IS_ERR(rockchip->ep_gpio))
126
+ return dev_err_probe(dev, PTR_ERR(rockchip->ep_gpio),
127
+ "failed to get ep GPIO\n");
130128 }
131129
132130 rockchip->aclk_pcie = devm_clk_get(dev, "aclk");
....@@ -153,41 +151,15 @@
153151 return PTR_ERR(rockchip->clk_pcie_pm);
154152 }
155153
156
- if (rockchip->is_rc) {
157
- mem = of_parse_phandle(node, "memory-region", 0);
158
- if (!mem) {
159
- dev_warn(dev, "missing \"memory-region\" property\n");
160
- return 0;
161
- }
162
-
163
- err = of_address_to_resource(mem, 0, &reg);
164
- if (err < 0) {
165
- dev_warn(dev, "missing \"reg\" property\n");
166
- return 0;
167
- }
168
-
169
- rockchip->mem_reserve_start = reg.start;
170
- rockchip->mem_reserve_size = resource_size(&reg);
171
-
172
- err = of_property_read_u32(node, "rockchip,dma_trx_enabled",
173
- &rockchip->dma_trx_enabled);
174
- if (err < 0) {
175
- dev_warn(dev,
176
- "missing \"rockchip,dma_trx_enabled\" property\n");
177
- return 0;
178
- }
179
-
180
- err = of_property_read_u32(node, "rockchip,deferred",
181
- &rockchip->deferred);
182
- if (err < 0) {
183
- dev_warn(dev, "missing \"rockchip,deferred\" property\n");
184
- return 0;
185
- }
186
- }
187
-
188154 return 0;
189155 }
190156 EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt);
157
+
158
+#define rockchip_pcie_read_addr(addr) rockchip_pcie_read(rockchip, addr)
159
+/* 100 ms max wait time for PHY PLLs to lock */
160
+#define RK_PHY_PLL_LOCK_TIMEOUT_US 100000
161
+/* Sleep should be less than 20ms */
162
+#define RK_PHY_PLL_LOCK_SLEEP_US 1000
191163
192164 int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
193165 {
....@@ -288,6 +260,16 @@
288260 dev_err(dev, "power on phy%d err %d\n", i, err);
289261 goto err_power_off_phy;
290262 }
263
+ }
264
+
265
+ err = readx_poll_timeout(rockchip_pcie_read_addr,
266
+ PCIE_CLIENT_SIDE_BAND_STATUS,
267
+ regs, !(regs & PCIE_CLIENT_PHY_ST),
268
+ RK_PHY_PLL_LOCK_SLEEP_US,
269
+ RK_PHY_PLL_LOCK_TIMEOUT_US);
270
+ if (err) {
271
+ dev_err(dev, "PHY PLLs could not lock, %d\n", err);
272
+ goto err_power_off_phy;
291273 }
292274
293275 /*
....@@ -457,3 +439,7 @@
457439 rockchip_pcie_write(rockchip, 0x0, PCIE_CORE_OB_REGION_DESC1);
458440 }
459441 EXPORT_SYMBOL_GPL(rockchip_pcie_cfg_configuration_accesses);
442
+
443
+MODULE_AUTHOR("Rockchip Inc");
444
+MODULE_DESCRIPTION("Rockchip AXI PCIe driver");
445
+MODULE_LICENSE("GPL v2");