Re: [PATCH 04/10] mtd: spi-nor: aspeed: add support for SPI dual IO read mode

Marek Vasut
2017-04-11T11:24:46Z

On 04/11/2017 10:53 AM, Cédric Le Goater wrote:
> On 04/06/2017 09:21 PM, Marek Vasut wrote:
>> On 04/06/2017 06:56 PM, Cédric Le Goater wrote:
>>> From: Robert Lippert <roblip@gmail.com>
>>>
>>> Implements support for the dual IO read mode on aspeed SMC/FMC
>>> controllers which uses both MISO and MOSI lines for data during a read
>>> to double the read bandwidth.
>>>
>>> Signed-off-by: Robert Lippert <rlippert@google.com>
>>> [clg: adapted to mainline driver ]
>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>> ---
>>> drivers/mtd/spi-nor/aspeed-smc.c | 20 +++++++++++++-------
>>> 1 file changed, 13 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/drivers/mtd/spi-nor/aspeed-smc.c b/drivers/mtd/spi-nor/aspeed-smc.c
>>> index 7dfa1ea0a787..b3c8cfe29765 100644
>>> --- a/drivers/mtd/spi-nor/aspeed-smc.c
>>> +++ b/drivers/mtd/spi-nor/aspeed-smc.c
>>> @@ -512,6 +512,7 @@ static ssize_t aspeed_smc_read_user(struct spi_nor *nor, loff_t from,
>>> int i;
>>> u8 dummy = 0xFF;
>>> int ret;
>>> + u32 ctl;
>>>
>>> if (aspeed_smc_dma_check(chip, from, len)) {
>>> ret = aspeed_smc_dma_start(chip, from, read_buf, len, 0);
>>> @@ -525,6 +526,13 @@ static ssize_t aspeed_smc_read_user(struct spi_nor *nor, loff_t from,
>>> for (i = 0; i < chip->nor.read_dummy / 8; i++)
>>> aspeed_smc_write_to_ahb(chip->ahb_base, &dummy, sizeof(dummy));
>>>
>>> + if (chip->nor.flash_read == SPI_NOR_DUAL) {
>>> + /* Switch to dual I/O mode for data cycle */
>>> + ctl = readl(chip->ctl) & ~CONTROL_IO_MODE_MASK;
>>> + ctl |= CONTROL_IO_DUAL_DATA;
>>> + writel(ctl, chip->ctl);
>>> + }
>>> +
>> Can't you switch the mode at runtime ? If you do, who'll clear the
>> CONTROL_IO_DUAL_DATA in this ctl register if you switch to SINGLE
>> mode for some command ?
>
> This is the read routine in User mode. When the read is completed,
> the previous (and default) setting of the control register is restored
> with a call to aspeed_smc_stop_user() but you don't see it in the diff
> hunk above.
>
> The default setting of the control register is used when the controller
> is in Command mode. That is when reads are performed 'automatically'
> from the AHB bus.

Ah, OK, thanks for clarifying.

--
Best regards,
Marek Vasut