From: Marek Vasut <marex-ynQEQJNshbs@public.gmane.org>
To: Trent Piepho <tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: Fabio Estevam
<fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org>,
spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org,
Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH 1/5] spi/mxs: Fix extra CS pulses and read mode in multi-transfer messages
Date: Tue, 2 Apr 2013 01:11:13 +0200 [thread overview]
Message-ID: <201304020111.13969.marex@denx.de> (raw)
In-Reply-To: <1364570381-17605-1-git-send-email-tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Dear Trent Piepho,
> There are two bits which control the CS line in the CTRL0 register:
> LOCK_CS and IGNORE_CRC. The latter would be better named DEASSERT_CS
> in SPI mode.
>
> LOCK_CS keeps CS asserted though the entire transfer. This should
> always be set. The DMA code will always set it, explicitly on the
> first segment of the first transfer, and then implicitly on all the
> rest by never clearing the bit from the value read from the ctrl0
> register.
>
> The only reason to not set LOCK_CS would be to attempt an altered
> protocol where CS pulses between each word. Though don't get your
> hopes up, as the hardware doesn't appear to do this in any sane
> manner.
>
> Setting DEASSERT_CS causes CS to be de-asserted at the end of the
> transfer. It would normally be set on the final segment of the final
> transfer. The DMA code explicitly sets it in this case, but because
> it never clears the bit from the ctrl0 register is will remain set for
> all transfers in subsequent messages. This results in a CS pulse
> between transfers.
>
> There is a similar problem with the read mode bit never being cleared
> in DMA mode.
>
> The spi transfer "cs_change" flag is ignored by the driver.
>
> The driver passes a "first" and "last" flag to the transfer functions
> for a message, so they can know how to set these bits. It does this
> by passing them as pointers. There is no reason to do this, as the
> flags are not modified in the transfer function. And since LOCK_CS
> can be set and left that way, there is no need for a "first" flag at
> all.
>
> This patch fixes DEASSERT_CS and READ being left on in DMA mode,
> eliminates the flags being passed as separate pointers, and adds
> support for the cs_change flag.
>
> Note that while using the cs_change flag to leave CS asserted after
> the final transfer works, getting the CS to automatically turn off
> when a different slave is addressed might not work.
>
> Signed-off-by: Trent Piepho <tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> Cc: Marek Vasut <marex-ynQEQJNshbs@public.gmane.org>
> Cc: Fabio Estevam <fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org>
> Cc: Shawn Guo <shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
> ---
> drivers/spi/spi-mxs.c | 86
> +++++++++++++++++++++---------------------------- 1 file changed, 36
> insertions(+), 50 deletions(-)
>
> diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c
> index 22a0af0..aa77d96b9 100644
> --- a/drivers/spi/spi-mxs.c
> +++ b/drivers/spi/spi-mxs.c
> @@ -58,6 +58,11 @@
>
> #define SG_MAXLEN 0xff00
>
> +/* Flags for txrx functions. More efficient that using an argument
> register for + * each one. */
Fix the comment please.
/*
* Multiline comment should really
* be like this.
*/
> +#define TXRX_WRITE 1 /* This is a write */
> +#define TXRX_DEASSERT_CS 2 /* De-assert CS at end of txrx */
New flags? I'm sure the GCC can optimize function parameters pretty well, esp.
if you make the bool.
> struct mxs_spi {
> struct mxs_ssp ssp;
> struct completion c;
> @@ -91,6 +96,8 @@ static int mxs_spi_setup_transfer(struct spi_device *dev,
>
> mxs_ssp_set_clk_rate(ssp, hz);
>
> + writel(BM_SSP_CTRL0_LOCK_CS,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> writel(BF_SSP_CTRL1_SSP_MODE(BV_SSP_CTRL1_SSP_MODE__SPI) |
> BF_SSP_CTRL1_WORD_LENGTH
> (BV_SSP_CTRL1_WORD_LENGTH__EIGHT_BITS) |
> @@ -155,26 +162,6 @@ static void mxs_spi_set_cs(struct mxs_spi *spi,
> unsigned cs) writel(select, ssp->base + HW_SSP_CTRL0 +
> STMP_OFFSET_REG_SET);
> }
>
> -static inline void mxs_spi_enable(struct mxs_spi *spi)
> -{
> - struct mxs_ssp *ssp = &spi->ssp;
> -
> - writel(BM_SSP_CTRL0_LOCK_CS,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> - writel(BM_SSP_CTRL0_IGNORE_CRC,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
> -}
> -
> -static inline void mxs_spi_disable(struct mxs_spi *spi)
> -{
> - struct mxs_ssp *ssp = &spi->ssp;
> -
> - writel(BM_SSP_CTRL0_LOCK_CS,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
> - writel(BM_SSP_CTRL0_IGNORE_CRC,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> -}
> -
> static int mxs_ssp_wait(struct mxs_spi *spi, int offset, int mask, bool
> set) {
> const unsigned long timeout = jiffies + msecs_to_jiffies(SSP_TIMEOUT);
> @@ -214,7 +201,7 @@ static irqreturn_t mxs_ssp_irq_handler(int irq, void
> *dev_id)
>
> static int mxs_spi_txrx_dma(struct mxs_spi *spi, int cs,
> unsigned char *buf, int len,
> - int *first, int *last, int write)
> + unsigned int flags)
> {
> struct mxs_ssp *ssp = &spi->ssp;
> struct dma_async_tx_descriptor *desc = NULL;
> @@ -241,20 +228,21 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs, INIT_COMPLETION(spi->c);
>
> ctrl0 = readl(ssp->base + HW_SSP_CTRL0);
> - ctrl0 &= ~BM_SSP_CTRL0_XFER_COUNT;
> + ctrl0 &= ~BM_SSP_CTRL0_XFER_COUNT & ~BM_SSP_CTRL0_IGNORE_CRC &
> + ~BM_SSP_CTRL0_READ;
Well ... ctrl0 &= ~(FOO | BAR | BAZ); ... won't cut it?
> ctrl0 |= BM_SSP_CTRL0_DATA_XFER | mxs_spi_cs_to_reg(cs);
>
> - if (*first)
> - ctrl0 |= BM_SSP_CTRL0_LOCK_CS;
The DMA will overwrite ctrl0 in each turn, did you try very long (>64kB long)
transfers with your adjustments? To test this, you can try
$ dd if=/dev/mtdN of=/dev/null bs=1M
on sufficiently large SPI flash supporting the FAST_READ opcode.
> - if (!write)
> + if (!(flags & TXRX_WRITE))
> ctrl0 |= BM_SSP_CTRL0_READ;
>
> /* Queue the DMA data transfer. */
> for (sg_count = 0; sg_count < sgs; sg_count++) {
> + /* Prepare the transfer descriptor. */
> min = min(len, desc_len);
>
> - /* Prepare the transfer descriptor. */
> - if ((sg_count + 1 == sgs) && *last)
> + /* De-assert CS on last segment if flag is set (i.e., no more
> + * transfers will follow) */
Wrong multi-line comment. See Documentation/CodingStyle chapter 8.
> + if ((sg_count + 1 == sgs) && (flags & TXRX_DEASSERT_CS))
> ctrl0 |= BM_SSP_CTRL0_IGNORE_CRC;
>
> if (ssp->devid == IMX23_SSP) {
> @@ -279,7 +267,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs,
>
> sg_init_one(&dma_xfer[sg_count].sg, sg_buf, min);
> ret = dma_map_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
> - write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> + (flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
I think this is unneeded.
> len -= min;
> buf += min;
> @@ -299,7 +287,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs,
>
> desc = dmaengine_prep_slave_sg(ssp->dmach,
> &dma_xfer[sg_count].sg, 1,
> - write ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
> + (flags & TXRX_WRITE) ? DMA_MEM_TO_DEV :
DMA_DEV_TO_MEM,
> DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
>
> if (!desc) {
> @@ -336,7 +324,7 @@ err_vmalloc:
> while (--sg_count >= 0) {
> err_mapped:
> dma_unmap_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
> - write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> + (flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> }
>
> kfree(dma_xfer);
> @@ -346,18 +334,20 @@ err_mapped:
>
> static int mxs_spi_txrx_pio(struct mxs_spi *spi, int cs,
> unsigned char *buf, int len,
> - int *first, int *last, int write)
> + unsigned int flags)
> {
> struct mxs_ssp *ssp = &spi->ssp;
>
> - if (*first)
> - mxs_spi_enable(spi);
> + /* Clear this now, set it on last transfer if needed */
> + writel(BM_SSP_CTRL0_IGNORE_CRC,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
>
> mxs_spi_set_cs(spi, cs);
>
> while (len--) {
> - if (*last && len == 0)
> - mxs_spi_disable(spi);
> + if (len == 0 && (flags & TXRX_DEASSERT_CS))
> + writel(BM_SSP_CTRL0_IGNORE_CRC,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
Ok, I'll stop here. You mixed two kinds of changes here:
1) The "fixup" of the flags
2) The adjustments to handling the IGNORE_CRC and LOCK_CS
Split the patch please.
------------------------------------------------------------------------------
Own the Future-Intel® Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest.
Compete for recognition, cash, and the chance to get your game
on Steam. $5K grand prize plus 10 genre and skill prizes.
Submit your demo by 6/6/13. http://p.sf.net/sfu/intel_levelupd2d
WARNING: multiple messages have this Message-ID (diff)
From: marex@denx.de (Marek Vasut)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/5] spi/mxs: Fix extra CS pulses and read mode in multi-transfer messages
Date: Tue, 2 Apr 2013 01:11:13 +0200 [thread overview]
Message-ID: <201304020111.13969.marex@denx.de> (raw)
In-Reply-To: <1364570381-17605-1-git-send-email-tpiepho@gmail.com>
Dear Trent Piepho,
> There are two bits which control the CS line in the CTRL0 register:
> LOCK_CS and IGNORE_CRC. The latter would be better named DEASSERT_CS
> in SPI mode.
>
> LOCK_CS keeps CS asserted though the entire transfer. This should
> always be set. The DMA code will always set it, explicitly on the
> first segment of the first transfer, and then implicitly on all the
> rest by never clearing the bit from the value read from the ctrl0
> register.
>
> The only reason to not set LOCK_CS would be to attempt an altered
> protocol where CS pulses between each word. Though don't get your
> hopes up, as the hardware doesn't appear to do this in any sane
> manner.
>
> Setting DEASSERT_CS causes CS to be de-asserted at the end of the
> transfer. It would normally be set on the final segment of the final
> transfer. The DMA code explicitly sets it in this case, but because
> it never clears the bit from the ctrl0 register is will remain set for
> all transfers in subsequent messages. This results in a CS pulse
> between transfers.
>
> There is a similar problem with the read mode bit never being cleared
> in DMA mode.
>
> The spi transfer "cs_change" flag is ignored by the driver.
>
> The driver passes a "first" and "last" flag to the transfer functions
> for a message, so they can know how to set these bits. It does this
> by passing them as pointers. There is no reason to do this, as the
> flags are not modified in the transfer function. And since LOCK_CS
> can be set and left that way, there is no need for a "first" flag at
> all.
>
> This patch fixes DEASSERT_CS and READ being left on in DMA mode,
> eliminates the flags being passed as separate pointers, and adds
> support for the cs_change flag.
>
> Note that while using the cs_change flag to leave CS asserted after
> the final transfer works, getting the CS to automatically turn off
> when a different slave is addressed might not work.
>
> Signed-off-by: Trent Piepho <tpiepho@gmail.com>
> Cc: Marek Vasut <marex@denx.de>
> Cc: Fabio Estevam <fabio.estevam@freescale.com>
> Cc: Shawn Guo <shawn.guo@linaro.org>
> ---
> drivers/spi/spi-mxs.c | 86
> +++++++++++++++++++++---------------------------- 1 file changed, 36
> insertions(+), 50 deletions(-)
>
> diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c
> index 22a0af0..aa77d96b9 100644
> --- a/drivers/spi/spi-mxs.c
> +++ b/drivers/spi/spi-mxs.c
> @@ -58,6 +58,11 @@
>
> #define SG_MAXLEN 0xff00
>
> +/* Flags for txrx functions. More efficient that using an argument
> register for + * each one. */
Fix the comment please.
/*
* Multiline comment should really
* be like this.
*/
> +#define TXRX_WRITE 1 /* This is a write */
> +#define TXRX_DEASSERT_CS 2 /* De-assert CS at end of txrx */
New flags? I'm sure the GCC can optimize function parameters pretty well, esp.
if you make the bool.
> struct mxs_spi {
> struct mxs_ssp ssp;
> struct completion c;
> @@ -91,6 +96,8 @@ static int mxs_spi_setup_transfer(struct spi_device *dev,
>
> mxs_ssp_set_clk_rate(ssp, hz);
>
> + writel(BM_SSP_CTRL0_LOCK_CS,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> writel(BF_SSP_CTRL1_SSP_MODE(BV_SSP_CTRL1_SSP_MODE__SPI) |
> BF_SSP_CTRL1_WORD_LENGTH
> (BV_SSP_CTRL1_WORD_LENGTH__EIGHT_BITS) |
> @@ -155,26 +162,6 @@ static void mxs_spi_set_cs(struct mxs_spi *spi,
> unsigned cs) writel(select, ssp->base + HW_SSP_CTRL0 +
> STMP_OFFSET_REG_SET);
> }
>
> -static inline void mxs_spi_enable(struct mxs_spi *spi)
> -{
> - struct mxs_ssp *ssp = &spi->ssp;
> -
> - writel(BM_SSP_CTRL0_LOCK_CS,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> - writel(BM_SSP_CTRL0_IGNORE_CRC,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
> -}
> -
> -static inline void mxs_spi_disable(struct mxs_spi *spi)
> -{
> - struct mxs_ssp *ssp = &spi->ssp;
> -
> - writel(BM_SSP_CTRL0_LOCK_CS,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
> - writel(BM_SSP_CTRL0_IGNORE_CRC,
> - ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
> -}
> -
> static int mxs_ssp_wait(struct mxs_spi *spi, int offset, int mask, bool
> set) {
> const unsigned long timeout = jiffies + msecs_to_jiffies(SSP_TIMEOUT);
> @@ -214,7 +201,7 @@ static irqreturn_t mxs_ssp_irq_handler(int irq, void
> *dev_id)
>
> static int mxs_spi_txrx_dma(struct mxs_spi *spi, int cs,
> unsigned char *buf, int len,
> - int *first, int *last, int write)
> + unsigned int flags)
> {
> struct mxs_ssp *ssp = &spi->ssp;
> struct dma_async_tx_descriptor *desc = NULL;
> @@ -241,20 +228,21 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs, INIT_COMPLETION(spi->c);
>
> ctrl0 = readl(ssp->base + HW_SSP_CTRL0);
> - ctrl0 &= ~BM_SSP_CTRL0_XFER_COUNT;
> + ctrl0 &= ~BM_SSP_CTRL0_XFER_COUNT & ~BM_SSP_CTRL0_IGNORE_CRC &
> + ~BM_SSP_CTRL0_READ;
Well ... ctrl0 &= ~(FOO | BAR | BAZ); ... won't cut it?
> ctrl0 |= BM_SSP_CTRL0_DATA_XFER | mxs_spi_cs_to_reg(cs);
>
> - if (*first)
> - ctrl0 |= BM_SSP_CTRL0_LOCK_CS;
The DMA will overwrite ctrl0 in each turn, did you try very long (>64kB long)
transfers with your adjustments? To test this, you can try
$ dd if=/dev/mtdN of=/dev/null bs=1M
on sufficiently large SPI flash supporting the FAST_READ opcode.
> - if (!write)
> + if (!(flags & TXRX_WRITE))
> ctrl0 |= BM_SSP_CTRL0_READ;
>
> /* Queue the DMA data transfer. */
> for (sg_count = 0; sg_count < sgs; sg_count++) {
> + /* Prepare the transfer descriptor. */
> min = min(len, desc_len);
>
> - /* Prepare the transfer descriptor. */
> - if ((sg_count + 1 == sgs) && *last)
> + /* De-assert CS on last segment if flag is set (i.e., no more
> + * transfers will follow) */
Wrong multi-line comment. See Documentation/CodingStyle chapter 8.
> + if ((sg_count + 1 == sgs) && (flags & TXRX_DEASSERT_CS))
> ctrl0 |= BM_SSP_CTRL0_IGNORE_CRC;
>
> if (ssp->devid == IMX23_SSP) {
> @@ -279,7 +267,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs,
>
> sg_init_one(&dma_xfer[sg_count].sg, sg_buf, min);
> ret = dma_map_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
> - write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> + (flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
I think this is unneeded.
> len -= min;
> buf += min;
> @@ -299,7 +287,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int
> cs,
>
> desc = dmaengine_prep_slave_sg(ssp->dmach,
> &dma_xfer[sg_count].sg, 1,
> - write ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
> + (flags & TXRX_WRITE) ? DMA_MEM_TO_DEV :
DMA_DEV_TO_MEM,
> DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
>
> if (!desc) {
> @@ -336,7 +324,7 @@ err_vmalloc:
> while (--sg_count >= 0) {
> err_mapped:
> dma_unmap_sg(ssp->dev, &dma_xfer[sg_count].sg, 1,
> - write ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> + (flags & TXRX_WRITE) ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
> }
>
> kfree(dma_xfer);
> @@ -346,18 +334,20 @@ err_mapped:
>
> static int mxs_spi_txrx_pio(struct mxs_spi *spi, int cs,
> unsigned char *buf, int len,
> - int *first, int *last, int write)
> + unsigned int flags)
> {
> struct mxs_ssp *ssp = &spi->ssp;
>
> - if (*first)
> - mxs_spi_enable(spi);
> + /* Clear this now, set it on last transfer if needed */
> + writel(BM_SSP_CTRL0_IGNORE_CRC,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
>
> mxs_spi_set_cs(spi, cs);
>
> while (len--) {
> - if (*last && len == 0)
> - mxs_spi_disable(spi);
> + if (len == 0 && (flags & TXRX_DEASSERT_CS))
> + writel(BM_SSP_CTRL0_IGNORE_CRC,
> + ssp->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
Ok, I'll stop here. You mixed two kinds of changes here:
1) The "fixup" of the flags
2) The adjustments to handling the IGNORE_CRC and LOCK_CS
Split the patch please.
next prev parent reply other threads:[~2013-04-01 23:11 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-29 15:19 [PATCH 1/5] spi/mxs: Fix extra CS pulses and read mode in multi-transfer messages Trent Piepho
2013-03-29 15:19 ` Trent Piepho
[not found] ` <1364570381-17605-1-git-send-email-tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-03-29 15:19 ` [PATCH 2/5] spi/mxs: Fix chip select control bits in DMA mode Trent Piepho
2013-03-29 15:19 ` Trent Piepho
[not found] ` <1364570381-17605-2-git-send-email-tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-01 23:13 ` Marek Vasut
2013-04-01 23:13 ` Marek Vasut
[not found] ` <201304020113.42124.marex-ynQEQJNshbs@public.gmane.org>
2013-04-01 23:27 ` Trent Piepho
2013-04-01 23:27 ` Trent Piepho
[not found] ` <CA+7tXih2wAVeLpVoYkt4Tmo3h0YtLoZY3vCcv5s8sUD1u8_BVQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-01 23:30 ` Marek Vasut
2013-04-01 23:30 ` Marek Vasut
[not found] ` <201304020130.51951.marex-ynQEQJNshbs@public.gmane.org>
2013-04-01 23:40 ` Trent Piepho
2013-04-01 23:40 ` Trent Piepho
[not found] ` <CA+7tXij_V1iAdPuPoTQ6CK6U5Y-iJprCPsTj=_LHAV1-=CL7gA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-02 0:02 ` Marek Vasut
2013-04-02 0:02 ` Marek Vasut
[not found] ` <201304020202.43501.marex-ynQEQJNshbs@public.gmane.org>
2013-04-02 1:58 ` Trent Piepho
2013-04-02 1:58 ` Trent Piepho
2013-03-29 15:19 ` [PATCH 3/5] spi/mxs: Remove full duplex check, spi core already does it Trent Piepho
2013-03-29 15:19 ` Trent Piepho
2013-03-29 15:19 ` [PATCH 4/5] spi/mxs: Remove bogus setting of ssp clk rate field Trent Piepho
2013-03-29 15:19 ` Trent Piepho
[not found] ` <1364570381-17605-4-git-send-email-tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-01 23:16 ` Marek Vasut
2013-04-01 23:16 ` Marek Vasut
[not found] ` <201304020116.04781.marex-ynQEQJNshbs@public.gmane.org>
2013-04-01 23:32 ` Trent Piepho
2013-04-01 23:32 ` Trent Piepho
[not found] ` <CA+7tXihhL2ETT+AgvX5KASZOOgi6bucModE88ztY9Q8U1gDbOQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-01 23:37 ` Marek Vasut
2013-04-01 23:37 ` Marek Vasut
2013-04-02 0:07 ` Trent Piepho
2013-04-02 0:07 ` Trent Piepho
[not found] ` <CA+7tXihfDnmkTJGzk_yvRKYwb5mJzzLJVV+XupCEGnmpQdKDLQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-02 0:29 ` Marek Vasut
2013-04-02 0:29 ` Marek Vasut
2013-03-29 15:19 ` [PATCH 5/5] spi/mxs: Fix multiple slave bug and don't set clock for each xfer Trent Piepho
2013-03-29 15:19 ` Trent Piepho
[not found] ` <1364570381-17605-5-git-send-email-tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2013-04-01 23:18 ` Marek Vasut
2013-04-01 23:18 ` Marek Vasut
2013-04-01 23:11 ` Marek Vasut [this message]
2013-04-01 23:11 ` [PATCH 1/5] spi/mxs: Fix extra CS pulses and read mode in multi-transfer messages Marek Vasut
[not found] ` <201304020111.13969.marex-ynQEQJNshbs@public.gmane.org>
2013-04-02 1:24 ` Trent Piepho
2013-04-02 1:24 ` Trent Piepho
[not found] ` <CA+7tXigx=qcDDJZGAx7JEX+Y-CDG-B0xyYgs6fHbUZofH7gnKw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-02 4:22 ` Marek Vasut
2013-04-02 4:22 ` Marek Vasut
[not found] ` <201304020622.52429.marex-ynQEQJNshbs@public.gmane.org>
2013-04-02 7:11 ` Trent Piepho
2013-04-02 7:11 ` Trent Piepho
[not found] ` <CA+7tXigvg+5k0Baa12CVwP5Ar7HUsJ8ihB19xrav4CNA6ZMFiA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-02 10:32 ` Marek Vasut
2013-04-02 10:32 ` Marek Vasut
[not found] ` <201304021232.12736.marex-ynQEQJNshbs@public.gmane.org>
2013-04-02 12:40 ` Trent Piepho
2013-04-02 12:40 ` Trent Piepho
[not found] ` <CA+7tXii8xhZQeKU2dTN26LxySNXhJT9NgRXcJ21cOX64qYj1NA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-04-02 23:39 ` Marek Vasut
2013-04-02 23:39 ` Marek Vasut
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=201304020111.13969.marex@denx.de \
--to=marex-ynqeqjnshbs@public.gmane.org \
--cc=fabio.estevam-KZfg59tc24xl57MIdRCFDg@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=shawn.guo-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org \
--cc=tpiepho-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.