On Thu, Jul 18, 2013 at 04:48:41PM +0530, Sourav Poddar wrote:Just some more findings on this, after wlen bits are transferred we need an WC interrupt.yeah. Say you have wlen = 8 but the transfer length is 8 bytes (64hmm..got this point. Yes, my mistake, here I agree if wlen is not 8 bits+static void qspi_write_msg(struct ti_qspi *qspi, struct spi_transfer *t)you always increment by each byte. Here, if you used writel(), you wrote
+{
+ const u8 *txbuf;
+ int wlen, count;
+
+ count = t->len;
+ txbuf = t->tx_buf;
+ wlen = t->bits_per_word;
+
+ while (count--) {
+ dev_dbg(qspi->dev, "tx cmd %08x dc %08x data %02x\n",
+ qspi->cmd | QSPI_WR_SNGL, qspi->dc, *txbuf);
+ ti_qspi_writel_data(qspi, *txbuf++, QSPI_SPI_DATA_REG, wlen);
4 bytes and should increment txbuf by 4.
txbuf++ is not valid.
Same goes for read_data(),Do you mean 4 words of 8 bits?
below. Another thing. Even though your wlen might be 8 bits, if you
write 4 bytes to write, you can save a few CPU cycles by using writel().
bits). If you use writeb(), you will do 8 writes, if you use writel()
you'll do 2 writes.
right on. To make sure this will execute a little faster (you never knowYes, just derive this formulae with 8 bits per word in mind.+static int ti_qspi_start_transfer_one(struct spi_master *master,this calculation doesn't look correct.
+ struct spi_message *m)
+{
+ struct ti_qspi *qspi = spi_master_get_devdata(master);
+ struct spi_device *spi = m->spi;
+ struct spi_transfer *t;
+ int status = 0, ret;
+ int frame_length;
+
+ /* setup device control reg */
+ qspi->dc = 0;
+
+ if (spi->mode& SPI_CPHA)
+ qspi->dc |= QSPI_CKPHA(spi->chip_select);
+ if (spi->mode& SPI_CPOL)
+ qspi->dc |= QSPI_CKPOL(spi->chip_select);
+ if (spi->mode& SPI_CS_HIGH)
+ qspi->dc |= QSPI_CSPOL(spi->chip_select);
+
+ frame_length = DIV_ROUND_UP(m->frame_length * spi->bits_per_word,
+ spi->bits_per_word);
(m->frame_length * spi->bits_per_word) /
spi->bits_per_word = m->frame_length
What are you trying to achieve here ? frame_length should be counted in
words right ? And we get that value in bytes. So what's the best
calculation to convert bytes into words ? If you have 8 bits_per_word
you don't need any calculation, but if you have 32 bits_per_word, you
_do_ need something.
Will change.
It should be (m->frame_length * 8) / spi->bits_per_word
what several different versions of GCC will do), instead of multiplying
by 8, left shift by 3.
alright, make that clear in your commit log.How will you achieve the number you want ? (hint: 1 byte == 8 bits)After bootup, I checked for deive detting enumerated as /proc/mtd.
And btw, all of these mistakes pretty much tell me that this driver
hasn't been tested. How have you tested this driver ?
After which I am using mtdutils(erase, dump and write utilied to
check for the communication with the flash device.)