pci-j721e.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * pci-j721e - PCIe controller driver for TI's J721E SoCs
  4. *
  5. * Copyright (C) 2020 Texas Instruments Incorporated - http://www.ti.com
  6. * Author: Kishon Vijay Abraham I <kishon@ti.com>
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/clk-provider.h>
  10. #include <linux/container_of.h>
  11. #include <linux/delay.h>
  12. #include <linux/gpio/consumer.h>
  13. #include <linux/io.h>
  14. #include <linux/irqchip/chained_irq.h>
  15. #include <linux/irqdomain.h>
  16. #include <linux/mfd/syscon.h>
  17. #include <linux/of.h>
  18. #include <linux/pci.h>
  19. #include <linux/platform_device.h>
  20. #include <linux/pm_runtime.h>
  21. #include <linux/regmap.h>
  22. #include "../../pci.h"
  23. #include "pcie-cadence.h"
  24. #define cdns_pcie_to_rc(p) container_of(p, struct cdns_pcie_rc, pcie)
  25. #define ENABLE_REG_SYS_2 0x108
  26. #define STATUS_REG_SYS_2 0x508
  27. #define STATUS_CLR_REG_SYS_2 0x708
  28. #define LINK_DOWN BIT(1)
  29. #define J7200_LINK_DOWN BIT(10)
  30. #define J721E_PCIE_USER_CMD_STATUS 0x4
  31. #define LINK_TRAINING_ENABLE BIT(0)
  32. #define J721E_PCIE_USER_LINKSTATUS 0x14
  33. #define LINK_STATUS GENMASK(1, 0)
  34. enum link_status {
  35. NO_RECEIVERS_DETECTED,
  36. LINK_TRAINING_IN_PROGRESS,
  37. LINK_UP_DL_IN_PROGRESS,
  38. LINK_UP_DL_COMPLETED,
  39. };
  40. #define J721E_MODE_RC BIT(7)
  41. #define LANE_COUNT(n) ((n) << 8)
  42. #define ACSPCIE_PAD_DISABLE_MASK GENMASK(1, 0)
  43. #define GENERATION_SEL_MASK GENMASK(1, 0)
  44. struct j721e_pcie {
  45. struct cdns_pcie *cdns_pcie;
  46. struct clk *refclk;
  47. u32 mode;
  48. u32 num_lanes;
  49. u32 max_lanes;
  50. struct gpio_desc *reset_gpio;
  51. void __iomem *user_cfg_base;
  52. void __iomem *intd_cfg_base;
  53. u32 linkdown_irq_regfield;
  54. };
  55. enum j721e_pcie_mode {
  56. PCI_MODE_RC,
  57. PCI_MODE_EP,
  58. };
  59. struct j721e_pcie_data {
  60. enum j721e_pcie_mode mode;
  61. unsigned int quirk_retrain_flag:1;
  62. unsigned int quirk_detect_quiet_flag:1;
  63. unsigned int quirk_disable_flr:1;
  64. u32 linkdown_irq_regfield;
  65. unsigned int byte_access_allowed:1;
  66. unsigned int max_lanes;
  67. };
  68. static inline u32 j721e_pcie_user_readl(struct j721e_pcie *pcie, u32 offset)
  69. {
  70. return readl(pcie->user_cfg_base + offset);
  71. }
  72. static inline void j721e_pcie_user_writel(struct j721e_pcie *pcie, u32 offset,
  73. u32 value)
  74. {
  75. writel(value, pcie->user_cfg_base + offset);
  76. }
  77. static inline u32 j721e_pcie_intd_readl(struct j721e_pcie *pcie, u32 offset)
  78. {
  79. return readl(pcie->intd_cfg_base + offset);
  80. }
  81. static inline void j721e_pcie_intd_writel(struct j721e_pcie *pcie, u32 offset,
  82. u32 value)
  83. {
  84. writel(value, pcie->intd_cfg_base + offset);
  85. }
  86. static irqreturn_t j721e_pcie_link_irq_handler(int irq, void *priv)
  87. {
  88. struct j721e_pcie *pcie = priv;
  89. struct device *dev = pcie->cdns_pcie->dev;
  90. u32 reg;
  91. reg = j721e_pcie_intd_readl(pcie, STATUS_REG_SYS_2);
  92. if (!(reg & pcie->linkdown_irq_regfield))
  93. return IRQ_NONE;
  94. dev_err(dev, "LINK DOWN!\n");
  95. j721e_pcie_intd_writel(pcie, STATUS_CLR_REG_SYS_2, pcie->linkdown_irq_regfield);
  96. return IRQ_HANDLED;
  97. }
  98. static void j721e_pcie_config_link_irq(struct j721e_pcie *pcie)
  99. {
  100. u32 reg;
  101. reg = j721e_pcie_intd_readl(pcie, ENABLE_REG_SYS_2);
  102. reg |= pcie->linkdown_irq_regfield;
  103. j721e_pcie_intd_writel(pcie, ENABLE_REG_SYS_2, reg);
  104. }
  105. static int j721e_pcie_start_link(struct cdns_pcie *cdns_pcie)
  106. {
  107. struct j721e_pcie *pcie = dev_get_drvdata(cdns_pcie->dev);
  108. u32 reg;
  109. reg = j721e_pcie_user_readl(pcie, J721E_PCIE_USER_CMD_STATUS);
  110. reg |= LINK_TRAINING_ENABLE;
  111. j721e_pcie_user_writel(pcie, J721E_PCIE_USER_CMD_STATUS, reg);
  112. return 0;
  113. }
  114. static void j721e_pcie_stop_link(struct cdns_pcie *cdns_pcie)
  115. {
  116. struct j721e_pcie *pcie = dev_get_drvdata(cdns_pcie->dev);
  117. u32 reg;
  118. reg = j721e_pcie_user_readl(pcie, J721E_PCIE_USER_CMD_STATUS);
  119. reg &= ~LINK_TRAINING_ENABLE;
  120. j721e_pcie_user_writel(pcie, J721E_PCIE_USER_CMD_STATUS, reg);
  121. }
  122. static bool j721e_pcie_link_up(struct cdns_pcie *cdns_pcie)
  123. {
  124. struct j721e_pcie *pcie = dev_get_drvdata(cdns_pcie->dev);
  125. u32 reg;
  126. reg = j721e_pcie_user_readl(pcie, J721E_PCIE_USER_LINKSTATUS);
  127. reg &= LINK_STATUS;
  128. if (reg == LINK_UP_DL_COMPLETED)
  129. return true;
  130. return false;
  131. }
  132. static const struct cdns_pcie_ops j721e_pcie_ops = {
  133. .start_link = j721e_pcie_start_link,
  134. .stop_link = j721e_pcie_stop_link,
  135. .link_up = j721e_pcie_link_up,
  136. };
  137. static int j721e_pcie_set_mode(struct j721e_pcie *pcie, struct regmap *syscon,
  138. unsigned int offset)
  139. {
  140. struct device *dev = pcie->cdns_pcie->dev;
  141. u32 mask = J721E_MODE_RC;
  142. u32 mode = pcie->mode;
  143. u32 val = 0;
  144. int ret = 0;
  145. if (mode == PCI_MODE_RC)
  146. val = J721E_MODE_RC;
  147. ret = regmap_update_bits(syscon, offset, mask, val);
  148. if (ret)
  149. dev_err(dev, "failed to set pcie mode\n");
  150. return ret;
  151. }
  152. static int j721e_pcie_set_link_speed(struct j721e_pcie *pcie,
  153. struct regmap *syscon, unsigned int offset)
  154. {
  155. struct device *dev = pcie->cdns_pcie->dev;
  156. struct device_node *np = dev->of_node;
  157. int link_speed;
  158. u32 val = 0;
  159. int ret;
  160. link_speed = of_pci_get_max_link_speed(np);
  161. if (link_speed < 2)
  162. link_speed = 2;
  163. val = link_speed - 1;
  164. ret = regmap_update_bits(syscon, offset, GENERATION_SEL_MASK, val);
  165. if (ret)
  166. dev_err(dev, "failed to set link speed\n");
  167. return ret;
  168. }
  169. static int j721e_pcie_set_lane_count(struct j721e_pcie *pcie,
  170. struct regmap *syscon, unsigned int offset)
  171. {
  172. struct device *dev = pcie->cdns_pcie->dev;
  173. u32 lanes = pcie->num_lanes;
  174. u32 mask = BIT(8);
  175. u32 val = 0;
  176. int ret;
  177. if (pcie->max_lanes == 4)
  178. mask = GENMASK(9, 8);
  179. val = LANE_COUNT(lanes - 1);
  180. ret = regmap_update_bits(syscon, offset, mask, val);
  181. if (ret)
  182. dev_err(dev, "failed to set link count\n");
  183. return ret;
  184. }
  185. static int j721e_enable_acspcie_refclk(struct j721e_pcie *pcie,
  186. struct regmap *syscon)
  187. {
  188. struct device *dev = pcie->cdns_pcie->dev;
  189. struct device_node *node = dev->of_node;
  190. u32 mask = ACSPCIE_PAD_DISABLE_MASK;
  191. struct of_phandle_args args;
  192. u32 val;
  193. int ret;
  194. ret = of_parse_phandle_with_fixed_args(node,
  195. "ti,syscon-acspcie-proxy-ctrl",
  196. 1, 0, &args);
  197. if (ret) {
  198. dev_err(dev,
  199. "ti,syscon-acspcie-proxy-ctrl has invalid arguments\n");
  200. return ret;
  201. }
  202. /* Clear PAD IO disable bits to enable refclk output */
  203. val = ~(args.args[0]);
  204. ret = regmap_update_bits(syscon, 0, mask, val);
  205. if (ret) {
  206. dev_err(dev, "failed to enable ACSPCIE refclk: %d\n", ret);
  207. return ret;
  208. }
  209. return 0;
  210. }
  211. static int j721e_pcie_ctrl_init(struct j721e_pcie *pcie)
  212. {
  213. struct device *dev = pcie->cdns_pcie->dev;
  214. struct device_node *node = dev->of_node;
  215. struct of_phandle_args args;
  216. unsigned int offset = 0;
  217. struct regmap *syscon;
  218. int ret;
  219. syscon = syscon_regmap_lookup_by_phandle(node, "ti,syscon-pcie-ctrl");
  220. if (IS_ERR(syscon)) {
  221. dev_err(dev, "Unable to get ti,syscon-pcie-ctrl regmap\n");
  222. return PTR_ERR(syscon);
  223. }
  224. /* Do not error out to maintain old DT compatibility */
  225. ret = of_parse_phandle_with_fixed_args(node, "ti,syscon-pcie-ctrl", 1,
  226. 0, &args);
  227. if (!ret)
  228. offset = args.args[0];
  229. ret = j721e_pcie_set_mode(pcie, syscon, offset);
  230. if (ret < 0) {
  231. dev_err(dev, "Failed to set pci mode\n");
  232. return ret;
  233. }
  234. ret = j721e_pcie_set_link_speed(pcie, syscon, offset);
  235. if (ret < 0) {
  236. dev_err(dev, "Failed to set link speed\n");
  237. return ret;
  238. }
  239. ret = j721e_pcie_set_lane_count(pcie, syscon, offset);
  240. if (ret < 0) {
  241. dev_err(dev, "Failed to set num-lanes\n");
  242. return ret;
  243. }
  244. /* Enable ACSPCIE refclk output if the optional property exists */
  245. syscon = syscon_regmap_lookup_by_phandle_optional(node,
  246. "ti,syscon-acspcie-proxy-ctrl");
  247. if (!syscon)
  248. return 0;
  249. return j721e_enable_acspcie_refclk(pcie, syscon);
  250. }
  251. static int cdns_ti_pcie_config_read(struct pci_bus *bus, unsigned int devfn,
  252. int where, int size, u32 *value)
  253. {
  254. if (pci_is_root_bus(bus))
  255. return pci_generic_config_read32(bus, devfn, where, size,
  256. value);
  257. return pci_generic_config_read(bus, devfn, where, size, value);
  258. }
  259. static int cdns_ti_pcie_config_write(struct pci_bus *bus, unsigned int devfn,
  260. int where, int size, u32 value)
  261. {
  262. if (pci_is_root_bus(bus))
  263. return pci_generic_config_write32(bus, devfn, where, size,
  264. value);
  265. return pci_generic_config_write(bus, devfn, where, size, value);
  266. }
  267. static struct pci_ops cdns_ti_pcie_host_ops = {
  268. .map_bus = cdns_pci_map_bus,
  269. .read = cdns_ti_pcie_config_read,
  270. .write = cdns_ti_pcie_config_write,
  271. };
  272. static const struct j721e_pcie_data j721e_pcie_rc_data = {
  273. .mode = PCI_MODE_RC,
  274. .quirk_retrain_flag = true,
  275. .byte_access_allowed = false,
  276. .linkdown_irq_regfield = LINK_DOWN,
  277. .max_lanes = 2,
  278. };
  279. static const struct j721e_pcie_data j721e_pcie_ep_data = {
  280. .mode = PCI_MODE_EP,
  281. .linkdown_irq_regfield = LINK_DOWN,
  282. .max_lanes = 2,
  283. };
  284. static const struct j721e_pcie_data j7200_pcie_rc_data = {
  285. .mode = PCI_MODE_RC,
  286. .quirk_detect_quiet_flag = true,
  287. .linkdown_irq_regfield = J7200_LINK_DOWN,
  288. .byte_access_allowed = true,
  289. .max_lanes = 2,
  290. };
  291. static const struct j721e_pcie_data j7200_pcie_ep_data = {
  292. .mode = PCI_MODE_EP,
  293. .quirk_detect_quiet_flag = true,
  294. .quirk_disable_flr = true,
  295. .max_lanes = 2,
  296. };
  297. static const struct j721e_pcie_data am64_pcie_rc_data = {
  298. .mode = PCI_MODE_RC,
  299. .linkdown_irq_regfield = J7200_LINK_DOWN,
  300. .byte_access_allowed = true,
  301. .max_lanes = 1,
  302. };
  303. static const struct j721e_pcie_data am64_pcie_ep_data = {
  304. .mode = PCI_MODE_EP,
  305. .linkdown_irq_regfield = J7200_LINK_DOWN,
  306. .max_lanes = 1,
  307. };
  308. static const struct j721e_pcie_data j784s4_pcie_rc_data = {
  309. .mode = PCI_MODE_RC,
  310. .quirk_retrain_flag = true,
  311. .byte_access_allowed = false,
  312. .linkdown_irq_regfield = LINK_DOWN,
  313. .max_lanes = 4,
  314. };
  315. static const struct j721e_pcie_data j784s4_pcie_ep_data = {
  316. .mode = PCI_MODE_EP,
  317. .linkdown_irq_regfield = LINK_DOWN,
  318. .max_lanes = 4,
  319. };
  320. static const struct of_device_id of_j721e_pcie_match[] = {
  321. {
  322. .compatible = "ti,j721e-pcie-host",
  323. .data = &j721e_pcie_rc_data,
  324. },
  325. {
  326. .compatible = "ti,j721e-pcie-ep",
  327. .data = &j721e_pcie_ep_data,
  328. },
  329. {
  330. .compatible = "ti,j7200-pcie-host",
  331. .data = &j7200_pcie_rc_data,
  332. },
  333. {
  334. .compatible = "ti,j7200-pcie-ep",
  335. .data = &j7200_pcie_ep_data,
  336. },
  337. {
  338. .compatible = "ti,am64-pcie-host",
  339. .data = &am64_pcie_rc_data,
  340. },
  341. {
  342. .compatible = "ti,am64-pcie-ep",
  343. .data = &am64_pcie_ep_data,
  344. },
  345. {
  346. .compatible = "ti,j784s4-pcie-host",
  347. .data = &j784s4_pcie_rc_data,
  348. },
  349. {
  350. .compatible = "ti,j784s4-pcie-ep",
  351. .data = &j784s4_pcie_ep_data,
  352. },
  353. {},
  354. };
  355. static int j721e_pcie_probe(struct platform_device *pdev)
  356. {
  357. struct device *dev = &pdev->dev;
  358. struct device_node *node = dev->of_node;
  359. struct pci_host_bridge *bridge;
  360. const struct j721e_pcie_data *data;
  361. struct cdns_pcie *cdns_pcie;
  362. struct j721e_pcie *pcie;
  363. struct cdns_pcie_rc *rc = NULL;
  364. struct cdns_pcie_ep *ep = NULL;
  365. struct gpio_desc *gpiod;
  366. void __iomem *base;
  367. struct clk *clk;
  368. u32 num_lanes;
  369. u32 mode;
  370. int ret;
  371. int irq;
  372. data = of_device_get_match_data(dev);
  373. if (!data)
  374. return -EINVAL;
  375. mode = (u32)data->mode;
  376. pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
  377. if (!pcie)
  378. return -ENOMEM;
  379. switch (mode) {
  380. case PCI_MODE_RC:
  381. if (!IS_ENABLED(CONFIG_PCIE_CADENCE_HOST))
  382. return -ENODEV;
  383. bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc));
  384. if (!bridge)
  385. return -ENOMEM;
  386. if (!data->byte_access_allowed)
  387. bridge->ops = &cdns_ti_pcie_host_ops;
  388. rc = pci_host_bridge_priv(bridge);
  389. rc->quirk_retrain_flag = data->quirk_retrain_flag;
  390. rc->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
  391. cdns_pcie = &rc->pcie;
  392. cdns_pcie->dev = dev;
  393. cdns_pcie->ops = &j721e_pcie_ops;
  394. pcie->cdns_pcie = cdns_pcie;
  395. break;
  396. case PCI_MODE_EP:
  397. if (!IS_ENABLED(CONFIG_PCIE_CADENCE_EP))
  398. return -ENODEV;
  399. ep = devm_kzalloc(dev, sizeof(*ep), GFP_KERNEL);
  400. if (!ep)
  401. return -ENOMEM;
  402. ep->quirk_detect_quiet_flag = data->quirk_detect_quiet_flag;
  403. ep->quirk_disable_flr = data->quirk_disable_flr;
  404. cdns_pcie = &ep->pcie;
  405. cdns_pcie->dev = dev;
  406. cdns_pcie->ops = &j721e_pcie_ops;
  407. pcie->cdns_pcie = cdns_pcie;
  408. break;
  409. default:
  410. dev_err(dev, "INVALID device type %d\n", mode);
  411. return 0;
  412. }
  413. pcie->mode = mode;
  414. pcie->linkdown_irq_regfield = data->linkdown_irq_regfield;
  415. base = devm_platform_ioremap_resource_byname(pdev, "intd_cfg");
  416. if (IS_ERR(base))
  417. return PTR_ERR(base);
  418. pcie->intd_cfg_base = base;
  419. base = devm_platform_ioremap_resource_byname(pdev, "user_cfg");
  420. if (IS_ERR(base))
  421. return PTR_ERR(base);
  422. pcie->user_cfg_base = base;
  423. ret = of_property_read_u32(node, "num-lanes", &num_lanes);
  424. if (ret || num_lanes > data->max_lanes) {
  425. dev_warn(dev, "num-lanes property not provided or invalid, setting num-lanes to 1\n");
  426. num_lanes = 1;
  427. }
  428. pcie->num_lanes = num_lanes;
  429. pcie->max_lanes = data->max_lanes;
  430. if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48)))
  431. return -EINVAL;
  432. irq = platform_get_irq_byname(pdev, "link_state");
  433. if (irq < 0)
  434. return irq;
  435. dev_set_drvdata(dev, pcie);
  436. pm_runtime_enable(dev);
  437. ret = pm_runtime_get_sync(dev);
  438. if (ret < 0) {
  439. dev_err_probe(dev, ret, "pm_runtime_get_sync failed\n");
  440. goto err_get_sync;
  441. }
  442. ret = j721e_pcie_ctrl_init(pcie);
  443. if (ret < 0) {
  444. dev_err_probe(dev, ret, "pm_runtime_get_sync failed\n");
  445. goto err_get_sync;
  446. }
  447. ret = devm_request_irq(dev, irq, j721e_pcie_link_irq_handler, 0,
  448. "j721e-pcie-link-down-irq", pcie);
  449. if (ret < 0) {
  450. dev_err_probe(dev, ret, "failed to request link state IRQ %d\n", irq);
  451. goto err_get_sync;
  452. }
  453. j721e_pcie_config_link_irq(pcie);
  454. switch (mode) {
  455. case PCI_MODE_RC:
  456. gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
  457. if (IS_ERR(gpiod)) {
  458. ret = dev_err_probe(dev, PTR_ERR(gpiod), "Failed to get reset GPIO\n");
  459. goto err_get_sync;
  460. }
  461. pcie->reset_gpio = gpiod;
  462. ret = cdns_pcie_init_phy(dev, cdns_pcie);
  463. if (ret) {
  464. dev_err_probe(dev, ret, "Failed to init phy\n");
  465. goto err_get_sync;
  466. }
  467. clk = devm_clk_get_optional(dev, "pcie_refclk");
  468. if (IS_ERR(clk)) {
  469. ret = dev_err_probe(dev, PTR_ERR(clk), "failed to get pcie_refclk\n");
  470. goto err_pcie_setup;
  471. }
  472. ret = clk_prepare_enable(clk);
  473. if (ret) {
  474. dev_err_probe(dev, ret, "failed to enable pcie_refclk\n");
  475. goto err_pcie_setup;
  476. }
  477. pcie->refclk = clk;
  478. /*
  479. * Section 2.2 of the PCI Express Card Electromechanical
  480. * Specification (Revision 5.1) mandates that the deassertion
  481. * of the PERST# signal should be delayed by 100 ms (TPVPERL).
  482. * This shall ensure that the power and the reference clock
  483. * are stable.
  484. */
  485. if (gpiod) {
  486. msleep(PCIE_T_PVPERL_MS);
  487. gpiod_set_value_cansleep(gpiod, 1);
  488. }
  489. ret = cdns_pcie_host_setup(rc);
  490. if (ret < 0) {
  491. clk_disable_unprepare(pcie->refclk);
  492. goto err_pcie_setup;
  493. }
  494. break;
  495. case PCI_MODE_EP:
  496. ret = cdns_pcie_init_phy(dev, cdns_pcie);
  497. if (ret) {
  498. dev_err_probe(dev, ret, "Failed to init phy\n");
  499. goto err_get_sync;
  500. }
  501. ret = cdns_pcie_ep_setup(ep);
  502. if (ret < 0)
  503. goto err_pcie_setup;
  504. break;
  505. }
  506. return 0;
  507. err_pcie_setup:
  508. cdns_pcie_disable_phy(cdns_pcie);
  509. err_get_sync:
  510. pm_runtime_put(dev);
  511. pm_runtime_disable(dev);
  512. return ret;
  513. }
  514. static void j721e_pcie_remove(struct platform_device *pdev)
  515. {
  516. struct j721e_pcie *pcie = platform_get_drvdata(pdev);
  517. struct cdns_pcie *cdns_pcie = pcie->cdns_pcie;
  518. struct device *dev = &pdev->dev;
  519. clk_disable_unprepare(pcie->refclk);
  520. cdns_pcie_disable_phy(cdns_pcie);
  521. pm_runtime_put(dev);
  522. pm_runtime_disable(dev);
  523. }
  524. static int j721e_pcie_suspend_noirq(struct device *dev)
  525. {
  526. struct j721e_pcie *pcie = dev_get_drvdata(dev);
  527. if (pcie->mode == PCI_MODE_RC) {
  528. gpiod_set_value_cansleep(pcie->reset_gpio, 0);
  529. clk_disable_unprepare(pcie->refclk);
  530. }
  531. cdns_pcie_disable_phy(pcie->cdns_pcie);
  532. return 0;
  533. }
  534. static int j721e_pcie_resume_noirq(struct device *dev)
  535. {
  536. struct j721e_pcie *pcie = dev_get_drvdata(dev);
  537. struct cdns_pcie *cdns_pcie = pcie->cdns_pcie;
  538. int ret;
  539. ret = j721e_pcie_ctrl_init(pcie);
  540. if (ret < 0)
  541. return ret;
  542. j721e_pcie_config_link_irq(pcie);
  543. /*
  544. * This is not called explicitly in the probe, it is called by
  545. * cdns_pcie_init_phy().
  546. */
  547. ret = cdns_pcie_enable_phy(pcie->cdns_pcie);
  548. if (ret < 0)
  549. return ret;
  550. if (pcie->mode == PCI_MODE_RC) {
  551. struct cdns_pcie_rc *rc = cdns_pcie_to_rc(cdns_pcie);
  552. ret = clk_prepare_enable(pcie->refclk);
  553. if (ret < 0)
  554. return ret;
  555. /*
  556. * Section 2.2 of the PCI Express Card Electromechanical
  557. * Specification (Revision 5.1) mandates that the deassertion
  558. * of the PERST# signal should be delayed by 100 ms (TPVPERL).
  559. * This shall ensure that the power and the reference clock
  560. * are stable.
  561. */
  562. if (pcie->reset_gpio) {
  563. msleep(PCIE_T_PVPERL_MS);
  564. gpiod_set_value_cansleep(pcie->reset_gpio, 1);
  565. }
  566. ret = cdns_pcie_host_link_setup(rc);
  567. if (ret < 0) {
  568. clk_disable_unprepare(pcie->refclk);
  569. return ret;
  570. }
  571. /*
  572. * Reset internal status of BARs to force reinitialization in
  573. * cdns_pcie_host_init().
  574. */
  575. for (enum cdns_pcie_rp_bar bar = RP_BAR0; bar <= RP_NO_BAR; bar++)
  576. rc->avail_ib_bar[bar] = true;
  577. ret = cdns_pcie_host_init(rc);
  578. if (ret) {
  579. clk_disable_unprepare(pcie->refclk);
  580. return ret;
  581. }
  582. }
  583. return 0;
  584. }
  585. static DEFINE_NOIRQ_DEV_PM_OPS(j721e_pcie_pm_ops,
  586. j721e_pcie_suspend_noirq,
  587. j721e_pcie_resume_noirq);
  588. static struct platform_driver j721e_pcie_driver = {
  589. .probe = j721e_pcie_probe,
  590. .remove_new = j721e_pcie_remove,
  591. .driver = {
  592. .name = "j721e-pcie",
  593. .of_match_table = of_j721e_pcie_match,
  594. .suppress_bind_attrs = true,
  595. .pm = pm_sleep_ptr(&j721e_pcie_pm_ops),
  596. },
  597. };
  598. builtin_platform_driver(j721e_pcie_driver);