2021-02-22 11:45:42

by Kishon Vijay Abraham I

[permalink] [raw]
Subject: [PATCH v3 4/4] PCI: j721e: Add support to provide refclk to PCIe connector

Add support to provide refclk to PCIe connector.

Signed-off-by: Kishon Vijay Abraham I <[email protected]>
---
drivers/pci/controller/cadence/pci-j721e.c | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/cadence/pci-j721e.c b/drivers/pci/controller/cadence/pci-j721e.c
index dac1ac8a7615..f99af98ab7d1 100644
--- a/drivers/pci/controller/cadence/pci-j721e.c
+++ b/drivers/pci/controller/cadence/pci-j721e.c
@@ -6,6 +6,7 @@
* Author: Kishon Vijay Abraham I <[email protected]>
*/

+#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
#include <linux/io.h>
@@ -50,6 +51,7 @@ enum link_status {

struct j721e_pcie {
struct device *dev;
+ struct clk *refclk;
u32 mode;
u32 num_lanes;
struct cdns_pcie *cdns_pcie;
@@ -310,6 +312,7 @@ static int j721e_pcie_probe(struct platform_device *pdev)
struct cdns_pcie_ep *ep;
struct gpio_desc *gpiod;
void __iomem *base;
+ struct clk *clk;
u32 num_lanes;
u32 mode;
int ret;
@@ -408,6 +411,19 @@ static int j721e_pcie_probe(struct platform_device *pdev)
goto err_get_sync;
}

+ clk = devm_clk_get_optional(dev, "pcie_refclk");
+ if (IS_ERR(clk)) {
+ dev_err(dev, "failed to get pcie_refclk\n");
+ goto err_pcie_setup;
+ }
+
+ ret = clk_prepare_enable(clk);
+ if (ret) {
+ dev_err(dev, "failed to enable pcie_refclk\n");
+ goto err_get_sync;
+ }
+ pcie->refclk = clk;
+
/*
* "Power Sequencing and Reset Signal Timings" table in
* PCI EXPRESS CARD ELECTROMECHANICAL SPECIFICATION, REV. 3.0
@@ -422,8 +438,10 @@ static int j721e_pcie_probe(struct platform_device *pdev)
}

ret = cdns_pcie_host_setup(rc);
- if (ret < 0)
+ if (ret < 0) {
+ clk_disable_unprepare(pcie->refclk);
goto err_pcie_setup;
+ }

break;
case PCI_MODE_EP:
@@ -476,6 +494,7 @@ static int j721e_pcie_remove(struct platform_device *pdev)
struct cdns_pcie *cdns_pcie = pcie->cdns_pcie;
struct device *dev = &pdev->dev;

+ clk_disable_unprepare(pcie->refclk);
cdns_pcie_disable_phy(cdns_pcie);
pm_runtime_put(dev);
pm_runtime_disable(dev);
--
2.17.1


2021-02-23 09:14:28

by Dan Carpenter

[permalink] [raw]
Subject: Re: [PATCH v3 4/4] PCI: j721e: Add support to provide refclk to PCIe connector

Hi Kishon,

url: https://github.com/0day-ci/linux/commits/Kishon-Vijay-Abraham-I/AM64-Add-PCIe-bindings-and-driver-support/20210222-194422
base: https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: i386-randconfig-m021-20210222 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

smatch warnings:
drivers/pci/controller/cadence/pci-j721e.c:420 j721e_pcie_probe() warn: missing error code 'ret'

vim +/ret +420 drivers/pci/controller/cadence/pci-j721e.c

f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 305 static int j721e_pcie_probe(struct platform_device *pdev)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 306 {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 307 struct device *dev = &pdev->dev;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 308 struct device_node *node = dev->of_node;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 309 struct pci_host_bridge *bridge;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 310 struct j721e_pcie_data *data;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 311 struct cdns_pcie *cdns_pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 312 struct j721e_pcie *pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 313 struct cdns_pcie_rc *rc;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 314 struct cdns_pcie_ep *ep;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 315 struct gpio_desc *gpiod;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 316 void __iomem *base;
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 317 struct clk *clk;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 318 u32 num_lanes;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 319 u32 mode;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 320 int ret;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 321 int irq;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 322
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 323 data = (struct j721e_pcie_data *)of_device_get_match_data(dev);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 324 if (!data)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 325 return -EINVAL;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 326
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 327 mode = (u32)data->mode;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 328
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 329 pcie = devm_kzalloc(dev, sizeof(*pcie), GFP_KERNEL);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 330 if (!pcie)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 331 return -ENOMEM;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 332
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 333 pcie->dev = dev;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 334 pcie->mode = mode;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 335
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 336 base = devm_platform_ioremap_resource_byname(pdev, "intd_cfg");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 337 if (IS_ERR(base))
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 338 return PTR_ERR(base);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 339 pcie->intd_cfg_base = base;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 340
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 341 base = devm_platform_ioremap_resource_byname(pdev, "user_cfg");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 342 if (IS_ERR(base))
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 343 return PTR_ERR(base);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 344 pcie->user_cfg_base = base;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 345
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 346 ret = of_property_read_u32(node, "num-lanes", &num_lanes);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 347 if (ret || num_lanes > MAX_LANES)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 348 num_lanes = 1;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 349 pcie->num_lanes = num_lanes;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 350
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 351 if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48)))
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 352 return -EINVAL;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 353
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 354 irq = platform_get_irq_byname(pdev, "link_state");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 355 if (irq < 0)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 356 return irq;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 357
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 358 dev_set_drvdata(dev, pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 359 pm_runtime_enable(dev);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 360 ret = pm_runtime_get_sync(dev);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 361 if (ret < 0) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 362 dev_err(dev, "pm_runtime_get_sync failed\n");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 363 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 364 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 365
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 366 ret = j721e_pcie_ctrl_init(pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 367 if (ret < 0) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 368 dev_err(dev, "pm_runtime_get_sync failed\n");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 369 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 370 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 371
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 372 ret = devm_request_irq(dev, irq, j721e_pcie_link_irq_handler, 0,
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 373 "j721e-pcie-link-down-irq", pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 374 if (ret < 0) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 375 dev_err(dev, "failed to request link state IRQ %d\n", irq);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 376 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 377 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 378
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 379 j721e_pcie_config_link_irq(pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 380
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 381 switch (mode) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 382 case PCI_MODE_RC:
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 383 if (!IS_ENABLED(CONFIG_PCIE_CADENCE_HOST)) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 384 ret = -ENODEV;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 385 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 386 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 387
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 388 bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rc));
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 389 if (!bridge) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 390 ret = -ENOMEM;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 391 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 392 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 393
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 394 bridge->ops = &cdns_ti_pcie_host_ops;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 395 rc = pci_host_bridge_priv(bridge);
4740b969aaf58a Nadeem Athani 2021-02-09 396 rc->quirk_retrain_flag = data->quirk_retrain_flag;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 397
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 398 cdns_pcie = &rc->pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 399 cdns_pcie->dev = dev;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 400 cdns_pcie->ops = &j721e_pcie_ops;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 401 pcie->cdns_pcie = cdns_pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 402
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 403 gpiod = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 404 if (IS_ERR(gpiod)) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 405 ret = PTR_ERR(gpiod);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 406 if (ret != -EPROBE_DEFER)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 407 dev_err(dev, "Failed to get reset GPIO\n");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 408 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 409 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 410
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 411 ret = cdns_pcie_init_phy(dev, cdns_pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 412 if (ret) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 413 dev_err(dev, "Failed to init phy\n");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 414 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 415 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 416
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 417 clk = devm_clk_get_optional(dev, "pcie_refclk");
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 418 if (IS_ERR(clk)) {
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 419 dev_err(dev, "failed to get pcie_refclk\n");
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 @420 goto err_pcie_setup;

ret = PTR_ERR(clk)

c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 421 }
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 422
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 423 ret = clk_prepare_enable(clk);
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 424 if (ret) {
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 425 dev_err(dev, "failed to enable pcie_refclk\n");
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 426 goto err_get_sync;
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 427 }
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 428 pcie->refclk = clk;
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 429
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 430 /*
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 431 * "Power Sequencing and Reset Signal Timings" table in
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 432 * PCI EXPRESS CARD ELECTROMECHANICAL SPECIFICATION, REV. 3.0
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 433 * indicates PERST# should be deasserted after minimum of 100us
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 434 * once REFCLK is stable. The REFCLK to the connector in RC
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 435 * mode is selected while enabling the PHY. So deassert PERST#
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 436 * after 100 us.
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 437 */
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 438 if (gpiod) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 439 usleep_range(100, 200);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 440 gpiod_set_value_cansleep(gpiod, 1);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 441 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 442
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 443 ret = cdns_pcie_host_setup(rc);
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 444 if (ret < 0) {
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 445 clk_disable_unprepare(pcie->refclk);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 446 goto err_pcie_setup;
c77817a9fba361 Kishon Vijay Abraham I 2021-02-22 447 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 448
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 449 break;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 450 case PCI_MODE_EP:
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 451 if (!IS_ENABLED(CONFIG_PCIE_CADENCE_EP)) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 452 ret = -ENODEV;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 453 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 454 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 455
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 456 ep = devm_kzalloc(dev, sizeof(*ep), GFP_KERNEL);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 457 if (!ep) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 458 ret = -ENOMEM;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 459 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 460 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 461
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 462 cdns_pcie = &ep->pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 463 cdns_pcie->dev = dev;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 464 cdns_pcie->ops = &j721e_pcie_ops;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 465 pcie->cdns_pcie = cdns_pcie;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 466
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 467 ret = cdns_pcie_init_phy(dev, cdns_pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 468 if (ret) {
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 469 dev_err(dev, "Failed to init phy\n");
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 470 goto err_get_sync;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 471 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 472
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 473 ret = cdns_pcie_ep_setup(ep);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 474 if (ret < 0)
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 475 goto err_pcie_setup;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 476
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 477 break;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 478 default:
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 479 dev_err(dev, "INVALID device type %d\n", mode);

Should this be an error path as well?

f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 480 }
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 481
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 482 return 0;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 483
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 484 err_pcie_setup:
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 485 cdns_pcie_disable_phy(cdns_pcie);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 486
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 487 err_get_sync:
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 488 pm_runtime_put(dev);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 489 pm_runtime_disable(dev);
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 490
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 491 return ret;
f3e25911a430ed Kishon Vijay Abraham I 2020-07-22 492 }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (15.25 kB)
.config.gz (40.69 kB)
Download all attachments