diff options
| author | Sourav Poddar <sourav.poddar@ti.com> | 2013-12-06 09:24:43 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2013-12-19 08:33:43 -0500 |
| commit | 6b3938aed04587dab42f9df83122a40c596f495a (patch) | |
| tree | 5ced50df6e0cf1c74be125702d78902e4169a1de | |
| parent | 6ce4eac1f600b34f2f7f58f9cd8f0503d79e42ae (diff) | |
spi/qspi: parse register by name.
Modify the qspi driver to parse reg information by name.
If "reg names" is not found, then revert back to normal
get resource.
Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
| -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) { |
