Merge remote-tracking branch 'spi/topic/pxa' into spi-next
authorMark Brown <broonie@linaro.org>
Wed, 26 Jun 2013 15:21:03 +0000 (16:21 +0100)
committerMark Brown <broonie@linaro.org>
Wed, 26 Jun 2013 15:21:03 +0000 (16:21 +0100)
1  2 
drivers/spi/spi-pxa2xx-dma.c
drivers/spi/spi-pxa2xx.c

@@@ -59,7 -59,7 +59,7 @@@ static int pxa2xx_spi_map_dma_buffer(st
                int ret;
  
                sg_free_table(sgt);
 -              ret = sg_alloc_table(sgt, nents, GFP_KERNEL);
 +              ret = sg_alloc_table(sgt, nents, GFP_ATOMIC);
                if (ret)
                        return ret;
        }
@@@ -327,22 -327,23 +327,23 @@@ void pxa2xx_spi_dma_start(struct driver
  int pxa2xx_spi_dma_setup(struct driver_data *drv_data)
  {
        struct pxa2xx_spi_master *pdata = drv_data->master_info;
+       struct device *dev = &drv_data->pdev->dev;
        dma_cap_mask_t mask;
  
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);
  
-       drv_data->dummy = devm_kzalloc(&drv_data->pdev->dev, SZ_2K, GFP_KERNEL);
+       drv_data->dummy = devm_kzalloc(dev, SZ_2K, GFP_KERNEL);
        if (!drv_data->dummy)
                return -ENOMEM;
  
-       drv_data->tx_chan = dma_request_channel(mask, pxa2xx_spi_dma_filter,
-                                               pdata);
+       drv_data->tx_chan = dma_request_slave_channel_compat(mask,
+                               pxa2xx_spi_dma_filter, pdata, dev, "tx");
        if (!drv_data->tx_chan)
                return -ENODEV;
  
-       drv_data->rx_chan = dma_request_channel(mask, pxa2xx_spi_dma_filter,
-                                               pdata);
+       drv_data->rx_chan = dma_request_slave_channel_compat(mask,
+                               pxa2xx_spi_dma_filter, pdata, dev, "rx");
        if (!drv_data->rx_chan) {
                dma_release_channel(drv_data->tx_chan);
                drv_data->tx_chan = NULL;
diff --combined drivers/spi/spi-pxa2xx.c
@@@ -881,6 -881,21 +881,6 @@@ static int setup(struct spi_device *spi
                rx_thres = RX_THRESH_DFLT;
        }
  
 -      if (!pxa25x_ssp_comp(drv_data)
 -              && (spi->bits_per_word < 4 || spi->bits_per_word > 32)) {
 -              dev_err(&spi->dev, "failed setup: ssp_type=%d, bits/wrd=%d "
 -                              "b/w not 4-32 for type non-PXA25x_SSP\n",
 -                              drv_data->ssp_type, spi->bits_per_word);
 -              return -EINVAL;
 -      } else if (pxa25x_ssp_comp(drv_data)
 -                      && (spi->bits_per_word < 4
 -                              || spi->bits_per_word > 16)) {
 -              dev_err(&spi->dev, "failed setup: ssp_type=%d, bits/wrd=%d "
 -                              "b/w not 4-16 for type PXA25x_SSP\n",
 -                              drv_data->ssp_type, spi->bits_per_word);
 -              return -EINVAL;
 -      }
 -
        /* Only alloc on first setup */
        chip = spi_get_ctldata(spi);
        if (!chip) {
                chip->n_bytes = 4;
                chip->read = u32_reader;
                chip->write = u32_writer;
 -      } else {
 -              dev_err(&spi->dev, "invalid wordsize\n");
 -              return -ENODEV;
        }
        chip->bits_per_word = spi->bits_per_word;
  
@@@ -1022,32 -1040,10 +1022,10 @@@ static void cleanup(struct spi_device *
  }
  
  #ifdef CONFIG_ACPI
- static int pxa2xx_spi_acpi_add_dma(struct acpi_resource *res, void *data)
- {
-       struct pxa2xx_spi_master *pdata = data;
-       if (res->type == ACPI_RESOURCE_TYPE_FIXED_DMA) {
-               const struct acpi_resource_fixed_dma *dma;
-               dma = &res->data.fixed_dma;
-               if (pdata->tx_slave_id < 0) {
-                       pdata->tx_slave_id = dma->request_lines;
-                       pdata->tx_chan_id = dma->channels;
-               } else if (pdata->rx_slave_id < 0) {
-                       pdata->rx_slave_id = dma->request_lines;
-                       pdata->rx_chan_id = dma->channels;
-               }
-       }
-       /* Tell the ACPI core to skip this resource */
-       return 1;
- }
  static struct pxa2xx_spi_master *
  pxa2xx_spi_acpi_get_pdata(struct platform_device *pdev)
  {
        struct pxa2xx_spi_master *pdata;
-       struct list_head resource_list;
        struct acpi_device *adev;
        struct ssp_device *ssp;
        struct resource *res;
            acpi_bus_get_device(ACPI_HANDLE(&pdev->dev), &adev))
                return NULL;
  
 -      pdata = devm_kzalloc(&pdev->dev, sizeof(*ssp), GFP_KERNEL);
 +      pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
        if (!pdata) {
                dev_err(&pdev->dev,
                        "failed to allocate memory for platform data\n");
        ssp->phys_base = res->start;
        ssp->mmio_base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(ssp->mmio_base))
-               return PTR_ERR(ssp->mmio_base);
+               return NULL;
  
        ssp->clk = devm_clk_get(&pdev->dev, NULL);
        ssp->irq = platform_get_irq(pdev, 0);
                ssp->port_id = devid;
  
        pdata->num_chipselect = 1;
-       pdata->rx_slave_id = -1;
-       pdata->tx_slave_id = -1;
-       INIT_LIST_HEAD(&resource_list);
-       acpi_dev_get_resources(adev, &resource_list, pxa2xx_spi_acpi_add_dma,
-                              pdata);
-       acpi_dev_free_resource_list(&resource_list);
-       pdata->enable_dma = pdata->rx_slave_id >= 0 && pdata->tx_slave_id >= 0;
+       pdata->enable_dma = true;
  
        return pdata;
  }
  static struct acpi_device_id pxa2xx_spi_acpi_match[] = {
        { "INT33C0", 0 },
        { "INT33C1", 0 },
+       { "80860F0E", 0 },
        { },
  };
  MODULE_DEVICE_TABLE(acpi, pxa2xx_spi_acpi_match);
@@@ -1172,13 -1161,11 +1143,13 @@@ static int pxa2xx_spi_probe(struct plat
        drv_data->ioaddr = ssp->mmio_base;
        drv_data->ssdr_physical = ssp->phys_base + SSDR;
        if (pxa25x_ssp_comp(drv_data)) {
 +              master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 16);
                drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE;
                drv_data->dma_cr1 = 0;
                drv_data->clear_sr = SSSR_ROR;
                drv_data->mask_sr = SSSR_RFS | SSSR_TFS | SSSR_ROR;
        } else {
 +              master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 32);
                drv_data->int_cr1 = SSCR1_TIE | SSCR1_RIE | SSCR1_TINTE;
                drv_data->dma_cr1 = DEFAULT_DMA_CR1;
                drv_data->clear_sr = SSSR_ROR | SSSR_TINT;
        if (platform_info->enable_dma) {
                status = pxa2xx_spi_dma_setup(drv_data);
                if (status) {
-                       dev_warn(dev, "failed to setup DMA, using PIO\n");
+                       dev_dbg(dev, "no DMA channels available, using PIO\n");
                        platform_info->enable_dma = false;
                }
        }
@@@ -1283,6 -1270,9 +1254,6 @@@ static int pxa2xx_spi_remove(struct pla
        /* Disconnect from the SPI framework */
        spi_unregister_master(drv_data->master);
  
 -      /* Prevent double remove */
 -      platform_set_drvdata(pdev, NULL);
 -
        return 0;
  }