|
|
|
@ -18,7 +18,6 @@ |
|
|
|
|
#include <linux/interrupt.h> |
|
|
|
|
#include <linux/delay.h> |
|
|
|
|
#include <linux/spi/spi.h> |
|
|
|
|
#include <linux/spi/mpc52xx_spi.h> |
|
|
|
|
#include <linux/of_spi.h> |
|
|
|
|
#include <linux/io.h> |
|
|
|
|
#include <linux/of_gpio.h> |
|
|
|
@ -54,7 +53,7 @@ MODULE_LICENSE("GPL"); |
|
|
|
|
/* FSM state return values */ |
|
|
|
|
#define FSM_STOP 0 /* Nothing more for the state machine to */ |
|
|
|
|
/* do. If something interesting happens */ |
|
|
|
|
/* then and IRQ will be received */ |
|
|
|
|
/* then an IRQ will be received */ |
|
|
|
|
#define FSM_POLL 1 /* need to poll for completion, an IRQ is */ |
|
|
|
|
/* not expected */ |
|
|
|
|
#define FSM_CONTINUE 2 /* Keep iterating the state machine */ |
|
|
|
@ -62,13 +61,12 @@ MODULE_LICENSE("GPL"); |
|
|
|
|
/* Driver internal data */ |
|
|
|
|
struct mpc52xx_spi { |
|
|
|
|
struct spi_master *master; |
|
|
|
|
u32 sysclk; |
|
|
|
|
void __iomem *regs; |
|
|
|
|
int irq0; /* MODF irq */ |
|
|
|
|
int irq1; /* SPIF irq */ |
|
|
|
|
int ipb_freq; |
|
|
|
|
unsigned int ipb_freq; |
|
|
|
|
|
|
|
|
|
/* Statistics */ |
|
|
|
|
/* Statistics; not used now, but will be reintroduced for debugfs */ |
|
|
|
|
int msg_count; |
|
|
|
|
int wcol_count; |
|
|
|
|
int wcol_ticks; |
|
|
|
@ -229,7 +227,7 @@ static int mpc52xx_spi_fsmstate_transfer(int irq, struct mpc52xx_spi *ms, |
|
|
|
|
ms->wcol_tx_timestamp = get_tbl(); |
|
|
|
|
data = 0; |
|
|
|
|
if (ms->tx_buf) |
|
|
|
|
data = *(ms->tx_buf-1); |
|
|
|
|
data = *(ms->tx_buf - 1); |
|
|
|
|
out_8(ms->regs + SPI_DATA, data); /* try again */ |
|
|
|
|
return FSM_CONTINUE; |
|
|
|
|
} else if (status & SPI_STATUS_MODF) { |
|
|
|
@ -481,8 +479,9 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op, |
|
|
|
|
gpio_direction_output(gpio_cs, 1); |
|
|
|
|
ms->gpio_cs[i] = gpio_cs; |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
} else { |
|
|
|
|
master->num_chipselect = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
spin_lock_init(&ms->lock); |
|
|
|
|
INIT_LIST_HEAD(&ms->queue); |
|
|
|
@ -490,10 +489,10 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op, |
|
|
|
|
|
|
|
|
|
/* Decide if interrupts can be used */ |
|
|
|
|
if (ms->irq0 && ms->irq1) { |
|
|
|
|
rc = request_irq(ms->irq0, mpc52xx_spi_irq, IRQF_SAMPLE_RANDOM, |
|
|
|
|
rc = request_irq(ms->irq0, mpc52xx_spi_irq, 0, |
|
|
|
|
"mpc5200-spi-modf", ms); |
|
|
|
|
rc |= request_irq(ms->irq1, mpc52xx_spi_irq, IRQF_SAMPLE_RANDOM, |
|
|
|
|
"mpc5200-spi-spiF", ms); |
|
|
|
|
rc |= request_irq(ms->irq1, mpc52xx_spi_irq, 0, |
|
|
|
|
"mpc5200-spi-spif", ms); |
|
|
|
|
if (rc) { |
|
|
|
|
free_irq(ms->irq0, ms); |
|
|
|
|
free_irq(ms->irq1, ms); |
|
|
|
@ -524,7 +523,6 @@ static int __devinit mpc52xx_spi_probe(struct of_device *op, |
|
|
|
|
while (i-- > 0) |
|
|
|
|
gpio_free(ms->gpio_cs[i]); |
|
|
|
|
|
|
|
|
|
if (ms->gpio_cs != NULL) |
|
|
|
|
kfree(ms->gpio_cs); |
|
|
|
|
err_alloc: |
|
|
|
|
err_init: |
|
|
|
@ -544,9 +542,7 @@ static int __devexit mpc52xx_spi_remove(struct of_device *op) |
|
|
|
|
for (i = 0; i < ms->gpio_cs_count; i++) |
|
|
|
|
gpio_free(ms->gpio_cs[i]); |
|
|
|
|
|
|
|
|
|
if (ms->gpio_cs != NULL) |
|
|
|
|
kfree(ms->gpio_cs); |
|
|
|
|
|
|
|
|
|
spi_unregister_master(master); |
|
|
|
|
spi_master_put(master); |
|
|
|
|
iounmap(ms->regs); |
|
|
|
|