Merge branch 'spi-4.17' into spi-4.18 for the merge window
authorMark Brown <broonie@kernel.org>
Mon, 4 Jun 2018 10:51:12 +0000 (11:51 +0100)
committerMark Brown <broonie@kernel.org>
Mon, 4 Jun 2018 10:51:12 +0000 (11:51 +0100)
1  2 
drivers/spi/spi-bcm-qspi.c
drivers/spi/spi-cadence.c
drivers/spi/spi-sh-msiof.c

@@@ -30,7 -30,6 +30,7 @@@
  #include <linux/platform_device.h>
  #include <linux/slab.h>
  #include <linux/spi/spi.h>
 +#include <linux/spi/spi-mem.h>
  #include <linux/sysfs.h>
  #include <linux/types.h>
  #include "spi-bcm-qspi.h"
@@@ -216,10 -215,10 +216,10 @@@ struct bcm_qspi 
        int bspi_maj_rev;
        int bspi_min_rev;
        int bspi_enabled;
 -      struct spi_flash_read_message *bspi_rf_msg;
 -      u32 bspi_rf_msg_idx;
 -      u32 bspi_rf_msg_len;
 -      u32 bspi_rf_msg_status;
 +      const struct spi_mem_op *bspi_rf_op;
 +      u32 bspi_rf_op_idx;
 +      u32 bspi_rf_op_len;
 +      u32 bspi_rf_op_status;
        struct bcm_xfer_mode xfer_mode;
        u32 s3_strap_override_ctrl;
        bool bspi_mode;
@@@ -314,26 -313,26 +314,26 @@@ static inline void bcm_qspi_bspi_lr_cle
  
  static void bcm_qspi_bspi_lr_data_read(struct bcm_qspi *qspi)
  {
 -      u32 *buf = (u32 *)qspi->bspi_rf_msg->buf;
 +      u32 *buf = (u32 *)qspi->bspi_rf_op->data.buf.in;
        u32 data = 0;
  
 -      dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_msg,
 -              qspi->bspi_rf_msg->buf, qspi->bspi_rf_msg_len);
 +      dev_dbg(&qspi->pdev->dev, "xfer %p rx %p rxlen %d\n", qspi->bspi_rf_op,
 +              qspi->bspi_rf_op->data.buf.in, qspi->bspi_rf_op_len);
        while (!bcm_qspi_bspi_lr_is_fifo_empty(qspi)) {
                data = bcm_qspi_bspi_lr_read_fifo(qspi);
 -              if (likely(qspi->bspi_rf_msg_len >= 4) &&
 +              if (likely(qspi->bspi_rf_op_len >= 4) &&
                    IS_ALIGNED((uintptr_t)buf, 4)) {
 -                      buf[qspi->bspi_rf_msg_idx++] = data;
 -                      qspi->bspi_rf_msg_len -= 4;
 +                      buf[qspi->bspi_rf_op_idx++] = data;
 +                      qspi->bspi_rf_op_len -= 4;
                } else {
                        /* Read out remaining bytes, make sure*/
 -                      u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_msg_idx];
 +                      u8 *cbuf = (u8 *)&buf[qspi->bspi_rf_op_idx];
  
                        data = cpu_to_le32(data);
 -                      while (qspi->bspi_rf_msg_len) {
 +                      while (qspi->bspi_rf_op_len) {
                                *cbuf++ = (u8)data;
                                data >>= 8;
 -                              qspi->bspi_rf_msg_len--;
 +                              qspi->bspi_rf_op_len--;
                        }
                }
        }
@@@ -350,12 -349,14 +350,12 @@@ static void bcm_qspi_bspi_set_xfer_para
  }
  
  static int bcm_qspi_bspi_set_flex_mode(struct bcm_qspi *qspi,
 -                                     struct spi_flash_read_message *msg,
 -                                     int hp)
 +                                     const struct spi_mem_op *op, int hp)
  {
        int bpc = 0, bpp = 0;
 -      u8 command = msg->read_opcode;
 -      int width  = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
 -      int addrlen = msg->addr_width;
 -      int addr_nbits = msg->addr_nbits ? msg->addr_nbits : SPI_NBITS_SINGLE;
 +      u8 command = op->cmd.opcode;
 +      int width  = op->cmd.buswidth ? op->cmd.buswidth : SPI_NBITS_SINGLE;
 +      int addrlen = op->addr.nbytes * 8;
        int flex_mode = 1;
  
        dev_dbg(&qspi->pdev->dev, "set flex mode w %x addrlen %x hp %d\n",
        if (addrlen == BSPI_ADDRLEN_4BYTES)
                bpp = BSPI_BPP_ADDR_SELECT_MASK;
  
 -      bpp |= msg->dummy_bytes * (8/addr_nbits);
 +      bpp |= (op->dummy.nbytes * 8) / op->dummy.buswidth;
  
        switch (width) {
        case SPI_NBITS_SINGLE:
  }
  
  static int bcm_qspi_bspi_set_override(struct bcm_qspi *qspi,
 -                                    struct spi_flash_read_message *msg,
 -                                    int hp)
 +                                    const struct spi_mem_op *op, int hp)
  {
 -      int width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
 -      int addrlen = msg->addr_width;
 +      int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE;
 +      int addrlen = op->addr.nbytes;
        u32 data = bcm_qspi_read(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL);
  
        dev_dbg(&qspi->pdev->dev, "set override mode w %x addrlen %x hp %d\n",
        /* set the override mode */
        data |= BSPI_STRAP_OVERRIDE_CTRL_OVERRIDE;
        bcm_qspi_write(qspi, BSPI, BSPI_STRAP_OVERRIDE_CTRL, data);
 -      bcm_qspi_bspi_set_xfer_params(qspi, msg->read_opcode, 0, 0, 0);
 +      bcm_qspi_bspi_set_xfer_params(qspi, op->cmd.opcode, 0, 0, 0);
  
        return 0;
  }
  
  static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
 -                                struct spi_flash_read_message *msg, int hp)
 +                                const struct spi_mem_op *op, int hp)
  {
        int error = 0;
 -      int width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE;
 -      int addrlen = msg->addr_width;
 +      int width = op->data.buswidth ? op->data.buswidth : SPI_NBITS_SINGLE;
 +      int addrlen = op->addr.nbytes;
  
        /* default mode */
        qspi->xfer_mode.flex_mode = true;
                if (val & mask || qspi->s3_strap_override_ctrl & mask) {
                        qspi->xfer_mode.flex_mode = false;
                        bcm_qspi_write(qspi, BSPI, BSPI_FLEX_MODE_ENABLE, 0);
 -                      error = bcm_qspi_bspi_set_override(qspi, msg, hp);
 +                      error = bcm_qspi_bspi_set_override(qspi, op, hp);
                }
        }
  
        if (qspi->xfer_mode.flex_mode)
 -              error = bcm_qspi_bspi_set_flex_mode(qspi, msg, hp);
 +              error = bcm_qspi_bspi_set_flex_mode(qspi, op, hp);
  
        if (error) {
                dev_warn(&qspi->pdev->dev,
  
  static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
  {
-       if (!has_bspi(qspi) || (qspi->bspi_enabled))
+       if (!has_bspi(qspi))
                return;
  
        qspi->bspi_enabled = 1;
  
  static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
  {
-       if (!has_bspi(qspi) || (!qspi->bspi_enabled))
+       if (!has_bspi(qspi))
                return;
  
        qspi->bspi_enabled = 0;
  
  static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
  {
-       u32 data = 0;
+       u32 rd = 0;
+       u32 wr = 0;
  
-       if (qspi->curr_cs == cs)
-               return;
        if (qspi->base[CHIP_SELECT]) {
-               data = bcm_qspi_read(qspi, CHIP_SELECT, 0);
-               data = (data & ~0xff) | (1 << cs);
-               bcm_qspi_write(qspi, CHIP_SELECT, 0, data);
+               rd = bcm_qspi_read(qspi, CHIP_SELECT, 0);
+               wr = (rd & ~0xff) | (1 << cs);
+               if (rd == wr)
+                       return;
+               bcm_qspi_write(qspi, CHIP_SELECT, 0, wr);
                usleep_range(10, 20);
        }
+       dev_dbg(&qspi->pdev->dev, "using cs:%d\n", cs);
        qspi->curr_cs = cs;
  }
  
@@@ -753,8 -758,13 +756,13 @@@ static int write_to_hw(struct bcm_qspi 
                        dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
                }
                mspi_cdram = MSPI_CDRAM_CONT_BIT;
-               mspi_cdram |= (~(1 << spi->chip_select) &
-                              MSPI_CDRAM_PCS);
+               if (has_bspi(qspi))
+                       mspi_cdram &= ~1;
+               else
+                       mspi_cdram |= (~(1 << spi->chip_select) &
+                                      MSPI_CDRAM_PCS);
                mspi_cdram |= ((tp.trans->bits_per_word <= 8) ? 0 :
                                MSPI_CDRAM_BITSE_BIT);
  
@@@ -792,20 -802,19 +800,20 @@@ done
        return slot;
  }
  
 -static int bcm_qspi_bspi_flash_read(struct spi_device *spi,
 -                                  struct spi_flash_read_message *msg)
 +static int bcm_qspi_bspi_exec_mem_op(struct spi_device *spi,
 +                                   const struct spi_mem_op *op)
  {
        struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
 -      u32 addr = 0, len, rdlen, len_words;
 +      u32 addr = 0, len, rdlen, len_words, from = 0;
        int ret = 0;
        unsigned long timeo = msecs_to_jiffies(100);
        struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
  
        if (bcm_qspi_bspi_ver_three(qspi))
 -              if (msg->addr_width == BSPI_ADDRLEN_4BYTES)
 +              if (op->addr.nbytes == BSPI_ADDRLEN_4BYTES)
                        return -EIO;
  
 +      from = op->addr.val;
        bcm_qspi_chip_select(qspi, spi->chip_select);
        bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0);
  
         * the upper address byte to bspi
         */
        if (bcm_qspi_bspi_ver_three(qspi) == false) {
 -              addr = msg->from & 0xff000000;
 +              addr = from & 0xff000000;
                bcm_qspi_write(qspi, BSPI,
                               BSPI_BSPI_FLASH_UPPER_ADDR_BYTE, addr);
        }
  
        if (!qspi->xfer_mode.flex_mode)
 -              addr = msg->from;
 +              addr = from;
        else
 -              addr = msg->from & 0x00ffffff;
 +              addr = from & 0x00ffffff;
  
        if (bcm_qspi_bspi_ver_three(qspi) == true)
                addr = (addr + 0xc00000) & 0xffffff;
         * read into the entire buffer by breaking the reads
         * into RAF buffer read lengths
         */
 -      len = msg->len;
 -      qspi->bspi_rf_msg_idx = 0;
 +      len = op->data.nbytes;
 +      qspi->bspi_rf_op_idx = 0;
  
        do {
                if (len > BSPI_READ_LENGTH)
                reinit_completion(&qspi->bspi_done);
                bcm_qspi_enable_bspi(qspi);
                len_words = (rdlen + 3) >> 2;
 -              qspi->bspi_rf_msg = msg;
 -              qspi->bspi_rf_msg_status = 0;
 -              qspi->bspi_rf_msg_len = rdlen;
 +              qspi->bspi_rf_op = op;
 +              qspi->bspi_rf_op_status = 0;
 +              qspi->bspi_rf_op_len = rdlen;
                dev_dbg(&qspi->pdev->dev,
                        "bspi xfr addr 0x%x len 0x%x", addr, rdlen);
                bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr);
                }
  
                /* set msg return length */
 -              msg->retlen += rdlen;
                addr += rdlen;
                len -= rdlen;
        } while (len);
@@@ -904,63 -914,61 +912,63 @@@ static int bcm_qspi_transfer_one(struc
        return 0;
  }
  
 -static int bcm_qspi_mspi_flash_read(struct spi_device *spi,
 -                                  struct spi_flash_read_message *msg)
 +static int bcm_qspi_mspi_exec_mem_op(struct spi_device *spi,
 +                                   const struct spi_mem_op *op)
  {
 -      struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
 +      struct spi_master *master = spi->master;
 +      struct bcm_qspi *qspi = spi_master_get_devdata(master);
        struct spi_transfer t[2];
 -      u8 cmd[6];
 -      int ret;
 +      u8 cmd[6] = { };
 +      int ret, i;
  
        memset(cmd, 0, sizeof(cmd));
        memset(t, 0, sizeof(t));
  
        /* tx */
        /* opcode is in cmd[0] */
 -      cmd[0] = msg->read_opcode;
 -      cmd[1] = msg->from >> (msg->addr_width * 8 -  8);
 -      cmd[2] = msg->from >> (msg->addr_width * 8 - 16);
 -      cmd[3] = msg->from >> (msg->addr_width * 8 - 24);
 -      cmd[4] = msg->from >> (msg->addr_width * 8 - 32);
 +      cmd[0] = op->cmd.opcode;
 +      for (i = 0; i < op->addr.nbytes; i++)
 +              cmd[1 + i] = op->addr.val >> (8 * (op->addr.nbytes - i - 1));
 +
        t[0].tx_buf = cmd;
 -      t[0].len = msg->addr_width + msg->dummy_bytes + 1;
 +      t[0].len = op->addr.nbytes + op->dummy.nbytes + 1;
        t[0].bits_per_word = spi->bits_per_word;
 -      t[0].tx_nbits = msg->opcode_nbits;
 +      t[0].tx_nbits = op->cmd.buswidth;
        /* lets mspi know that this is not last transfer */
        qspi->trans_pos.mspi_last_trans = false;
 -      ret = bcm_qspi_transfer_one(spi->master, spi, &t[0]);
 +      ret = bcm_qspi_transfer_one(master, spi, &t[0]);
  
        /* rx */
        qspi->trans_pos.mspi_last_trans = true;
        if (!ret) {
                /* rx */
 -              t[1].rx_buf = msg->buf;
 -              t[1].len = msg->len;
 -              t[1].rx_nbits =  msg->data_nbits;
 +              t[1].rx_buf = op->data.buf.in;
 +              t[1].len = op->data.nbytes;
 +              t[1].rx_nbits =  op->data.buswidth;
                t[1].bits_per_word = spi->bits_per_word;
 -              ret = bcm_qspi_transfer_one(spi->master, spi, &t[1]);
 +              ret = bcm_qspi_transfer_one(master, spi, &t[1]);
        }
  
 -      if (!ret)
 -              msg->retlen = msg->len;
 -
        return ret;
  }
  
 -static int bcm_qspi_flash_read(struct spi_device *spi,
 -                             struct spi_flash_read_message *msg)
 +static int bcm_qspi_exec_mem_op(struct spi_mem *mem,
 +                              const struct spi_mem_op *op)
  {
 +      struct spi_device *spi = mem->spi;
        struct bcm_qspi *qspi = spi_master_get_devdata(spi->master);
        int ret = 0;
        bool mspi_read = false;
 -      u32 addr, len;
 +      u32 addr = 0, len;
        u_char *buf;
  
 -      buf = msg->buf;
 -      addr = msg->from;
 -      len = msg->len;
 +      if (!op->data.nbytes || !op->addr.nbytes || op->addr.nbytes > 4 ||
 +          op->data.dir != SPI_MEM_DATA_IN)
 +              return -ENOTSUPP;
 +
 +      buf = op->data.buf.in;
 +      addr = op->addr.val;
 +      len = op->data.nbytes;
  
        if (bcm_qspi_bspi_ver_three(qspi) == true) {
                /*
                mspi_read = true;
  
        if (mspi_read)
 -              return bcm_qspi_mspi_flash_read(spi, msg);
 +              return bcm_qspi_mspi_exec_mem_op(spi, op);
  
 -      ret = bcm_qspi_bspi_set_mode(qspi, msg, -1);
 +      ret = bcm_qspi_bspi_set_mode(qspi, op, -1);
  
        if (!ret)
 -              ret = bcm_qspi_bspi_flash_read(spi, msg);
 +              ret = bcm_qspi_bspi_exec_mem_op(spi, op);
  
        return ret;
  }
@@@ -1026,10 -1034,10 +1034,10 @@@ static irqreturn_t bcm_qspi_bspi_lr_l2_
        struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
        u32 status = qspi_dev_id->irqp->mask;
  
 -      if (qspi->bspi_enabled && qspi->bspi_rf_msg) {
 +      if (qspi->bspi_enabled && qspi->bspi_rf_op) {
                bcm_qspi_bspi_lr_data_read(qspi);
 -              if (qspi->bspi_rf_msg_len == 0) {
 -                      qspi->bspi_rf_msg = NULL;
 +              if (qspi->bspi_rf_op_len == 0) {
 +                      qspi->bspi_rf_op = NULL;
                        if (qspi->soc_intc) {
                                /* disable soc BSPI interrupt */
                                soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE,
                                status = INTR_BSPI_LR_SESSION_DONE_MASK;
                        }
  
 -                      if (qspi->bspi_rf_msg_status)
 +                      if (qspi->bspi_rf_op_status)
                                bcm_qspi_bspi_lr_clear(qspi);
                        else
                                bcm_qspi_bspi_flush_prefetch_buffers(qspi);
        }
  
        status &= INTR_BSPI_LR_SESSION_DONE_MASK;
 -      if (qspi->bspi_enabled && status && qspi->bspi_rf_msg_len == 0)
 +      if (qspi->bspi_enabled && status && qspi->bspi_rf_op_len == 0)
                complete(&qspi->bspi_done);
  
        return IRQ_HANDLED;
@@@ -1063,7 -1071,7 +1071,7 @@@ static irqreturn_t bcm_qspi_bspi_lr_err
        struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc;
  
        dev_err(&qspi->pdev->dev, "BSPI INT error\n");
 -      qspi->bspi_rf_msg_status = -EIO;
 +      qspi->bspi_rf_op_status = -EIO;
        if (qspi->soc_intc)
                /* clear soc interrupt */
                soc_intc->bcm_qspi_int_ack(soc_intc, BSPI_ERR);
@@@ -1186,10 -1194,6 +1194,10 @@@ static void bcm_qspi_hw_uninit(struct b
  
  }
  
 +static const struct spi_controller_mem_ops bcm_qspi_mem_ops = {
 +      .exec_op = bcm_qspi_exec_mem_op,
 +};
 +
  static const struct of_device_id bcm_qspi_of_match[] = {
        { .compatible = "brcm,spi-bcm-qspi" },
        {},
@@@ -1232,7 -1236,7 +1240,7 @@@ int bcm_qspi_probe(struct platform_devi
        master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_RX_DUAL | SPI_RX_QUAD;
        master->setup = bcm_qspi_setup;
        master->transfer_one = bcm_qspi_transfer_one;
 -      master->spi_flash_read = bcm_qspi_flash_read;
 +      master->mem_ops = &bcm_qspi_mem_ops;
        master->cleanup = bcm_qspi_cleanup;
        master->dev.of_node = dev->of_node;
        master->num_chipselect = NUM_CHIPSELECT;
@@@ -313,6 -313,14 +313,14 @@@ static void cdns_spi_fill_tx_fifo(struc
  
        while ((trans_cnt < CDNS_SPI_FIFO_DEPTH) &&
               (xspi->tx_bytes > 0)) {
+               /* When xspi in busy condition, bytes may send failed,
+                * then spi control did't work thoroughly, add one byte delay
+                */
+               if (cdns_spi_read(xspi, CDNS_SPI_ISR) &
+                   CDNS_SPI_IXR_TXFULL)
+                       usleep_range(10, 20);
                if (xspi->txbuf)
                        cdns_spi_write(xspi, CDNS_SPI_TXD, *xspi->txbuf++);
                else
@@@ -686,7 -694,8 +694,7 @@@ static int cdns_spi_remove(struct platf
   */
  static int __maybe_unused cdns_spi_suspend(struct device *dev)
  {
 -      struct platform_device *pdev = to_platform_device(dev);
 -      struct spi_master *master = platform_get_drvdata(pdev);
 +      struct spi_master *master = dev_get_drvdata(dev);
  
        return spi_master_suspend(master);
  }
   */
  static int __maybe_unused cdns_spi_resume(struct device *dev)
  {
 -      struct platform_device *pdev = to_platform_device(dev);
 -      struct spi_master *master = platform_get_drvdata(pdev);
 +      struct spi_master *master = dev_get_drvdata(dev);
        struct cdns_spi *xspi = spi_master_get_devdata(master);
  
        cdns_spi_init_hw(xspi);
@@@ -39,7 -39,7 +39,7 @@@ struct sh_msiof_chipdata 
        u16 tx_fifo_size;
        u16 rx_fifo_size;
        u16 master_flags;
 -      u16 min_div;
 +      u16 min_div_pow;
  };
  
  struct sh_msiof_spi_priv {
@@@ -51,7 -51,7 +51,7 @@@
        struct completion done;
        unsigned int tx_fifo_size;
        unsigned int rx_fifo_size;
 -      unsigned int min_div;
 +      unsigned int min_div_pow;
        void *tx_dma_page;
        void *rx_dma_page;
        dma_addr_t tx_dma_addr;
@@@ -249,46 -249,43 +249,46 @@@ static irqreturn_t sh_msiof_spi_irq(in
        return IRQ_HANDLED;
  }
  
 -static struct {
 -      unsigned short div;
 -      unsigned short brdv;
 -} const sh_msiof_spi_div_table[] = {
 -      { 1,    SCR_BRDV_DIV_1 },
 -      { 2,    SCR_BRDV_DIV_2 },
 -      { 4,    SCR_BRDV_DIV_4 },
 -      { 8,    SCR_BRDV_DIV_8 },
 -      { 16,   SCR_BRDV_DIV_16 },
 -      { 32,   SCR_BRDV_DIV_32 },
 +static const u32 sh_msiof_spi_div_array[] = {
 +      SCR_BRDV_DIV_1, SCR_BRDV_DIV_2,  SCR_BRDV_DIV_4,
 +      SCR_BRDV_DIV_8, SCR_BRDV_DIV_16, SCR_BRDV_DIV_32,
  };
  
  static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p,
                                      unsigned long parent_rate, u32 spi_hz)
  {
 -      unsigned long div = 1024;
 +      unsigned long div;
        u32 brps, scr;
 -      size_t k;
 +      unsigned int div_pow = p->min_div_pow;
  
 -      if (!WARN_ON(!spi_hz || !parent_rate))
 -              div = DIV_ROUND_UP(parent_rate, spi_hz);
 -
 -      div = max_t(unsigned long, div, p->min_div);
 +      if (!spi_hz || !parent_rate) {
 +              WARN(1, "Invalid clock rate parameters %lu and %u\n",
 +                   parent_rate, spi_hz);
 +              return;
 +      }
  
 -      for (k = 0; k < ARRAY_SIZE(sh_msiof_spi_div_table); k++) {
 -              brps = DIV_ROUND_UP(div, sh_msiof_spi_div_table[k].div);
 +      div = DIV_ROUND_UP(parent_rate, spi_hz);
 +      if (div <= 1024) {
                /* SCR_BRDV_DIV_1 is valid only if BRPS is x 1/1 or x 1/2 */
 -              if (sh_msiof_spi_div_table[k].div == 1 && brps > 2)
 -                      continue;
 -              if (brps <= 32) /* max of brdv is 32 */
 -                      break;
 -      }
 +              if (!div_pow && div <= 32 && div > 2)
 +                      div_pow = 1;
 +
 +              if (div_pow)
 +                      brps = (div + 1) >> div_pow;
 +              else
 +                      brps = div;
  
 -      k = min_t(int, k, ARRAY_SIZE(sh_msiof_spi_div_table) - 1);
 -      brps = min_t(int, brps, 32);
 +              for (; brps > 32; div_pow++)
 +                      brps = (brps + 1) >> 1;
 +      } else {
 +              /* Set transfer rate composite divisor to 2^5 * 32 = 1024 */
 +              dev_err(&p->pdev->dev,
 +                      "Requested SPI transfer rate %d is too low\n", spi_hz);
 +              div_pow = 5;
 +              brps = 32;
 +      }
  
 -      scr = sh_msiof_spi_div_table[k].brdv | SCR_BRPS(brps);
 +      scr = sh_msiof_spi_div_array[div_pow] | SCR_BRPS(brps);
        sh_msiof_write(p, TSCR, scr);
        if (!(p->master->flags & SPI_MASTER_MUST_TX))
                sh_msiof_write(p, RSCR, scr);
@@@ -567,14 -564,16 +567,16 @@@ static int sh_msiof_spi_setup(struct sp
  
        /* Configure native chip select mode/polarity early */
        clr = MDR1_SYNCMD_MASK;
-       set = MDR1_TRMD | TMDR1_PCON | MDR1_SYNCMD_SPI;
+       set = MDR1_SYNCMD_SPI;
        if (spi->mode & SPI_CS_HIGH)
                clr |= BIT(MDR1_SYNCAC_SHIFT);
        else
                set |= BIT(MDR1_SYNCAC_SHIFT);
        pm_runtime_get_sync(&p->pdev->dev);
        tmp = sh_msiof_read(p, TMDR1) & ~clr;
-       sh_msiof_write(p, TMDR1, tmp | set);
+       sh_msiof_write(p, TMDR1, tmp | set | MDR1_TRMD | TMDR1_PCON);
+       tmp = sh_msiof_read(p, RMDR1) & ~clr;
+       sh_msiof_write(p, RMDR1, tmp | set);
        pm_runtime_put(&p->pdev->dev);
        p->native_cs_high = spi->mode & SPI_CS_HIGH;
        p->native_cs_inited = true;
@@@ -1044,21 -1043,21 +1046,21 @@@ static const struct sh_msiof_chipdata s
        .tx_fifo_size = 64,
        .rx_fifo_size = 64,
        .master_flags = 0,
 -      .min_div = 1,
 +      .min_div_pow = 0,
  };
  
  static const struct sh_msiof_chipdata rcar_gen2_data = {
        .tx_fifo_size = 64,
        .rx_fifo_size = 64,
        .master_flags = SPI_MASTER_MUST_TX,
 -      .min_div = 1,
 +      .min_div_pow = 0,
  };
  
  static const struct sh_msiof_chipdata rcar_gen3_data = {
        .tx_fifo_size = 64,
        .rx_fifo_size = 64,
        .master_flags = SPI_MASTER_MUST_TX,
 -      .min_div = 2,
 +      .min_div_pow = 1,
  };
  
  static const struct of_device_id sh_msiof_match[] = {
@@@ -1322,7 -1321,7 +1324,7 @@@ static int sh_msiof_spi_probe(struct pl
        platform_set_drvdata(pdev, p);
        p->master = master;
        p->info = info;
 -      p->min_div = chipdata->min_div;
 +      p->min_div_pow = chipdata->min_div_pow;
  
        init_completion(&p->done);