root/drivers/pci/controller/dwc/pcie-qcom.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. qcom_ep_reset_assert
  2. qcom_ep_reset_deassert
  3. qcom_pcie_establish_link
  4. qcom_pcie_2_1_0_ltssm_enable
  5. qcom_pcie_get_resources_2_1_0
  6. qcom_pcie_deinit_2_1_0
  7. qcom_pcie_init_2_1_0
  8. qcom_pcie_get_resources_1_0_0
  9. qcom_pcie_deinit_1_0_0
  10. qcom_pcie_init_1_0_0
  11. qcom_pcie_2_3_2_ltssm_enable
  12. qcom_pcie_get_resources_2_3_2
  13. qcom_pcie_deinit_2_3_2
  14. qcom_pcie_post_deinit_2_3_2
  15. qcom_pcie_init_2_3_2
  16. qcom_pcie_post_init_2_3_2
  17. qcom_pcie_get_resources_2_4_0
  18. qcom_pcie_deinit_2_4_0
  19. qcom_pcie_init_2_4_0
  20. qcom_pcie_get_resources_2_3_3
  21. qcom_pcie_deinit_2_3_3
  22. qcom_pcie_init_2_3_3
  23. qcom_pcie_link_up
  24. qcom_pcie_host_init
  25. qcom_pcie_probe
  26. qcom_fixup_class

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Qualcomm PCIe root complex driver
   4  *
   5  * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
   6  * Copyright 2015 Linaro Limited.
   7  *
   8  * Author: Stanimir Varbanov <svarbanov@mm-sol.com>
   9  */
  10 
  11 #include <linux/clk.h>
  12 #include <linux/delay.h>
  13 #include <linux/gpio/consumer.h>
  14 #include <linux/interrupt.h>
  15 #include <linux/io.h>
  16 #include <linux/iopoll.h>
  17 #include <linux/kernel.h>
  18 #include <linux/init.h>
  19 #include <linux/of_device.h>
  20 #include <linux/of_gpio.h>
  21 #include <linux/pci.h>
  22 #include <linux/pm_runtime.h>
  23 #include <linux/platform_device.h>
  24 #include <linux/phy/phy.h>
  25 #include <linux/regulator/consumer.h>
  26 #include <linux/reset.h>
  27 #include <linux/slab.h>
  28 #include <linux/types.h>
  29 
  30 #include "pcie-designware.h"
  31 
  32 #define PCIE20_PARF_SYS_CTRL                    0x00
  33 #define MST_WAKEUP_EN                           BIT(13)
  34 #define SLV_WAKEUP_EN                           BIT(12)
  35 #define MSTR_ACLK_CGC_DIS                       BIT(10)
  36 #define SLV_ACLK_CGC_DIS                        BIT(9)
  37 #define CORE_CLK_CGC_DIS                        BIT(6)
  38 #define AUX_PWR_DET                             BIT(4)
  39 #define L23_CLK_RMV_DIS                         BIT(2)
  40 #define L1_CLK_RMV_DIS                          BIT(1)
  41 
  42 #define PCIE20_COMMAND_STATUS                   0x04
  43 #define CMD_BME_VAL                             0x4
  44 #define PCIE20_DEVICE_CONTROL2_STATUS2          0x98
  45 #define PCIE_CAP_CPL_TIMEOUT_DISABLE            0x10
  46 
  47 #define PCIE20_PARF_PHY_CTRL                    0x40
  48 #define PCIE20_PARF_PHY_REFCLK                  0x4C
  49 #define PCIE20_PARF_DBI_BASE_ADDR               0x168
  50 #define PCIE20_PARF_SLV_ADDR_SPACE_SIZE         0x16C
  51 #define PCIE20_PARF_MHI_CLOCK_RESET_CTRL        0x174
  52 #define PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT       0x178
  53 #define PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2    0x1A8
  54 #define PCIE20_PARF_LTSSM                       0x1B0
  55 #define PCIE20_PARF_SID_OFFSET                  0x234
  56 #define PCIE20_PARF_BDF_TRANSLATE_CFG           0x24C
  57 
  58 #define PCIE20_ELBI_SYS_CTRL                    0x04
  59 #define PCIE20_ELBI_SYS_CTRL_LT_ENABLE          BIT(0)
  60 
  61 #define PCIE20_AXI_MSTR_RESP_COMP_CTRL0         0x818
  62 #define CFG_REMOTE_RD_REQ_BRIDGE_SIZE_2K        0x4
  63 #define CFG_REMOTE_RD_REQ_BRIDGE_SIZE_4K        0x5
  64 #define PCIE20_AXI_MSTR_RESP_COMP_CTRL1         0x81c
  65 #define CFG_BRIDGE_SB_INIT                      BIT(0)
  66 
  67 #define PCIE20_CAP                              0x70
  68 #define PCIE20_CAP_LINK_CAPABILITIES            (PCIE20_CAP + 0xC)
  69 #define PCIE20_CAP_ACTIVE_STATE_LINK_PM_SUPPORT (BIT(10) | BIT(11))
  70 #define PCIE20_CAP_LINK_1                       (PCIE20_CAP + 0x14)
  71 #define PCIE_CAP_LINK1_VAL                      0x2FD7F
  72 
  73 #define PCIE20_PARF_Q2A_FLUSH                   0x1AC
  74 
  75 #define PCIE20_MISC_CONTROL_1_REG               0x8BC
  76 #define DBI_RO_WR_EN                            1
  77 
  78 #define PERST_DELAY_US                          1000
  79 
  80 #define PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE      0x358
  81 #define SLV_ADDR_SPACE_SZ                       0x10000000
  82 
  83 #define QCOM_PCIE_2_1_0_MAX_SUPPLY      3
  84 struct qcom_pcie_resources_2_1_0 {
  85         struct clk *iface_clk;
  86         struct clk *core_clk;
  87         struct clk *phy_clk;
  88         struct reset_control *pci_reset;
  89         struct reset_control *axi_reset;
  90         struct reset_control *ahb_reset;
  91         struct reset_control *por_reset;
  92         struct reset_control *phy_reset;
  93         struct regulator_bulk_data supplies[QCOM_PCIE_2_1_0_MAX_SUPPLY];
  94 };
  95 
  96 struct qcom_pcie_resources_1_0_0 {
  97         struct clk *iface;
  98         struct clk *aux;
  99         struct clk *master_bus;
 100         struct clk *slave_bus;
 101         struct reset_control *core;
 102         struct regulator *vdda;
 103 };
 104 
 105 #define QCOM_PCIE_2_3_2_MAX_SUPPLY      2
 106 struct qcom_pcie_resources_2_3_2 {
 107         struct clk *aux_clk;
 108         struct clk *master_clk;
 109         struct clk *slave_clk;
 110         struct clk *cfg_clk;
 111         struct clk *pipe_clk;
 112         struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
 113 };
 114 
 115 #define QCOM_PCIE_2_4_0_MAX_CLOCKS      4
 116 struct qcom_pcie_resources_2_4_0 {
 117         struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
 118         int num_clks;
 119         struct reset_control *axi_m_reset;
 120         struct reset_control *axi_s_reset;
 121         struct reset_control *pipe_reset;
 122         struct reset_control *axi_m_vmid_reset;
 123         struct reset_control *axi_s_xpu_reset;
 124         struct reset_control *parf_reset;
 125         struct reset_control *phy_reset;
 126         struct reset_control *axi_m_sticky_reset;
 127         struct reset_control *pipe_sticky_reset;
 128         struct reset_control *pwr_reset;
 129         struct reset_control *ahb_reset;
 130         struct reset_control *phy_ahb_reset;
 131 };
 132 
 133 struct qcom_pcie_resources_2_3_3 {
 134         struct clk *iface;
 135         struct clk *axi_m_clk;
 136         struct clk *axi_s_clk;
 137         struct clk *ahb_clk;
 138         struct clk *aux_clk;
 139         struct reset_control *rst[7];
 140 };
 141 
 142 union qcom_pcie_resources {
 143         struct qcom_pcie_resources_1_0_0 v1_0_0;
 144         struct qcom_pcie_resources_2_1_0 v2_1_0;
 145         struct qcom_pcie_resources_2_3_2 v2_3_2;
 146         struct qcom_pcie_resources_2_3_3 v2_3_3;
 147         struct qcom_pcie_resources_2_4_0 v2_4_0;
 148 };
 149 
 150 struct qcom_pcie;
 151 
 152 struct qcom_pcie_ops {
 153         int (*get_resources)(struct qcom_pcie *pcie);
 154         int (*init)(struct qcom_pcie *pcie);
 155         int (*post_init)(struct qcom_pcie *pcie);
 156         void (*deinit)(struct qcom_pcie *pcie);
 157         void (*post_deinit)(struct qcom_pcie *pcie);
 158         void (*ltssm_enable)(struct qcom_pcie *pcie);
 159 };
 160 
 161 struct qcom_pcie {
 162         struct dw_pcie *pci;
 163         void __iomem *parf;                     /* DT parf */
 164         void __iomem *elbi;                     /* DT elbi */
 165         union qcom_pcie_resources res;
 166         struct phy *phy;
 167         struct gpio_desc *reset;
 168         const struct qcom_pcie_ops *ops;
 169 };
 170 
 171 #define to_qcom_pcie(x)         dev_get_drvdata((x)->dev)
 172 
 173 static void qcom_ep_reset_assert(struct qcom_pcie *pcie)
 174 {
 175         gpiod_set_value_cansleep(pcie->reset, 1);
 176         usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500);
 177 }
 178 
 179 static void qcom_ep_reset_deassert(struct qcom_pcie *pcie)
 180 {
 181         /* Ensure that PERST has been asserted for at least 100 ms */
 182         msleep(100);
 183         gpiod_set_value_cansleep(pcie->reset, 0);
 184         usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500);
 185 }
 186 
 187 static int qcom_pcie_establish_link(struct qcom_pcie *pcie)
 188 {
 189         struct dw_pcie *pci = pcie->pci;
 190 
 191         if (dw_pcie_link_up(pci))
 192                 return 0;
 193 
 194         /* Enable Link Training state machine */
 195         if (pcie->ops->ltssm_enable)
 196                 pcie->ops->ltssm_enable(pcie);
 197 
 198         return dw_pcie_wait_for_link(pci);
 199 }
 200 
 201 static void qcom_pcie_2_1_0_ltssm_enable(struct qcom_pcie *pcie)
 202 {
 203         u32 val;
 204 
 205         /* enable link training */
 206         val = readl(pcie->elbi + PCIE20_ELBI_SYS_CTRL);
 207         val |= PCIE20_ELBI_SYS_CTRL_LT_ENABLE;
 208         writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL);
 209 }
 210 
 211 static int qcom_pcie_get_resources_2_1_0(struct qcom_pcie *pcie)
 212 {
 213         struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0;
 214         struct dw_pcie *pci = pcie->pci;
 215         struct device *dev = pci->dev;
 216         int ret;
 217 
 218         res->supplies[0].supply = "vdda";
 219         res->supplies[1].supply = "vdda_phy";
 220         res->supplies[2].supply = "vdda_refclk";
 221         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(res->supplies),
 222                                       res->supplies);
 223         if (ret)
 224                 return ret;
 225 
 226         res->iface_clk = devm_clk_get(dev, "iface");
 227         if (IS_ERR(res->iface_clk))
 228                 return PTR_ERR(res->iface_clk);
 229 
 230         res->core_clk = devm_clk_get(dev, "core");
 231         if (IS_ERR(res->core_clk))
 232                 return PTR_ERR(res->core_clk);
 233 
 234         res->phy_clk = devm_clk_get(dev, "phy");
 235         if (IS_ERR(res->phy_clk))
 236                 return PTR_ERR(res->phy_clk);
 237 
 238         res->pci_reset = devm_reset_control_get_exclusive(dev, "pci");
 239         if (IS_ERR(res->pci_reset))
 240                 return PTR_ERR(res->pci_reset);
 241 
 242         res->axi_reset = devm_reset_control_get_exclusive(dev, "axi");
 243         if (IS_ERR(res->axi_reset))
 244                 return PTR_ERR(res->axi_reset);
 245 
 246         res->ahb_reset = devm_reset_control_get_exclusive(dev, "ahb");
 247         if (IS_ERR(res->ahb_reset))
 248                 return PTR_ERR(res->ahb_reset);
 249 
 250         res->por_reset = devm_reset_control_get_exclusive(dev, "por");
 251         if (IS_ERR(res->por_reset))
 252                 return PTR_ERR(res->por_reset);
 253 
 254         res->phy_reset = devm_reset_control_get_exclusive(dev, "phy");
 255         return PTR_ERR_OR_ZERO(res->phy_reset);
 256 }
 257 
 258 static void qcom_pcie_deinit_2_1_0(struct qcom_pcie *pcie)
 259 {
 260         struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0;
 261 
 262         reset_control_assert(res->pci_reset);
 263         reset_control_assert(res->axi_reset);
 264         reset_control_assert(res->ahb_reset);
 265         reset_control_assert(res->por_reset);
 266         reset_control_assert(res->pci_reset);
 267         clk_disable_unprepare(res->iface_clk);
 268         clk_disable_unprepare(res->core_clk);
 269         clk_disable_unprepare(res->phy_clk);
 270         regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
 271 }
 272 
 273 static int qcom_pcie_init_2_1_0(struct qcom_pcie *pcie)
 274 {
 275         struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0;
 276         struct dw_pcie *pci = pcie->pci;
 277         struct device *dev = pci->dev;
 278         u32 val;
 279         int ret;
 280 
 281         ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies);
 282         if (ret < 0) {
 283                 dev_err(dev, "cannot enable regulators\n");
 284                 return ret;
 285         }
 286 
 287         ret = reset_control_assert(res->ahb_reset);
 288         if (ret) {
 289                 dev_err(dev, "cannot assert ahb reset\n");
 290                 goto err_assert_ahb;
 291         }
 292 
 293         ret = clk_prepare_enable(res->iface_clk);
 294         if (ret) {
 295                 dev_err(dev, "cannot prepare/enable iface clock\n");
 296                 goto err_assert_ahb;
 297         }
 298 
 299         ret = clk_prepare_enable(res->phy_clk);
 300         if (ret) {
 301                 dev_err(dev, "cannot prepare/enable phy clock\n");
 302                 goto err_clk_phy;
 303         }
 304 
 305         ret = clk_prepare_enable(res->core_clk);
 306         if (ret) {
 307                 dev_err(dev, "cannot prepare/enable core clock\n");
 308                 goto err_clk_core;
 309         }
 310 
 311         ret = reset_control_deassert(res->ahb_reset);
 312         if (ret) {
 313                 dev_err(dev, "cannot deassert ahb reset\n");
 314                 goto err_deassert_ahb;
 315         }
 316 
 317         /* enable PCIe clocks and resets */
 318         val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL);
 319         val &= ~BIT(0);
 320         writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL);
 321 
 322         /* enable external reference clock */
 323         val = readl(pcie->parf + PCIE20_PARF_PHY_REFCLK);
 324         val |= BIT(16);
 325         writel(val, pcie->parf + PCIE20_PARF_PHY_REFCLK);
 326 
 327         ret = reset_control_deassert(res->phy_reset);
 328         if (ret) {
 329                 dev_err(dev, "cannot deassert phy reset\n");
 330                 return ret;
 331         }
 332 
 333         ret = reset_control_deassert(res->pci_reset);
 334         if (ret) {
 335                 dev_err(dev, "cannot deassert pci reset\n");
 336                 return ret;
 337         }
 338 
 339         ret = reset_control_deassert(res->por_reset);
 340         if (ret) {
 341                 dev_err(dev, "cannot deassert por reset\n");
 342                 return ret;
 343         }
 344 
 345         ret = reset_control_deassert(res->axi_reset);
 346         if (ret) {
 347                 dev_err(dev, "cannot deassert axi reset\n");
 348                 return ret;
 349         }
 350 
 351         /* wait for clock acquisition */
 352         usleep_range(1000, 1500);
 353 
 354 
 355         /* Set the Max TLP size to 2K, instead of using default of 4K */
 356         writel(CFG_REMOTE_RD_REQ_BRIDGE_SIZE_2K,
 357                pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL0);
 358         writel(CFG_BRIDGE_SB_INIT,
 359                pci->dbi_base + PCIE20_AXI_MSTR_RESP_COMP_CTRL1);
 360 
 361         return 0;
 362 
 363 err_deassert_ahb:
 364         clk_disable_unprepare(res->core_clk);
 365 err_clk_core:
 366         clk_disable_unprepare(res->phy_clk);
 367 err_clk_phy:
 368         clk_disable_unprepare(res->iface_clk);
 369 err_assert_ahb:
 370         regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
 371 
 372         return ret;
 373 }
 374 
 375 static int qcom_pcie_get_resources_1_0_0(struct qcom_pcie *pcie)
 376 {
 377         struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
 378         struct dw_pcie *pci = pcie->pci;
 379         struct device *dev = pci->dev;
 380 
 381         res->vdda = devm_regulator_get(dev, "vdda");
 382         if (IS_ERR(res->vdda))
 383                 return PTR_ERR(res->vdda);
 384 
 385         res->iface = devm_clk_get(dev, "iface");
 386         if (IS_ERR(res->iface))
 387                 return PTR_ERR(res->iface);
 388 
 389         res->aux = devm_clk_get(dev, "aux");
 390         if (IS_ERR(res->aux))
 391                 return PTR_ERR(res->aux);
 392 
 393         res->master_bus = devm_clk_get(dev, "master_bus");
 394         if (IS_ERR(res->master_bus))
 395                 return PTR_ERR(res->master_bus);
 396 
 397         res->slave_bus = devm_clk_get(dev, "slave_bus");
 398         if (IS_ERR(res->slave_bus))
 399                 return PTR_ERR(res->slave_bus);
 400 
 401         res->core = devm_reset_control_get_exclusive(dev, "core");
 402         return PTR_ERR_OR_ZERO(res->core);
 403 }
 404 
 405 static void qcom_pcie_deinit_1_0_0(struct qcom_pcie *pcie)
 406 {
 407         struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
 408 
 409         reset_control_assert(res->core);
 410         clk_disable_unprepare(res->slave_bus);
 411         clk_disable_unprepare(res->master_bus);
 412         clk_disable_unprepare(res->iface);
 413         clk_disable_unprepare(res->aux);
 414         regulator_disable(res->vdda);
 415 }
 416 
 417 static int qcom_pcie_init_1_0_0(struct qcom_pcie *pcie)
 418 {
 419         struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
 420         struct dw_pcie *pci = pcie->pci;
 421         struct device *dev = pci->dev;
 422         int ret;
 423 
 424         ret = reset_control_deassert(res->core);
 425         if (ret) {
 426                 dev_err(dev, "cannot deassert core reset\n");
 427                 return ret;
 428         }
 429 
 430         ret = clk_prepare_enable(res->aux);
 431         if (ret) {
 432                 dev_err(dev, "cannot prepare/enable aux clock\n");
 433                 goto err_res;
 434         }
 435 
 436         ret = clk_prepare_enable(res->iface);
 437         if (ret) {
 438                 dev_err(dev, "cannot prepare/enable iface clock\n");
 439                 goto err_aux;
 440         }
 441 
 442         ret = clk_prepare_enable(res->master_bus);
 443         if (ret) {
 444                 dev_err(dev, "cannot prepare/enable master_bus clock\n");
 445                 goto err_iface;
 446         }
 447 
 448         ret = clk_prepare_enable(res->slave_bus);
 449         if (ret) {
 450                 dev_err(dev, "cannot prepare/enable slave_bus clock\n");
 451                 goto err_master;
 452         }
 453 
 454         ret = regulator_enable(res->vdda);
 455         if (ret) {
 456                 dev_err(dev, "cannot enable vdda regulator\n");
 457                 goto err_slave;
 458         }
 459 
 460         /* change DBI base address */
 461         writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR);
 462 
 463         if (IS_ENABLED(CONFIG_PCI_MSI)) {
 464                 u32 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT);
 465 
 466                 val |= BIT(31);
 467                 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT);
 468         }
 469 
 470         return 0;
 471 err_slave:
 472         clk_disable_unprepare(res->slave_bus);
 473 err_master:
 474         clk_disable_unprepare(res->master_bus);
 475 err_iface:
 476         clk_disable_unprepare(res->iface);
 477 err_aux:
 478         clk_disable_unprepare(res->aux);
 479 err_res:
 480         reset_control_assert(res->core);
 481 
 482         return ret;
 483 }
 484 
 485 static void qcom_pcie_2_3_2_ltssm_enable(struct qcom_pcie *pcie)
 486 {
 487         u32 val;
 488 
 489         /* enable link training */
 490         val = readl(pcie->parf + PCIE20_PARF_LTSSM);
 491         val |= BIT(8);
 492         writel(val, pcie->parf + PCIE20_PARF_LTSSM);
 493 }
 494 
 495 static int qcom_pcie_get_resources_2_3_2(struct qcom_pcie *pcie)
 496 {
 497         struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
 498         struct dw_pcie *pci = pcie->pci;
 499         struct device *dev = pci->dev;
 500         int ret;
 501 
 502         res->supplies[0].supply = "vdda";
 503         res->supplies[1].supply = "vddpe-3v3";
 504         ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(res->supplies),
 505                                       res->supplies);
 506         if (ret)
 507                 return ret;
 508 
 509         res->aux_clk = devm_clk_get(dev, "aux");
 510         if (IS_ERR(res->aux_clk))
 511                 return PTR_ERR(res->aux_clk);
 512 
 513         res->cfg_clk = devm_clk_get(dev, "cfg");
 514         if (IS_ERR(res->cfg_clk))
 515                 return PTR_ERR(res->cfg_clk);
 516 
 517         res->master_clk = devm_clk_get(dev, "bus_master");
 518         if (IS_ERR(res->master_clk))
 519                 return PTR_ERR(res->master_clk);
 520 
 521         res->slave_clk = devm_clk_get(dev, "bus_slave");
 522         if (IS_ERR(res->slave_clk))
 523                 return PTR_ERR(res->slave_clk);
 524 
 525         res->pipe_clk = devm_clk_get(dev, "pipe");
 526         return PTR_ERR_OR_ZERO(res->pipe_clk);
 527 }
 528 
 529 static void qcom_pcie_deinit_2_3_2(struct qcom_pcie *pcie)
 530 {
 531         struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
 532 
 533         clk_disable_unprepare(res->slave_clk);
 534         clk_disable_unprepare(res->master_clk);
 535         clk_disable_unprepare(res->cfg_clk);
 536         clk_disable_unprepare(res->aux_clk);
 537 
 538         regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
 539 }
 540 
 541 static void qcom_pcie_post_deinit_2_3_2(struct qcom_pcie *pcie)
 542 {
 543         struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
 544 
 545         clk_disable_unprepare(res->pipe_clk);
 546 }
 547 
 548 static int qcom_pcie_init_2_3_2(struct qcom_pcie *pcie)
 549 {
 550         struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
 551         struct dw_pcie *pci = pcie->pci;
 552         struct device *dev = pci->dev;
 553         u32 val;
 554         int ret;
 555 
 556         ret = regulator_bulk_enable(ARRAY_SIZE(res->supplies), res->supplies);
 557         if (ret < 0) {
 558                 dev_err(dev, "cannot enable regulators\n");
 559                 return ret;
 560         }
 561 
 562         ret = clk_prepare_enable(res->aux_clk);
 563         if (ret) {
 564                 dev_err(dev, "cannot prepare/enable aux clock\n");
 565                 goto err_aux_clk;
 566         }
 567 
 568         ret = clk_prepare_enable(res->cfg_clk);
 569         if (ret) {
 570                 dev_err(dev, "cannot prepare/enable cfg clock\n");
 571                 goto err_cfg_clk;
 572         }
 573 
 574         ret = clk_prepare_enable(res->master_clk);
 575         if (ret) {
 576                 dev_err(dev, "cannot prepare/enable master clock\n");
 577                 goto err_master_clk;
 578         }
 579 
 580         ret = clk_prepare_enable(res->slave_clk);
 581         if (ret) {
 582                 dev_err(dev, "cannot prepare/enable slave clock\n");
 583                 goto err_slave_clk;
 584         }
 585 
 586         /* enable PCIe clocks and resets */
 587         val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL);
 588         val &= ~BIT(0);
 589         writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL);
 590 
 591         /* change DBI base address */
 592         writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR);
 593 
 594         /* MAC PHY_POWERDOWN MUX DISABLE  */
 595         val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL);
 596         val &= ~BIT(29);
 597         writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL);
 598 
 599         val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL);
 600         val |= BIT(4);
 601         writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL);
 602 
 603         val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2);
 604         val |= BIT(31);
 605         writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2);
 606 
 607         return 0;
 608 
 609 err_slave_clk:
 610         clk_disable_unprepare(res->master_clk);
 611 err_master_clk:
 612         clk_disable_unprepare(res->cfg_clk);
 613 err_cfg_clk:
 614         clk_disable_unprepare(res->aux_clk);
 615 
 616 err_aux_clk:
 617         regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
 618 
 619         return ret;
 620 }
 621 
 622 static int qcom_pcie_post_init_2_3_2(struct qcom_pcie *pcie)
 623 {
 624         struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
 625         struct dw_pcie *pci = pcie->pci;
 626         struct device *dev = pci->dev;
 627         int ret;
 628 
 629         ret = clk_prepare_enable(res->pipe_clk);
 630         if (ret) {
 631                 dev_err(dev, "cannot prepare/enable pipe clock\n");
 632                 return ret;
 633         }
 634 
 635         return 0;
 636 }
 637 
 638 static int qcom_pcie_get_resources_2_4_0(struct qcom_pcie *pcie)
 639 {
 640         struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
 641         struct dw_pcie *pci = pcie->pci;
 642         struct device *dev = pci->dev;
 643         bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019");
 644         int ret;
 645 
 646         res->clks[0].id = "aux";
 647         res->clks[1].id = "master_bus";
 648         res->clks[2].id = "slave_bus";
 649         res->clks[3].id = "iface";
 650 
 651         /* qcom,pcie-ipq4019 is defined without "iface" */
 652         res->num_clks = is_ipq ? 3 : 4;
 653 
 654         ret = devm_clk_bulk_get(dev, res->num_clks, res->clks);
 655         if (ret < 0)
 656                 return ret;
 657 
 658         res->axi_m_reset = devm_reset_control_get_exclusive(dev, "axi_m");
 659         if (IS_ERR(res->axi_m_reset))
 660                 return PTR_ERR(res->axi_m_reset);
 661 
 662         res->axi_s_reset = devm_reset_control_get_exclusive(dev, "axi_s");
 663         if (IS_ERR(res->axi_s_reset))
 664                 return PTR_ERR(res->axi_s_reset);
 665 
 666         if (is_ipq) {
 667                 /*
 668                  * These resources relates to the PHY or are secure clocks, but
 669                  * are controlled here for IPQ4019
 670                  */
 671                 res->pipe_reset = devm_reset_control_get_exclusive(dev, "pipe");
 672                 if (IS_ERR(res->pipe_reset))
 673                         return PTR_ERR(res->pipe_reset);
 674 
 675                 res->axi_m_vmid_reset = devm_reset_control_get_exclusive(dev,
 676                                                                          "axi_m_vmid");
 677                 if (IS_ERR(res->axi_m_vmid_reset))
 678                         return PTR_ERR(res->axi_m_vmid_reset);
 679 
 680                 res->axi_s_xpu_reset = devm_reset_control_get_exclusive(dev,
 681                                                                         "axi_s_xpu");
 682                 if (IS_ERR(res->axi_s_xpu_reset))
 683                         return PTR_ERR(res->axi_s_xpu_reset);
 684 
 685                 res->parf_reset = devm_reset_control_get_exclusive(dev, "parf");
 686                 if (IS_ERR(res->parf_reset))
 687                         return PTR_ERR(res->parf_reset);
 688 
 689                 res->phy_reset = devm_reset_control_get_exclusive(dev, "phy");
 690                 if (IS_ERR(res->phy_reset))
 691                         return PTR_ERR(res->phy_reset);
 692         }
 693 
 694         res->axi_m_sticky_reset = devm_reset_control_get_exclusive(dev,
 695                                                                    "axi_m_sticky");
 696         if (IS_ERR(res->axi_m_sticky_reset))
 697                 return PTR_ERR(res->axi_m_sticky_reset);
 698 
 699         res->pipe_sticky_reset = devm_reset_control_get_exclusive(dev,
 700                                                                   "pipe_sticky");
 701         if (IS_ERR(res->pipe_sticky_reset))
 702                 return PTR_ERR(res->pipe_sticky_reset);
 703 
 704         res->pwr_reset = devm_reset_control_get_exclusive(dev, "pwr");
 705         if (IS_ERR(res->pwr_reset))
 706                 return PTR_ERR(res->pwr_reset);
 707 
 708         res->ahb_reset = devm_reset_control_get_exclusive(dev, "ahb");
 709         if (IS_ERR(res->ahb_reset))
 710                 return PTR_ERR(res->ahb_reset);
 711 
 712         if (is_ipq) {
 713                 res->phy_ahb_reset = devm_reset_control_get_exclusive(dev, "phy_ahb");
 714                 if (IS_ERR(res->phy_ahb_reset))
 715                         return PTR_ERR(res->phy_ahb_reset);
 716         }
 717 
 718         return 0;
 719 }
 720 
 721 static void qcom_pcie_deinit_2_4_0(struct qcom_pcie *pcie)
 722 {
 723         struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
 724 
 725         reset_control_assert(res->axi_m_reset);
 726         reset_control_assert(res->axi_s_reset);
 727         reset_control_assert(res->pipe_reset);
 728         reset_control_assert(res->pipe_sticky_reset);
 729         reset_control_assert(res->phy_reset);
 730         reset_control_assert(res->phy_ahb_reset);
 731         reset_control_assert(res->axi_m_sticky_reset);
 732         reset_control_assert(res->pwr_reset);
 733         reset_control_assert(res->ahb_reset);
 734         clk_bulk_disable_unprepare(res->num_clks, res->clks);
 735 }
 736 
 737 static int qcom_pcie_init_2_4_0(struct qcom_pcie *pcie)
 738 {
 739         struct qcom_pcie_resources_2_4_0 *res = &pcie->res.v2_4_0;
 740         struct dw_pcie *pci = pcie->pci;
 741         struct device *dev = pci->dev;
 742         u32 val;
 743         int ret;
 744 
 745         ret = reset_control_assert(res->axi_m_reset);
 746         if (ret) {
 747                 dev_err(dev, "cannot assert axi master reset\n");
 748                 return ret;
 749         }
 750 
 751         ret = reset_control_assert(res->axi_s_reset);
 752         if (ret) {
 753                 dev_err(dev, "cannot assert axi slave reset\n");
 754                 return ret;
 755         }
 756 
 757         usleep_range(10000, 12000);
 758 
 759         ret = reset_control_assert(res->pipe_reset);
 760         if (ret) {
 761                 dev_err(dev, "cannot assert pipe reset\n");
 762                 return ret;
 763         }
 764 
 765         ret = reset_control_assert(res->pipe_sticky_reset);
 766         if (ret) {
 767                 dev_err(dev, "cannot assert pipe sticky reset\n");
 768                 return ret;
 769         }
 770 
 771         ret = reset_control_assert(res->phy_reset);
 772         if (ret) {
 773                 dev_err(dev, "cannot assert phy reset\n");
 774                 return ret;
 775         }
 776 
 777         ret = reset_control_assert(res->phy_ahb_reset);
 778         if (ret) {
 779                 dev_err(dev, "cannot assert phy ahb reset\n");
 780                 return ret;
 781         }
 782 
 783         usleep_range(10000, 12000);
 784 
 785         ret = reset_control_assert(res->axi_m_sticky_reset);
 786         if (ret) {
 787                 dev_err(dev, "cannot assert axi master sticky reset\n");
 788                 return ret;
 789         }
 790 
 791         ret = reset_control_assert(res->pwr_reset);
 792         if (ret) {
 793                 dev_err(dev, "cannot assert power reset\n");
 794                 return ret;
 795         }
 796 
 797         ret = reset_control_assert(res->ahb_reset);
 798         if (ret) {
 799                 dev_err(dev, "cannot assert ahb reset\n");
 800                 return ret;
 801         }
 802 
 803         usleep_range(10000, 12000);
 804 
 805         ret = reset_control_deassert(res->phy_ahb_reset);
 806         if (ret) {
 807                 dev_err(dev, "cannot deassert phy ahb reset\n");
 808                 return ret;
 809         }
 810 
 811         ret = reset_control_deassert(res->phy_reset);
 812         if (ret) {
 813                 dev_err(dev, "cannot deassert phy reset\n");
 814                 goto err_rst_phy;
 815         }
 816 
 817         ret = reset_control_deassert(res->pipe_reset);
 818         if (ret) {
 819                 dev_err(dev, "cannot deassert pipe reset\n");
 820                 goto err_rst_pipe;
 821         }
 822 
 823         ret = reset_control_deassert(res->pipe_sticky_reset);
 824         if (ret) {
 825                 dev_err(dev, "cannot deassert pipe sticky reset\n");
 826                 goto err_rst_pipe_sticky;
 827         }
 828 
 829         usleep_range(10000, 12000);
 830 
 831         ret = reset_control_deassert(res->axi_m_reset);
 832         if (ret) {
 833                 dev_err(dev, "cannot deassert axi master reset\n");
 834                 goto err_rst_axi_m;
 835         }
 836 
 837         ret = reset_control_deassert(res->axi_m_sticky_reset);
 838         if (ret) {
 839                 dev_err(dev, "cannot deassert axi master sticky reset\n");
 840                 goto err_rst_axi_m_sticky;
 841         }
 842 
 843         ret = reset_control_deassert(res->axi_s_reset);
 844         if (ret) {
 845                 dev_err(dev, "cannot deassert axi slave reset\n");
 846                 goto err_rst_axi_s;
 847         }
 848 
 849         ret = reset_control_deassert(res->pwr_reset);
 850         if (ret) {
 851                 dev_err(dev, "cannot deassert power reset\n");
 852                 goto err_rst_pwr;
 853         }
 854 
 855         ret = reset_control_deassert(res->ahb_reset);
 856         if (ret) {
 857                 dev_err(dev, "cannot deassert ahb reset\n");
 858                 goto err_rst_ahb;
 859         }
 860 
 861         usleep_range(10000, 12000);
 862 
 863         ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
 864         if (ret)
 865                 goto err_clks;
 866 
 867         /* enable PCIe clocks and resets */
 868         val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL);
 869         val &= ~BIT(0);
 870         writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL);
 871 
 872         /* change DBI base address */
 873         writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR);
 874 
 875         /* MAC PHY_POWERDOWN MUX DISABLE  */
 876         val = readl(pcie->parf + PCIE20_PARF_SYS_CTRL);
 877         val &= ~BIT(29);
 878         writel(val, pcie->parf + PCIE20_PARF_SYS_CTRL);
 879 
 880         val = readl(pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL);
 881         val |= BIT(4);
 882         writel(val, pcie->parf + PCIE20_PARF_MHI_CLOCK_RESET_CTRL);
 883 
 884         val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2);
 885         val |= BIT(31);
 886         writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT_V2);
 887 
 888         return 0;
 889 
 890 err_clks:
 891         reset_control_assert(res->ahb_reset);
 892 err_rst_ahb:
 893         reset_control_assert(res->pwr_reset);
 894 err_rst_pwr:
 895         reset_control_assert(res->axi_s_reset);
 896 err_rst_axi_s:
 897         reset_control_assert(res->axi_m_sticky_reset);
 898 err_rst_axi_m_sticky:
 899         reset_control_assert(res->axi_m_reset);
 900 err_rst_axi_m:
 901         reset_control_assert(res->pipe_sticky_reset);
 902 err_rst_pipe_sticky:
 903         reset_control_assert(res->pipe_reset);
 904 err_rst_pipe:
 905         reset_control_assert(res->phy_reset);
 906 err_rst_phy:
 907         reset_control_assert(res->phy_ahb_reset);
 908         return ret;
 909 }
 910 
 911 static int qcom_pcie_get_resources_2_3_3(struct qcom_pcie *pcie)
 912 {
 913         struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
 914         struct dw_pcie *pci = pcie->pci;
 915         struct device *dev = pci->dev;
 916         int i;
 917         const char *rst_names[] = { "axi_m", "axi_s", "pipe",
 918                                     "axi_m_sticky", "sticky",
 919                                     "ahb", "sleep", };
 920 
 921         res->iface = devm_clk_get(dev, "iface");
 922         if (IS_ERR(res->iface))
 923                 return PTR_ERR(res->iface);
 924 
 925         res->axi_m_clk = devm_clk_get(dev, "axi_m");
 926         if (IS_ERR(res->axi_m_clk))
 927                 return PTR_ERR(res->axi_m_clk);
 928 
 929         res->axi_s_clk = devm_clk_get(dev, "axi_s");
 930         if (IS_ERR(res->axi_s_clk))
 931                 return PTR_ERR(res->axi_s_clk);
 932 
 933         res->ahb_clk = devm_clk_get(dev, "ahb");
 934         if (IS_ERR(res->ahb_clk))
 935                 return PTR_ERR(res->ahb_clk);
 936 
 937         res->aux_clk = devm_clk_get(dev, "aux");
 938         if (IS_ERR(res->aux_clk))
 939                 return PTR_ERR(res->aux_clk);
 940 
 941         for (i = 0; i < ARRAY_SIZE(rst_names); i++) {
 942                 res->rst[i] = devm_reset_control_get(dev, rst_names[i]);
 943                 if (IS_ERR(res->rst[i]))
 944                         return PTR_ERR(res->rst[i]);
 945         }
 946 
 947         return 0;
 948 }
 949 
 950 static void qcom_pcie_deinit_2_3_3(struct qcom_pcie *pcie)
 951 {
 952         struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
 953 
 954         clk_disable_unprepare(res->iface);
 955         clk_disable_unprepare(res->axi_m_clk);
 956         clk_disable_unprepare(res->axi_s_clk);
 957         clk_disable_unprepare(res->ahb_clk);
 958         clk_disable_unprepare(res->aux_clk);
 959 }
 960 
 961 static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
 962 {
 963         struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
 964         struct dw_pcie *pci = pcie->pci;
 965         struct device *dev = pci->dev;
 966         int i, ret;
 967         u32 val;
 968 
 969         for (i = 0; i < ARRAY_SIZE(res->rst); i++) {
 970                 ret = reset_control_assert(res->rst[i]);
 971                 if (ret) {
 972                         dev_err(dev, "reset #%d assert failed (%d)\n", i, ret);
 973                         return ret;
 974                 }
 975         }
 976 
 977         usleep_range(2000, 2500);
 978 
 979         for (i = 0; i < ARRAY_SIZE(res->rst); i++) {
 980                 ret = reset_control_deassert(res->rst[i]);
 981                 if (ret) {
 982                         dev_err(dev, "reset #%d deassert failed (%d)\n", i,
 983                                 ret);
 984                         return ret;
 985                 }
 986         }
 987 
 988         /*
 989          * Don't have a way to see if the reset has completed.
 990          * Wait for some time.
 991          */
 992         usleep_range(2000, 2500);
 993 
 994         ret = clk_prepare_enable(res->iface);
 995         if (ret) {
 996                 dev_err(dev, "cannot prepare/enable core clock\n");
 997                 goto err_clk_iface;
 998         }
 999 
1000         ret = clk_prepare_enable(res->axi_m_clk);
1001         if (ret) {
1002                 dev_err(dev, "cannot prepare/enable core clock\n");
1003                 goto err_clk_axi_m;
1004         }
1005 
1006         ret = clk_prepare_enable(res->axi_s_clk);
1007         if (ret) {
1008                 dev_err(dev, "cannot prepare/enable axi slave clock\n");
1009                 goto err_clk_axi_s;
1010         }
1011 
1012         ret = clk_prepare_enable(res->ahb_clk);
1013         if (ret) {
1014                 dev_err(dev, "cannot prepare/enable ahb clock\n");
1015                 goto err_clk_ahb;
1016         }
1017 
1018         ret = clk_prepare_enable(res->aux_clk);
1019         if (ret) {
1020                 dev_err(dev, "cannot prepare/enable aux clock\n");
1021                 goto err_clk_aux;
1022         }
1023 
1024         writel(SLV_ADDR_SPACE_SZ,
1025                 pcie->parf + PCIE20_v3_PARF_SLV_ADDR_SPACE_SIZE);
1026 
1027         val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL);
1028         val &= ~BIT(0);
1029         writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL);
1030 
1031         writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR);
1032 
1033         writel(MST_WAKEUP_EN | SLV_WAKEUP_EN | MSTR_ACLK_CGC_DIS
1034                 | SLV_ACLK_CGC_DIS | CORE_CLK_CGC_DIS |
1035                 AUX_PWR_DET | L23_CLK_RMV_DIS | L1_CLK_RMV_DIS,
1036                 pcie->parf + PCIE20_PARF_SYS_CTRL);
1037         writel(0, pcie->parf + PCIE20_PARF_Q2A_FLUSH);
1038 
1039         writel(CMD_BME_VAL, pci->dbi_base + PCIE20_COMMAND_STATUS);
1040         writel(DBI_RO_WR_EN, pci->dbi_base + PCIE20_MISC_CONTROL_1_REG);
1041         writel(PCIE_CAP_LINK1_VAL, pci->dbi_base + PCIE20_CAP_LINK_1);
1042 
1043         val = readl(pci->dbi_base + PCIE20_CAP_LINK_CAPABILITIES);
1044         val &= ~PCIE20_CAP_ACTIVE_STATE_LINK_PM_SUPPORT;
1045         writel(val, pci->dbi_base + PCIE20_CAP_LINK_CAPABILITIES);
1046 
1047         writel(PCIE_CAP_CPL_TIMEOUT_DISABLE, pci->dbi_base +
1048                 PCIE20_DEVICE_CONTROL2_STATUS2);
1049 
1050         return 0;
1051 
1052 err_clk_aux:
1053         clk_disable_unprepare(res->ahb_clk);
1054 err_clk_ahb:
1055         clk_disable_unprepare(res->axi_s_clk);
1056 err_clk_axi_s:
1057         clk_disable_unprepare(res->axi_m_clk);
1058 err_clk_axi_m:
1059         clk_disable_unprepare(res->iface);
1060 err_clk_iface:
1061         /*
1062          * Not checking for failure, will anyway return
1063          * the original failure in 'ret'.
1064          */
1065         for (i = 0; i < ARRAY_SIZE(res->rst); i++)
1066                 reset_control_assert(res->rst[i]);
1067 
1068         return ret;
1069 }
1070 
1071 static int qcom_pcie_link_up(struct dw_pcie *pci)
1072 {
1073         u16 val = readw(pci->dbi_base + PCIE20_CAP + PCI_EXP_LNKSTA);
1074 
1075         return !!(val & PCI_EXP_LNKSTA_DLLLA);
1076 }
1077 
1078 static int qcom_pcie_host_init(struct pcie_port *pp)
1079 {
1080         struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
1081         struct qcom_pcie *pcie = to_qcom_pcie(pci);
1082         int ret;
1083 
1084         qcom_ep_reset_assert(pcie);
1085 
1086         ret = pcie->ops->init(pcie);
1087         if (ret)
1088                 return ret;
1089 
1090         ret = phy_power_on(pcie->phy);
1091         if (ret)
1092                 goto err_deinit;
1093 
1094         if (pcie->ops->post_init) {
1095                 ret = pcie->ops->post_init(pcie);
1096                 if (ret)
1097                         goto err_disable_phy;
1098         }
1099 
1100         dw_pcie_setup_rc(pp);
1101 
1102         if (IS_ENABLED(CONFIG_PCI_MSI))
1103                 dw_pcie_msi_init(pp);
1104 
1105         qcom_ep_reset_deassert(pcie);
1106 
1107         ret = qcom_pcie_establish_link(pcie);
1108         if (ret)
1109                 goto err;
1110 
1111         return 0;
1112 err:
1113         qcom_ep_reset_assert(pcie);
1114         if (pcie->ops->post_deinit)
1115                 pcie->ops->post_deinit(pcie);
1116 err_disable_phy:
1117         phy_power_off(pcie->phy);
1118 err_deinit:
1119         pcie->ops->deinit(pcie);
1120 
1121         return ret;
1122 }
1123 
1124 static const struct dw_pcie_host_ops qcom_pcie_dw_ops = {
1125         .host_init = qcom_pcie_host_init,
1126 };
1127 
1128 /* Qcom IP rev.: 2.1.0  Synopsys IP rev.: 4.01a */
1129 static const struct qcom_pcie_ops ops_2_1_0 = {
1130         .get_resources = qcom_pcie_get_resources_2_1_0,
1131         .init = qcom_pcie_init_2_1_0,
1132         .deinit = qcom_pcie_deinit_2_1_0,
1133         .ltssm_enable = qcom_pcie_2_1_0_ltssm_enable,
1134 };
1135 
1136 /* Qcom IP rev.: 1.0.0  Synopsys IP rev.: 4.11a */
1137 static const struct qcom_pcie_ops ops_1_0_0 = {
1138         .get_resources = qcom_pcie_get_resources_1_0_0,
1139         .init = qcom_pcie_init_1_0_0,
1140         .deinit = qcom_pcie_deinit_1_0_0,
1141         .ltssm_enable = qcom_pcie_2_1_0_ltssm_enable,
1142 };
1143 
1144 /* Qcom IP rev.: 2.3.2  Synopsys IP rev.: 4.21a */
1145 static const struct qcom_pcie_ops ops_2_3_2 = {
1146         .get_resources = qcom_pcie_get_resources_2_3_2,
1147         .init = qcom_pcie_init_2_3_2,
1148         .post_init = qcom_pcie_post_init_2_3_2,
1149         .deinit = qcom_pcie_deinit_2_3_2,
1150         .post_deinit = qcom_pcie_post_deinit_2_3_2,
1151         .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
1152 };
1153 
1154 /* Qcom IP rev.: 2.4.0  Synopsys IP rev.: 4.20a */
1155 static const struct qcom_pcie_ops ops_2_4_0 = {
1156         .get_resources = qcom_pcie_get_resources_2_4_0,
1157         .init = qcom_pcie_init_2_4_0,
1158         .deinit = qcom_pcie_deinit_2_4_0,
1159         .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
1160 };
1161 
1162 /* Qcom IP rev.: 2.3.3  Synopsys IP rev.: 4.30a */
1163 static const struct qcom_pcie_ops ops_2_3_3 = {
1164         .get_resources = qcom_pcie_get_resources_2_3_3,
1165         .init = qcom_pcie_init_2_3_3,
1166         .deinit = qcom_pcie_deinit_2_3_3,
1167         .ltssm_enable = qcom_pcie_2_3_2_ltssm_enable,
1168 };
1169 
1170 static const struct dw_pcie_ops dw_pcie_ops = {
1171         .link_up = qcom_pcie_link_up,
1172 };
1173 
1174 static int qcom_pcie_probe(struct platform_device *pdev)
1175 {
1176         struct device *dev = &pdev->dev;
1177         struct resource *res;
1178         struct pcie_port *pp;
1179         struct dw_pcie *pci;
1180         struct qcom_pcie *pcie;
1181         int ret;
1182 
1183         pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
1184         if (!pcie)
1185                 return -ENOMEM;
1186 
1187         pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
1188         if (!pci)
1189                 return -ENOMEM;
1190 
1191         pm_runtime_enable(dev);
1192         ret = pm_runtime_get_sync(dev);
1193         if (ret < 0) {
1194                 pm_runtime_disable(dev);
1195                 return ret;
1196         }
1197 
1198         pci->dev = dev;
1199         pci->ops = &dw_pcie_ops;
1200         pp = &pci->pp;
1201 
1202         pcie->pci = pci;
1203 
1204         pcie->ops = of_device_get_match_data(dev);
1205 
1206         pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_HIGH);
1207         if (IS_ERR(pcie->reset)) {
1208                 ret = PTR_ERR(pcie->reset);
1209                 goto err_pm_runtime_put;
1210         }
1211 
1212         res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "parf");
1213         pcie->parf = devm_ioremap_resource(dev, res);
1214         if (IS_ERR(pcie->parf)) {
1215                 ret = PTR_ERR(pcie->parf);
1216                 goto err_pm_runtime_put;
1217         }
1218 
1219         res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi");
1220         pci->dbi_base = devm_pci_remap_cfg_resource(dev, res);
1221         if (IS_ERR(pci->dbi_base)) {
1222                 ret = PTR_ERR(pci->dbi_base);
1223                 goto err_pm_runtime_put;
1224         }
1225 
1226         res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi");
1227         pcie->elbi = devm_ioremap_resource(dev, res);
1228         if (IS_ERR(pcie->elbi)) {
1229                 ret = PTR_ERR(pcie->elbi);
1230                 goto err_pm_runtime_put;
1231         }
1232 
1233         pcie->phy = devm_phy_optional_get(dev, "pciephy");
1234         if (IS_ERR(pcie->phy)) {
1235                 ret = PTR_ERR(pcie->phy);
1236                 goto err_pm_runtime_put;
1237         }
1238 
1239         ret = pcie->ops->get_resources(pcie);
1240         if (ret)
1241                 goto err_pm_runtime_put;
1242 
1243         pp->ops = &qcom_pcie_dw_ops;
1244 
1245         if (IS_ENABLED(CONFIG_PCI_MSI)) {
1246                 pp->msi_irq = platform_get_irq_byname(pdev, "msi");
1247                 if (pp->msi_irq < 0) {
1248                         ret = pp->msi_irq;
1249                         goto err_pm_runtime_put;
1250                 }
1251         }
1252 
1253         ret = phy_init(pcie->phy);
1254         if (ret) {
1255                 pm_runtime_disable(&pdev->dev);
1256                 goto err_pm_runtime_put;
1257         }
1258 
1259         platform_set_drvdata(pdev, pcie);
1260 
1261         ret = dw_pcie_host_init(pp);
1262         if (ret) {
1263                 dev_err(dev, "cannot initialize host\n");
1264                 pm_runtime_disable(&pdev->dev);
1265                 goto err_pm_runtime_put;
1266         }
1267 
1268         return 0;
1269 
1270 err_pm_runtime_put:
1271         pm_runtime_put(dev);
1272         pm_runtime_disable(dev);
1273 
1274         return ret;
1275 }
1276 
1277 static const struct of_device_id qcom_pcie_match[] = {
1278         { .compatible = "qcom,pcie-apq8084", .data = &ops_1_0_0 },
1279         { .compatible = "qcom,pcie-ipq8064", .data = &ops_2_1_0 },
1280         { .compatible = "qcom,pcie-apq8064", .data = &ops_2_1_0 },
1281         { .compatible = "qcom,pcie-msm8996", .data = &ops_2_3_2 },
1282         { .compatible = "qcom,pcie-ipq8074", .data = &ops_2_3_3 },
1283         { .compatible = "qcom,pcie-ipq4019", .data = &ops_2_4_0 },
1284         { .compatible = "qcom,pcie-qcs404", .data = &ops_2_4_0 },
1285         { }
1286 };
1287 
1288 static void qcom_fixup_class(struct pci_dev *dev)
1289 {
1290         dev->class = PCI_CLASS_BRIDGE_PCI << 8;
1291 }
1292 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x0101, qcom_fixup_class);
1293 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x0104, qcom_fixup_class);
1294 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x0106, qcom_fixup_class);
1295 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x0107, qcom_fixup_class);
1296 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x0302, qcom_fixup_class);
1297 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x1000, qcom_fixup_class);
1298 DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_QCOM, 0x1001, qcom_fixup_class);
1299 
1300 static struct platform_driver qcom_pcie_driver = {
1301         .probe = qcom_pcie_probe,
1302         .driver = {
1303                 .name = "qcom-pcie",
1304                 .suppress_bind_attrs = true,
1305                 .of_match_table = qcom_pcie_match,
1306         },
1307 };
1308 builtin_platform_driver(qcom_pcie_driver);

/* [<][>][^][v][top][bottom][index][help] */