import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / lcm / ili9340d_dbi_qvga / ili9340d_dbi_qvga.c
diff --git a/drivers/misc/mediatek/lcm/ili9340d_dbi_qvga/ili9340d_dbi_qvga.c b/drivers/misc/mediatek/lcm/ili9340d_dbi_qvga/ili9340d_dbi_qvga.c
new file mode 100644 (file)
index 0000000..a19ef6a
--- /dev/null
@@ -0,0 +1,589 @@
+#ifdef BUILD_LK
+#include <platform/mt_pmic.h>
+#else
+#include <linux/string.h>
+#if defined(BUILD_UBOOT)
+#include <asm/arch/mt_gpio.h>
+#else
+#include <mach/mt_gpio.h>
+#endif
+#endif
+
+
+#include <string.h>
+#include <stdio.h>
+#include "lcm_drv.h"
+
+#define FRAME_WIDTH  (240)
+#define FRAME_HEIGHT (320)
+#define LCM_ID       (0x69)
+
+// ---------------------------------------------------------------------------
+//  Local Variables
+// ---------------------------------------------------------------------------
+
+static LCM_UTIL_FUNCS lcm_util = {0};
+
+#define SET_RESET_PIN(v)    (lcm_util.set_reset_pin((v)))
+
+#define UDELAY(n) (lcm_util.udelay(n))
+#define MDELAY(n) (lcm_util.mdelay(n))
+
+#if defined(BUILD_LK)
+#define LCM_PRINT printf
+#elif defined(BUILD_UBOOT)
+#define LCM_PRINT printf
+#else
+#define LCM_PRINT printk
+#endif
+
+// ---------------------------------------------------------------------------
+//  Local Functions
+// ---------------------------------------------------------------------------
+
+static __inline void send_ctrl_cmd(unsigned int cmd)
+{
+       lcm_util.send_cmd(cmd);
+}
+
+static __inline void send_data_cmd(unsigned int data)
+{
+       lcm_util.send_data(data&0xff);
+}
+
+static __inline unsigned int read_data_cmd(void)
+{
+    return 0xFF&lcm_util.read_data();
+}
+
+static __inline void set_lcm_register(unsigned int regIndex,
+               unsigned int regData)
+{
+       send_ctrl_cmd(regIndex);
+       send_data_cmd(regData);
+}
+
+#if 0 // we don't use it. 
+static void sw_clear_panel(unsigned int color)
+{
+       unsigned short x0, y0, x1, y1, x, y;
+       unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
+
+       x0 = (unsigned short)0;
+       y0 = (unsigned short)0;
+       x1 = (unsigned short)FRAME_WIDTH-1;
+       y1 = (unsigned short)FRAME_HEIGHT-1;
+
+       h_X_start=((x0&0xFF00)>>8);
+       l_X_start=(x0&0x00FF);
+       h_X_end=((x1&0xFF00)>>8);
+       l_X_end=(x1&0x00FF);
+
+       h_Y_start=((y0&0xFF00)>>8);
+       l_Y_start=(y0&0x00FF);
+       h_Y_end=((y1&0xFF00)>>8);
+       l_Y_end=(y1&0x00FF);
+
+       send_ctrl_cmd(0x2A);
+       send_data_cmd(h_X_start);
+       send_data_cmd(l_X_start);
+       send_data_cmd(h_X_end);
+       send_data_cmd(l_X_end);
+
+       send_ctrl_cmd(0x2B);
+       send_data_cmd(h_Y_start);
+       send_data_cmd(l_Y_start);
+       send_data_cmd(h_Y_end);
+       send_data_cmd(l_Y_end);
+
+       send_ctrl_cmd(0x29);
+
+       send_ctrl_cmd(0x2C);
+    for (y = y0; y <= y1; ++ y) {
+        for (x = x0; x <= x1; ++ x) {
+            lcm_util.send_data(color);
+        }
+    }
+}
+#endif
+
+static void init_lcm_registers(void)
+{
+
+#if 1  
+     send_ctrl_cmd(0xCF);      // EXTC Option
+    send_data_cmd(0x00);
+    send_data_cmd(0x21);
+     send_data_cmd(0x20);
+
+    send_ctrl_cmd(0xF2); // 3-Gamma Function Off
+    send_data_cmd(0x02);
+
+     send_ctrl_cmd(0xB4); // Inversion Control -> 2Dot inversion
+     send_data_cmd(0x02);
+
+     send_ctrl_cmd(0xC0); // Powr control 1
+    send_data_cmd(0x15);
+    send_data_cmd(0x15);
+
+     send_ctrl_cmd(0xC1); // Power control 2
+    send_data_cmd(0x05);
+
+     send_ctrl_cmd(0xC2);      // Powr control 3
+     send_data_cmd(0x32);
+
+     send_ctrl_cmd(0xC5);      // Vcom control 1
+     send_data_cmd(0xFC);
+
+    send_ctrl_cmd(0xCB);   // V-core Setting
+    send_data_cmd(0x31);
+    send_data_cmd(0x24);
+    send_data_cmd(0x00);
+    send_data_cmd(0x34);
+
+     send_ctrl_cmd(0xF6);      // Interface control
+     send_data_cmd(0x41);
+    send_data_cmd(0x00);
+     send_data_cmd(0x00);
+
+     send_ctrl_cmd(0xB7);      // Entry Mode Set
+     send_data_cmd(0x06);
+
+     send_ctrl_cmd(0xB1);      // Frame Rate Control
+     send_data_cmd(0x00);
+    send_data_cmd(0x1B);
+
+     send_ctrl_cmd(0x36);      // Memory Access Control
+     send_data_cmd(0x08); // seosc 08 -> C8
+
+     send_ctrl_cmd(0xB5);      // Blanking Porch control
+     send_data_cmd(0x02);
+     send_data_cmd(0x02);
+     send_data_cmd(0x0A);
+     send_data_cmd(0x14);
+
+     send_ctrl_cmd(0xB6);      // Display Function control
+     send_data_cmd(0x0A);
+    send_data_cmd(0x82);
+     send_data_cmd(0x27);
+    send_data_cmd(0x00);
+
+     send_ctrl_cmd(0x3A);      // Pixel Format->DBI(5=16bit)
+    send_data_cmd(0x05);
+
+     send_ctrl_cmd(0x35);      // Tearing Effect Line On
+     send_data_cmd(0x00);
+
+     send_ctrl_cmd(0x44);      // Tearing Effect Control Parameter
+     send_data_cmd(0x00);
+     send_data_cmd(0xEF);
+
+     send_ctrl_cmd(0xE0);      // Positive Gamma Correction
+    send_data_cmd(0x00);
+    send_data_cmd(0x06);
+     send_data_cmd(0x07);
+    send_data_cmd(0x03);
+    send_data_cmd(0x0A);
+     send_data_cmd(0x0A);
+    send_data_cmd(0x36);
+    send_data_cmd(0x59);
+    send_data_cmd(0x4B);
+    send_data_cmd(0x0C);
+    send_data_cmd(0x18);
+    send_data_cmd(0x0F);
+    send_data_cmd(0x22);
+    send_data_cmd(0x1F);
+     send_data_cmd(0x0F);
+
+     send_ctrl_cmd(0xE1);      // Negative Gamma Correction
+    send_data_cmd(0x06);
+    send_data_cmd(0x23);
+    send_data_cmd(0x24);
+    send_data_cmd(0x01);
+    send_data_cmd(0x0F);
+     send_data_cmd(0x01);
+    send_data_cmd(0x31);
+    send_data_cmd(0x23);
+    send_data_cmd(0x40);
+    send_data_cmd(0x07);
+     send_data_cmd(0x0F);
+     send_data_cmd(0x0F);
+    send_data_cmd(0x30);
+    send_data_cmd(0x31);
+    send_data_cmd(0x0E);
+
+     send_ctrl_cmd(0x2A);      // Column address
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0xEF);
+
+     send_ctrl_cmd(0x2B);      // Page address
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0x01);
+     send_data_cmd(0x3F);
+
+     send_ctrl_cmd(0xE8);
+     send_data_cmd(0x84);
+     send_data_cmd(0x1A);
+     send_data_cmd(0x68);
+
+    send_ctrl_cmd(0x11);  // Exit Sleep
+     MDELAY(120);
+
+    send_ctrl_cmd(0x2C);
+
+    MDELAY(80);
+    send_ctrl_cmd(0x29);  // LCD on
+#else // HDK board
+     send_ctrl_cmd(0xCF);      // EXTC Option
+     send_data_cmd(0x20);
+     send_data_cmd(0x21);
+     send_data_cmd(0x20);
+
+     send_ctrl_cmd(0xF2); // 3-Gamma Function Off
+     send_data_cmd(0x02);
+
+     send_ctrl_cmd(0xB4); // Inversion Control -> 2Dot inversion
+     send_data_cmd(0x02);
+
+     send_ctrl_cmd(0xC0); // Powr control 1
+     send_data_cmd(0x15);
+     send_data_cmd(0x15);
+
+     send_ctrl_cmd(0xC1); // Power control 2
+     send_data_cmd(0x05);
+
+     send_ctrl_cmd(0xC2);      // Powr control 3
+     send_data_cmd(0x32);
+
+     send_ctrl_cmd(0xC5);      // Vcom control 1
+     send_data_cmd(0xFC);
+
+     send_ctrl_cmd(0xCB);      // V-core Setting
+     send_data_cmd(0x31);
+     send_data_cmd(0x24);
+     send_data_cmd(0x00);
+     send_data_cmd(0x34);
+
+     send_ctrl_cmd(0xF6);      // Interface control
+     send_data_cmd(0x41);
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+
+     send_ctrl_cmd(0xB7);      // Entry Mode Set
+     send_data_cmd(0x06);
+
+     send_ctrl_cmd(0xB1);      // Frame Rate Control
+     send_data_cmd(0x00);
+     send_data_cmd(0x1B);
+
+     send_ctrl_cmd(0x36);      // Memory Access Control
+     send_data_cmd(0x08); // seosc 08 -> C8
+
+     send_ctrl_cmd(0xB5);      // Blanking Porch control
+     send_data_cmd(0x02);
+     send_data_cmd(0x02);
+     send_data_cmd(0x0A);
+     send_data_cmd(0x14);
+
+     send_ctrl_cmd(0xB6);      // Display Function control
+     send_data_cmd(0x02);
+     send_data_cmd(0x82);
+     send_data_cmd(0x27);
+     send_data_cmd(0x00);
+
+     send_ctrl_cmd(0x3A);      // Pixel Format->DBI(5=16bit)
+     send_data_cmd(0x05);
+
+     send_ctrl_cmd(0x51);//write display brightness
+     send_data_cmd(0xff);//set brightness 0x00-0xff
+     MDELAY(50);
+
+     send_ctrl_cmd(0x53);//write ctrl display
+     send_data_cmd(0x24);
+     MDELAY(50);
+
+     send_ctrl_cmd(0x55);
+     send_data_cmd(0x02);//still picture
+     MDELAY(50);
+
+     send_ctrl_cmd(0x5e);//write CABC minumum brightness
+     send_data_cmd(0x70);//
+     MDELAY(50);
+
+     send_ctrl_cmd(0x35);      // Tearing Effect Line On
+     send_data_cmd(0x00);
+
+     send_ctrl_cmd(0x44);      // Tearing Effect Control Parameter
+     send_data_cmd(0x00);
+     send_data_cmd(0xEF);
+
+     send_ctrl_cmd(0xE0);      // Positive Gamma Correction
+     send_data_cmd(0x00);
+     send_data_cmd(0x06);
+     send_data_cmd(0x07);
+     send_data_cmd(0x03);
+     send_data_cmd(0x0A);
+     send_data_cmd(0x0A);
+     send_data_cmd(0x41);
+     send_data_cmd(0x59);
+     send_data_cmd(0x4D);
+     send_data_cmd(0x0C);
+     send_data_cmd(0x18);
+     send_data_cmd(0x0F);
+     send_data_cmd(0x22);
+     send_data_cmd(0x1D);
+     send_data_cmd(0x0F);
+
+     send_ctrl_cmd(0xE1);      // Negative Gamma Correction
+     send_data_cmd(0x06);
+     send_data_cmd(0x23);
+     send_data_cmd(0x24);
+     send_data_cmd(0x01);
+     send_data_cmd(0x0F);
+     send_data_cmd(0x01);
+     send_data_cmd(0x36);
+     send_data_cmd(0x23);
+     send_data_cmd(0x41);
+     send_data_cmd(0x07);
+     send_data_cmd(0x0F);
+     send_data_cmd(0x0F);
+     send_data_cmd(0x30);
+     send_data_cmd(0x27);
+     send_data_cmd(0x0E);
+
+     send_ctrl_cmd(0x2A);      // Column address
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0xEF);
+
+     send_ctrl_cmd(0x2B);      // Page address
+     send_data_cmd(0x00);
+     send_data_cmd(0x00);
+     send_data_cmd(0x01);
+     send_data_cmd(0x3F);
+
+     send_ctrl_cmd(0xE8);
+     send_data_cmd(0x84);
+     send_data_cmd(0x1A);
+     send_data_cmd(0x68);
+
+     send_ctrl_cmd(0x11);
+     MDELAY(120);
+
+     send_ctrl_cmd(0X29);
+#endif
+
+}
+
+
+// ---------------------------------------------------------------------------
+//  LCM Driver Implementations
+// ---------------------------------------------------------------------------
+
+static void lcm_set_util_funcs(const LCM_UTIL_FUNCS *util)
+{
+       memcpy(&lcm_util, util, sizeof(LCM_UTIL_FUNCS));
+}
+
+
+static void lcm_get_params(LCM_PARAMS *params)
+{
+       memset(params, 0, sizeof(LCM_PARAMS));
+
+       params->type   = LCM_TYPE_DBI;
+       params->ctrl   = LCM_CTRL_PARALLEL_DBI;
+       params->width  = FRAME_WIDTH;
+       params->height = FRAME_HEIGHT;
+       params->io_select_mode = 1;
+
+       params->dbi.port                    = 0;
+       params->dbi.clock_freq              = LCM_DBI_CLOCK_FREQ_52M;
+       params->dbi.data_width              = LCM_DBI_DATA_WIDTH_16BITS;
+       params->dbi.data_format.color_order = LCM_COLOR_ORDER_RGB;
+       params->dbi.data_format.trans_seq   = LCM_DBI_TRANS_SEQ_MSB_FIRST;
+       params->dbi.data_format.padding     = LCM_DBI_PADDING_ON_MSB;
+       params->dbi.data_format.format      = LCM_DBI_FORMAT_RGB565;
+       params->dbi.data_format.width       = LCM_DBI_DATA_WIDTH_16BITS;
+       params->dbi.cpu_write_bits          = LCM_DBI_CPU_WRITE_16_BITS;
+       params->dbi.io_driving_current      = 0;
+
+       params->dbi.parallel.write_setup    = 2;
+       params->dbi.parallel.write_hold     = 2;
+       params->dbi.parallel.write_wait     = 4;
+       params->dbi.parallel.read_setup     = 2;
+       params->dbi.parallel.read_latency   = 31;
+       params->dbi.parallel.wait_period    = 9;
+
+    // enable tearing-free
+    params->dbi.te_mode                 = LCM_DBI_TE_MODE_VSYNC_ONLY;
+    params->dbi.te_edge_polarity        = LCM_POLARITY_RISING;
+
+}
+
+
+
+static void lcm_init(void)
+{
+                 upmu_set_rg_vgp1_vosel(3);  // set 1.8v for VGP1
+                upmu_set_rg_vgp1_en(1);      //  VGP1 power ON
+            MDELAY(1);
+            upmu_set_rg_vcam_af_vosel(5);  // set 2.8V  for VCAM_AF
+            upmu_set_rg_vcam_af_en(1);      // VCAM_AF power ON
+            MDELAY(1);
+
+    SET_RESET_PIN(1);
+       MDELAY(1);
+       SET_RESET_PIN(0);
+       MDELAY(10);
+       SET_RESET_PIN(1);
+       MDELAY(120);
+       init_lcm_registers();
+       LCM_PRINT("[LCD] lcm_init \n");
+
+}
+
+
+static void lcm_suspend(void)
+{
+#if 1 
+       send_ctrl_cmd(0x10);
+       MDELAY(120);
+        upmu_set_rg_vcam_af_en(0);  // VCAM_AF power OFF
+        upmu_set_rg_vgp1_en(0);      //  VGP1 power OFF
+    #else
+    //sw_clear_panel(0);
+       send_ctrl_cmd(0x10);
+       MDELAY(5);
+    #endif 
+       LCM_PRINT("[LCD] lcm_suspend \n");
+
+}
+
+
+static void lcm_resume(void)
+{
+       //send_ctrl_cmd(0x11);
+
+
+       lcm_init();
+       MDELAY(120);
+
+       LCM_PRINT("[LCD] lcm_resume \n");
+}
+
+static void lcm_update(unsigned int x, unsigned int y,
+               unsigned int width, unsigned int height)
+{
+       unsigned short x0, y0, x1, y1;
+       unsigned short h_X_start,l_X_start,h_X_end,l_X_end,h_Y_start,l_Y_start,h_Y_end,l_Y_end;
+
+       x0 = (unsigned short)x;
+       y0 = (unsigned short)y;
+       x1 = (unsigned short)x+width-1;
+       y1 = (unsigned short)y+height-1;
+
+
+    h_X_start=((x0&0xFF00)>>8);
+    l_X_start=(x0&0x00FF);
+    h_X_end=((x1&0xFF00)>>8);
+    l_X_end=(x1&0x00FF);
+
+    h_Y_start=((y0&0xFF00)>>8);
+    l_Y_start=(y0&0x00FF);
+    h_Y_end=((y1&0xFF00)>>8);
+    l_Y_end=(y1&0x00FF);
+
+       send_ctrl_cmd(0x2A);
+       send_data_cmd(h_X_start);
+       send_data_cmd(l_X_start);
+       send_data_cmd(h_X_end);
+       send_data_cmd(l_X_end);
+
+       send_ctrl_cmd(0x2B);
+       send_data_cmd(h_Y_start);
+       send_data_cmd(l_Y_start);
+       send_data_cmd(h_Y_end);
+       send_data_cmd(l_Y_end);
+
+       send_ctrl_cmd(0x29);
+
+       send_ctrl_cmd(0x2C);
+}
+
+static void lcm_setbacklight(unsigned int level)
+{
+       if(level > 255) level = 255;
+#if 0
+       send_ctrl_cmd(0x51);
+       send_data_cmd(level);
+#else
+    send_ctrl_cmd(0xBE);
+    send_data_cmd(0x0F);
+#endif
+}
+static unsigned int lcm_compare_id(void)
+{
+#if 0
+    send_ctrl_cmd(0xB9);  // SET password
+       send_data_cmd(0xFF);
+       send_data_cmd(0x83);
+       send_data_cmd(0x69);
+    send_ctrl_cmd(0xC3);
+       send_data_cmd(0xFF);
+
+       send_ctrl_cmd(0xF4);
+       read_data_cmd();
+    return (LCM_ID == read_data_cmd())?1:0;
+#else
+    return 1;
+#endif
+}
+
+static void lcm_set_pwm(unsigned int divider)
+{
+#if 0
+ send_ctrl_cmd(0xBE);
+ send_data_cmd(0xFF);
+
+ send_ctrl_cmd(0xBF);
+ send_data_cmd(0x07);
+#endif
+}
+
+
+LCM_DRIVER ili9340d_dbi_qvga_drv =
+{
+    .name                      = " ili9340d_dbi_qvga",
+       .set_util_funcs = lcm_set_util_funcs,
+       .get_params     = lcm_get_params,
+       .init           = lcm_init,
+       .suspend        = lcm_suspend,
+       .resume         = lcm_resume,
+       .update         = lcm_update,
+       .set_backlight  = lcm_setbacklight,
+       .set_pwm        = lcm_set_pwm,
+       .compare_id     = lcm_compare_id,
+};
+
+// ---------------------------------------------------------------------------
+//  Get LCM Driver Hooks
+// ---------------------------------------------------------------------------
+/*
+LCM_DRIVER nt35510_dsi_cmd_6572_drv = {
+    .name = "nt35510_dsi_cmd_6572",
+    .set_util_funcs = lcm_set_util_funcs,
+    .get_params = lcm_get_params,
+    .init = lcm_init,
+    .suspend = lcm_suspend,
+    .resume = lcm_resume,
+    //.set_backlight = lcm_setbacklight,
+    //.set_pwm        = lcm_setpwm,
+    //.get_pwm        = lcm_getpwm,
+    //.compare_id = lcm_compare_id,
+    .update = lcm_update
+};
+*/