Modified: trunk/arch/blackfin/mach-bf537/boards/stamp.c (6594 => 6595)
--- trunk/arch/blackfin/mach-bf537/boards/stamp.c 2009-06-05 04:40:39 UTC (rev 6594)
+++ trunk/arch/blackfin/mach-bf537/boards/stamp.c 2009-06-05 11:51:26 UTC (rev 6595)
@@ -565,6 +565,7 @@
static struct bfin5xx_spi_chip mmc_spi_chip_info = {
.enable_dma = 0,
.bits_per_word = 8,
+ .pio_interrupt = 0,
};
#endif
@@ -849,6 +850,11 @@
[1] = {
.start = CH_SPI,
.end = CH_SPI,
+ .flags = IORESOURCE_DMA,
+ },
+ [2] = {
+ .start = IRQ_SPI,
+ .end = IRQ_SPI,
.flags = IORESOURCE_IRQ,
},
};
Modified: trunk/drivers/spi/spi_bfin5xx.c (6594 => 6595)
--- trunk/drivers/spi/spi_bfin5xx.c 2009-06-05 04:40:39 UTC (rev 6594)
+++ trunk/drivers/spi/spi_bfin5xx.c 2009-06-05 11:51:26 UTC (rev 6595)
@@ -97,6 +97,7 @@
dma_addr_t tx_dma;
int irq_requested;
+ int spi_irq;
size_t rx_map_len;
size_t tx_map_len;
@@ -562,7 +563,7 @@
/* Move to next transfer */
msg->state = bfin_spi_next_transfer(drv_data);
- disable_irq(IRQ_SPI);
+ disable_irq(drv_data->spi_irq);
/* Schedule transfer tasklet */
tasklet_schedule(&drv_data->pump_transfers);
@@ -946,7 +947,7 @@
}
/* once TDBR is empty, interrupt is triggered */
- enable_irq(IRQ_SPI);
+ enable_irq(drv_data->spi_irq);
return;
}
@@ -1312,7 +1313,7 @@
}
if (chip->pio_interrupt && !drv_data->irq_requested) {
- ret = request_irq(IRQ_SPI, bfin_spi_pio_irq_handler,
+ ret = request_irq(drv_data->spi_irq, bfin_spi_pio_irq_handler,
IRQF_DISABLED, "BFIN_SPI", drv_data);
if (ret) {
printk(KERN_NOTICE "Unable to register spi IRQ\n");
@@ -1320,7 +1321,7 @@
}
drv_data->irq_requested = 1;
/* we use write mode, spi irq has to be disabled here */
- disable_irq(IRQ_SPI);
+ disable_irq(drv_data->spi_irq);
}
if (chip->chip_select_num == 0) {
@@ -1521,13 +1522,21 @@
goto out_error_ioremap;
}
- drv_data->dma_channel = platform_get_irq(pdev, 0);
- if (drv_data->dma_channel < 0) {
+ res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+ if (res == NULL) {
dev_err(dev, "No DMA channel specified\n");
status = -ENOENT;
- goto out_error_no_dma_ch;
+ goto out_error_free_io;
}
+ drv_data->dma_channel = res->start;
+ drv_data->spi_irq = platform_get_irq(pdev, 0);
+ if (drv_data->spi_irq < 0) {
+ dev_err(dev, "No spi pio irq specified\n");
+ status = -ENOENT;
+ goto out_error_free_io;
+ }
+
/* Initial and start queue */
status = bfin_spi_init_queue(drv_data);
if (status != 0) {
@@ -1568,7 +1577,7 @@
out_error_queue_alloc:
bfin_spi_destroy_queue(drv_data);
-out_error_no_dma_ch:
+out_error_free_io:
iounmap((void *) drv_data->regs_base);
out_error_ioremap:
out_error_get_res:
@@ -1601,7 +1610,7 @@
}
if (drv_data->irq_requested) {
- free_irq(IRQ_SPI, drv_data);
+ free_irq(drv_data->spi_irq, drv_data);
drv_data->irq_requested = 0;
}