nvdimm_map
nvdimm_map->mem = memremap(offset, size, flags);
nvdimm_map->iomem = ioremap(offset, size);
if (!nvdimm_map->mem)
list_add(&nvdimm_map->list, &nvdimm_bus->mapping_list);
return nvdimm_map;
kfree(nvdimm_map);
struct nvdimm_map *nvdimm_map;
nvdimm_map = container_of(kref, struct nvdimm_map, kref);
nvdimm_bus = nvdimm_map->nvdimm_bus;
dev_dbg(&nvdimm_bus->dev, "%pa\n", &nvdimm_map->offset);
list_del(&nvdimm_map->list);
if (nvdimm_map->flags)
memunmap(nvdimm_map->mem);
iounmap(nvdimm_map->iomem);
release_mem_region(nvdimm_map->offset, nvdimm_map->size);
kfree(nvdimm_map);
struct nvdimm_map *nvdimm_map = data;
struct nvdimm_bus *nvdimm_bus = nvdimm_map->nvdimm_bus;
kref_put(&nvdimm_map->kref, nvdimm_map_release);
struct nvdimm_map *nvdimm_map;
nvdimm_map = find_nvdimm_map(dev, offset);
if (!nvdimm_map)
nvdimm_map = alloc_nvdimm_map(dev, offset, size, flags);
kref_get(&nvdimm_map->kref);
if (!nvdimm_map)
if (devm_add_action_or_reset(dev, nvdimm_map_put, nvdimm_map))
return nvdimm_map->mem;
static struct nvdimm_map *find_nvdimm_map(struct device *dev,
struct nvdimm_map *nvdimm_map;
list_for_each_entry(nvdimm_map, &nvdimm_bus->mapping_list, list)
if (nvdimm_map->offset == offset)
return nvdimm_map;
static struct nvdimm_map *alloc_nvdimm_map(struct device *dev,
struct nvdimm_map *nvdimm_map;
nvdimm_map = kzalloc_obj(*nvdimm_map);
if (!nvdimm_map)
INIT_LIST_HEAD(&nvdimm_map->list);
nvdimm_map->nvdimm_bus = nvdimm_bus;
nvdimm_map->offset = offset;
nvdimm_map->flags = flags;
nvdimm_map->size = size;
kref_init(&nvdimm_map->kref);