aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-ti-qspi.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/drivers/spi/spi-ti-qspi.c b/drivers/spi/spi-ti-qspi.c
index 0b71270fbf67..1211b663c814 100644
--- a/drivers/spi/spi-ti-qspi.c
+++ b/drivers/spi/spi-ti-qspi.c
@@ -46,6 +46,8 @@ struct ti_qspi {
46 46
47 struct spi_master *master; 47 struct spi_master *master;
48 void __iomem *base; 48 void __iomem *base;
49 void __iomem *ctrl_base;
50 void __iomem *mmap_base;
49 struct clk *fclk; 51 struct clk *fclk;
50 struct device *dev; 52 struct device *dev;
51 53
@@ -54,6 +56,8 @@ struct ti_qspi {
54 u32 spi_max_frequency; 56 u32 spi_max_frequency;
55 u32 cmd; 57 u32 cmd;
56 u32 dc; 58 u32 dc;
59
60 bool ctrl_mod;
57}; 61};
58 62
59#define QSPI_PID (0x0) 63#define QSPI_PID (0x0)
@@ -437,7 +441,7 @@ static int ti_qspi_probe(struct platform_device *pdev)
437{ 441{
438 struct ti_qspi *qspi; 442 struct ti_qspi *qspi;
439 struct spi_master *master; 443 struct spi_master *master;
440 struct resource *r; 444 struct resource *r, *res_ctrl, *res_mmap;
441 struct device_node *np = pdev->dev.of_node; 445 struct device_node *np = pdev->dev.of_node;
442 u32 max_freq; 446 u32 max_freq;
443 int ret = 0, num_cs, irq; 447 int ret = 0, num_cs, irq;
@@ -465,7 +469,35 @@ static int ti_qspi_probe(struct platform_device *pdev)
465 qspi->master = master; 469 qspi->master = master;
466 qspi->dev = &pdev->dev; 470 qspi->dev = &pdev->dev;
467 471
468 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 472 r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "qspi_base");
473 if (r == NULL) {
474 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
475 if (r == NULL) {
476 dev_err(&pdev->dev, "missing platform data\n");
477 return -ENODEV;
478 }
479 }
480
481 res_mmap = platform_get_resource_byname(pdev,
482 IORESOURCE_MEM, "qspi_mmap");
483 if (res_mmap == NULL) {
484 res_mmap = platform_get_resource(pdev, IORESOURCE_MEM, 1);
485 if (res_mmap == NULL) {
486 dev_err(&pdev->dev,
487 "memory mapped resource not required\n");
488 return -ENODEV;
489 }
490 }
491
492 res_ctrl = platform_get_resource_byname(pdev,
493 IORESOURCE_MEM, "qspi_ctrlmod");
494 if (res_ctrl == NULL) {
495 res_ctrl = platform_get_resource(pdev, IORESOURCE_MEM, 2);
496 if (res_ctrl == NULL) {
497 dev_dbg(&pdev->dev,
498 "control module resources not required\n");
499 }
500 }
469 501
470 irq = platform_get_irq(pdev, 0); 502 irq = platform_get_irq(pdev, 0);
471 if (irq < 0) { 503 if (irq < 0) {
@@ -481,6 +513,23 @@ static int ti_qspi_probe(struct platform_device *pdev)
481 goto free_master; 513 goto free_master;
482 } 514 }
483 515
516 if (res_ctrl) {
517 qspi->ctrl_mod = true;
518 qspi->ctrl_base = devm_ioremap_resource(&pdev->dev, res_ctrl);
519 if (IS_ERR(qspi->ctrl_base)) {
520 ret = PTR_ERR(qspi->ctrl_base);
521 goto free_master;
522 }
523 }
524
525 if (res_mmap) {
526 qspi->mmap_base = devm_ioremap_resource(&pdev->dev, res_mmap);
527 if (IS_ERR(qspi->mmap_base)) {
528 ret = PTR_ERR(qspi->mmap_base);
529 goto free_master;
530 }
531 }
532
484 ret = devm_request_irq(&pdev->dev, irq, ti_qspi_isr, 0, 533 ret = devm_request_irq(&pdev->dev, irq, ti_qspi_isr, 0,
485 dev_name(&pdev->dev), qspi); 534 dev_name(&pdev->dev), qspi);
486 if (ret < 0) { 535 if (ret < 0) {