/*
 * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 */

#include <linux/kernel.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/spinlock.h>
#include <linux/genalloc.h>

#include "iram.h"

static unsigned long iram_phys_base;
static void __iomem *iram_virt_base;
static struct gen_pool *iram_pool;

static inline void __iomem *iram_phys_to_virt(unsigned long p)
{
	return iram_virt_base + (p - iram_phys_base);
}

void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
{
	if (!iram_pool)
		return NULL;

	*dma_addr = gen_pool_alloc(iram_pool, size);
	pr_debug("iram alloc - %dB@0x%lX\n", size, *dma_addr);
	if (!*dma_addr)
		return NULL;
	return iram_phys_to_virt(*dma_addr);
}
EXPORT_SYMBOL(iram_alloc);

void iram_free(unsigned long addr, unsigned int size)
{
	if (!iram_pool)
		return;

	gen_pool_free(iram_pool, addr, size);
}
EXPORT_SYMBOL(iram_free);

int __init iram_init(unsigned long base, unsigned long size)
{
	iram_phys_base = base;

	iram_pool = gen_pool_create(PAGE_SHIFT, -1);
	if (!iram_pool)
		return -ENOMEM;

	gen_pool_add(iram_pool, base, size, -1);
	iram_virt_base = ioremap(iram_phys_base, size);
	if (!iram_virt_base)
		return -EIO;

	pr_debug("i.MX IRAM pool: %ld KB@0x%p\n", size / 1024, iram_virt_base);
	return 0;
}
