/*
 * drivers/display/lcd/lcd_extern/mipi_N070ICN.c
 *
 * 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 named License,
 * or 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.
 *
 */

#include <common.h>
#include <malloc.h>
#include <asm/arch/gpio.h>
#ifdef CONFIG_OF_LIBFDT
#include <libfdt.h>
#endif
#include <amlogic/aml_lcd.h>
#include <amlogic/aml_lcd_extern.h>
#include "lcd_extern.h"

#define LCD_EXTERN_INDEX		1
#define LCD_EXTERN_NAME			"mipi_N070ICN"
#define LCD_EXTERN_TYPE			LCD_EXTERN_MIPI

//******************** mipi command ********************//
//format:  data_type, num, data....
//special: data_type=0xff, num<0xff means delay ms, num=0xff means ending.
//******************************************************//
static unsigned char mipi_init_on_table[] = {
	0x39,5,0xFF,0xAA,0x55,0xA5,0x80, //========== Internal setting ==========

	0x39,3,0x6F,0x11,0x00, //MIPI related Timing Setting
	0x39,3,0xF7,0x20,0x00,

	0x15,2,0x6F,0x06,      //Improve ESD option
	0x15,2,0xF7,0xA0,
	0x15,2,0x6F,0x19,
	0x15,2,0xF7,0x12,

	0x15,2,0x6F,0x08,     //Vcom floating
	0x15,2,0xFA,0x40,
	0x15,2,0x6F,0x11,
	0x15,2,0xF3,0x01,

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x00, //========== page0 relative ==========
	0x15,2,0xC8,0x80,

	0x39,3,0xB1,0x6C,0x01, //Set WXGA resolution

	0x15,2,0xB6,0x08,      //Set source output hold time

	0x15,2,0x6F,0x02,      //EQ control function
	0x15,2,0xB8,0x08,

	0x39,3,0xBB,0x54,0x54, //Set bias current for GOP and SOP

	0x39,3,0xBC,0x05,0x05, //Inversion setting

	0x15,2,0xC7,0x01,      //zigzag setting

	0x39,6,0xBD,0x02,0xB0,0x0C,0x0A,0x00, //DSP Timing Settings update for BIST

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x01, //========== page1 relative ==========

	0x39,3,0xB0,0x05,0x05,                // Setting AVDD, AVEE clamp
	0x39,3,0xB1,0x05,0x05,

	0x39,3,0xBC,0x3A,0x01,                // VGMP, VGMN, VGSP, VGSN setting
	0x39,3,0xBD,0x3E,0x01,

	0x15,2,0xCA,0x00,                    // gate signal control

	0x15,2,0xC0,0x04,                    // power IC control
	0x15,2,0xB2,0x00,
	0x15,2,0xBE,0x80,      //vcom    -1.88V

	0x39,3,0xB3,0x19,0x19, // Setting VGH=15V, VGL=-11V
	0x39,3,0xB4,0x12,0x12,

	0x39,3,0xB9,0x24,0x24, // power control for VGH, VGL
	0x39,3,0xBA,0x14,0x14,

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x02, //========== page2 relative ==========

	0x15,2,0xEE,0x01,                     //Gamma setting
	0x39,5,0xEF,0x09,0x06,0x15,0x18,      //Gradient Control for Gamma Voltage

	0x39,7,0xB0,0x00,0x00,0x00,0x08,0x00,0x17, //========== GOA relative ==========
	0x15,2,0x6F,0x06,
	0x39,7,0xB0,0x00,0x25,0x00,0x30,0x00,0x45,
	0x15,2,0x6F,0x0C,
	0x39,5,0xB0,0x00,0x56,0x00,0x7A,
	0x39,7,0xB1,0x00,0xA3,0x00,0xE7,0x01,0x20, ////////////////////////////
	0x15,2,0x6F,0x06,
	0x39,7,0xB1,0x01,0x7A,0x01,0xC2,0x01,0xC5,
	0x15,2,0x6F,0x0C,
	0x39,5,0xB1,0x02,0x06,0x02,0x5F,
	0x39,7,0xB2,0x02,0x92,0x02,0xD0,0x02,0xFC,
	0x15,2,0x6F,0x06,
	0x39,7,0xB2,0x03,0x35,0x03,0x5D,0x03,0x8B,
	0x15,2,0x6F,0x0C,
	0x39,5,0xB2,0x03,0xA2,0x03,0xBF,
	0x39,5,0xB3,0x03,0xD2,0x03,0xFF,

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x06,      //PAGE6 : GOUT Mapping, VGLO select
	0x39,3,0xB0,0x00,0x17,
	0x39,3,0xB1,0x16,0x15,
	0x39,3,0xB2,0x14,0x13,
	0x39,3,0xB3,0x12,0x11,
	0x39,3,0xB4,0x10,0x2D,
	0x39,3,0xB5,0x01,0x08,
	0x39,3,0xB6,0x09,0x31,
	0x39,3,0xB7,0x31,0x31,
	0x39,3,0xB8,0x31,0x31,
	0x39,3,0xB9,0x31,0x31,
	0x39,3,0xBA,0x31,0x31,
	0x39,3,0xBB,0x31,0x31,
	0x39,3,0xBC,0x31,0x31,
	0x39,3,0xBD,0x31,0x09,
	0x39,3,0xBE,0x08,0x01,
	0x39,3,0xBF,0x2D,0x10,
	0x39,3,0xC0,0x11,0x12,
	0x39,3,0xC1,0x13,0x14,
	0x39,3,0xC2,0x15,0x16,
	0x39,3,0xC3,0x17,0x00,
	0x39,3,0xE5,0x31,0x31,
	0x39,3,0xC4,0x00,0x17,
	0x39,3,0xC5,0x16,0x15,
	0x39,3,0xC6,0x14,0x13,
	0x39,3,0xC7,0x12,0x11,
	0x39,3,0xC8,0x10,0x2D,
	0x39,3,0xC9,0x01,0x08,
	0x39,3,0xCA,0x09,0x31,
	0x39,3,0xCB,0x31,0x31,
	0x39,3,0xCC,0x31,0x31,
	0x39,3,0xCD,0x31,0x31,
	0x39,3,0xCE,0x31,0x31,
	0x39,3,0xCF,0x31,0x31,
	0x39,3,0xD0,0x31,0x31,
	0x39,3,0xD1,0x31,0x09,
	0x39,3,0xD2,0x08,0x01,
	0x39,3,0xD3,0x2D,0x10,
	0x39,3,0xD4,0x11,0x12,
	0x39,3,0xD5,0x13,0x14,
	0x39,3,0xD6,0x15,0x16,
	0x39,3,0xD7,0x17,0x00,
	0x39,3,0xE6,0x31,0x31,
	0x39,6,0xD8,0x00,0x00,0x00,0x00,0x00, //VGL level select;
	0x39,6,0xD9,0x00,0x00,0x00,0x00,0x00,
	0x15,2,0xE7,0x00,

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x03, //===page 3====//gate timing control
	0x39,3,0xB0,0x20,0x00,
	0x39,3,0xB1,0x20,0x00,
	0x39,6,0xB2,0x05,0x00,0x42,0x00,0x00,
	0x39,6,0xB6,0x05,0x00,0x42,0x00,0x00,
	0x39,6,0xBA,0x53,0x00,0x42,0x00,0x00,
	0x39,6,0xBB,0x53,0x00,0x42,0x00,0x00,
	0x15,2,0xC4,0x40,

	0x39,6,0xF0,0x55,0xAA,0x52,0x08,0x05, //===page 5====//
	0x39,3,0xB0,0x17,0x06,
	0x15,2,0xB8,0x00,
	0x39,6,0xBD,0x03,0x01,0x01,0x00,0x01,
	0x39,3,0xB1,0x17,0x06,
	0x39,3,0xB9,0x00,0x01,
	0x39,3,0xB2,0x17,0x06,
	0x39,3,0xBA,0x00,0x01,
	0x39,3,0xB3,0x17,0x06,
	0x39,3,0xBB,0x0A,0x00,
	0x39,3,0xB4,0x17,0x06,
	0x39,3,0xB5,0x17,0x06,
	0x39,3,0xB6,0x14,0x03,
	0x39,3,0xB7,0x00,0x00,
	0x39,3,0xBC,0x02,0x01,
	0x15,2,0xC0,0x05,
	0x15,2,0xC4,0xA5,
	0x39,3,0xC8,0x03,0x30,
	0x39,3,0xC9,0x03,0x51,
	0x39,6,0xD1,0x00,0x05,0x03,0x00,0x00,
	0x39,6,0xD2,0x00,0x05,0x09,0x00,0x00,
	0x15,2,0xE5,0x02,
	0x15,2,0xE6,0x02,
	0x15,2,0xE7,0x02,
	0x15,2,0xE9,0x02,
	0x15,2,0xED,0x33,

	0x05,1,0x11, //sleep out
	0xff,30,     //delay 30ms
	0x05,1,0x29, //display on
	0xff,30,     //delay 30ms
	0xff,0xff,   //ending flag
};

static unsigned char mipi_init_off_table[] = {
	0x05,1,0x28, //display off
	0xff,10,     //delay 10ms
	0x05,1,0x10, //sleep in
	0xff,10,     //delay 10ms
	0xff,0xff,   //ending flag
};

static int lcd_extern_driver_update(struct aml_lcd_extern_driver_s *ext_drv)
{
	if (ext_drv == NULL) {
		EXTERR("%s driver is null\n", LCD_EXTERN_NAME);
		return -1;
	}

	if (ext_drv->config->type == LCD_EXTERN_MAX) { //default for no dt
		ext_drv->config->index = LCD_EXTERN_INDEX;
		ext_drv->config->type = LCD_EXTERN_TYPE;
		strcpy(ext_drv->config->name, LCD_EXTERN_NAME);
	}
	ext_drv->config->table_init_on  = &mipi_init_on_table[0];
	ext_drv->config->table_init_off = &mipi_init_off_table[0];

	return 0;
}

int aml_lcd_extern_mipi_N070ICN_get_default_index(void)
{
	return LCD_EXTERN_INDEX;
}

int aml_lcd_extern_mipi_N070ICN_probe(struct aml_lcd_extern_driver_s *ext_drv)
{
	int ret = 0;

	ret = lcd_extern_driver_update(ext_drv);

	if (lcd_debug_print_flag)
		EXTPR("%s: %d\n", __func__, ret);
	return ret;
}
