Commit 3918c21e authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'spi-fix-v4.19-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Mark writes:
  "spi: Fixes for v4.19

  As well as one driver fix there's a couple of fixes here which address
  issues with the use of IDRs for allocation of dynamic bus numbers,
  ensuring that dynamic bus numbers interact well with static bus numbers
  assigned via DT and otherwise."

* tag 'spi-fix-v4.19-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: spi-fsl-dspi: fix broken DSPI_EOQ_MODE
  spi: Fix double IDR allocation with DT aliases
  spi: fix IDR collision on systems with both fixed and dynamic SPI bus numbers
parents ad3273d5 5223c9c1
...@@ -30,7 +30,11 @@ ...@@ -30,7 +30,11 @@
#define DRIVER_NAME "fsl-dspi" #define DRIVER_NAME "fsl-dspi"
#ifdef CONFIG_M5441x
#define DSPI_FIFO_SIZE 16
#else
#define DSPI_FIFO_SIZE 4 #define DSPI_FIFO_SIZE 4
#endif
#define DSPI_DMA_BUFSIZE (DSPI_FIFO_SIZE * 1024) #define DSPI_DMA_BUFSIZE (DSPI_FIFO_SIZE * 1024)
#define SPI_MCR 0x00 #define SPI_MCR 0x00
...@@ -623,9 +627,11 @@ static void dspi_tcfq_read(struct fsl_dspi *dspi) ...@@ -623,9 +627,11 @@ static void dspi_tcfq_read(struct fsl_dspi *dspi)
static void dspi_eoq_write(struct fsl_dspi *dspi) static void dspi_eoq_write(struct fsl_dspi *dspi)
{ {
int fifo_size = DSPI_FIFO_SIZE; int fifo_size = DSPI_FIFO_SIZE;
u16 xfer_cmd = dspi->tx_cmd;
/* Fill TX FIFO with as many transfers as possible */ /* Fill TX FIFO with as many transfers as possible */
while (dspi->len && fifo_size--) { while (dspi->len && fifo_size--) {
dspi->tx_cmd = xfer_cmd;
/* Request EOQF for last transfer in FIFO */ /* Request EOQF for last transfer in FIFO */
if (dspi->len == dspi->bytes_per_word || fifo_size == 0) if (dspi->len == dspi->bytes_per_word || fifo_size == 0)
dspi->tx_cmd |= SPI_PUSHR_CMD_EOQ; dspi->tx_cmd |= SPI_PUSHR_CMD_EOQ;
......
...@@ -2143,8 +2143,17 @@ int spi_register_controller(struct spi_controller *ctlr) ...@@ -2143,8 +2143,17 @@ int spi_register_controller(struct spi_controller *ctlr)
*/ */
if (ctlr->num_chipselect == 0) if (ctlr->num_chipselect == 0)
return -EINVAL; return -EINVAL;
/* allocate dynamic bus number using Linux idr */ if (ctlr->bus_num >= 0) {
if ((ctlr->bus_num < 0) && ctlr->dev.of_node) { /* devices with a fixed bus num must check-in with the num */
mutex_lock(&board_lock);
id = idr_alloc(&spi_master_idr, ctlr, ctlr->bus_num,
ctlr->bus_num + 1, GFP_KERNEL);
mutex_unlock(&board_lock);
if (WARN(id < 0, "couldn't get idr"))
return id == -ENOSPC ? -EBUSY : id;
ctlr->bus_num = id;
} else if (ctlr->dev.of_node) {
/* allocate dynamic bus number using Linux idr */
id = of_alias_get_id(ctlr->dev.of_node, "spi"); id = of_alias_get_id(ctlr->dev.of_node, "spi");
if (id >= 0) { if (id >= 0) {
ctlr->bus_num = id; ctlr->bus_num = id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment