From: lyx Date: Mon, 21 Mar 2011 06:12:10 +0000 (-0700) Subject: update spi driver X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8629f700ae19767f404f7704fe0915c333d55412;p=firefly-linux-kernel-4.4.55.git update spi driver --- diff --git a/arch/arm/mach-rk29/board-malata.c b/arch/arm/mach-rk29/board-malata.c old mode 100644 new mode 100755 index 1e311dd51e6f..305db83e83fe --- a/arch/arm/mach-rk29/board-malata.c +++ b/arch/arm/mach-rk29/board-malata.c @@ -1734,7 +1734,8 @@ static struct spi_cs_gpio rk29xx_spi0_cs_gpios[SPI_CHIPSELECT_NUM] = { { .name = "spi0 cs0", .cs_gpio = RK29_PIN2_PC1, - .cs_iomux_name = NULL, + .cs_iomux_name = GPIO2C1_SPI0CSN0_NAME, + .cs_iomux_mode = GPIO2H_SPI0_CSN0, }, { .name = "spi0 cs1", @@ -1748,7 +1749,8 @@ static struct spi_cs_gpio rk29xx_spi1_cs_gpios[SPI_CHIPSELECT_NUM] = { { .name = "spi1 cs0", .cs_gpio = RK29_PIN2_PC5, - .cs_iomux_name = NULL, + .cs_iomux_name = GPIO2C5_SPI1CSN0_NAME, + .cs_iomux_mode = GPIO2H_SPI1_CSN0, }, { .name = "spi1 cs1", @@ -1761,22 +1763,10 @@ static struct spi_cs_gpio rk29xx_spi1_cs_gpios[SPI_CHIPSELECT_NUM] = { static int spi_io_init(struct spi_cs_gpio *cs_gpios, int cs_num) { #if 1 - int i,j,ret; - - //cs + int i; if (cs_gpios) { for (i=0; imaster->dev.platform_data; struct spi_cs_gpio *cs_gpios = pdata->chipselect_gpios; - if (flag == 0) + if (flag == 0) { gpio_direction_output(cs_gpios[cs].cs_gpio, GPIO_HIGH); - else + } + else { gpio_direction_output(cs_gpios[cs].cs_gpio, GPIO_LOW); + } #endif } @@ -1007,17 +1013,20 @@ static void dma_transfer(struct rk29xx_spi *dws) //int cs_change) DBG("dws->tx_dmach: %d, dws->rx_dmach: %d, transfer->tx_dma: 0x%x\n", dws->tx_dmach, dws->rx_dmach, (unsigned int)transfer->tx_dma); if (transfer->tx_buf != NULL) { dws->state |= TXBUSY; - if (transfer->len & 0x3) { + /*if (transfer->len & 0x3) { burst = 1; } else { burst = 4; } - if (rk29_dma_config(dws->tx_dmach, burst)) { + if (rk29_dma_config(dws->tx_dmach, burst)) {*/ + if (rk29_dma_config(dws->tx_dmach, 1)) {//there is not dma burst but bitwide, set it 1 alwayss dev_err(&dws->master->dev, "function: %s, line: %d\n", __FUNCTION__, __LINE__); goto err_out; } + rk29_dma_ctrl(dws->tx_dmach, RK29_DMAOP_FLUSH); + iRet = rk29_dma_enqueue(dws->tx_dmach, (void *)dws, transfer->tx_dma, transfer->len); if (iRet) { @@ -1032,12 +1041,16 @@ static void dma_transfer(struct rk29xx_spi *dws) //int cs_change) } } + wait_till_not_busy(dws); + if (transfer->rx_buf != NULL) { dws->state |= RXBUSY; if (rk29_dma_config(dws->rx_dmach, 1)) { dev_err(&dws->master->dev, "function: %s, line: %d\n", __FUNCTION__, __LINE__); goto err_out; } + + rk29_dma_ctrl(dws->rx_dmach, RK29_DMAOP_FLUSH); iRet = rk29_dma_enqueue(dws->rx_dmach, (void *)dws, transfer->rx_dma, transfer->len); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c old mode 100644 new mode 100755 index 1d3ba252453d..e029cb56f5be --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -834,6 +834,7 @@ int spi_write_then_read(struct spi_device *spi, } else local_buf = buf; + memset(local_buf, 0, SPI_BUFSIZ); memcpy(local_buf, txbuf, n_tx); x[0].tx_buf = local_buf; x[1].rx_buf = local_buf + n_tx;