Skip to content

Commit ba7eab1

Browse files
committed
Merge branch 'at91-5.4-trunk/base_qspi' into linux-5.4-at91
2 parents 266f6b4 + 8fdcb60 commit ba7eab1

2 files changed

Lines changed: 111 additions & 35 deletions

File tree

drivers/spi/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ config SPI_AT91_USART
9595

9696
config SPI_ATMEL_QUADSPI
9797
tristate "Atmel Quad SPI Controller"
98-
depends on ARCH_AT91 || (ARM && COMPILE_TEST && !ARCH_EBSA110)
98+
depends on ARCH_AT91 || COMPILE_TEST
9999
depends on OF && HAS_IOMEM
100100
help
101101
This enables support for the Quad SPI controller in master mode.

drivers/spi/atmel-quadspi.c

Lines changed: 110 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,81 @@ static const struct atmel_qspi_mode atmel_qspi_modes[] = {
173173
{ 4, 4, 4, QSPI_IFR_WIDTH_QUAD_CMD },
174174
};
175175

176+
#ifdef VERBOSE_DEBUG
177+
static const char *atmel_qspi_reg_name(u32 offset, char *tmp, size_t sz)
178+
{
179+
switch (offset) {
180+
case QSPI_CR:
181+
return "CR";
182+
case QSPI_MR:
183+
return "MR";
184+
case QSPI_RD:
185+
return "MR";
186+
case QSPI_TD:
187+
return "TD";
188+
case QSPI_SR:
189+
return "SR";
190+
case QSPI_IER:
191+
return "IER";
192+
case QSPI_IDR:
193+
return "IDR";
194+
case QSPI_IMR:
195+
return "IMR";
196+
case QSPI_SCR:
197+
return "SCR";
198+
case QSPI_IAR:
199+
return "IAR";
200+
case QSPI_ICR:
201+
return "ICR/WICR";
202+
case QSPI_IFR:
203+
return "IFR";
204+
case QSPI_RICR:
205+
return "RICR";
206+
case QSPI_SMR:
207+
return "SMR";
208+
case QSPI_SKR:
209+
return "SKR";
210+
case QSPI_WPMR:
211+
return "WPMR";
212+
case QSPI_WPSR:
213+
return "WPSR";
214+
case QSPI_VERSION:
215+
return "VERSION";
216+
default:
217+
snprintf(tmp, sz, "0x%02x", offset);
218+
break;
219+
}
220+
221+
return tmp;
222+
}
223+
#endif /* VERBOSE_DEBUG */
224+
225+
static u32 atmel_qspi_read(struct atmel_qspi *aq, u32 offset)
226+
{
227+
u32 value = readl_relaxed(aq->regs + offset);
228+
229+
#ifdef VERBOSE_DEBUG
230+
char tmp[8];
231+
232+
dev_vdbg(&aq->pdev->dev, "read 0x%08x from %s\n", value,
233+
atmel_qspi_reg_name(offset, tmp, sizeof(tmp)));
234+
#endif /* VERBOSE_DEBUG */
235+
236+
return value;
237+
}
238+
239+
static void atmel_qspi_write(u32 value, struct atmel_qspi *aq, u32 offset)
240+
{
241+
#ifdef VERBOSE_DEBUG
242+
char tmp[8];
243+
244+
dev_vdbg(&aq->pdev->dev, "write 0x%08x into %s\n", value,
245+
atmel_qspi_reg_name(offset, tmp, sizeof(tmp)));
246+
#endif /* VERBOSE_DEBUG */
247+
248+
writel_relaxed(value, aq->regs + offset);
249+
}
250+
176251
static inline bool atmel_qspi_is_compatible(const struct spi_mem_op *op,
177252
const struct atmel_qspi_mode *mode)
178253
{
@@ -284,43 +359,44 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,
284359
if (dummy_cycles)
285360
ifr |= QSPI_IFR_NBDUM(dummy_cycles);
286361

287-
/* Set data enable */
288-
if (op->data.nbytes)
362+
/* Set data enable and data transfer type. */
363+
if (op->data.nbytes) {
289364
ifr |= QSPI_IFR_DATAEN;
290365

366+
if (op->addr.nbytes)
367+
ifr |= QSPI_IFR_TFRTYP_MEM;
368+
}
369+
291370
/*
292371
* If the QSPI controller is set in regular SPI mode, set it in
293372
* Serial Memory Mode (SMM).
294373
*/
295374
if (aq->mr != QSPI_MR_SMM) {
296-
writel_relaxed(QSPI_MR_SMM, aq->regs + QSPI_MR);
375+
atmel_qspi_write(QSPI_MR_SMM, aq, QSPI_MR);
297376
aq->mr = QSPI_MR_SMM;
298377
}
299378

300379
/* Clear pending interrupts */
301-
(void)readl_relaxed(aq->regs + QSPI_SR);
380+
(void)atmel_qspi_read(aq, QSPI_SR);
302381

303-
if (aq->caps->has_ricr) {
304-
if (!op->addr.nbytes && op->data.dir == SPI_MEM_DATA_IN)
305-
ifr |= QSPI_IFR_APBTFRTYP_READ;
382+
/* Set QSPI Instruction Frame registers. */
383+
if (op->addr.nbytes && !op->data.nbytes)
384+
atmel_qspi_write(iar, aq, QSPI_IAR);
306385

307-
/* Set QSPI Instruction Frame registers */
308-
writel_relaxed(iar, aq->regs + QSPI_IAR);
386+
if (aq->caps->has_ricr) {
309387
if (op->data.dir == SPI_MEM_DATA_IN)
310-
writel_relaxed(icr, aq->regs + QSPI_RICR);
388+
atmel_qspi_write(icr, aq, QSPI_RICR);
311389
else
312-
writel_relaxed(icr, aq->regs + QSPI_WICR);
313-
writel_relaxed(ifr, aq->regs + QSPI_IFR);
390+
atmel_qspi_write(icr, aq, QSPI_WICR);
314391
} else {
315-
if (op->data.dir == SPI_MEM_DATA_OUT)
392+
if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
316393
ifr |= QSPI_IFR_SAMA5D2_WRITE_TRSFR;
317394

318-
/* Set QSPI Instruction Frame registers */
319-
writel_relaxed(iar, aq->regs + QSPI_IAR);
320-
writel_relaxed(icr, aq->regs + QSPI_ICR);
321-
writel_relaxed(ifr, aq->regs + QSPI_IFR);
395+
atmel_qspi_write(icr, aq, QSPI_ICR);
322396
}
323397

398+
atmel_qspi_write(ifr, aq, QSPI_IFR);
399+
324400
return 0;
325401
}
326402

@@ -345,33 +421,33 @@ static int atmel_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
345421
/* Skip to the final steps if there is no data */
346422
if (op->data.nbytes) {
347423
/* Dummy read of QSPI_IFR to synchronize APB and AHB accesses */
348-
(void)readl_relaxed(aq->regs + QSPI_IFR);
424+
(void)atmel_qspi_read(aq, QSPI_IFR);
349425

350426
/* Send/Receive data */
351427
if (op->data.dir == SPI_MEM_DATA_IN)
352-
_memcpy_fromio(op->data.buf.in, aq->mem + offset,
353-
op->data.nbytes);
428+
memcpy_fromio(op->data.buf.in, aq->mem + offset,
429+
op->data.nbytes);
354430
else
355-
_memcpy_toio(aq->mem + offset, op->data.buf.out,
356-
op->data.nbytes);
431+
memcpy_toio(aq->mem + offset, op->data.buf.out,
432+
op->data.nbytes);
357433

358434
/* Release the chip-select */
359-
writel_relaxed(QSPI_CR_LASTXFER, aq->regs + QSPI_CR);
435+
atmel_qspi_write(QSPI_CR_LASTXFER, aq, QSPI_CR);
360436
}
361437

362438
/* Poll INSTRuction End status */
363-
sr = readl_relaxed(aq->regs + QSPI_SR);
439+
sr = atmel_qspi_read(aq, QSPI_SR);
364440
if ((sr & QSPI_SR_CMD_COMPLETED) == QSPI_SR_CMD_COMPLETED)
365441
return err;
366442

367443
/* Wait for INSTRuction End interrupt */
368444
reinit_completion(&aq->cmd_completion);
369445
aq->pending = sr & QSPI_SR_CMD_COMPLETED;
370-
writel_relaxed(QSPI_SR_CMD_COMPLETED, aq->regs + QSPI_IER);
446+
atmel_qspi_write(QSPI_SR_CMD_COMPLETED, aq, QSPI_IER);
371447
if (!wait_for_completion_timeout(&aq->cmd_completion,
372448
msecs_to_jiffies(1000)))
373449
err = -ETIMEDOUT;
374-
writel_relaxed(QSPI_SR_CMD_COMPLETED, aq->regs + QSPI_IDR);
450+
atmel_qspi_write(QSPI_SR_CMD_COMPLETED, aq, QSPI_IDR);
375451

376452
return err;
377453
}
@@ -410,31 +486,31 @@ static int atmel_qspi_setup(struct spi_device *spi)
410486
scbr--;
411487

412488
aq->scr = QSPI_SCR_SCBR(scbr);
413-
writel_relaxed(aq->scr, aq->regs + QSPI_SCR);
489+
atmel_qspi_write(aq->scr, aq, QSPI_SCR);
414490

415491
return 0;
416492
}
417493

418494
static void atmel_qspi_init(struct atmel_qspi *aq)
419495
{
420496
/* Reset the QSPI controller */
421-
writel_relaxed(QSPI_CR_SWRST, aq->regs + QSPI_CR);
497+
atmel_qspi_write(QSPI_CR_SWRST, aq, QSPI_CR);
422498

423499
/* Set the QSPI controller by default in Serial Memory Mode */
424-
writel_relaxed(QSPI_MR_SMM, aq->regs + QSPI_MR);
500+
atmel_qspi_write(QSPI_MR_SMM, aq, QSPI_MR);
425501
aq->mr = QSPI_MR_SMM;
426502

427503
/* Enable the QSPI controller */
428-
writel_relaxed(QSPI_CR_QSPIEN, aq->regs + QSPI_CR);
504+
atmel_qspi_write(QSPI_CR_QSPIEN, aq, QSPI_CR);
429505
}
430506

431507
static irqreturn_t atmel_qspi_interrupt(int irq, void *dev_id)
432508
{
433509
struct atmel_qspi *aq = dev_id;
434510
u32 status, mask, pending;
435511

436-
status = readl_relaxed(aq->regs + QSPI_SR);
437-
mask = readl_relaxed(aq->regs + QSPI_IMR);
512+
status = atmel_qspi_read(aq, QSPI_SR);
513+
mask = atmel_qspi_read(aq, QSPI_IMR);
438514
pending = status & mask;
439515

440516
if (!pending)
@@ -569,7 +645,7 @@ static int atmel_qspi_remove(struct platform_device *pdev)
569645
struct atmel_qspi *aq = spi_controller_get_devdata(ctrl);
570646

571647
spi_unregister_controller(ctrl);
572-
writel_relaxed(QSPI_CR_QSPIDIS, aq->regs + QSPI_CR);
648+
atmel_qspi_write(QSPI_CR_QSPIDIS, aq, QSPI_CR);
573649
clk_disable_unprepare(aq->qspick);
574650
clk_disable_unprepare(aq->pclk);
575651
return 0;
@@ -596,7 +672,7 @@ static int __maybe_unused atmel_qspi_resume(struct device *dev)
596672

597673
atmel_qspi_init(aq);
598674

599-
writel_relaxed(aq->scr, aq->regs + QSPI_SCR);
675+
atmel_qspi_write(aq->scr, aq, QSPI_SCR);
600676

601677
return 0;
602678
}

0 commit comments

Comments
 (0)