]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'spi/fix/mtk' into spi-linus
authorMark Brown <broonie@kernel.org>
Mon, 11 Jan 2016 16:48:27 +0000 (16:48 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 11 Jan 2016 16:48:27 +0000 (16:48 +0000)
1  2 
drivers/spi/spi-mt65xx.c

diff --combined drivers/spi/spi-mt65xx.c
index 7840067062a8daf950f4de9a07e232f1482c9485,375d412dbf05223ca4e934d10f82d73186c6032d..4895fe3944f198049c9e8708395e8576efd8320b
@@@ -323,7 -323,8 +323,8 @@@ static int mtk_spi_fifo_transfer(struc
                                 struct spi_device *spi,
                                 struct spi_transfer *xfer)
  {
-       int cnt;
+       int cnt, remainder;
+       u32 reg_val;
        struct mtk_spi *mdata = spi_master_get_devdata(master);
  
        mdata->cur_transfer = xfer;
        mtk_spi_prepare_transfer(master, xfer);
        mtk_spi_setup_packet(master);
  
-       if (xfer->len % 4)
-               cnt = xfer->len / 4 + 1;
-       else
-               cnt = xfer->len / 4;
+       cnt = xfer->len / 4;
        iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
  
+       remainder = xfer->len % 4;
+       if (remainder > 0) {
+               reg_val = 0;
+               memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
+               writel(reg_val, mdata->base + SPI_TX_DATA_REG);
+       }
        mtk_spi_enable_transfer(master);
  
        return 1;
@@@ -410,7 -415,7 +415,7 @@@ static int mtk_spi_setup(struct spi_dev
        if (!spi->controller_data)
                spi->controller_data = (void *)&mtk_default_chip_info;
  
 -      if (mdata->dev_comp->need_pad_sel)
 +      if (mdata->dev_comp->need_pad_sel && gpio_is_valid(spi->cs_gpio))
                gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
  
        return 0;
  
  static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
  {
-       u32 cmd, reg_val, cnt;
+       u32 cmd, reg_val, cnt, remainder;
        struct spi_master *master = dev_id;
        struct mtk_spi *mdata = spi_master_get_devdata(master);
        struct spi_transfer *trans = mdata->cur_transfer;
  
        if (!master->can_dma(master, master->cur_msg->spi, trans)) {
                if (trans->rx_buf) {
-                       if (mdata->xfer_len % 4)
-                               cnt = mdata->xfer_len / 4 + 1;
-                       else
-                               cnt = mdata->xfer_len / 4;
+                       cnt = mdata->xfer_len / 4;
                        ioread32_rep(mdata->base + SPI_RX_DATA_REG,
                                     trans->rx_buf, cnt);
+                       remainder = mdata->xfer_len % 4;
+                       if (remainder > 0) {
+                               reg_val = readl(mdata->base + SPI_RX_DATA_REG);
+                               memcpy(trans->rx_buf + (cnt * 4),
+                                       &reg_val, remainder);
+                       }
                }
                spi_finalize_current_transfer(master);
                return IRQ_HANDLED;
@@@ -632,23 -640,13 +640,23 @@@ static int mtk_spi_probe(struct platfor
                        goto err_put_master;
                }
  
 -              for (i = 0; i < master->num_chipselect; i++) {
 -                      ret = devm_gpio_request(&pdev->dev, master->cs_gpios[i],
 -                                              dev_name(&pdev->dev));
 -                      if (ret) {
 -                              dev_err(&pdev->dev,
 -                                      "can't get CS GPIO %i\n", i);
 -                              goto err_put_master;
 +              if (!master->cs_gpios && master->num_chipselect > 1) {
 +                      dev_err(&pdev->dev,
 +                              "cs_gpios not specified and num_chipselect > 1\n");
 +                      ret = -EINVAL;
 +                      goto err_put_master;
 +              }
 +
 +              if (master->cs_gpios) {
 +                      for (i = 0; i < master->num_chipselect; i++) {
 +                              ret = devm_gpio_request(&pdev->dev,
 +                                                      master->cs_gpios[i],
 +                                                      dev_name(&pdev->dev));
 +                              if (ret) {
 +                                      dev_err(&pdev->dev,
 +                                              "can't get CS GPIO %i\n", i);
 +                                      goto err_put_master;
 +                              }
                        }
                }
        }