#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>

#include "pfe_mod.h"

static u64 dma_mask = 0xffffffff;

/**
 * pfe_emulation_probe -
 *
 *
 */
static int pfe_emulation_probe(struct platform_device *pdev)
{
	int rc;

	printk(KERN_INFO "%s\n", __func__);

	pfe = kzalloc(sizeof(struct pfe), GFP_KERNEL);
	if (!pfe) {
		rc = -ENOMEM;
		goto err_alloc;
	}

	platform_set_drvdata(pdev, pfe);

	pfe->ddr_phys_baseaddr = 0x00020000;	/* should match the value used on the BSP */
	pfe->ddr_size = 12 * SZ_1M;		/* should match the value used on the BSP */
	pfe->ddr_baseaddr = vmalloc(pfe->ddr_size);
	if (!pfe->ddr_baseaddr) {
		printk(KERN_INFO "vmalloc() ddr failed\n");
		rc = -ENOMEM;
		goto err_ddr;
	}

	pfe->cbus_baseaddr = vmalloc(16 * SZ_1M);
	if (!pfe->cbus_baseaddr) {
		printk(KERN_INFO "vmalloc() cbus failed\n");
		rc = -ENOMEM;
		goto err_cbus;
	}

	pfe->apb_baseaddr =  vmalloc(16 * SZ_1M);
	if (!pfe->cbus_baseaddr) {
		printk(KERN_INFO "vmalloc() apb failed\n");
		rc = -ENOMEM;
		goto err_apb;
	}

	pfe->iram_baseaddr = vmalloc(128 * SZ_1K);
	if (!pfe->iram_baseaddr) {
		printk(KERN_INFO "vmalloc() iram failed\n");
		rc = -ENOMEM;
		goto err_iram;
	}

	pfe->hif_irq = 0;
	pfe->dev = &pdev->dev;
	pfe->dev->dma_mask = &dma_mask;	

	pfe->ctrl.sys_clk = 250000;
	rc = pfe_probe(pfe);
	if (rc < 0)
		goto err_probe;

	return 0;

err_probe:
	vfree(pfe->iram_baseaddr);

err_iram:
	vfree(pfe->apb_baseaddr);

err_apb:
	vfree(pfe->cbus_baseaddr);

err_cbus:
	vfree(pfe->ddr_baseaddr);

err_ddr:
	platform_set_drvdata(pdev, NULL);

	kfree(pfe);

err_alloc:
	return rc;
}


/**
 * pfe_emulation_remove -
 *
 *
 */
static int pfe_emulation_remove(struct platform_device *pdev)
{
	struct pfe *pfe = platform_get_drvdata(pdev);
	int rc;

	printk(KERN_INFO "%s\n", __func__);

	rc = pfe_remove(pfe);

	vfree(pfe->iram_baseaddr);
	vfree(pfe->apb_baseaddr);
	vfree(pfe->cbus_baseaddr);
	vfree(pfe->ddr_baseaddr);
	platform_set_drvdata(pdev, NULL);

	kfree(pfe);

	return rc;
}


static struct platform_driver pfe_platform_driver = {
	.probe = pfe_emulation_probe,
	.remove = pfe_emulation_remove,
	.driver = {
		.name = "pfe",
	},
};


static void pfe_device_release(struct device *dev)
{

}


static struct platform_device pfe_platform_device = {
	.name		= "pfe",
	.id		= 0,
	.dev.release	= pfe_device_release,
};

static int __init pfe_module_init(void)
{
	printk(KERN_INFO "%s\n", __func__);

	platform_device_register(&pfe_platform_device);

	return platform_driver_register(&pfe_platform_driver);
}


static void __exit pfe_module_exit(void)
{
	platform_driver_unregister(&pfe_platform_driver);

	platform_device_unregister(&pfe_platform_device);

	printk(KERN_INFO "%s\n", __func__);
}

MODULE_LICENSE("GPL");
module_init(pfe_module_init);
module_exit(pfe_module_exit);
