Merge branch 'master' into upstream
[pandora-kernel.git] / drivers / spi / spi_bfin5xx.c
index ab483a0..3f22351 100644 (file)
@@ -504,6 +504,15 @@ static irqreturn_t bfin_spi_dma_irq_handler(int irq, void *dev_id)
                "in dma_irq_handler dmastat:0x%x spistat:0x%x\n",
                dmastat, spistat);
 
+       if (drv_data->rx != NULL) {
+               u16 cr = read_CTRL(drv_data);
+               /* discard old RX data and clear RXS */
+               bfin_spi_dummy_read(drv_data);
+               write_CTRL(drv_data, cr & ~BIT_CTL_ENABLE); /* Disable SPI */
+               write_CTRL(drv_data, cr & ~BIT_CTL_TIMOD); /* Restore State */
+               write_STAT(drv_data, BIT_STAT_CLR); /* Clear Status */
+       }
+
        clear_dma_irqstat(drv_data->dma_channel);
 
        /*
@@ -1099,12 +1108,15 @@ static int bfin_spi_setup(struct spi_device *spi)
        }
 
        if (chip->chip_select_num >= MAX_CTRL_CS) {
-               ret = gpio_request(chip->cs_gpio, spi->modalias);
-               if (ret) {
-                       dev_err(&spi->dev, "gpio_request() error\n");
-                       goto pin_error;
+               /* Only request on first setup */
+               if (spi_get_ctldata(spi) == NULL) {
+                       ret = gpio_request(chip->cs_gpio, spi->modalias);
+                       if (ret) {
+                               dev_err(&spi->dev, "gpio_request() error\n");
+                               goto pin_error;
+                       }
+                       gpio_direction_output(chip->cs_gpio, 1);
                }
-               gpio_direction_output(chip->cs_gpio, 1);
        }
 
        dev_dbg(&spi->dev, "setup spi chip %s, width is %d, dma is %d\n",