/****************************************************************************
*
*	Copyright (c) 1999-2008 Broadcom Corporation
*
*   Unless you and Broadcom execute a separate written software license
*   agreement governing use of this software, this software is licensed to you
*   under the terms of the GNU General Public License version 2, available
*   at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL").
*
*   Notwithstanding the above, under no circumstances may you combine this
*   software in any way with any other Broadcom software provided under a
*   license other than the GPL, without Broadcom's express prior written
*   consent.
*
****************************************************************************/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/dma-mapping.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/acct.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/mm.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/kthread.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/ipc/ipc.h>
#include <linux/clk.h>
#include <linux/regulator/consumer.h>
#include <linux/vt_kern.h>
#include <linux/gpio.h>
#include <video/kona_fb.h>
#include <mach/io.h>
#include <linux/delay.h>
#include <mach/memory.h>
#include <mach/io_map.h>
#include <plat/reg_axipv.h>
#include <asm/io.h>
#ifdef CONFIG_FRAMEBUFFER_FPS
#include <linux/fb_fps.h>
#endif
#include <linux/clk.h>
#include <plat/pi_mgr.h>
#include <linux/broadcom/mobcom_types.h>
#include <linux/reboot.h>
#include <linux/kdebug.h>
#include <linux/notifier.h>
#include "kona_fb.h"
#include "lcd/display_drv.h"
#include "lcd/lcd.h"

#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#include <linux/wakelock.h>

#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
#include <linux/kobject.h>
#include <linux/seq_file.h>
#include <linux/ctype.h>
#endif /*  CONFIG_DEBUG_FS */

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
#include <video/kona_fb_image_dump.h>
#include "lcd/dump_start_img.h"
#include "lcd/dump_end_img.h"
#include "lcd/ap_start_dump_img.h"
#include "lcd/cp_start_dump_img.h"
#include "lcd/ap_ramdump_start_img.h"
#include "lcd/cp_ramdump_start_img.h"
#endif
#ifdef CONFIG_IOMMU_API
#include <linux/iommu.h>
#include <plat/bcm_iommu.h>
#endif

#ifdef CONFIG_DEBUG_FS
#define DBGFS_MAX_BUFF_SIZE 200
#endif /* CONFIG_DEBUG_FS */

/*#define KONA_FB_DEBUG */
/*#define PARTIAL_UPDATE_SUPPORT */

#define KONA_IOCTL_SET_BUFFER_AND_UPDATE	_IO('F', 0x80)
#define KONA_IOCTL_GET_FB_IOVA			_IOR('F', 0x81, u32)

#define SUSPEND_LINK_DELAY_MS 100

static struct pi_mgr_qos_node g_mm_qos_node;

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
static DEFINE_SPINLOCK(g_fb_crash_spin_lock);
#endif

enum lcd_state {
	KONA_FB_UNBLANK,
	KONA_FB_BLANK,
};

enum link_ctrl {
	RESUME_LINK,
	SUSPEND_LINK,
};

struct kona_fb {
	spinlock_t lock;
	struct mutex update_sem;
	struct completion prev_buf_done_sem;
	atomic_t buff_idx;
	atomic_t is_fb_registered;
	atomic_t is_graphics_started;
	int rotate;
	int is_display_found;
#ifdef CONFIG_FRAMEBUFFER_FPS
	struct fb_fps_info *fps_info;
#endif
	struct fb_info fb;
	u32 cmap[16];
	DISPDRV_T *display_ops;
	DISPDRV_INFO_T *display_info;
	DISPDRV_HANDLE_T display_hdl;
	struct pi_mgr_dfs_node dfs_node;
	int g_stop_drawing;
	struct proc_dir_entry *proc_entry;
	enum lcd_state blank_state;
	void *buff0;
	void *buff1;
	atomic_t force_update;
	struct notifier_block reboot_nb;
#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
	struct notifier_block die_nb;
#endif
	struct work_struct vsync_smart;

	size_t framesize_alloc;
	struct iommu_domain *direct_domain;
	struct sg_table *iovmm_table;
	struct kona_fb_platform_data *fb_data;
	struct platform_device *pdev;

	/* ESD check routine */
	struct workqueue_struct *esd_check_wq;
	struct delayed_work esd_check_work;
	struct completion tectl_gpio_done_sem;
	int esd_failure_cnt;
	/* user count */
	unsigned short open_count;

	bool link_suspended;
	bool suspend_link;
	struct delayed_work link_work;
	struct wake_lock wlock;

#ifdef CONFIG_DEBUG_FS
	struct dentry *dbgfs_dir;
#endif
};

static struct completion vsync_event;
static struct kona_fb *g_kona_fb;

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
static void kona_fb_unpack_888rle(void *, void *, uint32_t, uint32_t, uint32_t);
static void kona_fb_unpack_565rle(void *, void *, uint32_t, uint32_t, uint32_t);
#endif

static int kona_fb_reboot_cb(struct notifier_block *, unsigned long, void *);
#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
static int kona_fb_die_cb(struct notifier_block *, unsigned long, void *);
#endif

static int lcd_boot_mode(char *);
static int lcd_panel_setup(char *);
static int kona_fb_blank(int blank_mode, struct fb_info *info);

static int need_page_alignment = 1;
static char g_disp_str[DISPDRV_NAME_SZ];
int g_display_enabled;

#ifdef KONA_FB_DEBUG
#define KONA_PROF_N_RECORDS 50
static volatile struct {
	struct timeval	curr_time;
	struct timeval	prev_time;
	int is_late;
	int use_te;
} kona_fb_profile[KONA_PROF_N_RECORDS];

static volatile u32 kona_fb_profile_cnt;

void kona_fb_profile_record(struct timeval prev_timeval,
		struct timeval curr_timeval, int is_too_late, int do_vsync)
{
	kona_fb_profile[kona_fb_profile_cnt].curr_time =  curr_timeval;
	kona_fb_profile[kona_fb_profile_cnt].prev_time =  prev_timeval;
	kona_fb_profile[kona_fb_profile_cnt].is_late   = is_too_late;
	kona_fb_profile[kona_fb_profile_cnt].use_te   = do_vsync;
	kona_fb_profile_cnt = (kona_fb_profile_cnt+1) % KONA_PROF_N_RECORDS;
}

static int
proc_write_fb_test(struct file *file, const char __user *buffer,
			size_t count, loff_t *data)
{
	int len, cnt, i, num;
	char value[20];

	if (count > 19)
		len = 19;
	else
		len = count;

	if (copy_from_user(value, buffer, len))
		return -EFAULT;

	value[len] = '\0';

	num = simple_strtoul(value, NULL, 0);

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
	if (num == 1)
		kona_display_crash_image(0);
	else
		kona_display_crash_image(1);
#endif

	i = kona_fb_profile_cnt;
	for (cnt = 0; cnt < KONA_PROF_N_RECORDS; cnt++) {
		if (i != 0)
			printk(KERN_ERR "%8lu,%8lu,%8lu,%8lu,%8lu,%d, %d",
			kona_fb_profile[i].prev_time.tv_sec,
			kona_fb_profile[i].prev_time.tv_usec,
			kona_fb_profile[i].curr_time.tv_sec,
			kona_fb_profile[i].curr_time.tv_usec,
			(kona_fb_profile[i].prev_time.tv_sec -
			 kona_fb_profile[i-1].curr_time.tv_sec) * 1000000 +
			(kona_fb_profile[i].prev_time.tv_usec -
			 kona_fb_profile[i-1].curr_time.tv_usec),
			kona_fb_profile[i].is_late,
			kona_fb_profile[i].use_te);
		i = (i + 1) % KONA_PROF_N_RECORDS;
	}

	return len;
}
#else
#define kona_fb_profile_record(prev_timeval, curr_timeval, is_too_late, \
		do_vsync) do { } while (0)
#define proc_write_fb_test NULL
#endif /* KONA_FB_DEBUG */

static inline u32 convert_bitfield(int val, struct fb_bitfield *bf)
{
	unsigned int mask = (1 << bf->length) - 1;

	return (val >> (16 - bf->length) & mask) << bf->offset;
}

static int
kona_fb_setcolreg(unsigned int regno, unsigned int red, unsigned int green,
		  unsigned int blue, unsigned int transp, struct fb_info *info)
{
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);

	konafb_debug("kona regno = %d r=%d g=%d b=%d\n", regno, red, green,
		     blue);

	if (regno < 16) {
		fb->cmap[regno] = convert_bitfield(transp, &fb->fb.var.transp) |
		    convert_bitfield(blue, &fb->fb.var.blue) |
		    convert_bitfield(green, &fb->fb.var.green) |
		    convert_bitfield(red, &fb->fb.var.red);
		return 0;
	} else {
		return 1;
	}
}

static int kona_fb_check_var(struct fb_var_screeninfo *var,
			     struct fb_info *info)
{
	konafb_debug("kona %s\n", __func__);

	if ((var->rotate & 1) != (info->var.rotate & 1)) {
		if ((var->xres != info->var.yres) ||
		    (var->yres != info->var.xres) ||
		    (var->xres_virtual != info->var.yres) ||
		    (var->yres_virtual > info->var.xres * 2) ||
		    (var->yres_virtual < info->var.xres)) {
			konafb_error("fb_check_var_failed\n");
			return -EINVAL;
		}
	} else {
		if ((var->xres != info->var.xres) ||
		    (var->yres != info->var.yres) ||
		    (var->xres_virtual != info->var.xres) ||
		    (var->yres_virtual > info->var.yres * 2) ||
		    (var->yres_virtual < info->var.yres)) {
			konafb_error("fb_check_var_failed\n");
			return -EINVAL;
		}
	}

	return 0;
}

static int kona_fb_set_par(struct fb_info *info)
{
#if 0
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);

	konafb_debug("kona %s\n", __func__);

	if (fb->rotation != fb->fb.var.rotate) {
		konafb_warning("Rotation is not supported yet !\n");
		return -EINVAL;
	}
#endif

	return 0;
}

static inline void kona_clock_start(struct kona_fb *fb)
{
	fb->display_ops->start(fb->display_hdl, &fb->dfs_node);
}

static inline void kona_clock_stop(struct kona_fb *fb)
{
	fb->display_ops->stop(fb->display_hdl, &fb->dfs_node);
}

static void fb_suspend_link_work(struct work_struct *work)
{
	struct delayed_work *dw = container_of(work, struct delayed_work, work);
	struct kona_fb *fb = container_of(dw, struct kona_fb, link_work);

	if (mutex_trylock(&fb->update_sem)) {
		/* We might have exited special mode */
		if (!fb->suspend_link) {
			konafb_info("do not suspend\n");
		} else if (fb->link_suspended) {
			konafb_info("link already suspended\n");
		} else {
			if (!fb->display_info->vmode)
				kona_clock_start(fb);
			fb->display_ops->suspend_link(fb->display_hdl);
			if (!fb->display_info->vmode)
				kona_clock_stop(fb);
			pi_mgr_qos_request_update(&g_mm_qos_node,
				PI_MGR_QOS_DEFAULT_VALUE);
			fb->link_suspended = true;
		}
		mutex_unlock(&fb->update_sem);
	} else {
		konafb_info("mutex locked! link not closed\n");
	}
	wake_unlock(&fb->wlock);
}

static void link_control(struct kona_fb *fb, enum link_ctrl link_ctrl)
{
	if (link_ctrl == RESUME_LINK) {
		if (!fb->link_suspended) {
			konafb_warning("link already active\n");
			return;
		}
		cancel_delayed_work_sync(&fb->link_work);
		wake_unlock(&fb->wlock);
		pi_mgr_qos_request_update(&g_mm_qos_node, 10);
		if (!fb->display_info->vmode)
			kona_clock_start(fb);
		fb->display_ops->resume_link(fb->display_hdl);
		if (!fb->display_info->vmode)
			kona_clock_stop(fb);
		fb->link_suspended = false;
	} else {
		cancel_delayed_work_sync(&fb->link_work);
		wake_lock(&fb->wlock);
		schedule_delayed_work(&fb->link_work,
				msecs_to_jiffies(SUSPEND_LINK_DELAY_MS));
	}
}

#ifdef CONFIG_IOMMU_API
static int kona_fb_direct_map(struct kona_fb *fb, size_t framesize_alloc,
			dma_addr_t phys_fbbase, dma_addr_t dma_addr)
{
	struct iommu_domain *domain = NULL;
	int ret = -ENXIO;
	struct kona_fb_platform_data *fb_data = fb->fb_data;
	struct platform_device *pdev = fb->pdev;

	/* 1-to-1 mapping */
	domain = iommu_domain_alloc(&platform_bus_type);
	if (NULL == domain)
		goto fail_alloc;

	if (iommu_attach_device(domain, &pdev->dev)) {
		ret = -EINVAL;
		pr_err("%s Attaching dev(%p) to iommu dev(%p) failed\n",
				"framebuffer", &pdev->dev,
				&fb_data->pdev_iommu->dev);
		goto fail_attach;
	}

	if (iommu_map(domain, dma_addr, phys_fbbase, framesize_alloc,
				0)) {
		ret = -EINVAL;
		pr_err("%s iommu mapping domain(%p) da(%#x) to pa(%#x) size(%#08x) failed\n",
				"framebuffer", domain, dma_addr,
				phys_fbbase, framesize_alloc);
		goto fail_map;
	}

	fb->direct_domain = domain;
	pr_info("%s succ\n", __func__);
	return 0;

fail_map:
	iommu_detach_device(domain, &pdev->dev);
fail_attach:
	iommu_domain_free(domain);
fail_alloc:
	pr_err("%s failed ret = %d\n", __func__, ret);
	return ret;
}

static int kona_fb_direct_unmap(struct kona_fb *fb,
			size_t framesize_alloc, dma_addr_t dma_addr)
{
	struct iommu_domain *domain = fb->direct_domain;
	struct platform_device *pdev = fb->pdev;

	if (NULL == domain) {
		pr_err("%s fail, direct_domain NULL\n", __func__);
		return -EIO;
	}

	iommu_unmap(domain, dma_addr, framesize_alloc);

	iommu_detach_device(domain, &pdev->dev);

	iommu_domain_free(domain);

	fb->direct_domain = NULL;
	pr_info("%s succ\n", __func__);
	return 0;
}

#ifdef CONFIG_BCM_IOVMM
static int kona_fb_iovmm_map(struct kona_fb *fb, size_t framesize_alloc,
			dma_addr_t phys_fbbase, dma_addr_t *p_dma_addr)
{
	int n_pages, i;
	struct scatterlist *sg;
	struct sg_table *table;
	int ret = -ENXIO;
	struct dma_iommu_mapping *mapping = NULL;
	struct kona_fb_platform_data *fb_data = fb->fb_data;
	struct platform_device *pdev = fb->pdev;
	dma_addr_t dma_addr;

	if (!fb_data->pdev_iovmm) {
		ret = -EINVAL;
		pr_err("%s: iovmm device not set\n", "framebuffer");
		goto fail;
	}
	mapping = platform_get_drvdata(fb_data->pdev_iovmm);
	arm_iommu_attach_device(&pdev->dev, mapping);
	pr_info("%s iommu-mapping(%p)\n", "framebuffer", mapping);

	table = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
	if (!table) {
		ret = -ENOMEM;
		pr_err("Unable to allocate fb sgtable\n");
		goto fail;
	}
	n_pages = framesize_alloc >> PAGE_SHIFT;

	i = sg_alloc_table(table, 1, GFP_KERNEL);
	if (i) {
		ret = -ENOMEM;
		pr_err("sg_alloc_table failed\n");
		goto fail_sg_alloc;
	}
	for_each_sg(table->sgl, sg, table->nents, i) {
		struct page *page =
			phys_to_page(phys_fbbase);
		sg_set_page(sg, page, PAGE_SIZE * n_pages, 0);
	}
	dma_addr = arm_iommu_map_sgt(&pdev->dev, table, 0);
	if (dma_addr == DMA_ERROR_CODE) {
		ret = -EINVAL;
		pr_err("%16s: Failed iommu map da(%#x) pa(%#x) size(%#x)\n",
				"framebuffer", dma_addr, phys_fbbase,
				framesize_alloc);
		goto fail_map_sgt;
	}

	fb->iovmm_table = table;
	*p_dma_addr = dma_addr;
	pr_info("%s succ\n", __func__);
	return 0;

fail_map_sgt:
	sg_free_table(table);
fail_sg_alloc:
	kfree(table);
fail:
	pr_err("%s failed ret = %d\n", __func__, ret);
	return ret;
}

static int kona_fb_iovmm_unmap(struct kona_fb *fb,
			size_t framesize_alloc, dma_addr_t dma_addr)
{
	struct platform_device *pdev = fb->pdev;

	arm_iommu_unmap(&pdev->dev, dma_addr, framesize_alloc);

	if (fb->iovmm_table) {
		sg_free_table(fb->iovmm_table);
		kfree(fb->iovmm_table);
		fb->iovmm_table = NULL;
	}

	pr_info("%s succ\n", __func__);
	return 0;
}
#endif
#endif

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
static void kona_fb_unpack_565rle(void *dst, void *src, uint32_t image_size,
				uint32_t img_w, uint32_t img_h)
{
	unsigned long count, index, len, data, pos;
	u16 *lcd_buf, *image_buf;

	image_buf = (u16 *)src;
	lcd_buf = (u16 *)dst;
	for (count = 0, pos = 0; count < image_size / 2; count += 2) {
		len = image_buf[count];
		data = image_buf[count + 1];
		for (index = 0; index < len; index++) {
			lcd_buf[pos++] = data;
			if (pos >  g_kona_fb->fb.fix.smem_len / 4)
				printk(KERN_ERR "Wrong image size!");
		}
	}
}

static void kona_fb_unpack_888rle(void *dst, void *src, uint32_t image_size,
				uint32_t img_w, uint32_t img_h)
{
	unsigned long count, len, data, pos, pix_left_curr_line;
	unsigned long x_margin, y_margin;
	u32 *lcd_buf;
	u16 *image_buf;
	int dir;

	struct fb_info *fb = &g_kona_fb->fb;

	image_buf = (u16 *)src;
	lcd_buf = (u32 *)dst;
	x_margin = (fb->var.xres - img_w) / 2;
	y_margin = (fb->var.yres - img_h) / 2;

	/*If rotation is enabled, move to the end of buffer*/
	if (g_kona_fb->rotate == FB_ROTATE_UD) {
		pos = (fb->var.xres * fb->var.yres - 1);
		dir = -1;
	} else {
		pos = 0;
		dir = 1;
	}
	pix_left_curr_line = img_w;
	pos += y_margin * fb->var.xres * dir;
	pos += x_margin * dir;
	for (count = 0; count < image_size; count += 8) {
		len = *image_buf++;
		len |= (*image_buf++) << 16;
		data = *image_buf++;
		data |= (*image_buf++ << 16);
		while (len) {
			while (pix_left_curr_line) {
				lcd_buf[pos] = data;
				pos += dir;
				--len;
				--pix_left_curr_line;
				if (pos > fb->fix.smem_len / 8)
					printk(KERN_ERR "Wrong image size!");
				if (!len)
					break;
			}
			if (!pix_left_curr_line) {
				pos += x_margin * 2 * dir;
				pix_left_curr_line = img_w;
			}
		}
	}
}

void kona_display_crash_image(enum crash_dump_image_idx image_idx)
{
	unsigned long flags, image_size, img_w, img_h;
	void *image_buf;
	static bool crash_displayed;

	if (panic_timeout == 1)
		return;

	pr_err("%s:%d image_idx=%d\n", __func__, __LINE__, image_idx);
	atomic_set(&g_kona_fb->force_update, 1);
	kona_clock_start(g_kona_fb);
	spin_lock_irqsave(&g_fb_crash_spin_lock, flags);

	switch (image_idx) {
	case GENERIC_DUMP_START:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &dump_start_img_565[0];
			image_size = sizeof(dump_start_img_565);
		} else {
			image_buf = (void *) &dump_start_img_888[0];
			image_size = sizeof(dump_start_img_888);
		}
		img_w = dump_start_img_w;
		img_h = dump_start_img_h;
		break;
	case CP_CRASH_DUMP_START:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &cp_dump_start_img_565[0];
			image_size = sizeof(cp_dump_start_img_565);
		} else {
			image_buf = (void *) &cp_dump_start_img_888[0];
			image_size = sizeof(cp_dump_start_img_888);
		}
		img_w = dump_cp_start_img_w;
		img_h = dump_cp_start_img_h;
		break;
	case AP_CRASH_DUMP_START:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &ap_dump_start_img_565[0];
			image_size = sizeof(ap_dump_start_img_565);
		} else {
			image_buf = (void *) &ap_dump_start_img_888[0];
			image_size = sizeof(ap_dump_start_img_888);
		}
		img_w = dump_ap_start_img_w;
		img_h = dump_ap_start_img_h;
		break;
	case GENERIC_DUMP_END:
	case CP_CRASH_DUMP_END:
	case AP_CRASH_DUMP_END:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &dump_end_img_565[0];
			image_size = sizeof(dump_end_img_565);
		} else {
			image_buf = (void *) &dump_end_img_888[0];
			image_size = sizeof(dump_end_img_888);
		}
		img_w = dump_end_img_w;
		img_h = dump_end_img_h;
		break;
	case CP_RAM_DUMP_START:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &cp_ramdump_start_img_565[0];
			image_size = sizeof(cp_ramdump_start_img_565);
		} else {
			image_buf = (void *) &cp_ramdump_start_img_888[0];
			image_size = sizeof(cp_ramdump_start_img_888);
		}
		img_w = cp_ramdump_start_img_w;
		img_h = cp_ramdump_start_img_h;
		break;
	case AP_RAM_DUMP_START:
		if (16 == g_kona_fb->fb.var.bits_per_pixel) {
			image_buf = (void *) &ap_ramdump_start_img_565[0];
			image_size = sizeof(ap_ramdump_start_img_565);
		} else {
			image_buf = (void *) &ap_ramdump_start_img_888[0];
			image_size = sizeof(ap_ramdump_start_img_888);
		}
		img_w = ap_ramdump_start_img_w;
		img_h = ap_ramdump_start_img_h;
		break;
	default:
		pr_err("Invalid image index passed\n");
		goto err_idx;
	}

	if (16 == g_kona_fb->fb.var.bits_per_pixel)
		kona_fb_unpack_565rle((void *)g_kona_fb->fb.screen_base,
					image_buf, image_size, img_w, img_h);
	else
		kona_fb_unpack_888rle((void *)g_kona_fb->fb.screen_base,
					image_buf, image_size, img_w, img_h);

	/* For video mode, it is sufficient if we draw on the active buffer*/
	if (!g_kona_fb->display_info->vmode || (false == crash_displayed)) {
		if (g_kona_fb->display_ops->update_no_os)
			g_kona_fb->display_ops->update_no_os(
				g_kona_fb->display_hdl, g_kona_fb->buff0, NULL);
	}

	crash_displayed = true;
err_idx:
	g_kona_fb->g_stop_drawing = 1;
	spin_unlock_irqrestore(&g_fb_crash_spin_lock, flags);
	kona_clock_stop(g_kona_fb);
}
#endif

static void kona_display_done_cb(int status)
{
	(void)status;
	if (!g_kona_fb->display_info->vmode)
		kona_clock_stop(g_kona_fb);
	konafb_debug("kona_fb release called\n");
	complete(&g_kona_fb->prev_buf_done_sem);
}

/* This function peforms the in-place rotation of the buffer */
int kona_fb_rotate_buffer(void *buffer, int deg, unsigned width,
				unsigned height, unsigned char bytes_per_pixel)
{
	int i = 0;
	unsigned int total_num_pixels = width * height;
	unsigned short *Bottom_2Bpp;
	unsigned short *Top_2Bpp;
	unsigned short temp_2Bpp;
	unsigned int *Bottom_4Bpp;
	unsigned int *Top_4Bpp;
	unsigned int temp_4Bpp;

	if (bytes_per_pixel == 2) {
		/* point to the first pixel */
		Top_2Bpp = buffer;
		/* point to the last pixel */
		Bottom_2Bpp = Top_2Bpp + (width * height) - 1;

		for (i = 0; i < total_num_pixels / 2; ++i) {
			/* swap pixels from top-left in forward direction
			   to pixels in bottom-right in reverse direction */
			temp_2Bpp = *Top_2Bpp;
			*Top_2Bpp++ = *Bottom_2Bpp;
			*Bottom_2Bpp-- = temp_2Bpp;
		}
	} else {
	/* if Bpp = 4 */
		/* point to the first pixel */
		Top_4Bpp = buffer;
		/* point to the last pixel */
		Bottom_4Bpp = Top_4Bpp + (width * height) - 1;

		for (i = 0; i < total_num_pixels / 2; ++i) {
			/* swap pixels from top-left in forward direction
			   to pixels in bottom-right in reverse direction */
			temp_4Bpp = *Top_4Bpp;
			*Top_4Bpp++ = *Bottom_4Bpp;
			*Bottom_4Bpp-- = temp_4Bpp;
		}
	}
	return 0;
}

static int kona_fb_pan_display(struct fb_var_screeninfo *var,
			       struct fb_info *info)
{
	int ret = 0;
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);
	uint32_t buff_idx;
	int bytes_per_pixel = 0;
#ifdef CONFIG_FRAMEBUFFER_FPS
	void *dst;
#endif
	DISPDRV_WIN_t region, *p_region;

	buff_idx = var->yoffset ? 1 : 0;

	if (var->rotate == FB_ROTATE_UD) {
		bytes_per_pixel = var->bits_per_pixel / 8;
		konafb_debug("Rotating inside kernel\n");

		if (buff_idx == 1) {
			if (kona_fb_rotate_buffer(fb->fb.screen_base +
				(fb->buff1 - fb->buff0), FB_ROTATE_UD ,
				var->xres, var->yres, bytes_per_pixel))
				konafb_error("Unable to rotate !!\n");
		} else {
			if (kona_fb_rotate_buffer(fb->fb.screen_base,
				FB_ROTATE_UD, var->xres, var->yres,
							bytes_per_pixel))
				konafb_error("Unable to rotate !!\n");
		}
	}
	konafb_debug("kona %s with buff_idx =%d\n", __func__, buff_idx);

	if (mutex_lock_killable(&fb->update_sem))
		return -EINTR;

	if (1 == fb->g_stop_drawing) {
		konafb_debug(
		"kona FB/LCd is in the early suspend state and stops drawing now!");
		goto skip_drawing;
	}

	atomic_set(&fb->buff_idx, buff_idx);

#ifdef CONFIG_FRAMEBUFFER_FPS
	dst = (fb->fb.screen_base) +
	    (buff_idx * fb->fb.var.xres * fb->fb.var.yres *
	     (fb->fb.var.bits_per_pixel / 8));
	fb_fps_display(fb->fps_info, dst, 5, 2, 0);
#endif

	if (fb->link_suspended)
		link_control(fb, RESUME_LINK);

	if (!atomic_read(&fb->is_fb_registered)) {
		if (!fb->display_info->vmode)
			kona_clock_start(fb);
		ret =
		    fb->display_ops->update(fb->display_hdl,
					    buff_idx ? fb->buff1 : fb->buff0,
					    NULL, NULL);
		if (!fb->display_info->vmode)
			kona_clock_stop(fb);
	} else {
		atomic_set(&fb->is_graphics_started, 1);
		if (var->reserved[0] == 0x54445055) {
			region.t = var->reserved[1] >> 16;
			region.l = (u16) var->reserved[1];
			region.b = (var->reserved[2] >> 16) - 1;
			region.r = (u16) var->reserved[2] - 1;
			region.w = region.r - region.l + 1;
			region.h = region.b - region.t + 1;
			region.mode = 0;
			p_region = &region;
		} else {
			region.t	= 0;
			region.l	= 0;
			region.b	= fb->fb.var.height - 1;
			region.r	= fb->fb.var.width - 1;
			region.w	= fb->fb.var.width;
			region.h	= fb->fb.var.height;
			region.mode	= 1;
			p_region = NULL;
		}
		if (!fb->display_info->vmode) {
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);
			kona_clock_start(fb);
		}
		ret =
		    fb->display_ops->update(fb->display_hdl,
					buff_idx ? fb->buff1 : fb->buff0,
					p_region,
					(DISPDRV_CB_T)kona_display_done_cb);

		if (fb->display_info->vmode) {
			konafb_debug("waiting for release of 0x%x\n",
					buff_idx ? fb->buff0 : fb->buff1);
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);
		}
	}

	if (fb->suspend_link)
		link_control(fb, SUSPEND_LINK);

skip_drawing:
	mutex_unlock(&fb->update_sem);

	return ret;
}

#if defined(CONFIG_MACH_BCM_FPGA_E) || defined(CONFIG_MACH_BCM_FPGA)
static int kona_fb_sync(struct fb_info *info)
{
	pr_info("[KONA_FB]: HW Composer not enabled on Java Eve, return\n");
	return 0;
}
#else
static int kona_fb_sync(struct fb_info *info)
{
	wait_for_completion_interruptible(&vsync_event);
	return 0;
}
#endif
static void konafb_vsync_cb(void)
{
	if (g_kona_fb && g_kona_fb->display_info->vmode)
		complete(&vsync_event);
}

static void vsync_work_smart(struct work_struct *work)
{
	struct kona_fb *fb = container_of(work, struct kona_fb,
						vsync_smart);

	complete(&vsync_event);
	/* 16ms ~ 60HZ */
	usleep_range(16000, 16010);
	schedule_work(&fb->vsync_smart);
}

static ssize_t kona_fb_panel_name_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kona_fb *fb = dev_get_drvdata(dev);
	char const *name =  fb->fb_data->name ?
			fb->fb_data->name : "NoName";
	return scnprintf(buf, PAGE_SIZE, "Panel: %s\n", name);
}

static ssize_t kona_fb_panel_id_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kona_fb *fb = dev_get_drvdata(dev);
	uint8_t res_da = 0;
	uint8_t res_db = 0;
	uint8_t res_dc = 0;

	if (!fb->display_info->vmode)
		kona_clock_start(fb);
	panel_read(0xDA, &res_da, 1);
	panel_read(0xDB, &res_db, 1);
	panel_read(0xDC, &res_dc, 1);
	if (!fb->display_info->vmode)
		kona_clock_stop(fb);

	return scnprintf(buf, PAGE_SIZE, "Panel ID: 0x%.2x 0x%.2x 0x%.2x\n",
							res_da, res_db, res_dc);
}

static ssize_t kona_fb_panel_mode_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kona_fb *fb = dev_get_drvdata(dev);
	if (fb->display_info->special_mode_panel)
		return scnprintf(buf, PAGE_SIZE, "%d\n",
					fb->display_info->special_mode_on);
	else
		return scnprintf(buf, PAGE_SIZE, "%s\n", "Not supported");
}

static ssize_t kona_fb_panel_mode_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	int ret = count;
	struct kona_fb *fb = dev_get_drvdata(dev);
	uint32_t val;

	if (fb->display_info->vmode) {
		konafb_error("Only command mode supported\n");
		ret = -EOPNOTSUPP;
		goto exit;
	}

	if (!fb->display_info->special_mode_panel) {
		konafb_error("Not supported\n");
		ret = -EOPNOTSUPP;
		goto exit;
	}

	if (sscanf(buf, "%i", &val) != 1) {
		konafb_error("Error, buf = %s\n", buf);
		ret = -EINVAL;
		goto exit;
	}

	konafb_info("panel mode %i\n", val);
	mutex_lock(&fb->update_sem);
	if (val) {
		/* Enter special mode */
		if (fb->blank_state != KONA_FB_UNBLANK) {
			/* If panel is off, don't do anything with the hw */
			konafb_debug("Not in UNBLANK state (%d)\n",
							fb->blank_state);
			fb->display_info->special_mode_on = true;
			fb->suspend_link = true;
			goto exit_unlock;
		}
		if (fb->fb_data->esdcheck)
			cancel_delayed_work(&fb->esd_check_work);
		cancel_work_sync(&fb->vsync_smart);

		if (wait_for_completion_timeout(&fb->prev_buf_done_sem,
						msecs_to_jiffies(10000)) <= 0)
			konafb_error("timed out waiting for completion\n");
		if (fb->link_suspended) {
			konafb_debug("Link suspended when entering special "
								"mode\n");
			link_control(fb, RESUME_LINK);
		}
		kona_clock_start(fb);
		if (fb->display_info->cabc_enabled)
			panel_write(fb->display_info->cabc_off_seq);
		panel_write(fb->display_info->special_mode_on_seq);
		kona_clock_stop(fb);
		fb->suspend_link = true;
		link_control(fb, SUSPEND_LINK);
		complete(&g_kona_fb->prev_buf_done_sem);
		fb->display_info->special_mode_on = true;
		konafb_debug("Special mode ON\n");
	} else {
		/* Exit special mode */
		if (fb->blank_state == KONA_FB_BLANK) {
			/* If powerHAL exits special mode before system has
			   has sent KONA_FB_UNBLANK we will end up here. In
			   this state the display is already powered off */
			konafb_debug("Exit black mode\n");
			fb->display_info->special_mode_on = false;
			fb->suspend_link = false;
			goto exit_unlock;
		}
		cancel_delayed_work_sync(&fb->link_work);
		wake_unlock(&fb->wlock);
		fb->suspend_link = false;
		if (fb->link_suspended)
			link_control(fb, RESUME_LINK);
		complete(&g_kona_fb->prev_buf_done_sem);
		kona_clock_start(fb);
		panel_write(fb->display_info->special_mode_off_seq);
		if (fb->display_info->cabc_enabled)
			panel_write(fb->display_info->cabc_on_seq);
		kona_clock_stop(fb);
		schedule_work(&fb->vsync_smart);
		if (fb->fb_data->esdcheck)
			queue_delayed_work(fb->esd_check_wq,
				&fb->esd_check_work,
				msecs_to_jiffies(
					fb->fb_data->esdcheck_period_ms));

		fb->display_ops->enable_send_first_frame_event(fb->display_hdl);
		fb->display_info->special_mode_on = false;
		konafb_debug("Special mode OFF\n");
	}
exit_unlock:
	mutex_unlock(&fb->update_sem);
exit:
	return ret;
}

static struct device_attribute panel_attributes[] = {
	__ATTR(panel_name, S_IRUGO, kona_fb_panel_name_show, NULL),
	__ATTR(panel_id, S_IRUGO, kona_fb_panel_id_show, NULL),
	__ATTR(panel_mode, S_IRUGO|S_IWUSR|S_IWGRP,
					kona_fb_panel_mode_show,
					kona_fb_panel_mode_store),
};

static int register_attributes(struct device *dev)
{
	int i;
	for (i = 0; i < ARRAY_SIZE(panel_attributes); i++)
		if (device_create_file(dev, panel_attributes + i))
			goto error;
	return 0;
error:
	dev_err(dev, "%s: Unable to create interface\n", __func__);
	for (--i; i >= 0; i--)
		device_remove_file(dev, panel_attributes + i);
	return -ENODEV;
}

static void remove_attributes(struct device *dev)
{
	int i;
	for (i = 0; i < ARRAY_SIZE(panel_attributes); i++)
		device_remove_file(dev, panel_attributes + i);
}

#ifdef CONFIG_DEBUG_FS
/*
 * Usage:
 * echo <reg> <nbr_bytes> > panel_read
 * reg in hex
 * nbr_bytes in decimal
 * example: echo 0xDA 1 > panel_read
 */
static ssize_t dbgfs_reg_read(struct file *file, const char __user *ubuf,
						size_t count, loff_t *ppos)
{
	int ret = 0;
	struct seq_file *s = file->private_data;
	struct kona_fb *fb = s->private;
	int len;
	UInt8 *buff;
	uint8_t reg;
	char *kbuf = NULL;
	char *p;
	int i;

	mutex_lock(&fb->update_sem);
	kbuf = kzalloc(sizeof(char) * count, GFP_KERNEL);
	if (!kbuf) {
		pr_err("%s: Failed to allocate buffer\n", __func__);
		ret = -ENOMEM;
		goto exit;
	}

	if (copy_from_user(kbuf, ubuf, count)) {
		pr_err("%s: Failed to copy from user\n", __func__);
		ret = -EFAULT;
		goto fail_exit;
	}

	p = kbuf;
	p = p + 2;
	if (sscanf(p, "%2hhx", &reg) != 1) {
		pr_err("%s: Parameter error\n", __func__);
		ret = -EINVAL;
		goto fail_exit;
	}
	p = p + 2;
	if (sscanf(p, "%d", &len) != 1) {
		pr_err("%s: Parameter error\n", __func__);
		ret = -EINVAL;
		goto fail_exit;
	}

	if (len == 0) {
		pr_err("%s: Parameter error (len = 0)\n", __func__);
		ret = -EINVAL;
		goto fail_exit;
	}

	buff = kzalloc(sizeof(char) * len, GFP_KERNEL);
	if (!buff) {
		pr_err("%s: Failed to allocate buffer\n", __func__);
		ret = -ENOMEM;
		goto fail_exit;
	}

	if (fb->link_suspended)
		link_control(fb, RESUME_LINK);

	if (!fb->display_info->vmode)
		kona_clock_start(fb);

	panel_read(reg, buff, len);

	if (!fb->display_info->vmode)
		kona_clock_stop(fb);

	if (fb->suspend_link)
		link_control(fb, SUSPEND_LINK);

	pr_info("%s: reg 0x%.2x, len %d\n", __func__, reg, len);
	for (i = 0; i < len; i++)
		pr_info("%s: buff[%i] 0x%.2x\n", __func__, i, buff[i]);

	kfree(buff);
fail_exit:
	kfree(kbuf);
exit:
	mutex_unlock(&fb->update_sem);
	return count;
}

static int dbgfs_read_open(struct inode *inode, struct file *file)
{
	return single_open(file, NULL, inode->i_private);
}

static const struct file_operations dbgfs_read_fops = {
	.owner			= THIS_MODULE,
	.open			= dbgfs_read_open,
	.write			= dbgfs_reg_read,
	.llseek			= seq_lseek,
	.release		= single_release,
};

/*
 * Usage:
 * echo <type> <reg> <data, data, ...> > panel_write
 * type: dcs gen
 * reg in hex
 * data in hex
 * example: echo dcs 0x29 0 > panel_write
 */
static ssize_t dbgfs_reg_write(struct file *file, const char __user *ubuf,
						size_t count, loff_t *ppos)
{
	int ret = 0;
	u8 reg;
	char *kbuf = NULL;
	char *p;
	u8 rec[DBGFS_MAX_BUFF_SIZE];
	int rec_len = 0;
	u8 data;
	struct seq_file *s = file->private_data;
	struct kona_fb *fb = s->private;

	mutex_lock(&fb->update_sem);
	kbuf = kzalloc(sizeof(char) * count, GFP_KERNEL);
	if (!kbuf) {
		pr_err("%s: Failed to allocate buffer\n", __func__);
		ret = -ENOMEM;
		goto exit;
	}

	if (copy_from_user(kbuf, ubuf, count)) {
		pr_err("%s: Failed to copy from user\n", __func__);
		ret = -EFAULT;
		goto fail_exit;
	}

	p = kbuf;

	/* Get type of command */
	if (!strncmp(kbuf, "dcs", 3)) {
		rec[0] = DISPCTRL_WR_CMND;
		rec_len = 1;
	} else if (!strncmp(kbuf, "gen", 3)) {
		rec[0] = DISPCTRL_TAG_GEN_WR;
		rec_len = 2; /* save one slot for length */
	} else {
		pr_err("%s: Parameter error\n", __func__);
		ret = -EFAULT;
		goto fail_exit;
	}
	p = p + 3;

	/* Get  to next parameter */
	while (isspace(*p) || *p == '0' || (*p == 'x')) {
		p++;
	}

	if (iscntrl(*p)) { /* end of string? */
		ret = -EINVAL;
		goto fail_exit;
	}

	/* Get register */
	if (sscanf(p, "%4hhx", &reg) != 1) {
		pr_err("%s: Parameter error\n", __func__);
		ret = -EINVAL;
		goto fail_exit;
	}
	rec[rec_len] = reg;
	rec_len++;

	while (!isspace(*p) && !(*p == ',') && !iscntrl(*p))
		p++;

	/* Get data */
	while (!iscntrl(*p)) {
		if (isspace(*p) || (*p == ',')) {
			p++;
		} else if (isxdigit(*p)) {
			if (sscanf(p, "%4hhx", &data) == 1) {
				rec[rec_len] = data;
				rec_len++;
				if (rec_len >= DBGFS_MAX_BUFF_SIZE) {
					pr_info("%s: too many parameters\n",
								__func__);
					ret = -EINVAL;
					goto fail_exit;
				}
			}
			while (!isspace(*p) && !(*p == ',') && !iscntrl(*p))
				p++;
		} else {
			pr_info("%s: parameter parsing error\n", __func__);
			ret = -EINVAL;
			goto fail_exit;
		}
	}

	rec[rec_len] = 0; /* record must end with null */
	if (rec[0] == DISPCTRL_WR_CMND) {
		/* DCS has length in idx 0. command is not included */
		rec[0] = rec_len - 1;
	} else {
		if (rec_len <= 3) {
			pr_info("%s: generic command must have one parameter\n",
								__func__);
			ret = -EINVAL;
			goto fail_exit;
		}
		/* GEN has command in idx 0 and length in idx 1 */
		rec[1] = rec_len - 2;
	}

	if (fb->link_suspended)
		link_control(fb, RESUME_LINK);

	panel_write(rec);

	if (fb->suspend_link)
		link_control(fb, SUSPEND_LINK);

fail_exit:
	kfree(kbuf);
exit:
	mutex_unlock(&fb->update_sem);
	return count;
}

static int dbgfs_write_open(struct inode *inode, struct file *file)
{
	return single_open(file, NULL, inode->i_private);
}

static const struct file_operations dbgfs_write_fops = {
	.owner			= THIS_MODULE,
	.open			= dbgfs_write_open,
	.write			= dbgfs_reg_write,
	.llseek			= seq_lseek,
	.release		= single_release,
};

static ssize_t dbgfs_cabc_write(struct file *file, const char __user *ubuf,
						size_t count, loff_t *ppos)
{
	int ret = 0;
	char *kbuf = NULL;
	struct seq_file *s = file->private_data;
	struct kona_fb *fb = s->private;

	mutex_lock(&fb->update_sem);
	kbuf = kzalloc(sizeof(char) * count, GFP_KERNEL);
	if (!kbuf) {
		pr_err("%s: Failed to allocate buffer\n", __func__);
		ret = -ENOMEM;
		goto exit;
	}

	if (copy_from_user(kbuf, ubuf, count)) {
		pr_err("%s: Failed to copy from user\n", __func__);
		ret = -EFAULT;
		goto fail_exit;
	}

	if (!strncmp(kbuf, "0", 1)) {
		fb->display_info->cabc_enabled = false;
		fb->display_info->clear_panel_ram = false;
		if (fb->blank_state != KONA_FB_BLANK) {
			(void)kona_fb_blank(FB_BLANK_NORMAL, &fb->fb);
			(void)kona_fb_blank(FB_BLANK_UNBLANK, &fb->fb);
		}
		pr_info("%s: CABC turned off\n", __func__);
	} else {
		fb->display_info->cabc_enabled = true;
		fb->display_info->clear_panel_ram = true;
		if (fb->blank_state != KONA_FB_BLANK) {
			(void)kona_fb_blank(FB_BLANK_NORMAL, &fb->fb);
			(void)kona_fb_blank(FB_BLANK_UNBLANK, &fb->fb);
		}
		pr_info("%s: CABC turned on\n", __func__);
	}
fail_exit:
	kfree(kbuf);
exit:
	mutex_unlock(&fb->update_sem);
	return count;
}

static int dbgfs_cabc_open(struct inode *inode, struct file *file)
{
	return single_open(file, NULL, inode->i_private);
}

static const struct file_operations dbgfs_cabc_fops = {
	.owner			= THIS_MODULE,
	.open			= dbgfs_cabc_open,
	.write			= dbgfs_cabc_write,
	.llseek			= seq_lseek,
	.release		= single_release,
};

void __init kona_fb_create_debugfs(struct platform_device *pdev)
{
	struct kona_fb *fb;
	struct device *dev;

	if (!pdev) {
		pr_err("%s: no device\n", __func__);
		return;
	}

	dev = &pdev->dev;

	fb = platform_get_drvdata(pdev);
	if (!fb) {
		dev_err(dev, "%s: failed to get drvdata\n", __func__);
		return;
	}
	if (!&dev->kobj) {
		dev_err(dev, "%s: no &dev->kobj\n", __func__);
		return;
	}

	fb->dbgfs_dir = debugfs_create_dir(kobject_name(&dev->kobj), 0);
	if (!fb->dbgfs_dir) {
		dev_err(dev, "%s: dbgfs create dir failed\n", __func__);
	} else {
		if (!debugfs_create_file("panel_read", S_IWUSR, fb->dbgfs_dir,
							fb, &dbgfs_read_fops)) {
			dev_err(dev, "%s: failed to create dbgfs read file\n",
								__func__);
			return;
		}
		if (!debugfs_create_file("panel_write", S_IWUSR, fb->dbgfs_dir,
						fb, &dbgfs_write_fops)) {
			dev_err(dev, "%s: failed to create dbgfs write file\n",
								__func__);
			return;
		}
		if (!debugfs_create_file("cabc", S_IWUSR, fb->dbgfs_dir,
						fb, &dbgfs_cabc_fops)) {
			dev_err(dev, "%s: failed to create dbgfs cabc file\n",
								__func__);
			return;
		}
	}
}

void __exit kona_fb_remove_debugfs(struct platform_device *pdev)
{
	struct kona_fb *fb;

	if (!pdev || !&pdev->dev) {
		pr_err("%s: no device\n", __func__);
		return;
	}

	fb = platform_get_drvdata(pdev);
	if (!fb) {
		dev_err(&pdev->dev, "%s: failed to get drvdata\n", __func__);
		return;
	}
	debugfs_remove_recursive(fb->dbgfs_dir);
}
#endif /* CONFIG_DEBUG_FS */

static int enable_display(struct kona_fb *fb)
{
	int ret = 0;

	ret = fb->display_ops->init(fb->display_info, &fb->display_hdl, fb->pdev);
	if (ret != 0) {
		konafb_error("Failed to init this display device!\n");
		goto fail_to_init;
	}

	kona_clock_start(fb);
	ret = fb->display_ops->open(fb->display_hdl);
	if (ret != 0) {
		konafb_error("Failed to open this display device!\n");
		goto fail_to_open;
	}
	fb->link_suspended = false;
	if (fb->fb_data->pm_sleep)
		ret = fb->display_ops->power_control(fb->display_hdl,
				CTRL_SLEEP_OUT);
	else
		ret = fb->display_ops->power_control(fb->display_hdl,
				CTRL_PWR_ON);
	if (ret != 0) {
		konafb_error("Failed to power on this display device!\n");
		goto fail_to_power_control;
	}
	INIT_WORK(&fb->vsync_smart, vsync_work_smart);
	if (!fb->display_info->vmode) {
		schedule_work(&fb->vsync_smart);
		kona_clock_stop(fb);
	}

	konafb_debug("kona display is enabled successfully\n");
	return 0;

fail_to_power_control:
	fb->display_ops->close(fb->display_hdl);
fail_to_open:
	kona_clock_stop(fb);
	fb->display_ops->exit(fb->display_hdl);
fail_to_init:
	return ret;

}

static int disable_display(struct kona_fb *fb)
{
	int ret = 0;

	if (!fb->display_info->vmode)
		kona_clock_start(fb);
	cancel_work_sync(&fb->vsync_smart);

	if (fb->fb_data->pm_sleep)
		fb->display_ops->power_control(fb->display_hdl,
			CTRL_SLEEP_IN);
	else
		fb->display_ops->power_control(fb->display_hdl,
			CTRL_PWR_OFF);
	fb->display_ops->close(fb->display_hdl);
	fb->link_suspended = true;
	fb->display_ops->exit(fb->display_hdl);
	kona_clock_stop(fb);
	konafb_debug("kona display is disabled successfully\n");
	return ret;
}

static int kona_fb_ioctl(struct fb_info *info, unsigned int cmd,
			 unsigned long arg)
{
	void *ptr = NULL;
	int ret = 0;
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);

	konafb_debug("kona ioctl called! Cmd %x, Arg %lx\n", cmd, arg);
	switch (cmd) {

	case FBIO_WAITFORVSYNC:
		if (wait_for_completion_killable(&vsync_event) < 0) {
			konafb_info("Failed to get a vsync event\n");
			ret = -ETIMEDOUT;
		}
		break;

	case KONA_IOCTL_SET_BUFFER_AND_UPDATE:
		if (mutex_lock_killable(&fb->update_sem))
			return -EINTR;
		ptr = (void *)arg;

		if (ptr == NULL) {
			mutex_unlock(&fb->update_sem);
			return -EFAULT;
		}

		if (!fb->display_info->vmode) {
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);
			kona_clock_start(fb);
			ret = fb->display_ops->update(
					fb->display_hdl, ptr, NULL, NULL);
			kona_clock_stop(fb);
			complete(&g_kona_fb->prev_buf_done_sem);
		} else {
			ret = fb->display_ops->update(
					fb->display_hdl, ptr, NULL, NULL);
		}

		mutex_unlock(&fb->update_sem);
		break;

	case KONA_IOCTL_GET_FB_IOVA:
		ptr = (void *)arg;
		if (ptr == NULL) {
			pr_err("arg=NULL\n");
			return -EFAULT;
		}
		ret = copy_to_user(ptr, &fb->buff0, sizeof(u32));
		if (ret < 0)
			pr_err("copy2user failed ret=%d\n", ret);
		break;

	default:
		konafb_error("Wrong ioctl cmd\n");
		ret = -ENOTTY;
		break;
	}

	return ret;
}

static int clear_panel_ram(struct kona_fb *fb)
{
	int ret = 0;
	DISPDRV_WIN_t p_win;
	void *black_buf;
	size_t fsize, black_ram_size;
	dma_addr_t phys_base;
	struct platform_device *pdev = fb->pdev;
	uint16_t black_ram_lines;

	pr_info("%s: fill RAM with black\n", __func__);
	/* Workaround: One page extra allocated and mapped via m4u to avoid
	* v3d write faulting in m4u doing extra access */
	black_ram_lines = fb->display_info->clear_ram_row_end -
				fb->display_info->clear_ram_row_start + 1;
	black_ram_size = fb->display_info->width * black_ram_lines *
							fb->display_info->Bpp;
	fsize = PAGE_ALIGN(4096 + black_ram_size);

	black_buf = dma_alloc_writecombine(&pdev->dev, fsize, &phys_base,
								GFP_KERNEL);
	if (black_buf == NULL) {
		ret = -ENOMEM;
		konafb_error("Unable to allocate black framebuffer\n");
	} else {
		memset(black_buf, 0, fsize);
		p_win.l = 0;
		p_win.r = fb->display_info->width - 1;
		p_win.t = fb->display_info->clear_ram_row_start - 1;
		p_win.b = fb->display_info->clear_ram_row_end - 1;
		p_win.h = fb->display_info->clear_ram_row_end;
		p_win.w = fb->display_info->width;
		ret = fb->display_ops->update(fb->display_hdl, black_buf,
								&p_win, NULL);
		dma_free_writecombine(&pdev->dev, fsize, black_buf, phys_base);
	}
	return ret;
}

static int kona_fb_blank(int blank_mode, struct fb_info *info)
{
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);

	switch (blank_mode) {
	case FB_BLANK_POWERDOWN:
	case FB_BLANK_HSYNC_SUSPEND:
	case FB_BLANK_VSYNC_SUSPEND:
	case FB_BLANK_NORMAL:
		mutex_lock(&fb->update_sem);
		if (fb->blank_state == KONA_FB_BLANK) {
			konafb_debug("Display already in blank state. "
								"Do nothing\n");
			mutex_unlock(&fb->update_sem);
			break;
		}

		if (fb->link_suspended)
			link_control(fb, RESUME_LINK);

		if (fb->fb_data->esdcheck) {
			/* cancel the esd check routine */
			cancel_delayed_work(&fb->esd_check_work);
		}

		fb->g_stop_drawing = 1;
		/* In case of video mode, DSI commands can be sent out-of-sync
		 * of buffers */
		if (!fb->display_info->vmode) {
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);
			kona_clock_start(fb);
			if (fb->display_ops->power_control(fb->display_hdl,
					       CTRL_SCREEN_OFF))
				konafb_error(
				"Failed to blank this display device!\n");
			kona_clock_stop(fb);
			complete(&g_kona_fb->prev_buf_done_sem);
		} else {
			if (fb->display_ops->power_control(fb->display_hdl,
					       CTRL_SCREEN_OFF))
				konafb_error(
				"Failed to blank this display device!\n");
		}

		/* screen goes to sleep mode */
		disable_display(fb);

		/* Ok for MM going to shutdown state */
		pi_mgr_qos_request_update(&g_mm_qos_node,
					  PI_MGR_QOS_DEFAULT_VALUE);

		fb->blank_state = KONA_FB_BLANK;
		mutex_unlock(&fb->update_sem);
		break;

	case FB_BLANK_UNBLANK:
		mutex_lock(&fb->update_sem);
		if (fb->blank_state == KONA_FB_UNBLANK) {
			konafb_debug("Display already in unblank state. "
								"Do nothing\n");
			mutex_unlock(&fb->update_sem);
			break;
		}

		/* Ok for MM going to retention but not shutdown state */
		pi_mgr_qos_request_update(&g_mm_qos_node, 10);
		/* screen comes out of sleep */
		if (enable_display(fb))
			konafb_error("Failed to enable this display device\n");

		if (!fb->display_info->vmode) {
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);

			kona_clock_start(fb);
		}
		if (fb->display_info->clear_panel_ram)
			(void)clear_panel_ram(fb);
		fb->display_ops->update(fb->display_hdl,
				fb->fb.var.yoffset ? fb->buff1 : fb->buff0,
				NULL,
				(DISPDRV_CB_T)kona_display_done_cb);

		if (fb->display_info->vmode) {
			if (wait_for_completion_timeout(
			&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
				pr_err("%s:%d timed out waiting for completion",
					__func__, __LINE__);
		}


		fb->g_stop_drawing = 0;

		if (fb->display_info->special_mode_on == true) {
			konafb_debug("Go to special mode\n");
			kona_clock_start(fb);
			panel_write(fb->display_info->special_mode_on_seq);
			kona_clock_stop(fb);
		}

		if (!fb->display_info->vmode) {
			kona_clock_start(fb);

			if (fb->display_ops->
			    power_control(fb->display_hdl, CTRL_SCREEN_ON))
				konafb_error
				("Failed to unblank this display device!\n");

			kona_clock_stop(fb);
		} else {
			if (fb->display_ops->
			    power_control(fb->display_hdl, CTRL_SCREEN_ON))
				konafb_error
				("Failed to unblank this display device!\n");
		}
#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
		if (atomic_read(&g_kona_fb->force_update))
			kona_display_crash_image(CP_CRASH_DUMP_START);
#endif
		if (fb->fb_data->esdcheck) {
			/* schedule the esd check routine */
			queue_delayed_work(fb->esd_check_wq,
					&fb->esd_check_work,
			msecs_to_jiffies(fb->fb_data->esdcheck_period_ms));
		}

		if (fb->suspend_link)
			link_control(fb, SUSPEND_LINK);

		fb->blank_state = KONA_FB_UNBLANK;
		mutex_unlock(&fb->update_sem);
		break;

	default:
		return 1;
	}

	return 0;
}

static irqreturn_t kona_fb_esd_irq(int irq, void *dev_id)
{
	struct kona_fb *fb = (struct kona_fb *)dev_id;
	complete(&fb->tectl_gpio_done_sem);
	return IRQ_HANDLED;
}



static void kona_fb_esd_check(struct work_struct *data)
{
	struct kona_fb *fb = container_of((struct delayed_work *)data,
			struct kona_fb, esd_check_work);
	int esd_result = -EIO;
	uint32_t tectl_gpio = fb->fb_data->tectl_gpio;

	if (g_display_enabled) {
		/* Wait fb initial completed */
		queue_delayed_work(fb->esd_check_wq, &fb->esd_check_work,
			msecs_to_jiffies(fb->fb_data->esdcheck_period_ms));
		return;
	}

	if (fb->g_stop_drawing)
		return;

	if (tectl_gpio > 0) {
		unsigned long jiff_in = 0;

		/* mark as incomplete before waiting the esd signal */
		INIT_COMPLETION(fb->tectl_gpio_done_sem);
		enable_irq(gpio_to_irq(tectl_gpio));
		jiff_in = wait_for_completion_timeout(&fb->tectl_gpio_done_sem,
				msecs_to_jiffies(200));
		if (!jiff_in) {
			konafb_error("Wait esd gpio irq timeout\n");
			esd_result = -EIO;
		} else
			esd_result = 0;
		disable_irq(gpio_to_irq(tectl_gpio));
	} else {
		mutex_lock(&fb->update_sem);
		if (fb->display_info->esd_check_fn)
			esd_result = fb->display_info->esd_check_fn();
		if (esd_result < 0) /* stop drawing till error is recovered */
			fb->g_stop_drawing = 1;
		mutex_unlock(&fb->update_sem);
	}

	konafb_debug("esd_result %d\n", esd_result);

	if (esd_result < 0) {
		konafb_error("result %d failure_cnt %d\n", esd_result,
				fb->esd_failure_cnt);

		fb->esd_failure_cnt++;
		if (fb->esd_failure_cnt > fb->fb_data->esdcheck_retry) {
			konafb_error("too many fail %d, disable esd check\n",
					fb->esd_failure_cnt);
			fb->fb_data->esdcheck = FALSE;
			cancel_delayed_work(&fb->esd_check_work);
			destroy_workqueue(fb->esd_check_wq);
		}
	} else {
		fb->esd_failure_cnt = 0;
		queue_delayed_work(fb->esd_check_wq, &fb->esd_check_work,
			msecs_to_jiffies(fb->fb_data->esdcheck_period_ms));
	}

	return;
}

void free_platform_data(struct device *dev)
{
	if (dev->of_node)
		kfree(dev->platform_data);
}

static int __init lcd_panel_setup(char *panel)
{
	if (panel && strlen(panel)) {
		pr_err("bootloader has initialised %s\n", panel);
		strcpy(g_disp_str, panel);
		g_display_enabled = 0;
	}
	return 1;
}
__setup("lcd_panel=", lcd_panel_setup);


static int __init lcd_boot_mode(char *mode)
{
#ifndef CONFIG_FB_NEED_PAGE_ALIGNMENT
	if (mode && strlen(mode)) {
		if (!strcmp(mode, "recovery") || !strcmp(mode, "charger"))
			need_page_alignment = 0;
	}
#endif
	return 1;
}
__setup("androidboot.mode=", lcd_boot_mode);

#ifdef CONFIG_OF
static struct kona_fb_platform_data * __init get_of_data(struct device_node *np)
{
	u32 val;
	const char *str;
	struct kona_fb_platform_data *fb_data;
#ifdef CONFIG_IOMMU_API
	struct device_node *tmp_node;
#endif

	fb_data = kzalloc(sizeof(struct kona_fb_platform_data),
		GFP_KERNEL);
	if (!fb_data) {
		pr_err("couldn't allocate memory for pdata");
		goto alloc_failed;
	}

	if (of_property_read_string(np,	"module-name", &str))
		goto of_fail;
	if (unlikely(strlen(str) > DISPDRV_NAME_SZ))
		goto of_fail;
	if (g_display_enabled && strcmp(str, g_disp_str)) {
		pr_err("%s != %s enabled by bootloader\n", str, g_disp_str);
		goto of_fail;
	}
	strcpy(fb_data->name, str);

	if (of_property_read_string(np, "reg-name", &str))
		goto of_fail;
	if (unlikely(strlen(str) > DISPDRV_NAME_SZ))
		goto of_fail;
	strcpy(fb_data->reg_name, str);
	fb_data->rst.gpio = of_get_named_gpio(np, "rst-gpio", 0);
	if (!gpio_is_valid(fb_data->rst.gpio))
		goto of_fail;
	if (of_property_read_u32(np, "rst-setup", &val))
		goto of_fail;
	fb_data->rst.setup = val;
	if (of_property_read_u32(np, "rst-pulse", &val))
		goto of_fail;
	fb_data->rst.pulse = val;
	if (of_property_read_u32(np, "rst-hold", &val))
		goto of_fail;
	fb_data->rst.hold = val;

	if (of_property_read_bool(np, "rst-active-high"))
		fb_data->rst.active = true;
	else
		fb_data->rst.active = false;

	if (of_property_read_u32(np, "rotation", &val))
		goto of_fail;
	fb_data->rotation = val;

	fb_data->detect.gpio = of_get_named_gpio(np, "detect-gpio", 0);
	if (gpio_is_valid(fb_data->detect.gpio)) {
		if (of_property_read_u32(np,
			"detect-gpio-val", &val))
			goto of_fail;
		fb_data->detect.gpio_val = val;

		fb_data->detect.active =
			gpio_get_value(fb_data->detect.gpio);
		if (fb_data->detect.active !=
				fb_data->detect.gpio_val) {
			konafb_error(
			"gpio %d value failed for panel %s\n",
			fb_data->detect.gpio, fb_data->name);
			goto of_fail;
		}
	}

	if (of_property_read_bool(np, "vmode"))
		fb_data->vmode = true;
	else
		fb_data->vmode = false;
	if (of_property_read_bool(np, "vburst"))
		fb_data->vburst = true;
	else
		fb_data->vburst = false;
	if (of_property_read_bool(np, "cmnd-LP"))
		fb_data->cmnd_LP = true;
	else
		fb_data->cmnd_LP = false;
	if (of_property_read_bool(np, "te-ctrl"))
		fb_data->te_ctrl = true;
	else
		fb_data->te_ctrl = false;
	if (of_property_read_bool(np, "pm-sleep"))
		fb_data->pm_sleep = true;
	else
		fb_data->pm_sleep = false;

	if (of_property_read_u32(np, "col-mod-i", &val))
		goto of_fail;
	fb_data->col_mod_i = (uint8_t)val;
	if (of_property_read_u32(np, "col-mod-o", &val))
		goto of_fail;
	fb_data->col_mod_o = (uint8_t)val;
	if (of_property_read_u32(np, "width", &val))
		goto of_fail;
	fb_data->width = (uint16_t)val;
	if (of_property_read_u32(np, "height", &val))
		goto of_fail;
	fb_data->height = (uint16_t)val;
	if (of_property_read_u32(np, "fps", &val))
		goto of_fail;
	fb_data->fps = (uint8_t)val;
	if (of_property_read_u32(np, "lanes", &val))
		goto of_fail;
	fb_data->lanes = (uint8_t)val;
	if (of_property_read_u32(np, "hs-bitrate", &val))
		goto of_fail;
	fb_data->hs_bps = val;
	if (of_property_read_u32(np, "lp-bitrate", &val))
		goto of_fail;
	fb_data->lp_bps = val;

	/* Desense offset value to be absolute value w.r.t hs-bitrate */
	if (of_property_read_u32(np, "desense-offset", &val)) {
		konafb_info("desense offset not populated\n");
		fb_data->desense_offset = 0;
	} else {
		konafb_info("desense offset requested %d\n", val);
		fb_data->desense_offset = (int) val;
	}

	/*Get the ESD config */
	if (of_property_read_bool(np, "esdcheck")) {
		fb_data->esdcheck = TRUE;
		if (of_property_read_u32(np, "esdcheck-period-ms", &val))
			goto of_fail;
		fb_data->esdcheck_period_ms = val;
		if (of_property_read_u32(np, "esdcheck-retry", &val))
			goto of_fail;
		fb_data->esdcheck_retry = (uint8_t)val;
		if (of_property_read_u32(np, "tectl-gpio", &val))
			fb_data->tectl_gpio = 0;
		else {
			/* Only allow tectl as gpio if TE is not used */
			if (fb_data->vmode || !fb_data->te_ctrl)
				fb_data->tectl_gpio = val;
			else
				konafb_info("Can't enable tectl_gpio");
		}
	} else
		fb_data->esdcheck = FALSE;

#ifdef CONFIG_IOMMU_API
	/* Get the iommu device and link fb dev to iommu dev */
	tmp_node = of_parse_phandle(np, "iommu", 0);
	if (tmp_node  == NULL) {
		pr_err("%s get node(iommu) failed\n", __func__);
		goto of_fail;
	}
	fb_data->pdev_iommu = of_find_device_by_node(tmp_node);
	if (fb_data->pdev_iommu == NULL) {
		pr_err("%s get iommu device failed\n", __func__);
		goto of_fail;
	}
#endif /* CONFIG_IOMMU_API */

#ifdef CONFIG_BCM_IOVMM
	/* Get the iommu mapping and attach fb dev to mapping */
	tmp_node = of_parse_phandle(np,	"iovmm", 0);
	if (tmp_node  == NULL) {
		pr_err("%s get node(iovmm) failed\n", __func__);
		goto of_fail;
	}
	fb_data->pdev_iovmm = of_find_device_by_node(tmp_node);
	if (fb_data->pdev_iovmm == NULL) {
		pr_err("%s get iovmm device failed\n", __func__);
		goto of_fail;
	}
#endif /* CONFIG_BCM_IOVMM */


	return fb_data;

of_fail:
	konafb_error("get_of_data failed\n");
	kfree(fb_data);
alloc_failed:
	return NULL;
}
#endif /* CONFIG_OF */

static char *get_seq(DISPCTRL_REC_T *rec)
{
	char *buff, *dst;
	int list_len, cmd_len;
	DISPCTRL_REC_T *cur;
	int i;

	buff = NULL;
	/* Get the length of sequence in bytes = cmd+data+headersize+null */
	cur = rec;
	list_len = 0;
	for (i = 0; DISPCTRL_LIST_END != cur[i].type; i++) {
		if (DISPCTRL_WR_DATA == cur[i].type)
			list_len++;
		else if (DISPCTRL_GEN_WR_CMND == cur[i].type)
			list_len += 3; /* One more tag for Gen cmd */
		else
			list_len += 2; /* Indicates new packet */
	}

	list_len++; /* NULL termination */

	/* Allocate buff = length */
	buff = kmalloc(list_len, GFP_KERNEL);
	if (!buff)
		goto seq_done;


	/* Parse the DISPCTRL_REC_T[], extract data and fill buff */
	cur = rec;
	dst = buff;
	i = 0;
	for (i = 0; DISPCTRL_LIST_END != cur[i].type; i++) {
		switch (cur[i].type) {
		case DISPCTRL_GEN_WR_CMND:
			*dst++ = DISPCTRL_TAG_GEN_WR;
			/* fall through */
		case DISPCTRL_WR_CMND:
			cmd_len = 1;
			dst++;
			*dst++ = cur[i].val;
			while (DISPCTRL_WR_DATA == cur[i + 1].type) {
				i++;
				*dst++ = cur[i].val;
				cmd_len++;
			}
			if (cmd_len > DISPCTRL_MAX_DATA_LEN) {
				pr_err("cmd_len %d reach max\n", cmd_len);
				kfree(buff);
				buff = NULL;
				goto seq_done;
			}
			*(dst - cmd_len - 1) = cmd_len;
			break;
		case DISPCTRL_SLEEP_MS:
			/* Maximum packet size is limited to 254 */
			*dst++ = DISPCTRL_TAG_SLEEP;
			*dst++ = cur[i].val;
			break;
		default:
			pr_err("Invalid control list type %d\n", cur[i].type);
		}
	}

	/* Put a NULL at the end */
	*dst = 0;
	if (dst != (buff + list_len - 1))
		pr_err("dst ptr mismatch\n");
#if 0
	pr_err("dst %p buff %p\n", dst, buff);
	dst = buff;
	while (*dst)
		pr_err("%d ", *dst++);
	pr_err("list end size %d\n", list_len);
#endif
seq_done:
	return buff;
}

static int __init populate_dispdrv_cfg(struct kona_fb *fb,
	struct kona_fb_platform_data *pd)
{
	struct lcd_config *cfg;
	DISPDRV_INFO_T *info;
	int ret = -1;

	cfg = get_dispdrv_cfg(pd->name);
	if (!cfg) {
		pr_err("Couldn't find a suitable dispdrv\n");
		ret = -ENXIO;
		goto err_cfg;
	}

	if (cfg->mode_supp != LCD_CMD_VID_BOTH) {
		if (pd->vmode && (cfg->mode_supp != LCD_VID_ONLY)) {
			pr_err("No vid mode support\n");
			ret = -EINVAL;
			goto err_cfg;
		}
		if (!pd->vmode && (cfg->mode_supp != LCD_CMD_ONLY)) {
			pr_err("No cmd mode support\n");
			ret = -EINVAL;
			goto err_cfg;
		}
	}

	/* Allocate memory for disp_info */
	/* Setting memory to zero is mandatory for this struct */
	info = kzalloc(sizeof(DISPDRV_INFO_T), GFP_KERNEL);
	if (!info) {
		pr_err("Failed to allocate memory fr disp_info\n");
		ret = -ENOMEM;
		goto err_mem_disp_info;
	}

	/* Fill up "info" using "cfg" and "pd" */
	info->name = pd->name;
	info->reg_name = pd->reg_name;
	info->rst = &pd->rst;
	info->vmode = pd->vmode;
	info->vburst = (pd->vburst == cfg->vburst) ? pd->vburst : false;
	info->vid_cmnds = cfg->vid_cmnds;
	info->cmnd_LP = pd->cmnd_LP;
	info->te_ctrl = pd->te_ctrl;
	info->width = pd->width;
	info->height = pd->height;
	info->lanes = (pd->lanes > cfg->max_lanes) ? cfg->max_lanes : pd->lanes;

	/* Hardcode for now */
	info->in_fmt = pd->col_mod_i;
	info->out_fmt = pd->col_mod_o;
	if (info->in_fmt == DISPDRV_FB_FORMAT_RGB666U ||
			info->in_fmt == DISPDRV_FB_FORMAT_RGB666P ||
			info->in_fmt == DISPDRV_FB_FORMAT_RGB565)
		info->Bpp = 2;
	else
		info->Bpp = 4;

	info->phys_width = cfg->phys_width;
	info->phys_height = cfg->phys_height;
	info->fps = pd->fps;

	info->slp_in_seq = get_seq(cfg->slp_in_seq);
	if (!info->slp_in_seq)
		goto err_slp_in_seq;
	info->slp_out_seq = get_seq(cfg->slp_out_seq);
	if (!info->slp_out_seq)
		goto err_slp_out_seq;
	info->scrn_on_seq = get_seq(cfg->scrn_on_seq);
	if (!info->scrn_on_seq)
		goto err_scrn_on_seq;
	info->scrn_off_seq = get_seq(cfg->scrn_off_seq);
	if (!info->scrn_off_seq)
		goto err_scrn_off_seq;
	if (cfg->verify_id) {
		info->id_seq = get_seq(cfg->id_seq);
		if (!info->id_seq)
			goto err_id_seq;
	}
	memcpy(info->phy_timing, cfg->phy_timing, sizeof(info->phy_timing));
	if (info->vmode) {
		info->init_seq = get_seq(cfg->init_vid_seq);
		info->hs = cfg->hs;
		info->hbp = cfg->hbp;
		info->hfp = cfg->hfp;
		info->hbllp = cfg->hbllp;
		info->vs = cfg->vs;
		info->vbp = cfg->vbp;
		info->vfp = cfg->vfp;
	} else {
		info->init_seq = get_seq(cfg->init_cmd_seq);
		info->updt_win_fn = cfg->updt_win_fn;
		info->updt_win_seq_len = cfg->updt_win_seq_len;
	}
	if (!info->init_seq)
		goto err_init_seq;

	if (!info->vmode) {
		if (!info->updt_win_seq_len) {
			pr_err("Abort: win_seq_len = 0 for command mode\n");
			goto err_win_seq;
		}
		info->win_seq = kmalloc(info->updt_win_seq_len, GFP_KERNEL);
		if (!info->win_seq)
			goto err_win_seq;
	}

	/* Panel special mode */
	if (cfg->special_mode_panel) {
		info->special_mode_on_seq =
					get_seq(cfg->special_mode_on_cmd_seq);
		if (!info->special_mode_on_seq)
			goto err_special_mode_seq;
		info->special_mode_off_seq =
					get_seq(cfg->special_mode_off_cmd_seq);
		if (!info->special_mode_off_seq)
			goto err_special_mode_seq;
		info->special_mode_on = cfg->special_mode_on;
		info->special_mode_panel = cfg->special_mode_panel;
		pr_info("%s(%d): Panel special mode: %d\n",
				__func__, __LINE__, info->special_mode_on);
	}

	info->cabc_enabled = cfg->cabc_enabled;
	if (info->cabc_enabled) {
		info->cabc_init_seq = get_seq(cfg->cabc_init_seq);
		if (!info->cabc_init_seq)
			goto err_cabc_seq;
		info->cabc_on_seq = get_seq(cfg->cabc_on_seq);
		if (!info->cabc_on_seq)
			goto err_cabc_seq;
		info->cabc_off_seq = get_seq(cfg->cabc_off_seq);
		if (!info->cabc_off_seq)
			goto err_cabc_seq;
	}

	info->clear_panel_ram = cfg->clear_panel_ram;
	info->clear_ram_row_start = cfg->clear_ram_row_start;
	info->clear_ram_row_end = cfg->clear_ram_row_end;
	info->no_te_in_sleep = cfg->no_te_in_sleep;

	if (info->clear_panel_ram)	/* Override kernel command line ... */
		g_display_enabled = 0;	/* ... and force re-init of display */


	/* burst mode changes to be taken care here or PV? */
	info->hs_bps = (pd->hs_bps > cfg->max_hs_bps) ?
				 cfg->max_hs_bps : pd->hs_bps;
	info->lp_bps = (pd->lp_bps > cfg->max_lp_bps) ?
				 cfg->max_lp_bps : pd->lp_bps;
	info->desense_offset = pd->desense_offset;

	info->vsync_cb = (info->vmode) ? konafb_vsync_cb : NULL;
	info->cont_clk = cfg->cont_clk;
	info->init_fn = cfg->init_fn;
	info->esd_check_fn = cfg->esd_check_fn;
	fb->display_info = info;
	return 0;

err_cabc_seq:
	kfree(info->cabc_init_seq);
	kfree(info->cabc_on_seq);
	kfree(info->cabc_off_seq);
err_special_mode_seq:
	kfree(info->special_mode_on_seq);
	kfree(info->special_mode_off_seq);
err_win_seq:
	kfree(info->init_seq);
err_init_seq:
	if (cfg->verify_id)
		kfree(info->id_seq);
err_id_seq:
	kfree(info->scrn_off_seq);
err_scrn_off_seq:
	kfree(info->scrn_on_seq);
err_scrn_on_seq:
	kfree(info->slp_out_seq);
err_slp_out_seq:
	kfree(info->slp_in_seq);
err_slp_in_seq:
	kfree(info);
err_mem_disp_info:
err_cfg:
	return ret;
}

void release_dispdrv_info(DISPDRV_INFO_T *info)
{
	BUG_ON(ZERO_OR_NULL_PTR(info));
	kfree(info->cabc_init_seq);
	kfree(info->cabc_on_seq);
	kfree(info->cabc_off_seq);
	kfree(info->special_mode_on_seq);
	kfree(info->special_mode_off_seq);
	kfree(info->init_seq);
	kfree(info->slp_in_seq);
	kfree(info->slp_out_seq);
	kfree(info->scrn_on_seq);
	kfree(info->scrn_off_seq);
	kfree(info->win_seq);
	kfree(info);
}

static int kona_fb_open(struct fb_info *info, int user)
{
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);
	fb->open_count++;
	return 0;
}

static int kona_fb_release(struct fb_info *info, int user)
{
	struct kona_fb *fb = container_of(info, struct kona_fb, fb);
	fb->open_count--;

	if (fb->open_count < 0)
		return -EIO;
	/* If the open count goes 0, then restore the rotation parameter so that
	 * user space can again get to know the rotation parameter. */
	if (fb->open_count == 0)
		info->var.rotate = fb->rotate;

	return 0;
}

static struct fb_ops kona_fb_ops = {
	.fb_open = kona_fb_open,
	.fb_release = kona_fb_release,
	.owner = THIS_MODULE,
	.fb_check_var = kona_fb_check_var,
	.fb_set_par = kona_fb_set_par,
	.fb_setcolreg = kona_fb_setcolreg,
	.fb_pan_display = kona_fb_pan_display,
	.fb_fillrect = cfb_fillrect,
	.fb_copyarea = cfb_copyarea,
	.fb_imageblit = cfb_imageblit,
	.fb_ioctl = kona_fb_ioctl,
	.fb_sync = kona_fb_sync,
	.fb_blank = kona_fb_blank,
};


static const struct file_operations proc_fops = {
	.write = proc_write_fb_test,
};

static int __ref kona_fb_probe(struct platform_device *pdev)
{
	int ret = -ENXIO;
	struct kona_fb *fb;
	size_t framesize, framesize_alloc;
	uint32_t width, height;
	int ret_val = -1;
	struct kona_fb_platform_data *fb_data;
	dma_addr_t phys_fbbase, dma_addr, direct_dma_addr;
	uint64_t pixclock_64;
#ifdef CONFIG_LOGO
	int logo_rotate;
#endif
	uint32_t uboot_phys;
	void *uboot_kvirt = NULL;
	int need_map_switch = 0;

	konafb_info("start\n");
	if (g_kona_fb && (g_kona_fb->is_display_found == 1)) {
		konafb_info("A right display device is already found!\n");
		return -EINVAL;
	}

	fb = kzalloc(sizeof(struct kona_fb), GFP_KERNEL);
	if (fb == NULL) {
		konafb_error("Unable to allocate framebuffer structure\n");
		ret = -ENOMEM;
		goto err_fb_alloc_failed;
	}
	fb->g_stop_drawing = 0;

	g_kona_fb = fb;
	ret_val =
	    pi_mgr_dfs_add_request(&g_kona_fb->dfs_node, "lcd", PI_MGR_PI_ID_MM,
				   PI_OPP_ECONOMY);

	if (ret_val) {
		printk(KERN_ERR "Failed to add dfs request for LCD\n");
		ret = -EIO;
		goto fb_dfs_fail;
	}

#ifdef CONFIG_OF
	if (pdev->dev.of_node) {
		fb_data = get_of_data(pdev->dev.of_node);
		if (!fb_data)
			goto fb_data_failed;
		else /* Save the pointer needed in remove method */
			pdev->dev.platform_data = fb_data;
	} else {
#endif
		fb_data = pdev->dev.platform_data;
		if (!fb_data) {
			ret = -EINVAL;
			goto fb_data_failed;
		}
#ifdef CONFIG_OF
	}
#endif

	if (populate_dispdrv_cfg(fb, fb_data))
		goto dispdrv_data_failed;

	pr_err("Initialising in %s mode\n", fb->display_info->vmode ?
						"VIDEO" : "COMMAND");
	fb->display_ops = (DISPDRV_T *)DISP_DRV_GetFuncTable();

	spin_lock_init(&fb->lock);
	platform_set_drvdata(pdev, fb);
	fb->fb_data = fb_data;
	fb->pdev = pdev;

	mutex_init(&fb->update_sem);
	atomic_set(&fb->buff_idx, 0);
	atomic_set(&fb->is_fb_registered, 0);
	atomic_set(&fb->force_update, 0);
	init_completion(&fb->prev_buf_done_sem);
	init_completion(&vsync_event);
	complete(&fb->prev_buf_done_sem);
	atomic_set(&fb->is_graphics_started, 0);
	INIT_DELAYED_WORK(&fb->link_work, fb_suspend_link_work);
	wake_lock_init(&fb->wlock, WAKE_LOCK_SUSPEND, "dsi_link_wakelock");

	ret = enable_display(fb);
	if (ret) {
		konafb_error("Failed to enable this display device\n");
		goto err_enable_display_failed;
	} else {
		fb->is_display_found = 1;
	}

	framesize = fb->display_info->width * fb->display_info->height *
	    fb->display_info->Bpp;

	if (need_page_alignment)
		framesize = PAGE_ALIGN(framesize);
	framesize *= 2;

	/* Workaround: One page extra allocated and mapped via m4u to avoid
	 * v3d write faulting in m4u doing extra access */
	framesize_alloc = PAGE_ALIGN(framesize + 4096);
	fb->framesize_alloc = framesize_alloc;

	fb->fb.screen_base = dma_alloc_writecombine(&pdev->dev,
			framesize_alloc,
			&phys_fbbase,
			GFP_KERNEL);
	pr_info("kona_fb: screen_base=%p, phys_fbbase=%p size=0x%x\n",
			(void *)fb->fb.screen_base, (void *)phys_fbbase,
			framesize_alloc);
	if (fb->fb.screen_base == NULL) {
		ret = -ENOMEM;
		konafb_error("Unable to allocate fb memory\n");
		goto err_fbmem_alloc_failed;
	}
	dma_addr = phys_fbbase;
	direct_dma_addr = dma_addr;

#ifdef CONFIG_IOMMU_API
	pdev->dev.archdata.iommu = &fb_data->pdev_iommu->dev;
	pr_info("%s iommu-device(%p)\n", "framebuffer",
			pdev->dev.archdata.iommu);
#ifdef CONFIG_BCM_IOVMM
	need_map_switch = g_display_enabled && fb->display_info->vmode;
	if (need_map_switch) {
		/* 1:1 map for uboot logo */
		ret = kona_fb_direct_map(fb,
				framesize_alloc, phys_fbbase, direct_dma_addr);
		if (ret < 0) {
			pr_err("kona_fb_direct_map failed\n");
			goto err_set_var_failed;
		}
	}
	ret = kona_fb_iovmm_map(fb, framesize_alloc, phys_fbbase, &dma_addr);
#else
	ret = kona_fb_direct_map(fb,
			framesize_alloc, phys_fbbase, direct_dma_addr);
#endif /* CONFIG_BCM_IOVMM */
	pr_info("%16s: iommu map da(%#x) pa(%#x) size(%#x)\n",
			"framebuffer", dma_addr, phys_fbbase, framesize_alloc);
	if (ret < 0) {
		pr_err("kona_fb_iommu_mapping failed\n");
		goto err_set_var_failed;
	}
#endif /* CONFIG_IOMMU_API */

	/* Now we should get correct width and height for this display .. */
	width = fb->display_info->width;
	height = fb->display_info->height;
	fb->buff0 = (void *)dma_addr;
	fb->buff1 = (void *)dma_addr + framesize / 2;

	fb->fb.fbops = &kona_fb_ops;
	fb->fb.flags = FBINFO_FLAG_DEFAULT;
	fb->fb.pseudo_palette = fb->cmap;
	fb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
	fb->fb.fix.visual = FB_VISUAL_TRUECOLOR;
	fb->fb.fix.line_length = width * fb->display_info->Bpp;
	fb->fb.fix.accel = FB_ACCEL_NONE;
	fb->fb.fix.ypanstep = 1;
	fb->fb.fix.xpanstep = 4;
#ifdef PARTIAL_UPDATE_SUPPORT
	fb->fb.fix.reserved[0] = 0x5444;
	fb->fb.fix.reserved[1] = 0x5055;
#endif
	fb->fb.var.xres = width;
	fb->fb.var.yres = height;
	fb->fb.var.xres_virtual = width;
	fb->fb.var.yres_virtual = height * 2;
	fb->fb.var.bits_per_pixel = fb->display_info->Bpp << 3;
	fb->fb.var.activate = FB_ACTIVATE_NOW;
	fb->fb.var.height = fb->display_info->phys_height;
	fb->fb.var.width = fb->display_info->phys_width;
	pixclock_64 = div_u64(1000000000000LLU,
				width * height * fb->display_info->fps);
	fb->fb.var.pixclock = pixclock_64;
	fb->fb.var.rotate = fb_data->rotation == 180 ?
						FB_ROTATE_UD : FB_ROTATE_UR;
	fb->rotate = fb->fb.var.rotate;

	switch (fb->display_info->in_fmt) {
	case DISPDRV_FB_FORMAT_RGB666P:
	case DISPDRV_FB_FORMAT_RGB666U:
	case DISPDRV_FB_FORMAT_RGB565:
		fb->fb.var.red.offset = 11;
		fb->fb.var.red.length = 5;
		fb->fb.var.green.offset = 5;
		fb->fb.var.green.length = 6;
		fb->fb.var.blue.offset = 0;
		fb->fb.var.blue.length = 5;
		break;

	case DISPDRV_FB_FORMAT_xRGB8888:
		fb->fb.var.transp.offset = 24;
		fb->fb.var.transp.length = 8;
		fb->fb.var.red.offset = 16;
		fb->fb.var.red.length = 8;
		fb->fb.var.green.offset = 8;
		fb->fb.var.green.length = 8;
		fb->fb.var.blue.offset = 0;
		fb->fb.var.blue.length = 8;
		break;

	case DISPDRV_FB_FORMAT_xBGR8888:
		fb->fb.var.transp.offset = 24;
		fb->fb.var.transp.length = 8;
		fb->fb.var.blue.offset = 16;
		fb->fb.var.blue.length = 8;
		fb->fb.var.green.offset = 8;
		fb->fb.var.green.length = 8;
		fb->fb.var.red.offset = 0;
		fb->fb.var.red.length = 8;
		break;

	default:
		konafb_error("Wrong format!\n");
		break;
	}

	fb->fb.fix.smem_start = phys_fbbase;
	fb->fb.fix.smem_len = framesize;

	konafb_debug(
		"Framebuffer starts at phys[0x%08x], da[0x%08x] and virt[0x%08x] with frame size[0x%08x]\n",
		 phys_fbbase, dma_addr, (uint32_t) fb->fb.screen_base,
		 framesize);

	ret = fb_set_var(&fb->fb, &fb->fb.var);
	if (ret) {
		konafb_error("fb_set_var failed\n");
		goto err_set_var_failed;
	}

	if (need_map_switch) {
		uboot_phys = readl(KONA_AXIPV_VA + REG_CUR_FRAME);
		uboot_kvirt = ioremap_nocache(uboot_phys, framesize / 2);
		pr_info("Copy uboot logo to fb, phys 0x%x kvirt 0x%x\n",
				uboot_phys, (uint32_t)uboot_kvirt);
		if (uboot_kvirt) {
			/* memcopy uboot buffer to kernel's buff1 */
			memcpy(fb->fb.screen_base + (framesize / 2),
				uboot_kvirt, framesize / 2);
			iounmap(uboot_kvirt);
			/* update display with 1:1 map */
			if (!fb->display_info->vmode)
				kona_clock_start(fb);
			if (fb->display_info->clear_panel_ram)
				(void)clear_panel_ram(fb);
			ret = fb->display_ops->update(fb->display_hdl,
				(void *)phys_fbbase +
				(framesize / 2), NULL, NULL);
			if (!fb->display_info->vmode)
				kona_clock_stop(fb);
			if (ret) {
				konafb_error("Can not enable the LCD!\n");
				goto err_fb_register_failed;
			}
			/* Wait new buffer. TODO: checking frame end */
			usleep_range(16666, 16668);
		}
	}

#ifdef CONFIG_IOMMU_API
	if (bcm_iommu_enable(&pdev->dev) < 0)
		konafb_error("bcm_iommu_enable failed\n");
#endif
	if (!fb->display_info->vmode)
		kona_clock_start(fb);
	/* Paint it black (assuming default fb contents are all zero) */
	/* Or Paint it with the logo uboot has initliased */
	if (g_display_enabled && !fb->display_info->vmode) {
		/* Keep the boot display for command display */
	} else {
		if (fb->display_info->clear_panel_ram)
			(void)clear_panel_ram(fb);
		else
			ret = fb->display_ops->update(fb->display_hdl,
						fb->buff1, NULL, NULL);
	}
	if (ret) {
		konafb_error("Can not enable the LCD!\n");
		/* Stop esc_clock in cmd mode since disable_display
		 * again starts clock for cmd mode */
		if (!fb->display_info->vmode)
			kona_clock_stop(fb);
		goto err_fb_register_failed;
	}

#ifdef CONFIG_LOGO
	logo_rotate = fb->fb.var.rotate ? FB_ROTATE_UD : FB_ROTATE_UR;
	fb_prepare_logo(&fb->fb, logo_rotate);
	fb_show_logo(&fb->fb, logo_rotate);
	mutex_lock(&fb->update_sem);
	if (!fb->display_info->vmode) {
		kona_clock_start(fb);
		fb->display_ops->update(fb->display_hdl, fb->buff0, NULL, NULL);
		kona_clock_stop(fb);
	} else {
		fb->display_ops->update(fb->display_hdl, fb->buff0, NULL, NULL);
	}
	mutex_unlock(&fb->update_sem);
#endif

	/* Display on after painted blank */
	fb->display_ops->power_control(fb->display_hdl, CTRL_SCREEN_ON);
	if (!fb->display_info->vmode)
		kona_clock_stop(fb);

	if (need_map_switch) {
		/* To switch to new buffer. TODO: checking frame update end */
		usleep_range(16666, 16668);
#ifdef CONFIG_IOMMU_API
		/* unmap the uboot direct map */
		kona_fb_direct_unmap(fb, framesize_alloc, direct_dma_addr);
#endif
	}

	ret = register_framebuffer(&fb->fb);
	if (ret) {
		konafb_error("Framebuffer registration failed\n");
		goto err_fb_register_failed;
	}
#ifdef CONFIG_FRAMEBUFFER_FPS
	fb->fps_info = fb_fps_register(&fb->fb);
	if (NULL == fb->fps_info)
		printk(KERN_ERR "No fps display");
#endif

	atomic_set(&fb->is_fb_registered, 1);
	konafb_info("kona Framebuffer probe successfull\n");

	if (fb->fb_data->esdcheck) {
		uint32_t tectl_gpio = fb->fb_data->tectl_gpio;
		konafb_info("Enable esd check function for lcd\n");
		if (tectl_gpio > 0) {
			konafb_info("Enable TECTL gpio check\n");
			gpio_request(tectl_gpio, "tectl_gpio");
			gpio_direction_input(tectl_gpio);
			ret = request_irq(gpio_to_irq(tectl_gpio),
					kona_fb_esd_irq, IRQF_TRIGGER_FALLING,
					"tectl_gpio", fb);
			if (ret < 0) {
				konafb_error("Request esd gpio irq fail\n");
				goto err_fb_register_failed;
			}
		}
		disable_irq(gpio_to_irq(tectl_gpio));
		init_completion(&fb->tectl_gpio_done_sem);

		fb->esd_check_wq =
			create_singlethread_workqueue("lcd_esd_check");
		INIT_DELAYED_WORK(&fb->esd_check_work, kona_fb_esd_check);
		queue_delayed_work(fb->esd_check_wq, &fb->esd_check_work,
			msecs_to_jiffies(fb->fb_data->esdcheck_period_ms));
	}


	fb->proc_entry = proc_create_data("fb_debug", 0666, NULL,
						&proc_fops, NULL);
	if (NULL == fb->proc_entry)
		printk(KERN_ERR "%s: could not create proc entry.\n", __func__);

	fb->reboot_nb.notifier_call = kona_fb_reboot_cb;
	register_reboot_notifier(&fb->reboot_nb);
#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
	fb->die_nb.notifier_call = kona_fb_die_cb;
	register_die_notifier(&fb->die_nb);
#endif
	ret = register_attributes(&pdev->dev);
	if (ret)
		dev_err(&pdev->dev, "%s: failed to register attributes\n",
								__func__);
#ifdef CONFIG_DEBUG_FS
	kona_fb_create_debugfs(pdev);
#endif

	pr_info("%s(%d): Probe success. Panel: %s\n",
					__func__, __LINE__, fb->fb_data->name);
	return 0;

err_fb_register_failed:
err_set_var_failed:
	dma_free_writecombine(&pdev->dev, framesize_alloc, fb->fb.screen_base,
			phys_fbbase);
err_fbmem_alloc_failed:
	disable_display(fb);
err_enable_display_failed:
	release_dispdrv_info(fb->display_info);
dispdrv_data_failed:
	free_platform_data(&pdev->dev);
fb_data_failed:
	if (pi_mgr_dfs_request_remove(&fb->dfs_node))
		printk(KERN_ERR "Failed to remove dfs request for LCD\n");
fb_dfs_fail:
	kfree(fb);
	g_kona_fb = NULL;
err_fb_alloc_failed:
	pr_err("%s failed ret=%d\n", __func__, ret);
	return ret;
}

static int kona_fb_reboot_cb(struct notifier_block *nb,
	unsigned long val, void *v)
{
	struct kona_fb *fb = container_of(nb, struct kona_fb, reboot_nb);
	struct fb_event event;
	int blank = FB_BLANK_POWERDOWN;

	pr_err("Turning off display\n");
	if (fb->g_stop_drawing) {
		pr_err("Display is already suspended, nothing to do\n");
		goto exit;
	}

	/*shut down the backlight before disable the display*/
	pr_info("Turning off backlight\r\n");
	event.info = &fb->fb;
	event.data = &blank;
	fb_notifier_call_chain(FB_EVENT_BLANK, &event);

	mutex_lock(&fb->update_sem);
	if (fb->link_suspended)
		link_control(fb, RESUME_LINK);

	fb->g_stop_drawing = 1;
	if (!fb->display_info->vmode) {
		if (wait_for_completion_timeout(
		&fb->prev_buf_done_sem,	msecs_to_jiffies(10000)) <= 0)
			pr_err("%s:%d timed out waiting for completion",
				__func__, __LINE__);
		kona_clock_start(fb);
		fb->display_ops->power_control(
					fb->display_hdl, CTRL_SCREEN_OFF);
		kona_clock_stop(fb);
	} else {
		fb->display_ops->power_control(
					fb->display_hdl, CTRL_SCREEN_OFF);
	}
	disable_display(fb);
	mutex_unlock(&fb->update_sem);
	pr_err("Display disabled\n");
exit:
	return 0;
}

#ifdef CONFIG_FB_BRCM_CP_CRASH_DUMP_IMAGE_SUPPORT
static int kona_fb_die_cb(struct notifier_block *nb, unsigned long val, void *v)
{
	pr_err("kona_fb: die notifier invoked\n");
	if (!crash_dump_ui_on) {
		if (ramdump_enable)
			kona_display_crash_image(AP_RAM_DUMP_START);
		else
			kona_display_crash_image(AP_CRASH_DUMP_START);
		crash_dump_ui_on = 1;
	}
	return NOTIFY_DONE;
}
#endif

static int kona_fb_remove(struct platform_device *pdev)
{
	struct kona_fb *fb = platform_get_drvdata(pdev);
	struct kona_fb_platform_data *pdata = (struct kona_fb_platform_data *)
						pdev->dev.platform_data;

	remove_attributes(&pdev->dev);
#ifdef CONFIG_DEBUG_FS
	kona_fb_remove_debugfs(pdev);
#endif
#ifdef CONFIG_FRAMEBUFFER_FPS
	fb_fps_unregister(fb->fps_info);
#endif
	unregister_framebuffer(&fb->fb);
	disable_display(fb);
#ifdef CONFIG_IOMMU_API
#ifdef CONFIG_BCM_IOVMM
	kona_fb_iovmm_unmap(fb, fb->framesize_alloc, (dma_addr_t)fb->buff0);
#else
	kona_fb_direct_unmap(fb, fb->framesize_alloc, (dma_addr_t)fb->buff0);
#endif
#endif
	if (pdev->dev.of_node) {
		kfree(pdata);
		pdev->dev.platform_data = NULL;
	}

	wake_lock_destroy(&fb->wlock);

	kfree(fb);
	konafb_info("kona FB removed !!\n");
	return 0;
}

static const struct of_device_id kona_fb_of_match[] = {
	{ .compatible = "bcm,kona-fb", },
	{},
};
MODULE_DEVICE_TABLE(of, kona_fb_of_match);


static struct platform_driver kona_fb_driver = {
	.probe = kona_fb_probe,
	.remove = kona_fb_remove,
	.driver = {
		   .name = "kona_fb",
		   .owner = THIS_MODULE,
		   .of_match_table = kona_fb_of_match,
		   },
};

static int __init kona_fb_init(void)
{
	int ret;

	ret =
	    pi_mgr_qos_add_request(&g_mm_qos_node, "lcd", PI_MGR_PI_ID_MM, 10);
	if (ret)
		printk(KERN_ERR "failed to register qos client for lcd\n");

	ret = platform_driver_register(&kona_fb_driver);
	if (ret) {
		printk(KERN_ERR
		       "%s : Unable to register kona framebuffer driver\n",
		       __func__);
		goto fail_to_register;
	}
fail_to_register:
	printk(KERN_INFO "BRCM Framebuffer Init %s !\n", ret ? "FAILED" : "OK");

	return ret;
}

static void __exit kona_fb_exit(void)
{
	platform_driver_unregister(&kona_fb_driver);
	printk(KERN_INFO "BRCM Framebuffer exit OK\n");
}

module_init(kona_fb_init);
module_exit(kona_fb_exit);

MODULE_AUTHOR("Broadcom");
MODULE_DESCRIPTION("KONA FB Driver");
