| /* | 
 |  * Basic general purpose allocator for managing special purpose memory | 
 |  * not managed by the regular kmalloc/kfree interface. | 
 |  * Uses for this includes on-device special memory, uncached memory | 
 |  * etc. | 
 |  * | 
 |  * This code is based on the buddy allocator found in the sym53c8xx_2 | 
 |  * driver, adapted for general purpose use. | 
 |  * | 
 |  * This source code is licensed under the GNU General Public License, | 
 |  * Version 2.  See the file COPYING for more details. | 
 |  */ | 
 |  | 
 | #include <linux/spinlock.h> | 
 |  | 
 | #define ALLOC_MIN_SHIFT		5 /* 32 bytes minimum */ | 
 | /* | 
 |  *  Link between free memory chunks of a given size. | 
 |  */ | 
 | struct gen_pool_link { | 
 | 	struct gen_pool_link *next; | 
 | }; | 
 |  | 
 | /* | 
 |  *  Memory pool descriptor. | 
 |  */ | 
 | struct gen_pool { | 
 | 	spinlock_t lock; | 
 | 	unsigned long (*get_new_chunk)(struct gen_pool *); | 
 | 	struct gen_pool *next; | 
 | 	struct gen_pool_link *h; | 
 | 	unsigned long private; | 
 | 	int max_chunk_shift; | 
 | }; | 
 |  | 
 | unsigned long gen_pool_alloc(struct gen_pool *poolp, int size); | 
 | void gen_pool_free(struct gen_pool *mp, unsigned long ptr, int size); | 
 | struct gen_pool *gen_pool_create(int nr_chunks, int max_chunk_shift, | 
 | 				 unsigned long (*fp)(struct gen_pool *), | 
 | 				 unsigned long data); |