[PATCH Resend v5 07/16] spi/spi-atmel: add flag to controller data for lock operations
From: Nicolas Ferre Will allow to drop the lock during DMA operations. Signed-off-by: Nicolas Ferre Cc: spi-devel-gene...@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org [wenyou.y...@atmel.com: submit the patch] Signed-off-by: Wenyou Yang --- drivers/spi/spi-atmel.c | 31 +++ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 136ed8f..1c2933a 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -196,6 +196,7 @@ struct atmel_spi_caps { */ struct atmel_spi { spinlock_t lock; + unsigned long flags; resource_size_t phybase; void __iomem*regs; @@ -334,6 +335,16 @@ static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi) gpio_set_value(asd->npcs_pin, !active); } +static void atmel_spi_lock(struct atmel_spi *as) +{ + spin_lock_irqsave(>lock, as->flags); +} + +static void atmel_spi_unlock(struct atmel_spi *as) +{ + spin_unlock_irqrestore(>lock, as->flags); +} + static inline int atmel_spi_xfer_is_last(struct spi_message *msg, struct spi_transfer *xfer) { @@ -570,9 +581,9 @@ atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as, "xfer complete: %u bytes transferred\n", msg->actual_length); - spin_unlock(>lock); + atmel_spi_unlock(as); msg->complete(msg->context); - spin_lock(>lock); + atmel_spi_lock(as); as->current_transfer = NULL; as->next_transfer = NULL; @@ -803,13 +814,11 @@ static int atmel_spi_setup(struct spi_device *spi) spi->controller_state = asd; gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); } else { - unsigned long flags; - - spin_lock_irqsave(>lock, flags); + atmel_spi_lock(as); if (as->stay == spi) as->stay = NULL; cs_deactivate(as, spi); - spin_unlock_irqrestore(>lock, flags); + atmel_spi_unlock(as); } asd->csr = csr; @@ -828,7 +837,6 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg) { struct atmel_spi*as; struct spi_transfer *xfer; - unsigned long flags; struct device *controller = spi->master->dev.parent; u8 bits; struct atmel_spi_device *asd; @@ -893,11 +901,11 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg) msg->status = -EINPROGRESS; msg->actual_length = 0; - spin_lock_irqsave(>lock, flags); + atmel_spi_lock(as); list_add_tail(>queue, >queue); if (!as->current_transfer) atmel_spi_next_message(spi->master); - spin_unlock_irqrestore(>lock, flags); + atmel_spi_unlock(as); return 0; } @@ -907,17 +915,16 @@ static void atmel_spi_cleanup(struct spi_device *spi) struct atmel_spi*as = spi_master_get_devdata(spi->master); struct atmel_spi_device *asd = spi->controller_state; unsignedgpio = (unsigned) spi->controller_data; - unsigned long flags; if (!asd) return; - spin_lock_irqsave(>lock, flags); + atmel_spi_lock(as); if (as->stay == spi) { as->stay = NULL; cs_deactivate(as, spi); } - spin_unlock_irqrestore(>lock, flags); + atmel_spi_unlock(as); spi->controller_state = NULL; gpio_free(gpio); -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH Resend v5 07/16] spi/spi-atmel: add flag to controller data for lock operations
From: Nicolas Ferre nicolas.fe...@atmel.com Will allow to drop the lock during DMA operations. Signed-off-by: Nicolas Ferre nicolas.fe...@atmel.com Cc: spi-devel-gene...@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org [wenyou.y...@atmel.com: submit the patch] Signed-off-by: Wenyou Yang wenyou.y...@atmel.com --- drivers/spi/spi-atmel.c | 31 +++ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 136ed8f..1c2933a 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -196,6 +196,7 @@ struct atmel_spi_caps { */ struct atmel_spi { spinlock_t lock; + unsigned long flags; resource_size_t phybase; void __iomem*regs; @@ -334,6 +335,16 @@ static void cs_deactivate(struct atmel_spi *as, struct spi_device *spi) gpio_set_value(asd-npcs_pin, !active); } +static void atmel_spi_lock(struct atmel_spi *as) +{ + spin_lock_irqsave(as-lock, as-flags); +} + +static void atmel_spi_unlock(struct atmel_spi *as) +{ + spin_unlock_irqrestore(as-lock, as-flags); +} + static inline int atmel_spi_xfer_is_last(struct spi_message *msg, struct spi_transfer *xfer) { @@ -570,9 +581,9 @@ atmel_spi_msg_done(struct spi_master *master, struct atmel_spi *as, xfer complete: %u bytes transferred\n, msg-actual_length); - spin_unlock(as-lock); + atmel_spi_unlock(as); msg-complete(msg-context); - spin_lock(as-lock); + atmel_spi_lock(as); as-current_transfer = NULL; as-next_transfer = NULL; @@ -803,13 +814,11 @@ static int atmel_spi_setup(struct spi_device *spi) spi-controller_state = asd; gpio_direction_output(npcs_pin, !(spi-mode SPI_CS_HIGH)); } else { - unsigned long flags; - - spin_lock_irqsave(as-lock, flags); + atmel_spi_lock(as); if (as-stay == spi) as-stay = NULL; cs_deactivate(as, spi); - spin_unlock_irqrestore(as-lock, flags); + atmel_spi_unlock(as); } asd-csr = csr; @@ -828,7 +837,6 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg) { struct atmel_spi*as; struct spi_transfer *xfer; - unsigned long flags; struct device *controller = spi-master-dev.parent; u8 bits; struct atmel_spi_device *asd; @@ -893,11 +901,11 @@ static int atmel_spi_transfer(struct spi_device *spi, struct spi_message *msg) msg-status = -EINPROGRESS; msg-actual_length = 0; - spin_lock_irqsave(as-lock, flags); + atmel_spi_lock(as); list_add_tail(msg-queue, as-queue); if (!as-current_transfer) atmel_spi_next_message(spi-master); - spin_unlock_irqrestore(as-lock, flags); + atmel_spi_unlock(as); return 0; } @@ -907,17 +915,16 @@ static void atmel_spi_cleanup(struct spi_device *spi) struct atmel_spi*as = spi_master_get_devdata(spi-master); struct atmel_spi_device *asd = spi-controller_state; unsignedgpio = (unsigned) spi-controller_data; - unsigned long flags; if (!asd) return; - spin_lock_irqsave(as-lock, flags); + atmel_spi_lock(as); if (as-stay == spi) { as-stay = NULL; cs_deactivate(as, spi); } - spin_unlock_irqrestore(as-lock, flags); + atmel_spi_unlock(as); spi-controller_state = NULL; gpio_free(gpio); -- 1.7.9.5 -- To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/