Merge branch 'spi/next' of git://git.secretlab.ca/git/linux-2.6
* 'spi/next' of git://git.secretlab.ca/git/linux-2.6: (34 commits) spi/dw_spi: move dw_spi.h into drivers/spi spi/dw_spi: Fix missing header gpio/langwell: Clear edge bit before handling gpio/langwell: Simplify demux loop gpio/langwell: Convert irq name space gpio/langwell: Fix broken irq_eoi change. gpio; Make Intel chipset gpio drivers depend on x86 gpio/cs5535-gpio: Fix section mismatch spi/rtc-{ds1390,ds3234,m41t94}: Use spi_get_drvdata() for SPI devices spi/davinci: Support DMA transfers larger than 65535 words spi/davinci: Use correct length parameter to dma_map_single calls gpio: Use __devexit at necessary places gpio: add MODULE_DEVICE_TABLE to pch_gpio and ml_ioh_gpio gpio/mcp23s08: support mcp23s17 variant of_mmc_spi: add card detect irq support spi/omap_mcspi: catch xfers of non-multiple SPI word size spi/omap_mcspi: Off-by-one error in finding the right divisor gpio/pca953x: Fix wrong pointer type spi/pl022: rid dangling labels spi: add support for SuperH SPI ...
This commit is contained in:
@@ -467,6 +467,9 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
rx_reg = base + OMAP2_MCSPI_RX0;
|
||||
chstat_reg = base + OMAP2_MCSPI_CHSTAT0;
|
||||
|
||||
if (c < (word_len>>3))
|
||||
return 0;
|
||||
|
||||
if (word_len <= 8) {
|
||||
u8 *rx;
|
||||
const u8 *tx;
|
||||
@@ -514,7 +517,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
dev_vdbg(&spi->dev, "read-%d %02x\n",
|
||||
word_len, *(rx - 1));
|
||||
}
|
||||
} while (c);
|
||||
} while (c > (word_len>>3));
|
||||
} else if (word_len <= 16) {
|
||||
u16 *rx;
|
||||
const u16 *tx;
|
||||
@@ -561,7 +564,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
dev_vdbg(&spi->dev, "read-%d %04x\n",
|
||||
word_len, *(rx - 1));
|
||||
}
|
||||
} while (c);
|
||||
} while (c > (word_len>>3));
|
||||
} else if (word_len <= 32) {
|
||||
u32 *rx;
|
||||
const u32 *tx;
|
||||
@@ -608,7 +611,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
|
||||
dev_vdbg(&spi->dev, "read-%d %08x\n",
|
||||
word_len, *(rx - 1));
|
||||
}
|
||||
} while (c);
|
||||
} while (c > (word_len>>3));
|
||||
}
|
||||
|
||||
/* for TX_ONLY mode, be sure all words have shifted out */
|
||||
@@ -631,6 +634,17 @@ out:
|
||||
return count - c;
|
||||
}
|
||||
|
||||
static u32 omap2_mcspi_calc_divisor(u32 speed_hz)
|
||||
{
|
||||
u32 div;
|
||||
|
||||
for (div = 0; div < 15; div++)
|
||||
if (speed_hz >= (OMAP2_MCSPI_MAX_FREQ >> div))
|
||||
return div;
|
||||
|
||||
return 15;
|
||||
}
|
||||
|
||||
/* called only when no transfer is active to this device */
|
||||
static int omap2_mcspi_setup_transfer(struct spi_device *spi,
|
||||
struct spi_transfer *t)
|
||||
@@ -653,12 +667,8 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi,
|
||||
if (t && t->speed_hz)
|
||||
speed_hz = t->speed_hz;
|
||||
|
||||
if (speed_hz) {
|
||||
while (div <= 15 && (OMAP2_MCSPI_MAX_FREQ / (1 << div))
|
||||
> speed_hz)
|
||||
div++;
|
||||
} else
|
||||
div = 15;
|
||||
speed_hz = min_t(u32, speed_hz, OMAP2_MCSPI_MAX_FREQ);
|
||||
div = omap2_mcspi_calc_divisor(speed_hz);
|
||||
|
||||
l = mcspi_cached_chconf0(spi);
|
||||
|
||||
@@ -695,7 +705,7 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi,
|
||||
mcspi_write_chconf0(spi, l);
|
||||
|
||||
dev_dbg(&spi->dev, "setup: speed %d, sample %s edge, clk %s\n",
|
||||
OMAP2_MCSPI_MAX_FREQ / (1 << div),
|
||||
OMAP2_MCSPI_MAX_FREQ >> div,
|
||||
(spi->mode & SPI_CPHA) ? "trailing" : "leading",
|
||||
(spi->mode & SPI_CPOL) ? "inverted" : "normal");
|
||||
|
||||
@@ -996,10 +1006,10 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
|
||||
t->bits_per_word);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (t->speed_hz && t->speed_hz < OMAP2_MCSPI_MAX_FREQ/(1<<16)) {
|
||||
dev_dbg(&spi->dev, "%d Hz max exceeds %d\n",
|
||||
t->speed_hz,
|
||||
OMAP2_MCSPI_MAX_FREQ/(1<<16));
|
||||
if (t->speed_hz && t->speed_hz < (OMAP2_MCSPI_MAX_FREQ >> 15)) {
|
||||
dev_dbg(&spi->dev, "speed_hz %d below minimum %d Hz\n",
|
||||
t->speed_hz,
|
||||
OMAP2_MCSPI_MAX_FREQ >> 15);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user