Source
544
544
*/
545
545
void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc)
546
546
{
547
547
struct spi_controller *ctlr = desc->mem->spi->controller;
548
548
549
549
if (!desc->nodirmap && ctlr->mem_ops && ctlr->mem_ops->dirmap_destroy)
550
550
ctlr->mem_ops->dirmap_destroy(desc);
551
551
}
552
552
EXPORT_SYMBOL_GPL(spi_mem_dirmap_destroy);
553
553
554
+
static void devm_spi_mem_dirmap_release(struct device *dev, void *res)
555
+
{
556
+
struct spi_mem_dirmap_desc *desc = *(struct spi_mem_dirmap_desc **)res;
557
+
558
+
spi_mem_dirmap_destroy(desc);
559
+
}
560
+
561
+
/**
562
+
* devm_spi_mem_dirmap_create() - Create a direct mapping descriptor and attach
563
+
* it to a device
564
+
* @dev: device the dirmap desc will be attached to
565
+
* @mem: SPI mem device this direct mapping should be created for
566
+
* @info: direct mapping information
567
+
*
568
+
* devm_ variant of the spi_mem_dirmap_create() function. See
569
+
* spi_mem_dirmap_create() for more details.
570
+
*
571
+
* Return: a valid pointer in case of success, and ERR_PTR() otherwise.
572
+
*/
573
+
struct spi_mem_dirmap_desc *
574
+
devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
575
+
const struct spi_mem_dirmap_info *info)
576
+
{
577
+
struct spi_mem_dirmap_desc **ptr, *desc;
578
+
579
+
ptr = devres_alloc(devm_spi_mem_dirmap_release, sizeof(*ptr),
580
+
GFP_KERNEL);
581
+
if (!ptr)
582
+
return ERR_PTR(-ENOMEM);
583
+
584
+
desc = spi_mem_dirmap_create(mem, info);
585
+
if (IS_ERR(desc)) {
586
+
devres_free(ptr);
587
+
} else {
588
+
*ptr = desc;
589
+
devres_add(dev, ptr);
590
+
}
591
+
592
+
return desc;
593
+
}
594
+
EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_create);
595
+
596
+
static int devm_spi_mem_dirmap_match(struct device *dev, void *res, void *data)
597
+
{
598
+
struct spi_mem_dirmap_desc **ptr = res;
599
+
600
+
if (WARN_ON(!ptr || !*ptr))
601
+
return 0;
602
+
603
+
return *ptr == data;
604
+
}
605
+
606
+
/**
607
+
* devm_spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor attached
608
+
* to a device
609
+
* @dev: device the dirmap desc is attached to
610
+
* @desc: the direct mapping descriptor to destroy
611
+
*
612
+
* devm_ variant of the spi_mem_dirmap_destroy() function. See
613
+
* spi_mem_dirmap_destroy() for more details.
614
+
*/
615
+
void devm_spi_mem_dirmap_destroy(struct device *dev,
616
+
struct spi_mem_dirmap_desc *desc)
617
+
{
618
+
devres_release(dev, devm_spi_mem_dirmap_release,
619
+
devm_spi_mem_dirmap_match, desc);
620
+
}
621
+
EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_destroy);
622
+
554
623
/**
555
624
* spi_mem_dirmap_dirmap_read() - Read data through a direct mapping
556
625
* @desc: direct mapping descriptor
557
626
* @offs: offset to start reading from. Note that this is not an absolute
558
627
* offset, but the offset within the direct mapping which already has
559
628
* its own offset
560
629
* @len: length in bytes
561
630
* @buf: destination buffer. This buffer must be DMA-able
562
631
*
563
632
* This function reads data from a memory device using a direct mapping