@@ -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+
176251static 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
418494static 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
431507static 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