staging: android: persistent_ram: Introduce persistent_ram_free()
authorAnton Vorontsov <anton.vorontsov@linaro.org>
Sat, 12 May 2012 00:18:05 +0000 (17:18 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 May 2012 15:56:05 +0000 (08:56 -0700)
A corresponding function to persistent_ram_new().

Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/android/persistent_ram.c
drivers/staging/android/persistent_ram.h

index c16d7c2b1d9789541245144a7a89f5bc5f43be94..63481dad9b76acaa3a0246f9ec3e1b90cfb0a0f7 100644 (file)
@@ -364,6 +364,9 @@ static void *persistent_ram_iomap(phys_addr_t start, size_t size)
 static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
                struct persistent_ram_zone *prz)
 {
+       prz->paddr = start;
+       prz->size = size;
+
        if (pfn_valid(start >> PAGE_SHIFT))
                prz->vaddr = persistent_ram_vmap(start, size);
        else
@@ -437,6 +440,18 @@ static int __init persistent_ram_post_init(struct persistent_ram_zone *prz, bool
        return 0;
 }
 
+void persistent_ram_free(struct persistent_ram_zone *prz)
+{
+       if (pfn_valid(prz->paddr >> PAGE_SHIFT)) {
+               vunmap(prz->vaddr);
+       } else {
+               iounmap(prz->vaddr);
+               release_mem_region(prz->paddr, prz->size);
+       }
+       persistent_ram_free_old(prz);
+       kfree(prz);
+}
+
 struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,
                                                       size_t size,
                                                       bool ecc)
index 8154d15befa7946dab181931a11612f1b3b3b52a..d3b2b45da3b0994a014936cb1e73dd0665fc2d0e 100644 (file)
@@ -39,6 +39,8 @@ struct persistent_ram {
 };
 
 struct persistent_ram_zone {
+       phys_addr_t paddr;
+       size_t size;
        void *vaddr;
        struct persistent_ram_buffer *buffer;
        size_t buffer_size;
@@ -66,6 +68,7 @@ int persistent_ram_early_init(struct persistent_ram *ram);
 struct persistent_ram_zone * __init persistent_ram_new(phys_addr_t start,
                                                       size_t size,
                                                       bool ecc);
+void persistent_ram_free(struct persistent_ram_zone *prz);
 struct persistent_ram_zone *persistent_ram_init_ringbuffer(struct device *dev,
                bool ecc);