aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-10-31 14:54:11 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-10-31 14:54:11 -0400
commit0c183d92b20b5c84ca655b45ef57b3318b83eb9e (patch)
tree69ea493c665968b4cca9e43d3c7696b6f3242254
parent3f7b55b6b26dc89f58ede1ef5d0cec90816ccac6 (diff)
parent2fbef66e1407d1b13d181f7f5614a5897b452188 (diff)
Merge tag 'spi-fix-v4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown: "A few small fixes for SPI, one core fix that only applies in cases where we're handling DT overlays and a couple of driver specific fixes: - Fix handling of error cases when instantiating DT overlays so we don't end up just ignoring devices that encountered an error during instantiation. - Avoid reading uninitialized data when handing spurious interrupts in the espi driver. - A driver specific fix for the dspi driver to fix a bad interaction with u-boot" * tag 'spi-fix-v4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: spi: dspi: clear SPI_SR before enable interrupt spi: fsl-espi: avoid processing uninitalized data on error spi: mark device nodes only in case of successful instantiation
-rw-r--r--drivers/spi/spi-fsl-dspi.c7
-rw-r--r--drivers/spi/spi-fsl-espi.c2
-rw-r--r--drivers/spi/spi.c5
3 files changed, 12 insertions, 2 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 35c0dd945668..a67b0ff6a362 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -70,6 +70,7 @@
70#define SPI_SR 0x2c 70#define SPI_SR 0x2c
71#define SPI_SR_EOQF 0x10000000 71#define SPI_SR_EOQF 0x10000000
72#define SPI_SR_TCFQF 0x80000000 72#define SPI_SR_TCFQF 0x80000000
73#define SPI_SR_CLEAR 0xdaad0000
73 74
74#define SPI_RSER 0x30 75#define SPI_RSER 0x30
75#define SPI_RSER_EOQFE 0x10000000 76#define SPI_RSER_EOQFE 0x10000000
@@ -646,6 +647,11 @@ static const struct regmap_config dspi_regmap_config = {
646 .max_register = 0x88, 647 .max_register = 0x88,
647}; 648};
648 649
650static void dspi_init(struct fsl_dspi *dspi)
651{
652 regmap_write(dspi->regmap, SPI_SR, SPI_SR_CLEAR);
653}
654
649static int dspi_probe(struct platform_device *pdev) 655static int dspi_probe(struct platform_device *pdev)
650{ 656{
651 struct device_node *np = pdev->dev.of_node; 657 struct device_node *np = pdev->dev.of_node;
@@ -709,6 +715,7 @@ static int dspi_probe(struct platform_device *pdev)
709 return PTR_ERR(dspi->regmap); 715 return PTR_ERR(dspi->regmap);
710 } 716 }
711 717
718 dspi_init(dspi);
712 dspi->irq = platform_get_irq(pdev, 0); 719 dspi->irq = platform_get_irq(pdev, 0);
713 if (dspi->irq < 0) { 720 if (dspi->irq < 0) {
714 dev_err(&pdev->dev, "can't get platform irq\n"); 721 dev_err(&pdev->dev, "can't get platform irq\n");
diff --git a/drivers/spi/spi-fsl-espi.c b/drivers/spi/spi-fsl-espi.c
index 7451585a080e..2c175b9495f7 100644
--- a/drivers/spi/spi-fsl-espi.c
+++ b/drivers/spi/spi-fsl-espi.c
@@ -458,7 +458,7 @@ static void fsl_espi_cpu_irq(struct mpc8xxx_spi *mspi, u32 events)
458 458
459 mspi->len -= rx_nr_bytes; 459 mspi->len -= rx_nr_bytes;
460 460
461 if (mspi->rx) 461 if (rx_nr_bytes && mspi->rx)
462 mspi->get_rx(rx_data, mspi); 462 mspi->get_rx(rx_data, mspi);
463 } 463 }
464 464
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 5787b723b593..838783c3fed0 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -1618,9 +1618,11 @@ static void of_register_spi_devices(struct spi_master *master)
1618 if (of_node_test_and_set_flag(nc, OF_POPULATED)) 1618 if (of_node_test_and_set_flag(nc, OF_POPULATED))
1619 continue; 1619 continue;
1620 spi = of_register_spi_device(master, nc); 1620 spi = of_register_spi_device(master, nc);
1621 if (IS_ERR(spi)) 1621 if (IS_ERR(spi)) {
1622 dev_warn(&master->dev, "Failed to create SPI device for %s\n", 1622 dev_warn(&master->dev, "Failed to create SPI device for %s\n",
1623 nc->full_name); 1623 nc->full_name);
1624 of_node_clear_flag(nc, OF_POPULATED);
1625 }
1624 } 1626 }
1625} 1627}
1626#else 1628#else
@@ -3131,6 +3133,7 @@ static int of_spi_notify(struct notifier_block *nb, unsigned long action,
3131 if (IS_ERR(spi)) { 3133 if (IS_ERR(spi)) {
3132 pr_err("%s: failed to create for '%s'\n", 3134 pr_err("%s: failed to create for '%s'\n",
3133 __func__, rd->dn->full_name); 3135 __func__, rd->dn->full_name);
3136 of_node_clear_flag(rd->dn, OF_POPULATED);
3134 return notifier_from_errno(PTR_ERR(spi)); 3137 return notifier_from_errno(PTR_ERR(spi));
3135 } 3138 }
3136 break; 3139 break;