Lines Matching full:mem
12 #include <linux/spi/spi-mem.h>
104 static int spi_check_buswidth_req(struct spi_mem *mem, u8 buswidth, bool tx) in spi_check_buswidth_req() argument
106 u32 mode = mem->spi->mode; in spi_check_buswidth_req()
142 static bool spi_mem_check_buswidth(struct spi_mem *mem, in spi_mem_check_buswidth() argument
145 if (spi_check_buswidth_req(mem, op->cmd.buswidth, true)) in spi_mem_check_buswidth()
149 spi_check_buswidth_req(mem, op->addr.buswidth, true)) in spi_mem_check_buswidth()
153 spi_check_buswidth_req(mem, op->dummy.buswidth, true)) in spi_mem_check_buswidth()
157 spi_check_buswidth_req(mem, op->data.buswidth, in spi_mem_check_buswidth()
164 bool spi_mem_default_supports_op(struct spi_mem *mem, in spi_mem_default_supports_op() argument
167 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_default_supports_op()
190 if (op->max_freq && mem->spi->controller->min_speed_hz && in spi_mem_default_supports_op()
191 op->max_freq < mem->spi->controller->min_speed_hz) in spi_mem_default_supports_op()
195 op->max_freq < mem->spi->max_speed_hz) { in spi_mem_default_supports_op()
200 return spi_mem_check_buswidth(mem, op); in spi_mem_default_supports_op()
240 static bool spi_mem_internal_supports_op(struct spi_mem *mem, in spi_mem_internal_supports_op() argument
243 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_internal_supports_op()
246 return ctlr->mem_ops->supports_op(mem, op); in spi_mem_internal_supports_op()
248 return spi_mem_default_supports_op(mem, op); in spi_mem_internal_supports_op()
254 * @mem: the SPI memory
266 bool spi_mem_supports_op(struct spi_mem *mem, const struct spi_mem_op *op) in spi_mem_supports_op() argument
271 return spi_mem_internal_supports_op(mem, op); in spi_mem_supports_op()
275 static int spi_mem_access_start(struct spi_mem *mem) in spi_mem_access_start() argument
277 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_access_start()
302 static void spi_mem_access_end(struct spi_mem *mem) in spi_mem_access_end() argument
304 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_access_end()
358 * @mem: the SPI memory
368 int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op) in spi_mem_exec_op() argument
371 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_exec_op()
378 spi_mem_adjust_op_freq(mem, (struct spi_mem_op *)op); in spi_mem_exec_op()
380 …dev_vdbg(&mem->spi->dev, "[cmd: 0x%02x][%dB addr: %#8llx][%2dB dummy][%4dB data %s] %d%c-%d%c-%d%c… in spi_mem_exec_op()
389 op->max_freq ? op->max_freq : mem->spi->max_speed_hz); in spi_mem_exec_op()
395 if (!spi_mem_internal_supports_op(mem, op)) in spi_mem_exec_op()
398 if (ctlr->mem_ops && ctlr->mem_ops->exec_op && !spi_get_csgpiod(mem->spi, 0)) { in spi_mem_exec_op()
399 ret = spi_mem_access_start(mem); in spi_mem_exec_op()
403 ret = ctlr->mem_ops->exec_op(mem, op); in spi_mem_exec_op()
405 spi_mem_access_end(mem); in spi_mem_exec_op()
414 spi_mem_add_op_stats(mem->spi->pcpu_statistics, op, ret); in spi_mem_exec_op()
486 ret = spi_sync(mem->spi, &msg); in spi_mem_exec_op()
501 * spi_mem_get_name() - Return the SPI mem device name to be used by the
503 * @mem: the SPI memory
505 * This function allows SPI mem users to retrieve the SPI mem device name.
510 * by the SPI mem user
512 const char *spi_mem_get_name(struct spi_mem *mem) in spi_mem_get_name() argument
514 return mem->name; in spi_mem_get_name()
519 * spi_mem_adjust_op_size() - Adjust the data size of a SPI mem operation to
521 * @mem: the SPI memory
526 * optimized accesses. This function allows SPI mem drivers to split a single
533 int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op) in spi_mem_adjust_op_size() argument
535 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_adjust_op_size()
539 return ctlr->mem_ops->adjust_op_size(mem, op); in spi_mem_adjust_op_size()
544 if (len > spi_max_transfer_size(mem->spi)) in spi_mem_adjust_op_size()
548 spi_max_transfer_size(mem->spi), in spi_mem_adjust_op_size()
549 spi_max_message_size(mem->spi) - in spi_mem_adjust_op_size()
560 * spi_mem_adjust_op_freq() - Adjust the frequency of a SPI mem operation to
562 * @mem: the SPI memory
566 * speed. This function allows SPI mem drivers to set @op->max_freq to the
569 void spi_mem_adjust_op_freq(struct spi_mem *mem, struct spi_mem_op *op) in spi_mem_adjust_op_freq() argument
571 if (!op->max_freq || op->max_freq > mem->spi->max_speed_hz) in spi_mem_adjust_op_freq()
572 op->max_freq = mem->spi->max_speed_hz; in spi_mem_adjust_op_freq()
619 ret = spi_mem_adjust_op_size(desc->mem, &op); in spi_mem_no_dirmap_read()
623 ret = spi_mem_exec_op(desc->mem, &op); in spi_mem_no_dirmap_read()
639 ret = spi_mem_adjust_op_size(desc->mem, &op); in spi_mem_no_dirmap_write()
643 ret = spi_mem_exec_op(desc->mem, &op); in spi_mem_no_dirmap_write()
652 * @mem: SPI mem device this direct mapping should be created for
664 spi_mem_dirmap_create(struct spi_mem *mem, in spi_mem_dirmap_create() argument
667 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_dirmap_create()
683 desc->mem = mem; in spi_mem_dirmap_create()
690 if (!spi_mem_supports_op(desc->mem, &desc->info.op_tmpl)) in spi_mem_dirmap_create()
714 struct spi_controller *ctlr = desc->mem->spi->controller; in spi_mem_dirmap_destroy()
734 * @mem: SPI mem device this direct mapping should be created for
743 devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem, in devm_spi_mem_dirmap_create() argument
753 desc = spi_mem_dirmap_create(mem, info); in devm_spi_mem_dirmap_create()
811 struct spi_controller *ctlr = desc->mem->spi->controller; in spi_mem_dirmap_read()
823 ret = spi_mem_access_start(desc->mem); in spi_mem_dirmap_read()
829 spi_mem_access_end(desc->mem); in spi_mem_dirmap_read()
857 struct spi_controller *ctlr = desc->mem->spi->controller; in spi_mem_dirmap_write()
869 ret = spi_mem_access_start(desc->mem); in spi_mem_dirmap_write()
875 spi_mem_access_end(desc->mem); in spi_mem_dirmap_write()
889 static int spi_mem_read_status(struct spi_mem *mem, in spi_mem_read_status() argument
896 ret = spi_mem_exec_op(mem, op); in spi_mem_read_status()
910 * @mem: SPI memory device
924 int spi_mem_poll_status(struct spi_mem *mem, in spi_mem_poll_status() argument
931 struct spi_controller *ctlr = mem->spi->controller; in spi_mem_poll_status()
940 if (ctlr->mem_ops && ctlr->mem_ops->poll_status && !spi_get_csgpiod(mem->spi, 0)) { in spi_mem_poll_status()
941 ret = spi_mem_access_start(mem); in spi_mem_poll_status()
945 ret = ctlr->mem_ops->poll_status(mem, op, mask, match, in spi_mem_poll_status()
949 spi_mem_access_end(mem); in spi_mem_poll_status()
953 if (!spi_mem_supports_op(mem, op)) in spi_mem_poll_status()
964 polling_delay_us, timeout_ms * 1000, false, mem, in spi_mem_poll_status()
978 struct spi_mem *mem; in spi_mem_probe() local
980 mem = devm_kzalloc(&spi->dev, sizeof(*mem), GFP_KERNEL); in spi_mem_probe()
981 if (!mem) in spi_mem_probe()
984 mem->spi = spi; in spi_mem_probe()
987 mem->name = ctlr->mem_ops->get_name(mem); in spi_mem_probe()
989 mem->name = dev_name(&spi->dev); in spi_mem_probe()
991 if (IS_ERR_OR_NULL(mem->name)) in spi_mem_probe()
992 return PTR_ERR_OR_ZERO(mem->name); in spi_mem_probe()
994 spi_set_drvdata(spi, mem); in spi_mem_probe()
996 return memdrv->probe(mem); in spi_mem_probe()
1002 struct spi_mem *mem = spi_get_drvdata(spi); in spi_mem_remove() local
1005 memdrv->remove(mem); in spi_mem_remove()
1011 struct spi_mem *mem = spi_get_drvdata(spi); in spi_mem_shutdown() local
1014 memdrv->shutdown(mem); in spi_mem_shutdown()