/*
 * drivers/display/lcd/lcd_extern/mipi_TV070WSM.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		3
#define LCD_EXTERN_NAME			"mipi_TV070WSM_FT"
#define LCD_EXTERN_TYPE			LCD_EXTERN_MIPI

/* ******************** mipi command ********************
 * format:  data_type, cmd_size, data....
 * special: data_type=0xff,
 *		cmd_size<0xff means delay ms, cmd_size=0xff means ending.
 *          data_type=0xf0,
 *		data0=gpio_index, data1=gpio_value, data2=delay.
 */
static unsigned char mipi_init_on_table[] = {
	0x23,2,0xE0,0x00,
	0x23,2,0xE1,0x93,
	0x23,2,0xE2,0x65,
	0x23,2,0xE3,0xF8,
	0x23,2,0xE0,0x01,
	0x23,2,0x00,0x00,
	0x23,2,0x01,0x90,
	0x23,2,0x03,0x00,
	0x23,2,0x04,0x90,
	0x23,2,0x17,0x00,
	0x23,2,0x18,0xB0,
	0x23,2,0x19,0x01,
	0x23,2,0x1A,0x00,
	0x23,2,0x1B,0xB0,
	0x23,2,0x1C,0x01,
	0x23,2,0x1F,0x3E,
	0x23,2,0x20,0x2F,
	0x23,2,0x21,0x2F,
	0x23,2,0x22,0x0E,
	0x23,2,0x37,0x69,
	0x23,2,0x38,0x05,
	0x23,2,0x39,0x00,
	0x23,2,0x3A,0x01,
	0x23,2,0x3C,0x90,
	0x23,2,0x3D,0xFF,
	0x23,2,0x3E,0xFF,
	0x23,2,0x3F,0xFF,
	0x23,2,0x40,0x02,
	0x23,2,0x41,0x80,
	0x23,2,0x42,0x99,
	0x23,2,0x43,0x06,
	0x23,2,0x44,0x09,
	0x23,2,0x45,0x3C,
	0x23,2,0x4B,0x04,
	0x23,2,0x55,0x0D,
	0x23,2,0x56,0x01,
	0x23,2,0x57,0x89,
	0x23,2,0x58,0x0A,
	0x23,2,0x59,0x0A,
	0x23,2,0x5A,0x27,
	0x23,2,0x5B,0x15,
	0x23,2,0x5D,0x7C,
	0x23,2,0x5E,0x67,
	0x23,2,0x5F,0x58,
	0x23,2,0x60,0x4C,
	0x23,2,0x61,0x48,
	0x23,2,0x62,0x38,
	0x23,2,0x63,0x3C,
	0x23,2,0x64,0x24,
	0x23,2,0x65,0x3B,
	0x23,2,0x66,0x38,
	0x23,2,0x67,0x36,
	0x23,2,0x68,0x53,
	0x23,2,0x69,0x3F,
	0x23,2,0x6A,0x44,
	0x23,2,0x6B,0x35,
	0x23,2,0x6C,0x2E,
	0x23,2,0x6D,0x1F,
	0x23,2,0x6E,0x0C,
	0x23,2,0x6F,0x00,
	0x23,2,0x70,0x7C,
	0x23,2,0x71,0x67,
	0x23,2,0x72,0x58,
	0x23,2,0x73,0x4C,
	0x23,2,0x74,0x48,
	0x23,2,0x75,0x38,
	0x23,2,0x76,0x3C,
	0x23,2,0x77,0x24,
	0x23,2,0x78,0x3B,
	0x23,2,0x79,0x38,
	0x23,2,0x7A,0x36,
	0x23,2,0x7B,0x53,
	0x23,2,0x7C,0x3F,
	0x23,2,0x7D,0x44,
	0x23,2,0x7E,0x35,
	0x23,2,0x7F,0x2E,
	0x23,2,0x80,0x1F,
	0x23,2,0x81,0x0C,
	0x23,2,0x82,0x00,
	0x23,2,0xE0,0x02,
	0x23,2,0x00,0x45,
	0x23,2,0x01,0x45,
	0x23,2,0x02,0x47,
	0x23,2,0x03,0x47,
	0x23,2,0x04,0x41,
	0x23,2,0x05,0x41,
	0x23,2,0x06,0x1F,
	0x23,2,0x07,0x1F,
	0x23,2,0x08,0x1F,
	0x23,2,0x09,0x1F,
	0x23,2,0x0A,0x1F,
	0x23,2,0x0B,0x1F,
	0x23,2,0x0C,0x1F,
	0x23,2,0x0D,0x1D,
	0x23,2,0x0E,0x1D,
	0x23,2,0x0F,0x1D,
	0x23,2,0x10,0x1F,
	0x23,2,0x11,0x1F,
	0x23,2,0x12,0x1F,
	0x23,2,0x13,0x1F,
	0x23,2,0x14,0x1F,
	0x23,2,0x15,0x1F,
	0x23,2,0x16,0x44,
	0x23,2,0x17,0x44,
	0x23,2,0x18,0x46,
	0x23,2,0x19,0x46,
	0x23,2,0x1A,0x40,
	0x23,2,0x1B,0x40,
	0x23,2,0x1C,0x1F,
	0x23,2,0x1D,0x1F,
	0x23,2,0x1E,0x1F,
	0x23,2,0x1F,0x1F,
	0x23,2,0x20,0x1F,
	0x23,2,0x21,0x1F,
	0x23,2,0x22,0x1F,
	0x23,2,0x23,0x1D,
	0x23,2,0x24,0x1D,
	0x23,2,0x25,0x1D,
	0x23,2,0x26,0x1F,
	0x23,2,0x27,0x1F,
	0x23,2,0x28,0x1F,
	0x23,2,0x29,0x1F,
	0x23,2,0x2A,0x1F,
	0x23,2,0x2B,0x1F,
	0x23,2,0x58,0x40,
	0x23,2,0x59,0x00,
	0x23,2,0x5A,0x00,
	0x23,2,0x5B,0x10,
	0x23,2,0x5C,0x06,
	0x23,2,0x5D,0x20,
	0x23,2,0x5E,0x00,
	0x23,2,0x5F,0x00,
	0x23,2,0x61,0x00,
	0x23,2,0x62,0x00,
	0x23,2,0x63,0x7A,
	0x23,2,0x64,0x7A,
	0x23,2,0x65,0x00,
	0x23,2,0x66,0x00,
	0x23,2,0x67,0x32,
	0x23,2,0x68,0x08,
	0x23,2,0x69,0x7A,
	0x23,2,0x6A,0x7A,
	0x23,2,0x6B,0x00,
	0x23,2,0x6C,0x00,
	0x23,2,0x6D,0x04,
	0x23,2,0x6E,0x04,
	0x23,2,0x6F,0x88,
	0x23,2,0x70,0x00,
	0x23,2,0x71,0x00,
	0x23,2,0x72,0x06,
	0x23,2,0x73,0x7B,
	0x23,2,0x74,0x00,
	0x23,2,0x75,0x07,
	0x23,2,0x76,0x00,
	0x23,2,0x77,0x5D,
	0x23,2,0x78,0x17,
	0x23,2,0x79,0x1F,
	0x23,2,0x7A,0x00,
	0x23,2,0x7B,0x00,
	0x23,2,0x7C,0x00,
	0x23,2,0x7D,0x03,
	0x23,2,0x7E,0x7B,
	0x23,2,0xE0,0x03,
	0x23,2,0xAF,0x20,
	0x23,2,0xE0,0x04,
	0x23,2,0x09,0x11,
	0x23,2,0x0E,0x48,
	0x23,2,0x2B,0x2B,
	0x23,2,0x2E,0x44,
	0x23,2,0x41,0xFF,
	0x23,2,0xE0,0x00,
	0x23,2,0xE6,0x02,
	0x23,2,0xE7,0x0C,
	0x05,1,0x11,
	0xff,120,/* delay 120ms */

	0x23,2,0xE0,0x03,
	0x23,2,0x2B,0x01,
	0x23,2,0x2C,0x00,
	0x23,2,0x30,0x03,
	0x23,2,0x31,0xCC,
	0x23,2,0x32,0x03,
	0x23,2,0x33,0xC9,
	0x23,2,0x34,0x03,
	0x23,2,0x35,0xC0,
	0x23,2,0x36,0x03,
	0x23,2,0x37,0xB3,
	0x23,2,0x38,0x03,
	0x23,2,0x39,0xAB,
	0x23,2,0x3A,0x03,
	0x23,2,0x3B,0x9D,
	0x23,2,0x3C,0x03,
	0x23,2,0x3D,0x8F,
	0x23,2,0x3E,0x03,
	0x23,2,0x3F,0x6D,
	0x23,2,0x40,0x03,
	0x23,2,0x41,0x51,
	0x23,2,0x42,0x03,
	0x23,2,0x43,0x17,
	0x23,2,0x44,0x02,
	0x23,2,0x45,0xD8,
	0x23,2,0x46,0x02,
	0x23,2,0x47,0x60,
	0x23,2,0x48,0x01,
	0x23,2,0x49,0xEB,
	0x23,2,0x4A,0x01,
	0x23,2,0x4B,0xE5,
	0x23,2,0x4C,0x01,
	0x23,2,0x4D,0x6C,
	0x23,2,0x4E,0x00,
	0x23,2,0x4F,0xF2,
	0x23,2,0x50,0x00,
	0x23,2,0x51,0xB4,
	0x23,2,0x52,0x00,
	0x23,2,0x53,0x74,
	0x23,2,0x54,0x00,
	0x23,2,0x55,0x54,
	0x23,2,0x56,0x00,
	0x23,2,0x57,0x34,
	0x23,2,0x58,0x00,
	0x23,2,0x59,0x26,
	0x23,2,0x5A,0x00,
	0x23,2,0x5B,0x18,
	0x23,2,0x5C,0x00,
	0x23,2,0x5D,0x11,
	0x23,2,0x5E,0x00,
	0x23,2,0x5F,0x0A,
	0x23,2,0x60,0x00,
	0x23,2,0x61,0x03,
	0x23,2,0x62,0x00,
	0x23,2,0x63,0x00,
	0x23,2,0x64,0x03,
	0x23,2,0x65,0x9E,
	0x23,2,0x66,0x03,
	0x23,2,0x67,0x9B,
	0x23,2,0x68,0x03,
	0x23,2,0x69,0x94,
	0x23,2,0x6A,0x03,
	0x23,2,0x6B,0x8C,
	0x23,2,0x6C,0x03,
	0x23,2,0x6D,0x85,
	0x23,2,0x6E,0x03,
	0x23,2,0x6F,0x76,
	0x23,2,0x70,0x03,
	0x23,2,0x71,0x67,
	0x23,2,0x72,0x03,
	0x23,2,0x73,0x4B,
	0x23,2,0x74,0x03,
	0x23,2,0x75,0x2E,
	0x23,2,0x76,0x02,
	0x23,2,0x77,0xF7,
	0x23,2,0x78,0x02,
	0x23,2,0x79,0xB8,
	0x23,2,0x7A,0x02,
	0x23,2,0x7B,0x46,
	0x23,2,0x7C,0x01,
	0x23,2,0x7D,0xD6,
	0x23,2,0x7E,0x01,
	0x23,2,0x7F,0xD0,
	0x23,2,0x80,0x01,
	0x23,2,0x81,0x5C,
	0x23,2,0x82,0x00,
	0x23,2,0x83,0xE7,
	0x23,2,0x84,0x00,
	0x23,2,0x85,0xAA,
	0x23,2,0x86,0x00,
	0x23,2,0x87,0x74,
	0x23,2,0x88,0x00,
	0x23,2,0x89,0x5A,
	0x23,2,0x8A,0x00,
	0x23,2,0x8B,0x3C,
	0x23,2,0x8C,0x00,
	0x23,2,0x8D,0x2C,
	0x23,2,0x8E,0x00,
	0x23,2,0x8F,0x1C,
	0x23,2,0x90,0x00,
	0x23,2,0x91,0x14,
	0x23,2,0x92,0x00,
	0x23,2,0x93,0x0C,
	0x23,2,0x94,0x00,
	0x23,2,0x95,0x04,
	0x23,2,0x96,0x00,
	0x23,2,0x97,0x00,
	0x23,2,0xE0,0x00,
	0x05,1,0x29, 
	0xff,5,
	0xff, 0xff, /* ending flag */
};

static unsigned char mipi_init_off_table[] = {
	0XFF, 5,       /* delay 5ms */
	0x05, 1, 0x28, /* display off */
	0xff, 30,      /* delay 30ms */
	0x05, 1, 0x10, /* sleep in */
	0xff, 10,
	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_TV070WSM_ft_get_default_index(void)
{
	return LCD_EXTERN_INDEX;
}

int aml_lcd_extern_mipi_TV070WSM_ft_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;
}
