diff options
-rw-r--r-- | drivers/spi/spi-ti-qspi.c | 53 |
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) { |