Commit 190fc9d9 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'spi-v3.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi

Pull spi fixes from Mark Brown:
 "There's a couple of driver fixes here, plus one core fix for the DMA
  mapping which wasn't doing the right thing for vmalloc()ed addresses
  that hadn't been through kmap().  It's fairly rare to use vmalloc()
  with SPI and it's a subset of those users who might fail so it's
  unsurprising that this wasn't noticed sooner"

* tag 'spi-v3.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi:
  spi: sirf: fix word width configuration
  spi: Fix mapping from vmalloc-ed buffer to scatter list
  spi: dw: Fix dynamic speed change.
parents 0210bb60 ec058615
...@@ -376,9 +376,6 @@ static void pump_transfers(unsigned long data) ...@@ -376,9 +376,6 @@ static void pump_transfers(unsigned long data)
chip = dws->cur_chip; chip = dws->cur_chip;
spi = message->spi; spi = message->spi;
if (unlikely(!chip->clk_div))
chip->clk_div = dws->max_freq / chip->speed_hz;
if (message->state == ERROR_STATE) { if (message->state == ERROR_STATE) {
message->status = -EIO; message->status = -EIO;
goto early_exit; goto early_exit;
...@@ -419,7 +416,7 @@ static void pump_transfers(unsigned long data) ...@@ -419,7 +416,7 @@ static void pump_transfers(unsigned long data)
if (transfer->speed_hz) { if (transfer->speed_hz) {
speed = chip->speed_hz; speed = chip->speed_hz;
if (transfer->speed_hz != speed) { if ((transfer->speed_hz != speed) || (!chip->clk_div)) {
speed = transfer->speed_hz; speed = transfer->speed_hz;
/* clk_div doesn't support odd number */ /* clk_div doesn't support odd number */
...@@ -581,7 +578,6 @@ static int dw_spi_setup(struct spi_device *spi) ...@@ -581,7 +578,6 @@ static int dw_spi_setup(struct spi_device *spi)
dev_err(&spi->dev, "No max speed HZ parameter\n"); dev_err(&spi->dev, "No max speed HZ parameter\n");
return -EINVAL; return -EINVAL;
} }
chip->speed_hz = spi->max_speed_hz;
chip->tmode = 0; /* Tx & Rx */ chip->tmode = 0; /* Tx & Rx */
/* Default SPI mode is SCPOL = 0, SCPH = 0 */ /* Default SPI mode is SCPOL = 0, SCPH = 0 */
......
...@@ -562,9 +562,9 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t) ...@@ -562,9 +562,9 @@ spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
sspi->word_width = DIV_ROUND_UP(bits_per_word, 8); sspi->word_width = DIV_ROUND_UP(bits_per_word, 8);
txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) |
sspi->word_width; (sspi->word_width >> 1);
rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) |
sspi->word_width; (sspi->word_width >> 1);
if (!(spi->mode & SPI_CS_HIGH)) if (!(spi->mode & SPI_CS_HIGH))
regval |= SIRFSOC_SPI_CS_IDLE_STAT; regval |= SIRFSOC_SPI_CS_IDLE_STAT;
......
...@@ -615,13 +615,13 @@ static int spi_map_buf(struct spi_master *master, struct device *dev, ...@@ -615,13 +615,13 @@ static int spi_map_buf(struct spi_master *master, struct device *dev,
sg_free_table(sgt); sg_free_table(sgt);
return -ENOMEM; return -ENOMEM;
} }
sg_buf = page_address(vm_page) + sg_set_page(&sgt->sgl[i], vm_page,
((size_t)buf & ~PAGE_MASK); min, offset_in_page(buf));
} else { } else {
sg_buf = buf; sg_buf = buf;
sg_set_buf(&sgt->sgl[i], sg_buf, min);
} }
sg_set_buf(&sgt->sgl[i], sg_buf, min);
buf += min; buf += min;
len -= min; len -= min;
......
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