浏览代码

Merge branch 'spi-4.17' into spi-4.18 for the merge window

Mark Brown 7 年之前
父节点
当前提交
16c10b3bf8
共有 4 个文件被更改,包括 35 次插入12 次删除
  1. 18 10
      drivers/spi/spi-bcm-qspi.c
  2. 5 0
      drivers/spi/spi-bcm2835aux.c
  3. 8 0
      drivers/spi/spi-cadence.c
  4. 4 2
      drivers/spi/spi-sh-msiof.c

+ 18 - 10
drivers/spi/spi-bcm-qspi.c

@@ -488,7 +488,7 @@ static int bcm_qspi_bspi_set_mode(struct bcm_qspi *qspi,
 
 
 static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
 static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
 {
 {
-	if (!has_bspi(qspi) || (qspi->bspi_enabled))
+	if (!has_bspi(qspi))
 		return;
 		return;
 
 
 	qspi->bspi_enabled = 1;
 	qspi->bspi_enabled = 1;
@@ -503,7 +503,7 @@ static void bcm_qspi_enable_bspi(struct bcm_qspi *qspi)
 
 
 static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
 static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
 {
 {
-	if (!has_bspi(qspi) || (!qspi->bspi_enabled))
+	if (!has_bspi(qspi))
 		return;
 		return;
 
 
 	qspi->bspi_enabled = 0;
 	qspi->bspi_enabled = 0;
@@ -517,16 +517,19 @@ static void bcm_qspi_disable_bspi(struct bcm_qspi *qspi)
 
 
 static void bcm_qspi_chip_select(struct bcm_qspi *qspi, int cs)
 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]) {
 	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);
 		usleep_range(10, 20);
 	}
 	}
+
+	dev_dbg(&qspi->pdev->dev, "using cs:%d\n", cs);
 	qspi->curr_cs = cs;
 	qspi->curr_cs = cs;
 }
 }
 
 
@@ -753,8 +756,13 @@ static int write_to_hw(struct bcm_qspi *qspi, struct spi_device *spi)
 			dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
 			dev_dbg(&qspi->pdev->dev, "WR %04x\n", val);
 		}
 		}
 		mspi_cdram = MSPI_CDRAM_CONT_BIT;
 		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 |= ((tp.trans->bits_per_word <= 8) ? 0 :
 				MSPI_CDRAM_BITSE_BIT);
 				MSPI_CDRAM_BITSE_BIT);
 
 

+ 5 - 0
drivers/spi/spi-bcm2835aux.c

@@ -184,6 +184,11 @@ static irqreturn_t bcm2835aux_spi_interrupt(int irq, void *dev_id)
 	struct bcm2835aux_spi *bs = spi_master_get_devdata(master);
 	struct bcm2835aux_spi *bs = spi_master_get_devdata(master);
 	irqreturn_t ret = IRQ_NONE;
 	irqreturn_t ret = IRQ_NONE;
 
 
+	/* IRQ may be shared, so return if our interrupts are disabled */
+	if (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_CNTL1) &
+	      (BCM2835_AUX_SPI_CNTL1_TXEMPTY | BCM2835_AUX_SPI_CNTL1_IDLE)))
+		return ret;
+
 	/* check if we have data to read */
 	/* check if we have data to read */
 	while (bs->rx_len &&
 	while (bs->rx_len &&
 	       (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) &
 	       (!(bcm2835aux_rd(bs, BCM2835_AUX_SPI_STAT) &

+ 8 - 0
drivers/spi/spi-cadence.c

@@ -313,6 +313,14 @@ static void cdns_spi_fill_tx_fifo(struct cdns_spi *xspi)
 
 
 	while ((trans_cnt < CDNS_SPI_FIFO_DEPTH) &&
 	while ((trans_cnt < CDNS_SPI_FIFO_DEPTH) &&
 	       (xspi->tx_bytes > 0)) {
 	       (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)
 		if (xspi->txbuf)
 			cdns_spi_write(xspi, CDNS_SPI_TXD, *xspi->txbuf++);
 			cdns_spi_write(xspi, CDNS_SPI_TXD, *xspi->txbuf++);
 		else
 		else

+ 4 - 2
drivers/spi/spi-sh-msiof.c

@@ -567,14 +567,16 @@ static int sh_msiof_spi_setup(struct spi_device *spi)
 
 
 	/* Configure native chip select mode/polarity early */
 	/* Configure native chip select mode/polarity early */
 	clr = MDR1_SYNCMD_MASK;
 	clr = MDR1_SYNCMD_MASK;
-	set = MDR1_TRMD | TMDR1_PCON | MDR1_SYNCMD_SPI;
+	set = MDR1_SYNCMD_SPI;
 	if (spi->mode & SPI_CS_HIGH)
 	if (spi->mode & SPI_CS_HIGH)
 		clr |= BIT(MDR1_SYNCAC_SHIFT);
 		clr |= BIT(MDR1_SYNCAC_SHIFT);
 	else
 	else
 		set |= BIT(MDR1_SYNCAC_SHIFT);
 		set |= BIT(MDR1_SYNCAC_SHIFT);
 	pm_runtime_get_sync(&p->pdev->dev);
 	pm_runtime_get_sync(&p->pdev->dev);
 	tmp = sh_msiof_read(p, TMDR1) & ~clr;
 	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);
 	pm_runtime_put(&p->pdev->dev);
 	p->native_cs_high = spi->mode & SPI_CS_HIGH;
 	p->native_cs_high = spi->mode & SPI_CS_HIGH;
 	p->native_cs_inited = true;
 	p->native_cs_inited = true;