diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-19 13:10:43 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-12-19 13:10:43 -0500 |
commit | 3c73a2dda9e6b4ee3d836d0b80090bf63feae3c3 (patch) | |
tree | e80aa215fbd665c743ecc87ff66a57be19881042 | |
parent | d525c13e9efb92c9868b90bfc637d186d0aaaccb (diff) | |
parent | c1f4a149406ce41962c6ba7d92047563f9e26e0b (diff) |
Merge tag 'spi-fix-v4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi fixes from Mark Brown:
"A couple of reference counting bugs here, one in spidev and one with
holding an extra reference in the core that we never freed if we
removed a device, plus a driver specific fix. Both of the refcounting
bugs are very old but they've only been found by observation so
hopefully their impact has been low"
* tag 'spi-fix-v4.4-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
spi: fix parent-device reference leak
spi: spidev: Hold spi_lock over all defererences of spi in release()
spi-fsl-dspi: Fix CTAR Register access
-rw-r--r-- | drivers/spi/spi-fsl-dspi.c | 12 | ||||
-rw-r--r-- | drivers/spi/spi.c | 2 | ||||
-rw-r--r-- | drivers/spi/spidev.c | 2 |
3 files changed, 8 insertions, 8 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 59a11437db70..39412c9097c6 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c | |||
@@ -167,7 +167,7 @@ static inline int is_double_byte_mode(struct fsl_dspi *dspi) | |||
167 | { | 167 | { |
168 | unsigned int val; | 168 | unsigned int val; |
169 | 169 | ||
170 | regmap_read(dspi->regmap, SPI_CTAR(dspi->cs), &val); | 170 | regmap_read(dspi->regmap, SPI_CTAR(0), &val); |
171 | 171 | ||
172 | return ((val & SPI_FRAME_BITS_MASK) == SPI_FRAME_BITS(8)) ? 0 : 1; | 172 | return ((val & SPI_FRAME_BITS_MASK) == SPI_FRAME_BITS(8)) ? 0 : 1; |
173 | } | 173 | } |
@@ -257,7 +257,7 @@ static u32 dspi_data_to_pushr(struct fsl_dspi *dspi, int tx_word) | |||
257 | 257 | ||
258 | return SPI_PUSHR_TXDATA(d16) | | 258 | return SPI_PUSHR_TXDATA(d16) | |
259 | SPI_PUSHR_PCS(dspi->cs) | | 259 | SPI_PUSHR_PCS(dspi->cs) | |
260 | SPI_PUSHR_CTAS(dspi->cs) | | 260 | SPI_PUSHR_CTAS(0) | |
261 | SPI_PUSHR_CONT; | 261 | SPI_PUSHR_CONT; |
262 | } | 262 | } |
263 | 263 | ||
@@ -290,7 +290,7 @@ static int dspi_eoq_write(struct fsl_dspi *dspi) | |||
290 | */ | 290 | */ |
291 | if (tx_word && (dspi->len == 1)) { | 291 | if (tx_word && (dspi->len == 1)) { |
292 | dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; | 292 | dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; |
293 | regmap_update_bits(dspi->regmap, SPI_CTAR(dspi->cs), | 293 | regmap_update_bits(dspi->regmap, SPI_CTAR(0), |
294 | SPI_FRAME_BITS_MASK, SPI_FRAME_BITS(8)); | 294 | SPI_FRAME_BITS_MASK, SPI_FRAME_BITS(8)); |
295 | tx_word = 0; | 295 | tx_word = 0; |
296 | } | 296 | } |
@@ -339,7 +339,7 @@ static int dspi_tcfq_write(struct fsl_dspi *dspi) | |||
339 | 339 | ||
340 | if (tx_word && (dspi->len == 1)) { | 340 | if (tx_word && (dspi->len == 1)) { |
341 | dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; | 341 | dspi->dataflags |= TRAN_STATE_WORD_ODD_NUM; |
342 | regmap_update_bits(dspi->regmap, SPI_CTAR(dspi->cs), | 342 | regmap_update_bits(dspi->regmap, SPI_CTAR(0), |
343 | SPI_FRAME_BITS_MASK, SPI_FRAME_BITS(8)); | 343 | SPI_FRAME_BITS_MASK, SPI_FRAME_BITS(8)); |
344 | tx_word = 0; | 344 | tx_word = 0; |
345 | } | 345 | } |
@@ -407,7 +407,7 @@ static int dspi_transfer_one_message(struct spi_master *master, | |||
407 | regmap_update_bits(dspi->regmap, SPI_MCR, | 407 | regmap_update_bits(dspi->regmap, SPI_MCR, |
408 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, | 408 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF, |
409 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); | 409 | SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF); |
410 | regmap_write(dspi->regmap, SPI_CTAR(dspi->cs), | 410 | regmap_write(dspi->regmap, SPI_CTAR(0), |
411 | dspi->cur_chip->ctar_val); | 411 | dspi->cur_chip->ctar_val); |
412 | 412 | ||
413 | trans_mode = dspi->devtype_data->trans_mode; | 413 | trans_mode = dspi->devtype_data->trans_mode; |
@@ -566,7 +566,7 @@ static irqreturn_t dspi_interrupt(int irq, void *dev_id) | |||
566 | if (!dspi->len) { | 566 | if (!dspi->len) { |
567 | if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) { | 567 | if (dspi->dataflags & TRAN_STATE_WORD_ODD_NUM) { |
568 | regmap_update_bits(dspi->regmap, | 568 | regmap_update_bits(dspi->regmap, |
569 | SPI_CTAR(dspi->cs), | 569 | SPI_CTAR(0), |
570 | SPI_FRAME_BITS_MASK, | 570 | SPI_FRAME_BITS_MASK, |
571 | SPI_FRAME_BITS(16)); | 571 | SPI_FRAME_BITS(16)); |
572 | dspi->dataflags &= ~TRAN_STATE_WORD_ODD_NUM; | 572 | dspi->dataflags &= ~TRAN_STATE_WORD_ODD_NUM; |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 2b0a8ec3affb..dee1cb87d24f 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -1705,7 +1705,7 @@ struct spi_master *spi_alloc_master(struct device *dev, unsigned size) | |||
1705 | master->bus_num = -1; | 1705 | master->bus_num = -1; |
1706 | master->num_chipselect = 1; | 1706 | master->num_chipselect = 1; |
1707 | master->dev.class = &spi_master_class; | 1707 | master->dev.class = &spi_master_class; |
1708 | master->dev.parent = get_device(dev); | 1708 | master->dev.parent = dev; |
1709 | spi_master_set_devdata(master, &master[1]); | 1709 | spi_master_set_devdata(master, &master[1]); |
1710 | 1710 | ||
1711 | return master; | 1711 | return master; |
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 91a0fcd72423..d0e7dfc647cf 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c | |||
@@ -651,11 +651,11 @@ static int spidev_release(struct inode *inode, struct file *filp) | |||
651 | kfree(spidev->rx_buffer); | 651 | kfree(spidev->rx_buffer); |
652 | spidev->rx_buffer = NULL; | 652 | spidev->rx_buffer = NULL; |
653 | 653 | ||
654 | spin_lock_irq(&spidev->spi_lock); | ||
654 | if (spidev->spi) | 655 | if (spidev->spi) |
655 | spidev->speed_hz = spidev->spi->max_speed_hz; | 656 | spidev->speed_hz = spidev->spi->max_speed_hz; |
656 | 657 | ||
657 | /* ... after we unbound from the underlying device? */ | 658 | /* ... after we unbound from the underlying device? */ |
658 | spin_lock_irq(&spidev->spi_lock); | ||
659 | dofree = (spidev->spi == NULL); | 659 | dofree = (spidev->spi == NULL); |
660 | spin_unlock_irq(&spidev->spi_lock); | 660 | spin_unlock_irq(&spidev->spi_lock); |
661 | 661 | ||