@@ -331,7 +331,7 @@ static int stm32_qspi_send(struct spi_mem *mem, const struct spi_mem_op *op)
331331{
332332 struct stm32_qspi * qspi = spi_controller_get_devdata (mem -> spi -> master );
333333 struct stm32_qspi_flash * flash = & qspi -> flash [mem -> spi -> chip_select ];
334- u32 ccr , cr , addr_max ;
334+ u32 ccr , cr ;
335335 int timeout , err = 0 ;
336336
337337 dev_dbg (qspi -> dev , "cmd:%#x mode:%d.%d.%d.%d addr:%#llx len:%#x\n" ,
@@ -343,18 +343,6 @@ static int stm32_qspi_send(struct spi_mem *mem, const struct spi_mem_op *op)
343343 if (err )
344344 goto abort ;
345345
346- addr_max = op -> addr .val + op -> data .nbytes + 1 ;
347-
348- if (op -> data .dir == SPI_MEM_DATA_IN ) {
349- if (addr_max < qspi -> mm_size &&
350- op -> addr .buswidth )
351- qspi -> fmode = CCR_FMODE_MM ;
352- else
353- qspi -> fmode = CCR_FMODE_INDR ;
354- } else {
355- qspi -> fmode = CCR_FMODE_INDW ;
356- }
357-
358346 cr = readl_relaxed (qspi -> io_base + QSPI_CR );
359347 cr &= ~CR_PRESC_MASK & ~CR_FSEL ;
360348 cr |= FIELD_PREP (CR_PRESC_MASK , flash -> presc );
@@ -364,8 +352,6 @@ static int stm32_qspi_send(struct spi_mem *mem, const struct spi_mem_op *op)
364352 if (op -> data .nbytes )
365353 writel_relaxed (op -> data .nbytes - 1 ,
366354 qspi -> io_base + QSPI_DLR );
367- else
368- qspi -> fmode = CCR_FMODE_INDW ;
369355
370356 ccr = qspi -> fmode ;
371357 ccr |= FIELD_PREP (CCR_INST_MASK , op -> cmd .opcode );
@@ -441,6 +427,11 @@ static int stm32_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
441427 }
442428
443429 mutex_lock (& qspi -> lock );
430+ if (op -> data .dir == SPI_MEM_DATA_IN && op -> data .nbytes )
431+ qspi -> fmode = CCR_FMODE_INDR ;
432+ else
433+ qspi -> fmode = CCR_FMODE_INDW ;
434+
444435 ret = stm32_qspi_send (mem , op );
445436 mutex_unlock (& qspi -> lock );
446437
@@ -450,6 +441,64 @@ static int stm32_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
450441 return ret ;
451442}
452443
444+ static int stm32_qspi_dirmap_create (struct spi_mem_dirmap_desc * desc )
445+ {
446+ struct stm32_qspi * qspi = spi_controller_get_devdata (desc -> mem -> spi -> master );
447+
448+ if (desc -> info .op_tmpl .data .dir == SPI_MEM_DATA_OUT )
449+ return - EOPNOTSUPP ;
450+
451+ /* should never happen, as mm_base == null is an error probe exit condition */
452+ if (!qspi -> mm_base && desc -> info .op_tmpl .data .dir == SPI_MEM_DATA_IN )
453+ return - EOPNOTSUPP ;
454+
455+ if (!qspi -> mm_size )
456+ return - EOPNOTSUPP ;
457+
458+ return 0 ;
459+ }
460+
461+ static ssize_t stm32_qspi_dirmap_read (struct spi_mem_dirmap_desc * desc ,
462+ u64 offs , size_t len , void * buf )
463+ {
464+ struct stm32_qspi * qspi = spi_controller_get_devdata (desc -> mem -> spi -> master );
465+ struct spi_mem_op op ;
466+ u32 addr_max ;
467+ int ret ;
468+
469+ ret = pm_runtime_get_sync (qspi -> dev );
470+ if (ret < 0 ) {
471+ pm_runtime_put_noidle (qspi -> dev );
472+ return ret ;
473+ }
474+
475+ mutex_lock (& qspi -> lock );
476+ /* make a local copy of desc op_tmpl and complete dirmap rdesc
477+ * spi_mem_op template with offs, len and *buf in order to get
478+ * all needed transfer information into struct spi_mem_op
479+ */
480+ memcpy (& op , & desc -> info .op_tmpl , sizeof (struct spi_mem_op ));
481+ dev_dbg (qspi -> dev , "%s len = 0x%x offs = 0x%llx buf = 0x%p\n" , __func__ , len , offs , buf );
482+
483+ op .data .nbytes = len ;
484+ op .addr .val = desc -> info .offset + offs ;
485+ op .data .buf .in = buf ;
486+
487+ addr_max = op .addr .val + op .data .nbytes + 1 ;
488+ if (addr_max < qspi -> mm_size && op .addr .buswidth )
489+ qspi -> fmode = CCR_FMODE_MM ;
490+ else
491+ qspi -> fmode = CCR_FMODE_INDR ;
492+
493+ ret = stm32_qspi_send (desc -> mem , & op );
494+ mutex_unlock (& qspi -> lock );
495+
496+ pm_runtime_mark_last_busy (qspi -> dev );
497+ pm_runtime_put_autosuspend (qspi -> dev );
498+
499+ return ret ?: len ;
500+ }
501+
453502static int stm32_qspi_setup (struct spi_device * spi )
454503{
455504 struct spi_controller * ctrl = spi -> master ;
@@ -555,7 +604,9 @@ static void stm32_qspi_dma_free(struct stm32_qspi *qspi)
555604 * to check supported mode.
556605 */
557606static const struct spi_controller_mem_ops stm32_qspi_mem_ops = {
558- .exec_op = stm32_qspi_exec_op ,
607+ .exec_op = stm32_qspi_exec_op ,
608+ .dirmap_create = stm32_qspi_dirmap_create ,
609+ .dirmap_read = stm32_qspi_dirmap_read ,
559610};
560611
561612static int stm32_qspi_probe (struct platform_device * pdev )
0 commit comments