Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.6-rc2 606 lines 15 kB view raw
1/* 2 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. 3 * Copyright 2015 Linaro Limited. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 and 7 * only version 2 as published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 */ 14 15#include <linux/clk.h> 16#include <linux/delay.h> 17#include <linux/gpio.h> 18#include <linux/interrupt.h> 19#include <linux/io.h> 20#include <linux/iopoll.h> 21#include <linux/kernel.h> 22#include <linux/module.h> 23#include <linux/of_device.h> 24#include <linux/of_gpio.h> 25#include <linux/pci.h> 26#include <linux/platform_device.h> 27#include <linux/phy/phy.h> 28#include <linux/regulator/consumer.h> 29#include <linux/reset.h> 30#include <linux/slab.h> 31#include <linux/types.h> 32 33#include "pcie-designware.h" 34 35#define PCIE20_PARF_PHY_CTRL 0x40 36#define PCIE20_PARF_PHY_REFCLK 0x4C 37#define PCIE20_PARF_DBI_BASE_ADDR 0x168 38#define PCIE20_PARF_SLV_ADDR_SPACE_SIZE 0x16c 39#define PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT 0x178 40 41#define PCIE20_ELBI_SYS_CTRL 0x04 42#define PCIE20_ELBI_SYS_CTRL_LT_ENABLE BIT(0) 43 44#define PCIE20_CAP 0x70 45 46#define PERST_DELAY_US 1000 47 48struct qcom_pcie_resources_v0 { 49 struct clk *iface_clk; 50 struct clk *core_clk; 51 struct clk *phy_clk; 52 struct reset_control *pci_reset; 53 struct reset_control *axi_reset; 54 struct reset_control *ahb_reset; 55 struct reset_control *por_reset; 56 struct reset_control *phy_reset; 57 struct regulator *vdda; 58 struct regulator *vdda_phy; 59 struct regulator *vdda_refclk; 60}; 61 62struct qcom_pcie_resources_v1 { 63 struct clk *iface; 64 struct clk *aux; 65 struct clk *master_bus; 66 struct clk *slave_bus; 67 struct reset_control *core; 68 struct regulator *vdda; 69}; 70 71union qcom_pcie_resources { 72 struct qcom_pcie_resources_v0 v0; 73 struct qcom_pcie_resources_v1 v1; 74}; 75 76struct qcom_pcie; 77 78struct qcom_pcie_ops { 79 int (*get_resources)(struct qcom_pcie *pcie); 80 int (*init)(struct qcom_pcie *pcie); 81 void (*deinit)(struct qcom_pcie *pcie); 82}; 83 84struct qcom_pcie { 85 struct pcie_port pp; 86 struct device *dev; 87 union qcom_pcie_resources res; 88 void __iomem *parf; 89 void __iomem *dbi; 90 void __iomem *elbi; 91 struct phy *phy; 92 struct gpio_desc *reset; 93 struct qcom_pcie_ops *ops; 94}; 95 96#define to_qcom_pcie(x) container_of(x, struct qcom_pcie, pp) 97 98static void qcom_ep_reset_assert(struct qcom_pcie *pcie) 99{ 100 gpiod_set_value(pcie->reset, 1); 101 usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500); 102} 103 104static void qcom_ep_reset_deassert(struct qcom_pcie *pcie) 105{ 106 gpiod_set_value(pcie->reset, 0); 107 usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500); 108} 109 110static irqreturn_t qcom_pcie_msi_irq_handler(int irq, void *arg) 111{ 112 struct pcie_port *pp = arg; 113 114 return dw_handle_msi_irq(pp); 115} 116 117static int qcom_pcie_establish_link(struct qcom_pcie *pcie) 118{ 119 u32 val; 120 121 if (dw_pcie_link_up(&pcie->pp)) 122 return 0; 123 124 /* enable link training */ 125 val = readl(pcie->elbi + PCIE20_ELBI_SYS_CTRL); 126 val |= PCIE20_ELBI_SYS_CTRL_LT_ENABLE; 127 writel(val, pcie->elbi + PCIE20_ELBI_SYS_CTRL); 128 129 return dw_pcie_wait_for_link(&pcie->pp); 130} 131 132static int qcom_pcie_get_resources_v0(struct qcom_pcie *pcie) 133{ 134 struct qcom_pcie_resources_v0 *res = &pcie->res.v0; 135 struct device *dev = pcie->dev; 136 137 res->vdda = devm_regulator_get(dev, "vdda"); 138 if (IS_ERR(res->vdda)) 139 return PTR_ERR(res->vdda); 140 141 res->vdda_phy = devm_regulator_get(dev, "vdda_phy"); 142 if (IS_ERR(res->vdda_phy)) 143 return PTR_ERR(res->vdda_phy); 144 145 res->vdda_refclk = devm_regulator_get(dev, "vdda_refclk"); 146 if (IS_ERR(res->vdda_refclk)) 147 return PTR_ERR(res->vdda_refclk); 148 149 res->iface_clk = devm_clk_get(dev, "iface"); 150 if (IS_ERR(res->iface_clk)) 151 return PTR_ERR(res->iface_clk); 152 153 res->core_clk = devm_clk_get(dev, "core"); 154 if (IS_ERR(res->core_clk)) 155 return PTR_ERR(res->core_clk); 156 157 res->phy_clk = devm_clk_get(dev, "phy"); 158 if (IS_ERR(res->phy_clk)) 159 return PTR_ERR(res->phy_clk); 160 161 res->pci_reset = devm_reset_control_get(dev, "pci"); 162 if (IS_ERR(res->pci_reset)) 163 return PTR_ERR(res->pci_reset); 164 165 res->axi_reset = devm_reset_control_get(dev, "axi"); 166 if (IS_ERR(res->axi_reset)) 167 return PTR_ERR(res->axi_reset); 168 169 res->ahb_reset = devm_reset_control_get(dev, "ahb"); 170 if (IS_ERR(res->ahb_reset)) 171 return PTR_ERR(res->ahb_reset); 172 173 res->por_reset = devm_reset_control_get(dev, "por"); 174 if (IS_ERR(res->por_reset)) 175 return PTR_ERR(res->por_reset); 176 177 res->phy_reset = devm_reset_control_get(dev, "phy"); 178 if (IS_ERR(res->phy_reset)) 179 return PTR_ERR(res->phy_reset); 180 181 return 0; 182} 183 184static int qcom_pcie_get_resources_v1(struct qcom_pcie *pcie) 185{ 186 struct qcom_pcie_resources_v1 *res = &pcie->res.v1; 187 struct device *dev = pcie->dev; 188 189 res->vdda = devm_regulator_get(dev, "vdda"); 190 if (IS_ERR(res->vdda)) 191 return PTR_ERR(res->vdda); 192 193 res->iface = devm_clk_get(dev, "iface"); 194 if (IS_ERR(res->iface)) 195 return PTR_ERR(res->iface); 196 197 res->aux = devm_clk_get(dev, "aux"); 198 if (IS_ERR(res->aux)) 199 return PTR_ERR(res->aux); 200 201 res->master_bus = devm_clk_get(dev, "master_bus"); 202 if (IS_ERR(res->master_bus)) 203 return PTR_ERR(res->master_bus); 204 205 res->slave_bus = devm_clk_get(dev, "slave_bus"); 206 if (IS_ERR(res->slave_bus)) 207 return PTR_ERR(res->slave_bus); 208 209 res->core = devm_reset_control_get(dev, "core"); 210 if (IS_ERR(res->core)) 211 return PTR_ERR(res->core); 212 213 return 0; 214} 215 216static void qcom_pcie_deinit_v0(struct qcom_pcie *pcie) 217{ 218 struct qcom_pcie_resources_v0 *res = &pcie->res.v0; 219 220 reset_control_assert(res->pci_reset); 221 reset_control_assert(res->axi_reset); 222 reset_control_assert(res->ahb_reset); 223 reset_control_assert(res->por_reset); 224 reset_control_assert(res->pci_reset); 225 clk_disable_unprepare(res->iface_clk); 226 clk_disable_unprepare(res->core_clk); 227 clk_disable_unprepare(res->phy_clk); 228 regulator_disable(res->vdda); 229 regulator_disable(res->vdda_phy); 230 regulator_disable(res->vdda_refclk); 231} 232 233static int qcom_pcie_init_v0(struct qcom_pcie *pcie) 234{ 235 struct qcom_pcie_resources_v0 *res = &pcie->res.v0; 236 struct device *dev = pcie->dev; 237 u32 val; 238 int ret; 239 240 ret = regulator_enable(res->vdda); 241 if (ret) { 242 dev_err(dev, "cannot enable vdda regulator\n"); 243 return ret; 244 } 245 246 ret = regulator_enable(res->vdda_refclk); 247 if (ret) { 248 dev_err(dev, "cannot enable vdda_refclk regulator\n"); 249 goto err_refclk; 250 } 251 252 ret = regulator_enable(res->vdda_phy); 253 if (ret) { 254 dev_err(dev, "cannot enable vdda_phy regulator\n"); 255 goto err_vdda_phy; 256 } 257 258 ret = reset_control_assert(res->ahb_reset); 259 if (ret) { 260 dev_err(dev, "cannot assert ahb reset\n"); 261 goto err_assert_ahb; 262 } 263 264 ret = clk_prepare_enable(res->iface_clk); 265 if (ret) { 266 dev_err(dev, "cannot prepare/enable iface clock\n"); 267 goto err_assert_ahb; 268 } 269 270 ret = clk_prepare_enable(res->phy_clk); 271 if (ret) { 272 dev_err(dev, "cannot prepare/enable phy clock\n"); 273 goto err_clk_phy; 274 } 275 276 ret = clk_prepare_enable(res->core_clk); 277 if (ret) { 278 dev_err(dev, "cannot prepare/enable core clock\n"); 279 goto err_clk_core; 280 } 281 282 ret = reset_control_deassert(res->ahb_reset); 283 if (ret) { 284 dev_err(dev, "cannot deassert ahb reset\n"); 285 goto err_deassert_ahb; 286 } 287 288 /* enable PCIe clocks and resets */ 289 val = readl(pcie->parf + PCIE20_PARF_PHY_CTRL); 290 val &= ~BIT(0); 291 writel(val, pcie->parf + PCIE20_PARF_PHY_CTRL); 292 293 /* enable external reference clock */ 294 val = readl(pcie->parf + PCIE20_PARF_PHY_REFCLK); 295 val |= BIT(16); 296 writel(val, pcie->parf + PCIE20_PARF_PHY_REFCLK); 297 298 ret = reset_control_deassert(res->phy_reset); 299 if (ret) { 300 dev_err(dev, "cannot deassert phy reset\n"); 301 return ret; 302 } 303 304 ret = reset_control_deassert(res->pci_reset); 305 if (ret) { 306 dev_err(dev, "cannot deassert pci reset\n"); 307 return ret; 308 } 309 310 ret = reset_control_deassert(res->por_reset); 311 if (ret) { 312 dev_err(dev, "cannot deassert por reset\n"); 313 return ret; 314 } 315 316 ret = reset_control_deassert(res->axi_reset); 317 if (ret) { 318 dev_err(dev, "cannot deassert axi reset\n"); 319 return ret; 320 } 321 322 /* wait for clock acquisition */ 323 usleep_range(1000, 1500); 324 325 return 0; 326 327err_deassert_ahb: 328 clk_disable_unprepare(res->core_clk); 329err_clk_core: 330 clk_disable_unprepare(res->phy_clk); 331err_clk_phy: 332 clk_disable_unprepare(res->iface_clk); 333err_assert_ahb: 334 regulator_disable(res->vdda_phy); 335err_vdda_phy: 336 regulator_disable(res->vdda_refclk); 337err_refclk: 338 regulator_disable(res->vdda); 339 340 return ret; 341} 342 343static void qcom_pcie_deinit_v1(struct qcom_pcie *pcie) 344{ 345 struct qcom_pcie_resources_v1 *res = &pcie->res.v1; 346 347 reset_control_assert(res->core); 348 clk_disable_unprepare(res->slave_bus); 349 clk_disable_unprepare(res->master_bus); 350 clk_disable_unprepare(res->iface); 351 clk_disable_unprepare(res->aux); 352 regulator_disable(res->vdda); 353} 354 355static int qcom_pcie_init_v1(struct qcom_pcie *pcie) 356{ 357 struct qcom_pcie_resources_v1 *res = &pcie->res.v1; 358 struct device *dev = pcie->dev; 359 int ret; 360 361 ret = reset_control_deassert(res->core); 362 if (ret) { 363 dev_err(dev, "cannot deassert core reset\n"); 364 return ret; 365 } 366 367 ret = clk_prepare_enable(res->aux); 368 if (ret) { 369 dev_err(dev, "cannot prepare/enable aux clock\n"); 370 goto err_res; 371 } 372 373 ret = clk_prepare_enable(res->iface); 374 if (ret) { 375 dev_err(dev, "cannot prepare/enable iface clock\n"); 376 goto err_aux; 377 } 378 379 ret = clk_prepare_enable(res->master_bus); 380 if (ret) { 381 dev_err(dev, "cannot prepare/enable master_bus clock\n"); 382 goto err_iface; 383 } 384 385 ret = clk_prepare_enable(res->slave_bus); 386 if (ret) { 387 dev_err(dev, "cannot prepare/enable slave_bus clock\n"); 388 goto err_master; 389 } 390 391 ret = regulator_enable(res->vdda); 392 if (ret) { 393 dev_err(dev, "cannot enable vdda regulator\n"); 394 goto err_slave; 395 } 396 397 /* change DBI base address */ 398 writel(0, pcie->parf + PCIE20_PARF_DBI_BASE_ADDR); 399 400 if (IS_ENABLED(CONFIG_PCI_MSI)) { 401 u32 val = readl(pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); 402 403 val |= BIT(31); 404 writel(val, pcie->parf + PCIE20_PARF_AXI_MSTR_WR_ADDR_HALT); 405 } 406 407 return 0; 408err_slave: 409 clk_disable_unprepare(res->slave_bus); 410err_master: 411 clk_disable_unprepare(res->master_bus); 412err_iface: 413 clk_disable_unprepare(res->iface); 414err_aux: 415 clk_disable_unprepare(res->aux); 416err_res: 417 reset_control_assert(res->core); 418 419 return ret; 420} 421 422static int qcom_pcie_link_up(struct pcie_port *pp) 423{ 424 struct qcom_pcie *pcie = to_qcom_pcie(pp); 425 u16 val = readw(pcie->dbi + PCIE20_CAP + PCI_EXP_LNKSTA); 426 427 return !!(val & PCI_EXP_LNKSTA_DLLLA); 428} 429 430static void qcom_pcie_host_init(struct pcie_port *pp) 431{ 432 struct qcom_pcie *pcie = to_qcom_pcie(pp); 433 int ret; 434 435 qcom_ep_reset_assert(pcie); 436 437 ret = pcie->ops->init(pcie); 438 if (ret) 439 goto err_deinit; 440 441 ret = phy_power_on(pcie->phy); 442 if (ret) 443 goto err_deinit; 444 445 dw_pcie_setup_rc(pp); 446 447 if (IS_ENABLED(CONFIG_PCI_MSI)) 448 dw_pcie_msi_init(pp); 449 450 qcom_ep_reset_deassert(pcie); 451 452 ret = qcom_pcie_establish_link(pcie); 453 if (ret) 454 goto err; 455 456 return; 457err: 458 qcom_ep_reset_assert(pcie); 459 phy_power_off(pcie->phy); 460err_deinit: 461 pcie->ops->deinit(pcie); 462} 463 464static int qcom_pcie_rd_own_conf(struct pcie_port *pp, int where, int size, 465 u32 *val) 466{ 467 /* the device class is not reported correctly from the register */ 468 if (where == PCI_CLASS_REVISION && size == 4) { 469 *val = readl(pp->dbi_base + PCI_CLASS_REVISION); 470 *val &= 0xff; /* keep revision id */ 471 *val |= PCI_CLASS_BRIDGE_PCI << 16; 472 return PCIBIOS_SUCCESSFUL; 473 } 474 475 return dw_pcie_cfg_read(pp->dbi_base + where, size, val); 476} 477 478static struct pcie_host_ops qcom_pcie_dw_ops = { 479 .link_up = qcom_pcie_link_up, 480 .host_init = qcom_pcie_host_init, 481 .rd_own_conf = qcom_pcie_rd_own_conf, 482}; 483 484static const struct qcom_pcie_ops ops_v0 = { 485 .get_resources = qcom_pcie_get_resources_v0, 486 .init = qcom_pcie_init_v0, 487 .deinit = qcom_pcie_deinit_v0, 488}; 489 490static const struct qcom_pcie_ops ops_v1 = { 491 .get_resources = qcom_pcie_get_resources_v1, 492 .init = qcom_pcie_init_v1, 493 .deinit = qcom_pcie_deinit_v1, 494}; 495 496static int qcom_pcie_probe(struct platform_device *pdev) 497{ 498 struct device *dev = &pdev->dev; 499 struct resource *res; 500 struct qcom_pcie *pcie; 501 struct pcie_port *pp; 502 int ret; 503 504 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL); 505 if (!pcie) 506 return -ENOMEM; 507 508 pcie->ops = (struct qcom_pcie_ops *)of_device_get_match_data(dev); 509 pcie->dev = dev; 510 511 pcie->reset = devm_gpiod_get_optional(dev, "perst", GPIOD_OUT_LOW); 512 if (IS_ERR(pcie->reset)) 513 return PTR_ERR(pcie->reset); 514 515 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "parf"); 516 pcie->parf = devm_ioremap_resource(dev, res); 517 if (IS_ERR(pcie->parf)) 518 return PTR_ERR(pcie->parf); 519 520 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dbi"); 521 pcie->dbi = devm_ioremap_resource(dev, res); 522 if (IS_ERR(pcie->dbi)) 523 return PTR_ERR(pcie->dbi); 524 525 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "elbi"); 526 pcie->elbi = devm_ioremap_resource(dev, res); 527 if (IS_ERR(pcie->elbi)) 528 return PTR_ERR(pcie->elbi); 529 530 pcie->phy = devm_phy_optional_get(dev, "pciephy"); 531 if (IS_ERR(pcie->phy)) 532 return PTR_ERR(pcie->phy); 533 534 ret = pcie->ops->get_resources(pcie); 535 if (ret) 536 return ret; 537 538 pp = &pcie->pp; 539 pp->dev = dev; 540 pp->dbi_base = pcie->dbi; 541 pp->root_bus_nr = -1; 542 pp->ops = &qcom_pcie_dw_ops; 543 544 if (IS_ENABLED(CONFIG_PCI_MSI)) { 545 pp->msi_irq = platform_get_irq_byname(pdev, "msi"); 546 if (pp->msi_irq < 0) 547 return pp->msi_irq; 548 549 ret = devm_request_irq(dev, pp->msi_irq, 550 qcom_pcie_msi_irq_handler, 551 IRQF_SHARED, "qcom-pcie-msi", pp); 552 if (ret) { 553 dev_err(dev, "cannot request msi irq\n"); 554 return ret; 555 } 556 } 557 558 ret = phy_init(pcie->phy); 559 if (ret) 560 return ret; 561 562 ret = dw_pcie_host_init(pp); 563 if (ret) { 564 dev_err(dev, "cannot initialize host\n"); 565 return ret; 566 } 567 568 platform_set_drvdata(pdev, pcie); 569 570 return 0; 571} 572 573static int qcom_pcie_remove(struct platform_device *pdev) 574{ 575 struct qcom_pcie *pcie = platform_get_drvdata(pdev); 576 577 qcom_ep_reset_assert(pcie); 578 phy_power_off(pcie->phy); 579 phy_exit(pcie->phy); 580 pcie->ops->deinit(pcie); 581 582 return 0; 583} 584 585static const struct of_device_id qcom_pcie_match[] = { 586 { .compatible = "qcom,pcie-ipq8064", .data = &ops_v0 }, 587 { .compatible = "qcom,pcie-apq8064", .data = &ops_v0 }, 588 { .compatible = "qcom,pcie-apq8084", .data = &ops_v1 }, 589 { } 590}; 591MODULE_DEVICE_TABLE(of, qcom_pcie_match); 592 593static struct platform_driver qcom_pcie_driver = { 594 .probe = qcom_pcie_probe, 595 .remove = qcom_pcie_remove, 596 .driver = { 597 .name = "qcom-pcie", 598 .of_match_table = qcom_pcie_match, 599 }, 600}; 601 602module_platform_driver(qcom_pcie_driver); 603 604MODULE_AUTHOR("Stanimir Varbanov <svarbanov@mm-sol.com>"); 605MODULE_DESCRIPTION("Qualcomm PCIe root complex driver"); 606MODULE_LICENSE("GPL v2");