blob: 3a095800b0a9ef85f2d3403b848638463074ca0f [file] [log] [blame]
/*
* drivers/amlogic/media/vout/lcd/lcd_extern/mipi_G101B158.c
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/amlogic/i2c-amlogic.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/amlogic/media/vout/lcd/lcd_extern.h>
#include "lcd_extern.h"
#define LCD_EXTERN_NAME "mipi_G101B158"
static unsigned char mipi_init_on_table[] = {
0xff, 120, /* delay */
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x00,
0x29, 3, 0xB1, 0x68, 0x01,
0x15, 2, 0xB5, 0xC8,
0x29, 6, 0xBD, 0x02, 0xB0, 0x10, 0x10, 0x00,
0x15, 2, 0xBC, 0x05,
0x15, 2, 0xC7, 0x00,
0x15, 2, 0xC8, 0x80,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x01,
0x29, 3, 0xB3, 0x2D, 0x2D,
0x29, 3, 0xB4, 0x19, 0x19,
0x15, 2, 0xB5, 0x06,
0x29, 3, 0xB9, 0x35, 0x35,
0x29, 3, 0xBA, 0x25, 0x25,
0x29, 3, 0xBC, 0x90, 0x00,
0x29, 3, 0xBD, 0x90, 0x00,
0x15, 2, 0xC0, 0x0C,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x02,
0x15, 2, 0xEE, 0x02,
0x29, 7, 0xB0, 0x00, 0x00, 0x00, 0x32, 0x00, 0x64,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xB0, 0x00, 0x83, 0x00, 0x9C, 0x00, 0xC3,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xB0, 0x00, 0xDF, 0x01, 0x0E,
0x29, 7, 0xB1, 0x01, 0x33, 0x01, 0x6C, 0x01, 0x99,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xB1, 0x01, 0xDF, 0x02, 0x18, 0x02, 0x1A,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xB1, 0x02, 0x4E, 0x02, 0x87,
0x29, 7, 0xB2, 0x02, 0xAC, 0x02, 0xDB, 0x02, 0xFC,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xB2, 0x03, 0x24, 0x03, 0x46, 0x03, 0x71,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xB2, 0x03, 0x8C, 0x03, 0xB1,
0x29, 5, 0xB3, 0x03, 0xED, 0x03, 0Xff,
0x29, 7, 0xBC, 0x00, 0x00, 0x00, 0x32, 0x00, 0x64,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xBC, 0x00, 0x83, 0x00, 0x9C, 0x00, 0xC3,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xBC, 0x00, 0xDF, 0x01, 0x0E,
0x29, 7, 0xBD, 0x01, 0x33, 0x01, 0x6C, 0x01, 0x99,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xBD, 0x01, 0xDF, 0x02, 0x18, 0x02, 0x1A,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xBD, 0x02, 0x4E, 0x02, 0x87,
0x29, 7, 0xBE, 0x02, 0xAC, 0x02, 0xDB, 0x02, 0xFC,
0x15, 2, 0x6F, 0x06,
0x29, 7, 0xBE, 0x03, 0x24, 0x03, 0x46, 0x03, 0x71,
0x15, 2, 0x6F, 0x0C,
0x29, 5, 0xBE, 0x03, 0x8C, 0x03, 0xB1,
0x29, 5, 0xBF, 0x03, 0xED, 0x03, 0xFF,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x03,
0x29, 6, 0xB2, 0x05, 0x00, 0x00, 0x00, 0x00,
0x29, 6, 0xB6, 0x05, 0x00, 0x00, 0x00, 0x00,
0x29, 6, 0xB7, 0x05, 0x00, 0x00, 0x00, 0x00,
0x29, 6, 0xBA, 0x57, 0x00, 0x00, 0x00, 0x00,
0x29, 6, 0xBB, 0x57, 0x00, 0x00, 0x00, 0x00,
0x29, 5, 0xC0, 0x00, 0x34, 0x00, 0x00,
0x29, 5, 0xC1, 0x00, 0x00, 0x34, 0x00,
0x15, 2, 0xC4, 0x40,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x04,
0x29, 4, 0xB1, 0x03, 0x02, 0x05,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x05,
0x29, 3, 0xB0, 0x17, 0x06,
0x29, 3, 0xB1, 0x17, 0x06,
0x29, 3, 0xB2, 0x17, 0x06,
0x29, 3, 0xB3, 0x17, 0x06,
0x29, 3, 0xB4, 0x17, 0x06,
0x15, 2, 0xBB, 0x02,
0x29, 6, 0xBD, 0x03, 0x01, 0x03, 0x03, 0x01,
0x15, 2, 0xC0, 0x05,
0x15, 2, 0xC4, 0x82,
0x15, 2, 0xC5, 0xA2,
0x29, 3, 0xC8, 0x03, 0x30,
0x29, 3, 0xC9, 0x03, 0x31,
0x29, 4, 0xCC, 0x00, 0x00, 0x3C,
0x29, 4, 0xCD, 0x00, 0x00, 0x3C,
0x29, 6, 0xD1, 0x00, 0x05, 0x07, 0x00, 0x00,
0x29, 6, 0xD2, 0x00, 0x25, 0x09, 0x00, 0x00,
0x15, 2, 0xE5, 0x06,
0x15, 2, 0xE6, 0x06,
0x15, 2, 0xE7, 0x06,
0x15, 2, 0xE8, 0x06,
0x15, 2, 0xE9, 0x06,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x06,
0x29, 3, 0xB0, 0x0A, 0x2D,
0x29, 3, 0xB1, 0x2D, 0x08,
0x29, 3, 0xB2, 0x2A, 0x29,
0x29, 3, 0xB3, 0x34, 0x1A,
0x29, 3, 0xB4, 0x18, 0x16,
0x29, 3, 0xB5, 0x14, 0x12,
0x29, 3, 0xB6, 0x10, 0x00,
0x29, 3, 0xB7, 0x34, 0x34,
0x29, 3, 0xB8, 0x32, 0x34,
0x29, 3, 0xB9, 0x34, 0x34,
0x29, 3, 0xBA, 0x34, 0x34,
0x29, 3, 0xBB, 0x34, 0x34,
0x29, 3, 0xBC, 0x34, 0x34,
0x29, 3, 0xBD, 0x01, 0x11,
0x29, 3, 0xBE, 0x13, 0x15,
0x29, 3, 0xBF, 0x17, 0x19,
0x29, 3, 0xC0, 0x1B, 0x34,
0x29, 3, 0xC1, 0x29, 0x2A,
0x29, 3, 0xC2, 0x09, 0x2D,
0x29, 3, 0xC3, 0x2D, 0x0B,
0x29, 3, 0xC4, 0x0B, 0x2D,
0x29, 3, 0xC5, 0x2D, 0x01,
0x29, 3, 0xC6, 0x2A, 0x29,
0x29, 3, 0xC7, 0x34, 0x19,
0x29, 3, 0xC8, 0x1B, 0x11,
0x29, 3, 0xC9, 0x13, 0x15,
0x29, 3, 0xCA, 0x17, 0x09,
0x29, 3, 0xCB, 0x34, 0x34,
0x29, 3, 0xCC, 0x34, 0x34,
0x29, 3, 0xCD, 0x34, 0x34,
0x29, 3, 0xCE, 0x34, 0x34,
0x29, 3, 0xCF, 0x34, 0x34,
0x29, 3, 0xD0, 0x34, 0x34,
0x29, 3, 0xD1, 0x08, 0x16,
0x29, 3, 0xD2, 0x14, 0x12,
0x29, 3, 0xD3, 0x10, 0x1A,
0x29, 3, 0xD4, 0x18, 0x34,
0x29, 3, 0xD5, 0x29, 0x2A,
0x29, 3, 0xD6, 0x00, 0x2D,
0x29, 3, 0xD7, 0x2D, 0x0A,
0x29, 6, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x29, 6, 0xD9, 0x00, 0x00, 0x00, 0x00, 0x00,
0x29, 3, 0xE5, 0x34, 0x34,
0x29, 3, 0xE6, 0x34, 0x34,
0x15, 2, 0xE7, 0x00,
0x29, 3, 0xE8, 0x34, 0x34,
0x29, 3, 0xE9, 0x34, 0x34,
0x15, 2, 0xEA, 0x00,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x00, 0x00,
0x23, 2, 0x35, 0x00,
#if 1
0x13, 1, 0x11,
0xff, 150,
0x13, 1, 0x29,
#else //bist mode
0xff, 150,
0x29, 6, 0xF0, 0x55, 0xAA, 0x52, 0x08, 0x00,
0xff, 10,
0x29, 5, 0xEE, 0x87, 0x78, 0x02, 0x40,
0xff, 10,
0x29, 6, 0xEF, 0x00, 0x07, 0xFF, 0xFF, 0x00,
#endif
0xff, 20,
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, 150, /* delay 150ms */
0xFF, 0xFF, /* ending flag */
};
static int lcd_extern_driver_update(
struct aml_lcd_extern_driver_s *ext_drv)
{
int ret = 0;
if (ext_drv) {
ext_drv->config->table_init_on = &mipi_init_on_table[0];
ext_drv->config->table_init_off = &mipi_init_off_table[0];
} else {
EXTERR("%s driver is null\n", LCD_EXTERN_NAME);
ret = -1;
}
return ret;
}
int aml_lcd_extern_mipi_g101b158_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;
}