![Stepan Moskovchenko](/assets/img/avatar_default.png)
Qualcomm development of the MSM SOC framebuffer driver has diverged significantly from the driver used by Android. This is a snapshot of our current driver, in all it's agony. We are putting this in staging to help with the process of converging the two drivers. At this point, the driver has been tested only in dumb framebuffer mode. Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org> Signed-off-by: David Brown <davidb@codeaurora.org> Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org> [dwalker@codeaurora.org: added a small compile fix and TODO.] Signed-off-by: Daniel Walker <dwalker@codeaurora.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
1742 lines
62 KiB
C
1742 lines
62 KiB
C
/* Copyright (c) 2008-2009, Code Aurora Forum. 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 version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301, USA.
|
|
*/
|
|
|
|
#include "msm_fb.h"
|
|
#include "mddihost.h"
|
|
#include "mddihosti.h"
|
|
#include "mddi_toshiba.h"
|
|
|
|
#define TM_GET_DID(id) ((id) & 0xff)
|
|
#define TM_GET_PID(id) (((id) & 0xff00)>>8)
|
|
|
|
#define MDDI_CLIENT_CORE_BASE 0x108000
|
|
#define LCD_CONTROL_BLOCK_BASE 0x110000
|
|
#define SPI_BLOCK_BASE 0x120000
|
|
#define PWM_BLOCK_BASE 0x140000
|
|
#define SYSTEM_BLOCK1_BASE 0x160000
|
|
|
|
#define TTBUSSEL (MDDI_CLIENT_CORE_BASE|0x18)
|
|
#define DPSET0 (MDDI_CLIENT_CORE_BASE|0x1C)
|
|
#define DPSET1 (MDDI_CLIENT_CORE_BASE|0x20)
|
|
#define DPSUS (MDDI_CLIENT_CORE_BASE|0x24)
|
|
#define DPRUN (MDDI_CLIENT_CORE_BASE|0x28)
|
|
#define SYSCKENA (MDDI_CLIENT_CORE_BASE|0x2C)
|
|
|
|
#define BITMAP0 (MDDI_CLIENT_CORE_BASE|0x44)
|
|
#define BITMAP1 (MDDI_CLIENT_CORE_BASE|0x48)
|
|
#define BITMAP2 (MDDI_CLIENT_CORE_BASE|0x4C)
|
|
#define BITMAP3 (MDDI_CLIENT_CORE_BASE|0x50)
|
|
#define BITMAP4 (MDDI_CLIENT_CORE_BASE|0x54)
|
|
|
|
#define SRST (LCD_CONTROL_BLOCK_BASE|0x00)
|
|
#define PORT_ENB (LCD_CONTROL_BLOCK_BASE|0x04)
|
|
#define START (LCD_CONTROL_BLOCK_BASE|0x08)
|
|
#define PORT (LCD_CONTROL_BLOCK_BASE|0x0C)
|
|
|
|
#define INTFLG (LCD_CONTROL_BLOCK_BASE|0x18)
|
|
#define INTMSK (LCD_CONTROL_BLOCK_BASE|0x1C)
|
|
#define MPLFBUF (LCD_CONTROL_BLOCK_BASE|0x20)
|
|
|
|
#define PXL (LCD_CONTROL_BLOCK_BASE|0x30)
|
|
#define HCYCLE (LCD_CONTROL_BLOCK_BASE|0x34)
|
|
#define HSW (LCD_CONTROL_BLOCK_BASE|0x38)
|
|
#define HDE_START (LCD_CONTROL_BLOCK_BASE|0x3C)
|
|
#define HDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x40)
|
|
#define VCYCLE (LCD_CONTROL_BLOCK_BASE|0x44)
|
|
#define VSW (LCD_CONTROL_BLOCK_BASE|0x48)
|
|
#define VDE_START (LCD_CONTROL_BLOCK_BASE|0x4C)
|
|
#define VDE_SIZE (LCD_CONTROL_BLOCK_BASE|0x50)
|
|
#define WAKEUP (LCD_CONTROL_BLOCK_BASE|0x54)
|
|
#define REGENB (LCD_CONTROL_BLOCK_BASE|0x5C)
|
|
#define VSYNIF (LCD_CONTROL_BLOCK_BASE|0x60)
|
|
#define WRSTB (LCD_CONTROL_BLOCK_BASE|0x64)
|
|
#define RDSTB (LCD_CONTROL_BLOCK_BASE|0x68)
|
|
#define ASY_DATA (LCD_CONTROL_BLOCK_BASE|0x6C)
|
|
#define ASY_DATB (LCD_CONTROL_BLOCK_BASE|0x70)
|
|
#define ASY_DATC (LCD_CONTROL_BLOCK_BASE|0x74)
|
|
#define ASY_DATD (LCD_CONTROL_BLOCK_BASE|0x78)
|
|
#define ASY_DATE (LCD_CONTROL_BLOCK_BASE|0x7C)
|
|
#define ASY_DATF (LCD_CONTROL_BLOCK_BASE|0x80)
|
|
#define ASY_DATG (LCD_CONTROL_BLOCK_BASE|0x84)
|
|
#define ASY_DATH (LCD_CONTROL_BLOCK_BASE|0x88)
|
|
#define ASY_CMDSET (LCD_CONTROL_BLOCK_BASE|0x8C)
|
|
#define MONI (LCD_CONTROL_BLOCK_BASE|0xB0)
|
|
#define VPOS (LCD_CONTROL_BLOCK_BASE|0xC0)
|
|
|
|
#define SSICTL (SPI_BLOCK_BASE|0x00)
|
|
#define SSITIME (SPI_BLOCK_BASE|0x04)
|
|
#define SSITX (SPI_BLOCK_BASE|0x08)
|
|
#define SSIINTS (SPI_BLOCK_BASE|0x14)
|
|
|
|
#define TIMER0LOAD (PWM_BLOCK_BASE|0x00)
|
|
#define TIMER0CTRL (PWM_BLOCK_BASE|0x08)
|
|
#define PWM0OFF (PWM_BLOCK_BASE|0x1C)
|
|
#define TIMER1LOAD (PWM_BLOCK_BASE|0x20)
|
|
#define TIMER1CTRL (PWM_BLOCK_BASE|0x28)
|
|
#define PWM1OFF (PWM_BLOCK_BASE|0x3C)
|
|
#define TIMER2LOAD (PWM_BLOCK_BASE|0x40)
|
|
#define TIMER2CTRL (PWM_BLOCK_BASE|0x48)
|
|
#define PWM2OFF (PWM_BLOCK_BASE|0x5C)
|
|
#define PWMCR (PWM_BLOCK_BASE|0x68)
|
|
|
|
#define GPIOIS (GPIO_BLOCK_BASE|0x08)
|
|
#define GPIOIEV (GPIO_BLOCK_BASE|0x10)
|
|
#define GPIOIC (GPIO_BLOCK_BASE|0x20)
|
|
|
|
#define WKREQ (SYSTEM_BLOCK1_BASE|0x00)
|
|
#define CLKENB (SYSTEM_BLOCK1_BASE|0x04)
|
|
#define DRAMPWR (SYSTEM_BLOCK1_BASE|0x08)
|
|
#define INTMASK (SYSTEM_BLOCK1_BASE|0x0C)
|
|
#define CNT_DIS (SYSTEM_BLOCK1_BASE|0x10)
|
|
|
|
typedef enum {
|
|
TOSHIBA_STATE_OFF,
|
|
TOSHIBA_STATE_PRIM_SEC_STANDBY,
|
|
TOSHIBA_STATE_PRIM_SEC_READY,
|
|
TOSHIBA_STATE_PRIM_NORMAL_MODE,
|
|
TOSHIBA_STATE_SEC_NORMAL_MODE
|
|
} mddi_toshiba_state_t;
|
|
|
|
static uint32 mddi_toshiba_curr_vpos;
|
|
static boolean mddi_toshiba_monitor_refresh_value = FALSE;
|
|
static boolean mddi_toshiba_report_refresh_measurements = FALSE;
|
|
|
|
boolean mddi_toshiba_61Hz_refresh = TRUE;
|
|
|
|
/* Modifications to timing to increase refresh rate to > 60Hz.
|
|
* 20MHz dot clock.
|
|
* 646 total rows.
|
|
* 506 total columns.
|
|
* refresh rate = 61.19Hz
|
|
*/
|
|
static uint32 mddi_toshiba_rows_per_second = 39526;
|
|
static uint32 mddi_toshiba_usecs_per_refresh = 16344;
|
|
static uint32 mddi_toshiba_rows_per_refresh = 646;
|
|
extern boolean mddi_vsync_detect_enabled;
|
|
|
|
static msm_fb_vsync_handler_type mddi_toshiba_vsync_handler;
|
|
static void *mddi_toshiba_vsync_handler_arg;
|
|
static uint16 mddi_toshiba_vsync_attempts;
|
|
|
|
static mddi_toshiba_state_t toshiba_state = TOSHIBA_STATE_OFF;
|
|
|
|
static struct msm_panel_common_pdata *mddi_toshiba_pdata;
|
|
|
|
static int mddi_toshiba_lcd_on(struct platform_device *pdev);
|
|
static int mddi_toshiba_lcd_off(struct platform_device *pdev);
|
|
|
|
static void mddi_toshiba_state_transition(mddi_toshiba_state_t a,
|
|
mddi_toshiba_state_t b)
|
|
{
|
|
if (toshiba_state != a) {
|
|
MDDI_MSG_ERR("toshiba state trans. (%d->%d) found %d\n", a, b,
|
|
toshiba_state);
|
|
}
|
|
toshiba_state = b;
|
|
}
|
|
|
|
#define GORDON_REG_IMGCTL1 0x10 /* Image interface control 1 */
|
|
#define GORDON_REG_IMGCTL2 0x11 /* Image interface control 2 */
|
|
#define GORDON_REG_IMGSET1 0x12 /* Image interface settings 1 */
|
|
#define GORDON_REG_IMGSET2 0x13 /* Image interface settings 2 */
|
|
#define GORDON_REG_IVBP1 0x14 /* DM0: Vert back porch */
|
|
#define GORDON_REG_IHBP1 0x15 /* DM0: Horiz back porch */
|
|
#define GORDON_REG_IVNUM1 0x16 /* DM0: Num of vert lines */
|
|
#define GORDON_REG_IHNUM1 0x17 /* DM0: Num of pixels per line */
|
|
#define GORDON_REG_IVBP2 0x18 /* DM1: Vert back porch */
|
|
#define GORDON_REG_IHBP2 0x19 /* DM1: Horiz back porch */
|
|
#define GORDON_REG_IVNUM2 0x1A /* DM1: Num of vert lines */
|
|
#define GORDON_REG_IHNUM2 0x1B /* DM1: Num of pixels per line */
|
|
#define GORDON_REG_LCDIFCTL1 0x30 /* LCD interface control 1 */
|
|
#define GORDON_REG_VALTRAN 0x31 /* LCD IF ctl: VALTRAN sync flag */
|
|
#define GORDON_REG_AVCTL 0x33
|
|
#define GORDON_REG_LCDIFCTL2 0x34 /* LCD interface control 2 */
|
|
#define GORDON_REG_LCDIFCTL3 0x35 /* LCD interface control 3 */
|
|
#define GORDON_REG_LCDIFSET1 0x36 /* LCD interface settings 1 */
|
|
#define GORDON_REG_PCCTL 0x3C
|
|
#define GORDON_REG_TPARAM1 0x40
|
|
#define GORDON_REG_TLCDIF1 0x41
|
|
#define GORDON_REG_TSSPB_ST1 0x42
|
|
#define GORDON_REG_TSSPB_ED1 0x43
|
|
#define GORDON_REG_TSCK_ST1 0x44
|
|
#define GORDON_REG_TSCK_WD1 0x45
|
|
#define GORDON_REG_TGSPB_VST1 0x46
|
|
#define GORDON_REG_TGSPB_VED1 0x47
|
|
#define GORDON_REG_TGSPB_CH1 0x48
|
|
#define GORDON_REG_TGCK_ST1 0x49
|
|
#define GORDON_REG_TGCK_ED1 0x4A
|
|
#define GORDON_REG_TPCTL_ST1 0x4B
|
|
#define GORDON_REG_TPCTL_ED1 0x4C
|
|
#define GORDON_REG_TPCHG_ED1 0x4D
|
|
#define GORDON_REG_TCOM_CH1 0x4E
|
|
#define GORDON_REG_THBP1 0x4F
|
|
#define GORDON_REG_TPHCTL1 0x50
|
|
#define GORDON_REG_EVPH1 0x51
|
|
#define GORDON_REG_EVPL1 0x52
|
|
#define GORDON_REG_EVNH1 0x53
|
|
#define GORDON_REG_EVNL1 0x54
|
|
#define GORDON_REG_TBIAS1 0x55
|
|
#define GORDON_REG_TPARAM2 0x56
|
|
#define GORDON_REG_TLCDIF2 0x57
|
|
#define GORDON_REG_TSSPB_ST2 0x58
|
|
#define GORDON_REG_TSSPB_ED2 0x59
|
|
#define GORDON_REG_TSCK_ST2 0x5A
|
|
#define GORDON_REG_TSCK_WD2 0x5B
|
|
#define GORDON_REG_TGSPB_VST2 0x5C
|
|
#define GORDON_REG_TGSPB_VED2 0x5D
|
|
#define GORDON_REG_TGSPB_CH2 0x5E
|
|
#define GORDON_REG_TGCK_ST2 0x5F
|
|
#define GORDON_REG_TGCK_ED2 0x60
|
|
#define GORDON_REG_TPCTL_ST2 0x61
|
|
#define GORDON_REG_TPCTL_ED2 0x62
|
|
#define GORDON_REG_TPCHG_ED2 0x63
|
|
#define GORDON_REG_TCOM_CH2 0x64
|
|
#define GORDON_REG_THBP2 0x65
|
|
#define GORDON_REG_TPHCTL2 0x66
|
|
#define GORDON_REG_EVPH2 0x67
|
|
#define GORDON_REG_EVPL2 0x68
|
|
#define GORDON_REG_EVNH2 0x69
|
|
#define GORDON_REG_EVNL2 0x6A
|
|
#define GORDON_REG_TBIAS2 0x6B
|
|
#define GORDON_REG_POWCTL 0x80
|
|
#define GORDON_REG_POWOSC1 0x81
|
|
#define GORDON_REG_POWOSC2 0x82
|
|
#define GORDON_REG_POWSET 0x83
|
|
#define GORDON_REG_POWTRM1 0x85
|
|
#define GORDON_REG_POWTRM2 0x86
|
|
#define GORDON_REG_POWTRM3 0x87
|
|
#define GORDON_REG_POWTRMSEL 0x88
|
|
#define GORDON_REG_POWHIZ 0x89
|
|
|
|
void serigo(uint16 reg, uint8 data)
|
|
{
|
|
uint32 mddi_val = 0;
|
|
mddi_queue_register_read(SSIINTS, &mddi_val, TRUE, 0);
|
|
if (mddi_val & (1 << 8))
|
|
mddi_wait(1);
|
|
/* No De-assert of CS and send 2 bytes */
|
|
mddi_val = 0x90000 | ((0x00FF & reg) << 8) | data;
|
|
mddi_queue_register_write(SSITX, mddi_val, TRUE, 0);
|
|
}
|
|
|
|
void gordon_init(void)
|
|
{
|
|
/* Image interface settings ***/
|
|
serigo(GORDON_REG_IMGCTL2, 0x00);
|
|
serigo(GORDON_REG_IMGSET1, 0x01);
|
|
|
|
/* Exchange the RGB signal for J510(Softbank mobile) */
|
|
serigo(GORDON_REG_IMGSET2, 0x12);
|
|
serigo(GORDON_REG_LCDIFSET1, 0x00);
|
|
mddi_wait(2);
|
|
|
|
/* Pre-charge settings */
|
|
serigo(GORDON_REG_PCCTL, 0x09);
|
|
serigo(GORDON_REG_LCDIFCTL2, 0x1B);
|
|
mddi_wait(1);
|
|
}
|
|
|
|
void gordon_disp_on(void)
|
|
{
|
|
/*gordon_dispmode setting */
|
|
/*VGA settings */
|
|
serigo(GORDON_REG_TPARAM1, 0x30);
|
|
serigo(GORDON_REG_TLCDIF1, 0x00);
|
|
serigo(GORDON_REG_TSSPB_ST1, 0x8B);
|
|
serigo(GORDON_REG_TSSPB_ED1, 0x93);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TSCK_ST1, 0x88);
|
|
serigo(GORDON_REG_TSCK_WD1, 0x00);
|
|
serigo(GORDON_REG_TGSPB_VST1, 0x01);
|
|
serigo(GORDON_REG_TGSPB_VED1, 0x02);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TGSPB_CH1, 0x5E);
|
|
serigo(GORDON_REG_TGCK_ST1, 0x80);
|
|
serigo(GORDON_REG_TGCK_ED1, 0x3C);
|
|
serigo(GORDON_REG_TPCTL_ST1, 0x50);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TPCTL_ED1, 0x74);
|
|
serigo(GORDON_REG_TPCHG_ED1, 0x78);
|
|
serigo(GORDON_REG_TCOM_CH1, 0x50);
|
|
serigo(GORDON_REG_THBP1, 0x84);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TPHCTL1, 0x00);
|
|
serigo(GORDON_REG_EVPH1, 0x70);
|
|
serigo(GORDON_REG_EVPL1, 0x64);
|
|
serigo(GORDON_REG_EVNH1, 0x56);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_EVNL1, 0x48);
|
|
serigo(GORDON_REG_TBIAS1, 0x88);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TPARAM2, 0x28);
|
|
serigo(GORDON_REG_TLCDIF2, 0x14);
|
|
serigo(GORDON_REG_TSSPB_ST2, 0x49);
|
|
serigo(GORDON_REG_TSSPB_ED2, 0x4B);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TSCK_ST2, 0x4A);
|
|
serigo(GORDON_REG_TSCK_WD2, 0x02);
|
|
serigo(GORDON_REG_TGSPB_VST2, 0x02);
|
|
serigo(GORDON_REG_TGSPB_VED2, 0x03);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TGSPB_CH2, 0x2F);
|
|
serigo(GORDON_REG_TGCK_ST2, 0x40);
|
|
serigo(GORDON_REG_TGCK_ED2, 0x1E);
|
|
serigo(GORDON_REG_TPCTL_ST2, 0x2C);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TPCTL_ED2, 0x3A);
|
|
serigo(GORDON_REG_TPCHG_ED2, 0x3C);
|
|
serigo(GORDON_REG_TCOM_CH2, 0x28);
|
|
serigo(GORDON_REG_THBP2, 0x4D);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_TPHCTL2, 0x1A);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_IVBP1, 0x02);
|
|
serigo(GORDON_REG_IHBP1, 0x90);
|
|
serigo(GORDON_REG_IVNUM1, 0xA0);
|
|
serigo(GORDON_REG_IHNUM1, 0x78);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_IVBP2, 0x02);
|
|
serigo(GORDON_REG_IHBP2, 0x48);
|
|
serigo(GORDON_REG_IVNUM2, 0x50);
|
|
serigo(GORDON_REG_IHNUM2, 0x3C);
|
|
mddi_wait(2);
|
|
serigo(GORDON_REG_POWCTL, 0x03);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_POWCTL, 0x07);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_POWCTL, 0x0F);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_AVCTL, 0x03);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_POWCTL, 0x1F);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_POWCTL, 0x5F);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_POWCTL, 0x7F);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_LCDIFCTL1, 0x02);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_IMGCTL1, 0x00);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_LCDIFCTL3, 0x00);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_VALTRAN, 0x01);
|
|
mddi_wait(15);
|
|
serigo(GORDON_REG_LCDIFCTL1, 0x03);
|
|
serigo(GORDON_REG_LCDIFCTL1, 0x03);
|
|
mddi_wait(1);
|
|
}
|
|
|
|
void gordon_disp_off(void)
|
|
{
|
|
serigo(GORDON_REG_LCDIFCTL2, 0x7B);
|
|
serigo(GORDON_REG_VALTRAN, 0x01);
|
|
serigo(GORDON_REG_LCDIFCTL1, 0x02);
|
|
serigo(GORDON_REG_LCDIFCTL3, 0x01);
|
|
mddi_wait(20);
|
|
serigo(GORDON_REG_VALTRAN, 0x01);
|
|
serigo(GORDON_REG_IMGCTL1, 0x01);
|
|
serigo(GORDON_REG_LCDIFCTL1, 0x00);
|
|
mddi_wait(20);
|
|
serigo(GORDON_REG_POWCTL, 0x1F);
|
|
mddi_wait(40);
|
|
serigo(GORDON_REG_POWCTL, 0x07);
|
|
mddi_wait(40);
|
|
serigo(GORDON_REG_POWCTL, 0x03);
|
|
mddi_wait(40);
|
|
serigo(GORDON_REG_POWCTL, 0x00);
|
|
mddi_wait(40);
|
|
}
|
|
|
|
void gordon_disp_init(void)
|
|
{
|
|
gordon_init();
|
|
mddi_wait(20);
|
|
gordon_disp_on();
|
|
}
|
|
|
|
static void toshiba_common_initial_setup(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT) {
|
|
write_client_reg(DPSET0 , 0x4bec0066, TRUE);
|
|
write_client_reg(DPSET1 , 0x00000113, TRUE);
|
|
write_client_reg(DPSUS , 0x00000000, TRUE);
|
|
write_client_reg(DPRUN , 0x00000001, TRUE);
|
|
mddi_wait(5);
|
|
write_client_reg(SYSCKENA , 0x00000001, TRUE);
|
|
write_client_reg(CLKENB , 0x0000a0e9, TRUE);
|
|
|
|
write_client_reg(GPIODATA , 0x03FF0000, TRUE);
|
|
write_client_reg(GPIODIR , 0x0000024D, TRUE);
|
|
write_client_reg(GPIOSEL , 0x00000173, TRUE);
|
|
write_client_reg(GPIOPC , 0x03C300C0, TRUE);
|
|
write_client_reg(WKREQ , 0x00000000, TRUE);
|
|
write_client_reg(GPIOIS , 0x00000000, TRUE);
|
|
write_client_reg(GPIOIEV , 0x00000001, TRUE);
|
|
write_client_reg(GPIOIC , 0x000003FF, TRUE);
|
|
write_client_reg(GPIODATA , 0x00040004, TRUE);
|
|
|
|
write_client_reg(GPIODATA , 0x00080008, TRUE);
|
|
write_client_reg(DRAMPWR , 0x00000001, TRUE);
|
|
write_client_reg(CLKENB , 0x0000a0eb, TRUE);
|
|
write_client_reg(PWMCR , 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
|
|
write_client_reg(SSICTL , 0x00060399, TRUE);
|
|
write_client_reg(SSITIME , 0x00000100, TRUE);
|
|
write_client_reg(CNT_DIS , 0x00000002, TRUE);
|
|
write_client_reg(SSICTL , 0x0006039b, TRUE);
|
|
|
|
write_client_reg(SSITX , 0x00000000, TRUE);
|
|
mddi_wait(7);
|
|
write_client_reg(SSITX , 0x00000000, TRUE);
|
|
mddi_wait(7);
|
|
write_client_reg(SSITX , 0x00000000, TRUE);
|
|
mddi_wait(7);
|
|
|
|
write_client_reg(SSITX , 0x000800BA, TRUE);
|
|
write_client_reg(SSITX , 0x00000111, TRUE);
|
|
write_client_reg(SSITX , 0x00080036, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x0008003A, TRUE);
|
|
write_client_reg(SSITX , 0x00000160, TRUE);
|
|
write_client_reg(SSITX , 0x000800B1, TRUE);
|
|
write_client_reg(SSITX , 0x0000015D, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B2, TRUE);
|
|
write_client_reg(SSITX , 0x00000133, TRUE);
|
|
write_client_reg(SSITX , 0x000800B3, TRUE);
|
|
write_client_reg(SSITX , 0x00000122, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B4, TRUE);
|
|
write_client_reg(SSITX , 0x00000102, TRUE);
|
|
write_client_reg(SSITX , 0x000800B5, TRUE);
|
|
write_client_reg(SSITX , 0x0000011E, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B6, TRUE);
|
|
write_client_reg(SSITX , 0x00000127, TRUE);
|
|
write_client_reg(SSITX , 0x000800B7, TRUE);
|
|
write_client_reg(SSITX , 0x00000103, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B9, TRUE);
|
|
write_client_reg(SSITX , 0x00000124, TRUE);
|
|
write_client_reg(SSITX , 0x000800BD, TRUE);
|
|
write_client_reg(SSITX , 0x000001A1, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800BB, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
write_client_reg(SSITX , 0x000800BF, TRUE);
|
|
write_client_reg(SSITX , 0x00000101, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800BE, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
write_client_reg(SSITX , 0x000800C0, TRUE);
|
|
write_client_reg(SSITX , 0x00000111, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C1, TRUE);
|
|
write_client_reg(SSITX , 0x00000111, TRUE);
|
|
write_client_reg(SSITX , 0x000800C2, TRUE);
|
|
write_client_reg(SSITX , 0x00000111, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C3, TRUE);
|
|
write_client_reg(SSITX , 0x00080132, TRUE);
|
|
write_client_reg(SSITX , 0x00000132, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C4, TRUE);
|
|
write_client_reg(SSITX , 0x00080132, TRUE);
|
|
write_client_reg(SSITX , 0x00000132, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C5, TRUE);
|
|
write_client_reg(SSITX , 0x00080132, TRUE);
|
|
write_client_reg(SSITX , 0x00000132, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C6, TRUE);
|
|
write_client_reg(SSITX , 0x00080132, TRUE);
|
|
write_client_reg(SSITX , 0x00000132, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C7, TRUE);
|
|
write_client_reg(SSITX , 0x00080164, TRUE);
|
|
write_client_reg(SSITX , 0x00000145, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800C8, TRUE);
|
|
write_client_reg(SSITX , 0x00000144, TRUE);
|
|
write_client_reg(SSITX , 0x000800C9, TRUE);
|
|
write_client_reg(SSITX , 0x00000152, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800CA, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800EC, TRUE);
|
|
write_client_reg(SSITX , 0x00080101, TRUE);
|
|
write_client_reg(SSITX , 0x000001FC, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800CF, TRUE);
|
|
write_client_reg(SSITX , 0x00000101, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D0, TRUE);
|
|
write_client_reg(SSITX , 0x00080110, TRUE);
|
|
write_client_reg(SSITX , 0x00000104, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D1, TRUE);
|
|
write_client_reg(SSITX , 0x00000101, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D2, TRUE);
|
|
write_client_reg(SSITX , 0x00080100, TRUE);
|
|
write_client_reg(SSITX , 0x00000128, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D3, TRUE);
|
|
write_client_reg(SSITX , 0x00080100, TRUE);
|
|
write_client_reg(SSITX , 0x00000128, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D4, TRUE);
|
|
write_client_reg(SSITX , 0x00080126, TRUE);
|
|
write_client_reg(SSITX , 0x000001A4, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800D5, TRUE);
|
|
write_client_reg(SSITX , 0x00000120, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800EF, TRUE);
|
|
write_client_reg(SSITX , 0x00080132, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
mddi_wait(1);
|
|
|
|
write_client_reg(BITMAP0 , 0x032001E0, TRUE);
|
|
write_client_reg(BITMAP1 , 0x032001E0, TRUE);
|
|
write_client_reg(BITMAP2 , 0x014000F0, TRUE);
|
|
write_client_reg(BITMAP3 , 0x014000F0, TRUE);
|
|
write_client_reg(BITMAP4 , 0x014000F0, TRUE);
|
|
write_client_reg(CLKENB , 0x0000A1EB, TRUE);
|
|
write_client_reg(PORT_ENB , 0x00000001, TRUE);
|
|
write_client_reg(PORT , 0x00000004, TRUE);
|
|
write_client_reg(PXL , 0x00000002, TRUE);
|
|
write_client_reg(MPLFBUF , 0x00000000, TRUE);
|
|
write_client_reg(HCYCLE , 0x000000FD, TRUE);
|
|
write_client_reg(HSW , 0x00000003, TRUE);
|
|
write_client_reg(HDE_START , 0x00000007, TRUE);
|
|
write_client_reg(HDE_SIZE , 0x000000EF, TRUE);
|
|
write_client_reg(VCYCLE , 0x00000325, TRUE);
|
|
write_client_reg(VSW , 0x00000001, TRUE);
|
|
write_client_reg(VDE_START , 0x00000003, TRUE);
|
|
write_client_reg(VDE_SIZE , 0x0000031F, TRUE);
|
|
write_client_reg(START , 0x00000001, TRUE);
|
|
mddi_wait(32);
|
|
write_client_reg(SSITX , 0x000800BC, TRUE);
|
|
write_client_reg(SSITX , 0x00000180, TRUE);
|
|
write_client_reg(SSITX , 0x0008003B, TRUE);
|
|
write_client_reg(SSITX , 0x00000100, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B0, TRUE);
|
|
write_client_reg(SSITX , 0x00000116, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x000800B8, TRUE);
|
|
write_client_reg(SSITX , 0x000801FF, TRUE);
|
|
write_client_reg(SSITX , 0x000001F5, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX , 0x00000011, TRUE);
|
|
mddi_wait(5);
|
|
write_client_reg(SSITX , 0x00000029, TRUE);
|
|
return;
|
|
}
|
|
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA) {
|
|
write_client_reg(DPSET0, 0x4BEC0066, TRUE);
|
|
write_client_reg(DPSET1, 0x00000113, TRUE);
|
|
write_client_reg(DPSUS, 0x00000000, TRUE);
|
|
write_client_reg(DPRUN, 0x00000001, TRUE);
|
|
mddi_wait(14);
|
|
write_client_reg(SYSCKENA, 0x00000001, TRUE);
|
|
write_client_reg(CLKENB, 0x000000EF, TRUE);
|
|
write_client_reg(GPIO_BLOCK_BASE, 0x03FF0000, TRUE);
|
|
write_client_reg(GPIODIR, 0x0000024D, TRUE);
|
|
write_client_reg(SYSTEM_BLOCK2_BASE, 0x00000173, TRUE);
|
|
write_client_reg(GPIOPC, 0x03C300C0, TRUE);
|
|
write_client_reg(SYSTEM_BLOCK1_BASE, 0x00000000, TRUE);
|
|
write_client_reg(GPIOIS, 0x00000000, TRUE);
|
|
write_client_reg(GPIOIEV, 0x00000001, TRUE);
|
|
write_client_reg(GPIOIC, 0x000003FF, TRUE);
|
|
write_client_reg(GPIO_BLOCK_BASE, 0x00060006, TRUE);
|
|
write_client_reg(GPIO_BLOCK_BASE, 0x00080008, TRUE);
|
|
write_client_reg(GPIO_BLOCK_BASE, 0x02000200, TRUE);
|
|
write_client_reg(DRAMPWR, 0x00000001, TRUE);
|
|
write_client_reg(TIMER0CTRL, 0x00000060, TRUE);
|
|
write_client_reg(PWM_BLOCK_BASE, 0x00001388, TRUE);
|
|
write_client_reg(PWM0OFF, 0x00001387, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER1LOAD, 0x00001388, TRUE);
|
|
write_client_reg(PWM1OFF, 0x00001387, TRUE);
|
|
write_client_reg(TIMER0CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(PWMCR, 0x00000003, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SPI_BLOCK_BASE, 0x00063111, TRUE);
|
|
write_client_reg(SSITIME, 0x00000100, TRUE);
|
|
write_client_reg(SPI_BLOCK_BASE, 0x00063113, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(CLKENB, 0x0000A1EF, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(WRSTB, 0x0000003F, TRUE);
|
|
write_client_reg(RDSTB, 0x00000432, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(10);
|
|
write_client_reg(ASY_DATA, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATB, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATD, 0x80000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000009, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000008, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(20);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
} else {
|
|
write_client_reg(DPSET0, 0x4BEC0066, TRUE);
|
|
write_client_reg(DPSET1, 0x00000113, TRUE);
|
|
write_client_reg(DPSUS, 0x00000000, TRUE);
|
|
write_client_reg(DPRUN, 0x00000001, TRUE);
|
|
mddi_wait(14);
|
|
write_client_reg(SYSCKENA, 0x00000001, TRUE);
|
|
write_client_reg(CLKENB, 0x000000EF, TRUE);
|
|
write_client_reg(GPIODATA, 0x03FF0000, TRUE);
|
|
write_client_reg(GPIODIR, 0x0000024D, TRUE);
|
|
write_client_reg(GPIOSEL, 0x00000173, TRUE);
|
|
write_client_reg(GPIOPC, 0x03C300C0, TRUE);
|
|
write_client_reg(WKREQ, 0x00000000, TRUE);
|
|
write_client_reg(GPIOIS, 0x00000000, TRUE);
|
|
write_client_reg(GPIOIEV, 0x00000001, TRUE);
|
|
write_client_reg(GPIOIC, 0x000003FF, TRUE);
|
|
write_client_reg(GPIODATA, 0x00060006, TRUE);
|
|
write_client_reg(GPIODATA, 0x00080008, TRUE);
|
|
write_client_reg(GPIODATA, 0x02000200, TRUE);
|
|
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA) {
|
|
mddi_wait(400);
|
|
write_client_reg(DRAMPWR, 0x00000001, TRUE);
|
|
|
|
write_client_reg(CNT_DIS, 0x00000002, TRUE);
|
|
write_client_reg(BITMAP0, 0x01E00320, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
write_client_reg(PORT, 0x00000004, TRUE);
|
|
write_client_reg(PXL, 0x0000003A, TRUE);
|
|
write_client_reg(MPLFBUF, 0x00000000, TRUE);
|
|
write_client_reg(HCYCLE, 0x00000253, TRUE);
|
|
write_client_reg(HSW, 0x00000003, TRUE);
|
|
write_client_reg(HDE_START, 0x00000017, TRUE);
|
|
write_client_reg(HDE_SIZE, 0x0000018F, TRUE);
|
|
write_client_reg(VCYCLE, 0x000001FF, TRUE);
|
|
write_client_reg(VSW, 0x00000001, TRUE);
|
|
write_client_reg(VDE_START, 0x00000003, TRUE);
|
|
write_client_reg(VDE_SIZE, 0x000001DF, TRUE);
|
|
write_client_reg(START, 0x00000001, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(TIMER0CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER0LOAD, 0x00001388, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER1LOAD, 0x00001388, TRUE);
|
|
write_client_reg(PWM1OFF, 0x00000087, TRUE);
|
|
} else {
|
|
write_client_reg(DRAMPWR, 0x00000001, TRUE);
|
|
write_client_reg(TIMER0CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER0LOAD, 0x00001388, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER1LOAD, 0x00001388, TRUE);
|
|
write_client_reg(PWM1OFF, 0x00001387, TRUE);
|
|
}
|
|
|
|
write_client_reg(TIMER0CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(PWMCR, 0x00000003, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSICTL, 0x00000799, TRUE);
|
|
write_client_reg(SSITIME, 0x00000100, TRUE);
|
|
write_client_reg(SSICTL, 0x0000079b, TRUE);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000000, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x000800BA, TRUE);
|
|
write_client_reg(SSITX, 0x00000111, TRUE);
|
|
write_client_reg(SSITX, 0x00080036, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800BB, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
write_client_reg(SSITX, 0x0008003A, TRUE);
|
|
write_client_reg(SSITX, 0x00000160, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800BF, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
write_client_reg(SSITX, 0x000800B1, TRUE);
|
|
write_client_reg(SSITX, 0x0000015D, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800B2, TRUE);
|
|
write_client_reg(SSITX, 0x00000133, TRUE);
|
|
write_client_reg(SSITX, 0x000800B3, TRUE);
|
|
write_client_reg(SSITX, 0x00000122, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800B4, TRUE);
|
|
write_client_reg(SSITX, 0x00000102, TRUE);
|
|
write_client_reg(SSITX, 0x000800B5, TRUE);
|
|
write_client_reg(SSITX, 0x0000011F, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800B6, TRUE);
|
|
write_client_reg(SSITX, 0x00000128, TRUE);
|
|
write_client_reg(SSITX, 0x000800B7, TRUE);
|
|
write_client_reg(SSITX, 0x00000103, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800B9, TRUE);
|
|
write_client_reg(SSITX, 0x00000120, TRUE);
|
|
write_client_reg(SSITX, 0x000800BD, TRUE);
|
|
write_client_reg(SSITX, 0x00000102, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800BE, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
write_client_reg(SSITX, 0x000800C0, TRUE);
|
|
write_client_reg(SSITX, 0x00000111, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C1, TRUE);
|
|
write_client_reg(SSITX, 0x00000111, TRUE);
|
|
write_client_reg(SSITX, 0x000800C2, TRUE);
|
|
write_client_reg(SSITX, 0x00000111, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C3, TRUE);
|
|
write_client_reg(SSITX, 0x0008010A, TRUE);
|
|
write_client_reg(SSITX, 0x0000010A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C4, TRUE);
|
|
write_client_reg(SSITX, 0x00080160, TRUE);
|
|
write_client_reg(SSITX, 0x00000160, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C5, TRUE);
|
|
write_client_reg(SSITX, 0x00080160, TRUE);
|
|
write_client_reg(SSITX, 0x00000160, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C6, TRUE);
|
|
write_client_reg(SSITX, 0x00080160, TRUE);
|
|
write_client_reg(SSITX, 0x00000160, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C7, TRUE);
|
|
write_client_reg(SSITX, 0x00080133, TRUE);
|
|
write_client_reg(SSITX, 0x00000143, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800C8, TRUE);
|
|
write_client_reg(SSITX, 0x00000144, TRUE);
|
|
write_client_reg(SSITX, 0x000800C9, TRUE);
|
|
write_client_reg(SSITX, 0x00000133, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800CA, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800EC, TRUE);
|
|
write_client_reg(SSITX, 0x00080102, TRUE);
|
|
write_client_reg(SSITX, 0x00000118, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800CF, TRUE);
|
|
write_client_reg(SSITX, 0x00000101, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D0, TRUE);
|
|
write_client_reg(SSITX, 0x00080110, TRUE);
|
|
write_client_reg(SSITX, 0x00000104, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D1, TRUE);
|
|
write_client_reg(SSITX, 0x00000101, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D2, TRUE);
|
|
write_client_reg(SSITX, 0x00080100, TRUE);
|
|
write_client_reg(SSITX, 0x0000013A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D3, TRUE);
|
|
write_client_reg(SSITX, 0x00080100, TRUE);
|
|
write_client_reg(SSITX, 0x0000013A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D4, TRUE);
|
|
write_client_reg(SSITX, 0x00080124, TRUE);
|
|
write_client_reg(SSITX, 0x0000016E, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x000800D5, TRUE);
|
|
write_client_reg(SSITX, 0x00000124, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800ED, TRUE);
|
|
write_client_reg(SSITX, 0x00080101, TRUE);
|
|
write_client_reg(SSITX, 0x0000010A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D6, TRUE);
|
|
write_client_reg(SSITX, 0x00000101, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D7, TRUE);
|
|
write_client_reg(SSITX, 0x00080110, TRUE);
|
|
write_client_reg(SSITX, 0x0000010A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D8, TRUE);
|
|
write_client_reg(SSITX, 0x00000101, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800D9, TRUE);
|
|
write_client_reg(SSITX, 0x00080100, TRUE);
|
|
write_client_reg(SSITX, 0x00000114, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800DE, TRUE);
|
|
write_client_reg(SSITX, 0x00080100, TRUE);
|
|
write_client_reg(SSITX, 0x00000114, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800DF, TRUE);
|
|
write_client_reg(SSITX, 0x00080112, TRUE);
|
|
write_client_reg(SSITX, 0x0000013F, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E0, TRUE);
|
|
write_client_reg(SSITX, 0x0000010B, TRUE);
|
|
write_client_reg(SSITX, 0x000800E2, TRUE);
|
|
write_client_reg(SSITX, 0x00000101, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E3, TRUE);
|
|
write_client_reg(SSITX, 0x00000136, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E4, TRUE);
|
|
write_client_reg(SSITX, 0x00080100, TRUE);
|
|
write_client_reg(SSITX, 0x00000103, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E5, TRUE);
|
|
write_client_reg(SSITX, 0x00080102, TRUE);
|
|
write_client_reg(SSITX, 0x00000104, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E6, TRUE);
|
|
write_client_reg(SSITX, 0x00000103, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E7, TRUE);
|
|
write_client_reg(SSITX, 0x00080104, TRUE);
|
|
write_client_reg(SSITX, 0x0000010A, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(SSITX, 0x000800E8, TRUE);
|
|
write_client_reg(SSITX, 0x00000104, TRUE);
|
|
write_client_reg(CLKENB, 0x000001EF, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(WRSTB, 0x0000003F, TRUE);
|
|
write_client_reg(RDSTB, 0x00000432, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(10);
|
|
write_client_reg(ASY_DATA, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATB, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000000, TRUE);
|
|
write_client_reg(ASY_DATD, 0x80000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000009, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000008, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(20);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
}
|
|
|
|
mddi_toshiba_state_transition(TOSHIBA_STATE_PRIM_SEC_STANDBY,
|
|
TOSHIBA_STATE_PRIM_SEC_READY);
|
|
}
|
|
|
|
static void toshiba_prim_start(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA) {
|
|
write_client_reg(BITMAP1, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP2, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP3, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP4, 0x00DC00B0, TRUE);
|
|
write_client_reg(CLKENB, 0x000001EF, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
write_client_reg(PORT, 0x00000016, TRUE);
|
|
write_client_reg(PXL, 0x00000002, TRUE);
|
|
write_client_reg(MPLFBUF, 0x00000000, TRUE);
|
|
write_client_reg(HCYCLE, 0x00000185, TRUE);
|
|
write_client_reg(HSW, 0x00000018, TRUE);
|
|
write_client_reg(HDE_START, 0x0000004A, TRUE);
|
|
write_client_reg(HDE_SIZE, 0x000000EF, TRUE);
|
|
write_client_reg(VCYCLE, 0x0000028E, TRUE);
|
|
write_client_reg(VSW, 0x00000004, TRUE);
|
|
write_client_reg(VDE_START, 0x00000009, TRUE);
|
|
write_client_reg(VDE_SIZE, 0x0000027F, TRUE);
|
|
write_client_reg(START, 0x00000001, TRUE);
|
|
write_client_reg(SYSTEM_BLOCK1_BASE, 0x00000002, TRUE);
|
|
} else{
|
|
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
write_client_reg(BITMAP1, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP2, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP3, 0x01E000F0, TRUE);
|
|
write_client_reg(BITMAP4, 0x00DC00B0, TRUE);
|
|
write_client_reg(CLKENB, 0x000001EF, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
write_client_reg(PORT, 0x00000004, TRUE);
|
|
write_client_reg(PXL, 0x00000002, TRUE);
|
|
write_client_reg(MPLFBUF, 0x00000000, TRUE);
|
|
|
|
if (mddi_toshiba_61Hz_refresh) {
|
|
write_client_reg(HCYCLE, 0x000000FC, TRUE);
|
|
mddi_toshiba_rows_per_second = 39526;
|
|
mddi_toshiba_rows_per_refresh = 646;
|
|
mddi_toshiba_usecs_per_refresh = 16344;
|
|
} else {
|
|
write_client_reg(HCYCLE, 0x0000010b, TRUE);
|
|
mddi_toshiba_rows_per_second = 37313;
|
|
mddi_toshiba_rows_per_refresh = 646;
|
|
mddi_toshiba_usecs_per_refresh = 17313;
|
|
}
|
|
|
|
write_client_reg(HSW, 0x00000003, TRUE);
|
|
write_client_reg(HDE_START, 0x00000007, TRUE);
|
|
write_client_reg(HDE_SIZE, 0x000000EF, TRUE);
|
|
write_client_reg(VCYCLE, 0x00000285, TRUE);
|
|
write_client_reg(VSW, 0x00000001, TRUE);
|
|
write_client_reg(VDE_START, 0x00000003, TRUE);
|
|
write_client_reg(VDE_SIZE, 0x0000027F, TRUE);
|
|
write_client_reg(START, 0x00000001, TRUE);
|
|
mddi_wait(10);
|
|
write_client_reg(SSITX, 0x000800BC, TRUE);
|
|
write_client_reg(SSITX, 0x00000180, TRUE);
|
|
write_client_reg(SSITX, 0x0008003B, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x000800B0, TRUE);
|
|
write_client_reg(SSITX, 0x00000116, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x000800B8, TRUE);
|
|
write_client_reg(SSITX, 0x000801FF, TRUE);
|
|
write_client_reg(SSITX, 0x000001F5, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x00000011, TRUE);
|
|
write_client_reg(SSITX, 0x00000029, TRUE);
|
|
write_client_reg(WKREQ, 0x00000000, TRUE);
|
|
write_client_reg(WAKEUP, 0x00000000, TRUE);
|
|
write_client_reg(INTMSK, 0x00000001, TRUE);
|
|
}
|
|
|
|
mddi_toshiba_state_transition(TOSHIBA_STATE_PRIM_SEC_READY,
|
|
TOSHIBA_STATE_PRIM_NORMAL_MODE);
|
|
}
|
|
|
|
static void toshiba_sec_start(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(CLKENB, 0x000011EF, TRUE);
|
|
write_client_reg(BITMAP0, 0x028001E0, TRUE);
|
|
write_client_reg(BITMAP1, 0x00000000, TRUE);
|
|
write_client_reg(BITMAP2, 0x00000000, TRUE);
|
|
write_client_reg(BITMAP3, 0x00000000, TRUE);
|
|
write_client_reg(BITMAP4, 0x00DC00B0, TRUE);
|
|
write_client_reg(PORT, 0x00000000, TRUE);
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(MPLFBUF, 0x00000004, TRUE);
|
|
write_client_reg(HCYCLE, 0x0000006B, TRUE);
|
|
write_client_reg(HSW, 0x00000003, TRUE);
|
|
write_client_reg(HDE_START, 0x00000007, TRUE);
|
|
write_client_reg(HDE_SIZE, 0x00000057, TRUE);
|
|
write_client_reg(VCYCLE, 0x000000E6, TRUE);
|
|
write_client_reg(VSW, 0x00000001, TRUE);
|
|
write_client_reg(VDE_START, 0x00000003, TRUE);
|
|
write_client_reg(VDE_SIZE, 0x000000DB, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000001, TRUE);
|
|
write_client_reg(ASY_DATB, 0x0000011B, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000002, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000700, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000003, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000230, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000008, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000402, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000009, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x8000000B, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATE, 0x8000000C, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATG, 0x8000000D, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000409, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x8000000E, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000409, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000030, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000031, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000100, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000032, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000104, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000033, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000400, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000034, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000306, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000035, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000706, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000036, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000707, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000037, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000004, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000038, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000039, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATG, 0x8000003A, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000044, TRUE);
|
|
write_client_reg(ASY_DATB, 0x0000AF00, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000045, TRUE);
|
|
write_client_reg(ASY_DATD, 0x0000DB00, TRUE);
|
|
write_client_reg(ASY_DATE, 0x08000042, TRUE);
|
|
write_client_reg(ASY_DATF, 0x0000DB00, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000021, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(PXL, 0x0000000C, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000022, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000003, TRUE);
|
|
write_client_reg(START, 0x00000001, TRUE);
|
|
mddi_wait(60);
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000050, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000051, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000E00, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000052, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000D01, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000053, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000058, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x8000005A, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000E01, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000009, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000008, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000011, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000812, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000012, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000003, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000013, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000909, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000040, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
mddi_wait(40);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000340, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(60);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00003340, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00004007, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000009, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000008, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004017, TRUE);
|
|
write_client_reg(ASY_DATC, 0x8000005B, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000011, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x0000000D, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x0000000C, TRUE);
|
|
mddi_wait(20);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
/* LTPS I/F control */
|
|
write_client_reg(ASY_DATB, 0x00000019, TRUE);
|
|
/* Direct cmd transfer enable */
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
/* Direct cmd transfer disable */
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(20);
|
|
/* Index setting of SUB LCDD */
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
/* LTPS I/F control */
|
|
write_client_reg(ASY_DATB, 0x00000079, TRUE);
|
|
/* Direct cmd transfer enable */
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
/* Direct cmd transfer disable */
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(20);
|
|
/* Index setting of SUB LCDD */
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
/* LTPS I/F control */
|
|
write_client_reg(ASY_DATB, 0x000003FD, TRUE);
|
|
/* Direct cmd transfer enable */
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
/* Direct cmd transfer disable */
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(20);
|
|
mddi_toshiba_state_transition(TOSHIBA_STATE_PRIM_SEC_READY,
|
|
TOSHIBA_STATE_SEC_NORMAL_MODE);
|
|
}
|
|
|
|
static void toshiba_prim_lcd_off(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA) {
|
|
gordon_disp_off();
|
|
} else{
|
|
|
|
/* Main panel power off (Deep standby in) */
|
|
write_client_reg(SSITX, 0x000800BC, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
write_client_reg(SSITX, 0x00000028, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(SSITX, 0x000800B8, TRUE);
|
|
write_client_reg(SSITX, 0x00000180, TRUE);
|
|
write_client_reg(SSITX, 0x00000102, TRUE);
|
|
write_client_reg(SSITX, 0x00000010, TRUE);
|
|
}
|
|
write_client_reg(PORT, 0x00000003, TRUE);
|
|
write_client_reg(REGENB, 0x00000001, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(REGENB, 0x00000001, TRUE);
|
|
mddi_wait(3);
|
|
if (TM_GET_PID(mfd->panel.id) != LCD_SHARP_2P4_VGA) {
|
|
write_client_reg(SSITX, 0x000800B0, TRUE);
|
|
write_client_reg(SSITX, 0x00000100, TRUE);
|
|
}
|
|
mddi_toshiba_state_transition(TOSHIBA_STATE_PRIM_NORMAL_MODE,
|
|
TOSHIBA_STATE_PRIM_SEC_STANDBY);
|
|
}
|
|
|
|
static void toshiba_sec_lcd_off(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004016, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000019, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x0000000B, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000002, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(4);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000300, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(4);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004004, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(PORT, 0x00000000, TRUE);
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000001, TRUE);
|
|
write_client_reg(REGENB, 0x00000001, TRUE);
|
|
mddi_toshiba_state_transition(TOSHIBA_STATE_SEC_NORMAL_MODE,
|
|
TOSHIBA_STATE_PRIM_SEC_STANDBY);
|
|
}
|
|
|
|
static void toshiba_sec_cont_update_start(struct msm_fb_data_type *mfd)
|
|
{
|
|
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(INTMASK, 0x00000001, TRUE);
|
|
write_client_reg(TTBUSSEL, 0x0000000B, TRUE);
|
|
write_client_reg(MONI, 0x00000008, TRUE);
|
|
write_client_reg(CLKENB, 0x000000EF, TRUE);
|
|
write_client_reg(CLKENB, 0x000010EF, TRUE);
|
|
write_client_reg(CLKENB, 0x000011EF, TRUE);
|
|
write_client_reg(BITMAP4, 0x00DC00B0, TRUE);
|
|
write_client_reg(HCYCLE, 0x0000006B, TRUE);
|
|
write_client_reg(HSW, 0x00000003, TRUE);
|
|
write_client_reg(HDE_START, 0x00000002, TRUE);
|
|
write_client_reg(HDE_SIZE, 0x00000057, TRUE);
|
|
write_client_reg(VCYCLE, 0x000000E6, TRUE);
|
|
write_client_reg(VSW, 0x00000001, TRUE);
|
|
write_client_reg(VDE_START, 0x00000003, TRUE);
|
|
write_client_reg(VDE_SIZE, 0x000000DB, TRUE);
|
|
write_client_reg(WRSTB, 0x00000015, TRUE);
|
|
write_client_reg(MPLFBUF, 0x00000004, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000021, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000022, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000007, TRUE);
|
|
write_client_reg(PXL, 0x00000089, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000001, TRUE);
|
|
mddi_wait(2);
|
|
}
|
|
|
|
static void toshiba_sec_cont_update_stop(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
mddi_wait(3);
|
|
write_client_reg(SRST, 0x00000002, TRUE);
|
|
mddi_wait(3);
|
|
write_client_reg(SRST, 0x00000003, TRUE);
|
|
}
|
|
|
|
static void toshiba_sec_backlight_on(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(TIMER0CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER0LOAD, 0x00001388, TRUE);
|
|
write_client_reg(PWM0OFF, 0x00000001, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x00000060, TRUE);
|
|
write_client_reg(TIMER1LOAD, 0x00001388, TRUE);
|
|
write_client_reg(PWM1OFF, 0x00001387, TRUE);
|
|
write_client_reg(TIMER0CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(TIMER1CTRL, 0x000000E0, TRUE);
|
|
write_client_reg(PWMCR, 0x00000003, TRUE);
|
|
}
|
|
|
|
static void toshiba_sec_sleep_in(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004016, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000019, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x0000000B, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000002, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(4);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000300, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(4);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000000, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004004, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(PORT, 0x00000000, TRUE);
|
|
write_client_reg(PXL, 0x00000000, TRUE);
|
|
write_client_reg(START, 0x00000000, TRUE);
|
|
write_client_reg(REGENB, 0x00000001, TRUE);
|
|
/* Sleep in sequence */
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000302, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
}
|
|
|
|
static void toshiba_sec_sleep_out(struct msm_fb_data_type *mfd)
|
|
{
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_TOSHIBA_2P4_WVGA_PT)
|
|
return;
|
|
|
|
write_client_reg(VSYNIF, 0x00000000, TRUE);
|
|
write_client_reg(PORT_ENB, 0x00000002, TRUE);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000300, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
/* Display ON sequence */
|
|
write_client_reg(ASY_DATA, 0x80000011, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000812, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000012, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000003, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000013, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000909, TRUE);
|
|
write_client_reg(ASY_DATG, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATH, 0x00000040, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000001, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000000, TRUE);
|
|
mddi_wait(4);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000340, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(6);
|
|
write_client_reg(ASY_DATA, 0x80000010, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00003340, TRUE);
|
|
write_client_reg(ASY_DATC, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00004007, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000009, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000008, TRUE);
|
|
mddi_wait(1);
|
|
write_client_reg(ASY_DATA, 0x80000007, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00004017, TRUE);
|
|
write_client_reg(ASY_DATC, 0x8000005B, TRUE);
|
|
write_client_reg(ASY_DATD, 0x00000000, TRUE);
|
|
write_client_reg(ASY_DATE, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATF, 0x00000011, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x0000000D, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x0000000C, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000019, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x00000079, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
write_client_reg(ASY_DATA, 0x80000059, TRUE);
|
|
write_client_reg(ASY_DATB, 0x000003FD, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000005, TRUE);
|
|
write_client_reg(ASY_CMDSET, 0x00000004, TRUE);
|
|
mddi_wait(2);
|
|
}
|
|
|
|
static void mddi_toshiba_lcd_set_backlight(struct msm_fb_data_type *mfd)
|
|
{
|
|
int32 level;
|
|
int ret = -EPERM;
|
|
int max = mfd->panel_info.bl_max;
|
|
int min = mfd->panel_info.bl_min;
|
|
|
|
if (mddi_toshiba_pdata && mddi_toshiba_pdata->pmic_backlight) {
|
|
ret = mddi_toshiba_pdata->pmic_backlight(mfd->bl_level);
|
|
if (!ret)
|
|
return;
|
|
}
|
|
|
|
if (ret && mddi_toshiba_pdata && mddi_toshiba_pdata->backlight_level) {
|
|
level = mddi_toshiba_pdata->backlight_level(mfd->bl_level,
|
|
max, min);
|
|
|
|
if (level < 0)
|
|
return;
|
|
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA)
|
|
write_client_reg(TIMER0LOAD, 0x00001388, TRUE);
|
|
} else {
|
|
if (!max)
|
|
level = 0;
|
|
else
|
|
level = (mfd->bl_level * 4999) / max;
|
|
}
|
|
|
|
write_client_reg(PWM0OFF, level, TRUE);
|
|
}
|
|
|
|
static void mddi_toshiba_vsync_set_handler(msm_fb_vsync_handler_type handler, /* ISR to be executed */
|
|
void *arg)
|
|
{
|
|
boolean error = FALSE;
|
|
unsigned long flags;
|
|
|
|
/* Disable interrupts */
|
|
spin_lock_irqsave(&mddi_host_spin_lock, flags);
|
|
/* INTLOCK(); */
|
|
|
|
if (mddi_toshiba_vsync_handler != NULL) {
|
|
error = TRUE;
|
|
} else {
|
|
/* Register the handler for this particular GROUP interrupt source */
|
|
mddi_toshiba_vsync_handler = handler;
|
|
mddi_toshiba_vsync_handler_arg = arg;
|
|
}
|
|
|
|
/* Restore interrupts */
|
|
spin_unlock_irqrestore(&mddi_host_spin_lock, flags);
|
|
/* MDDI_INTFREE(); */
|
|
if (error) {
|
|
MDDI_MSG_ERR("MDDI: Previous Vsync handler never called\n");
|
|
} else {
|
|
/* Enable the vsync wakeup */
|
|
mddi_queue_register_write(INTMSK, 0x0000, FALSE, 0);
|
|
|
|
mddi_toshiba_vsync_attempts = 1;
|
|
mddi_vsync_detect_enabled = TRUE;
|
|
}
|
|
} /* mddi_toshiba_vsync_set_handler */
|
|
|
|
static void mddi_toshiba_lcd_vsync_detected(boolean detected)
|
|
{
|
|
/* static timetick_type start_time = 0; */
|
|
static struct timeval start_time;
|
|
static boolean first_time = TRUE;
|
|
/* uint32 mdp_cnt_val = 0; */
|
|
/* timetick_type elapsed_us; */
|
|
struct timeval now;
|
|
uint32 elapsed_us;
|
|
uint32 num_vsyncs;
|
|
|
|
if ((detected) || (mddi_toshiba_vsync_attempts > 5)) {
|
|
if ((detected) && (mddi_toshiba_monitor_refresh_value)) {
|
|
/* if (start_time != 0) */
|
|
if (!first_time) {
|
|
jiffies_to_timeval(jiffies, &now);
|
|
elapsed_us =
|
|
(now.tv_sec - start_time.tv_sec) * 1000000 +
|
|
now.tv_usec - start_time.tv_usec;
|
|
/*
|
|
* LCD is configured for a refresh every usecs,
|
|
* so to determine the number of vsyncs that
|
|
* have occurred since the last measurement
|
|
* add half that to the time difference and
|
|
* divide by the refresh rate.
|
|
*/
|
|
num_vsyncs = (elapsed_us +
|
|
(mddi_toshiba_usecs_per_refresh >>
|
|
1)) /
|
|
mddi_toshiba_usecs_per_refresh;
|
|
/*
|
|
* LCD is configured for * hsyncs (rows) per
|
|
* refresh cycle. Calculate new rows_per_second
|
|
* value based upon these new measurements.
|
|
* MDP can update with this new value.
|
|
*/
|
|
mddi_toshiba_rows_per_second =
|
|
(mddi_toshiba_rows_per_refresh * 1000 *
|
|
num_vsyncs) / (elapsed_us / 1000);
|
|
}
|
|
/* start_time = timetick_get(); */
|
|
first_time = FALSE;
|
|
jiffies_to_timeval(jiffies, &start_time);
|
|
if (mddi_toshiba_report_refresh_measurements) {
|
|
(void)mddi_queue_register_read_int(VPOS,
|
|
&mddi_toshiba_curr_vpos);
|
|
/* mdp_cnt_val = MDP_LINE_COUNT; */
|
|
}
|
|
}
|
|
/* if detected = TRUE, client initiated wakeup was detected */
|
|
if (mddi_toshiba_vsync_handler != NULL) {
|
|
(*mddi_toshiba_vsync_handler)
|
|
(mddi_toshiba_vsync_handler_arg);
|
|
mddi_toshiba_vsync_handler = NULL;
|
|
}
|
|
mddi_vsync_detect_enabled = FALSE;
|
|
mddi_toshiba_vsync_attempts = 0;
|
|
/* need to disable the interrupt wakeup */
|
|
if (!mddi_queue_register_write_int(INTMSK, 0x0001))
|
|
MDDI_MSG_ERR("Vsync interrupt disable failed!\n");
|
|
if (!detected) {
|
|
/* give up after 5 failed attempts but show error */
|
|
MDDI_MSG_NOTICE("Vsync detection failed!\n");
|
|
} else if ((mddi_toshiba_monitor_refresh_value) &&
|
|
(mddi_toshiba_report_refresh_measurements)) {
|
|
MDDI_MSG_NOTICE(" Last Line Counter=%d!\n",
|
|
mddi_toshiba_curr_vpos);
|
|
/* MDDI_MSG_NOTICE(" MDP Line Counter=%d!\n",mdp_cnt_val); */
|
|
MDDI_MSG_NOTICE(" Lines Per Second=%d!\n",
|
|
mddi_toshiba_rows_per_second);
|
|
}
|
|
/* clear the interrupt */
|
|
if (!mddi_queue_register_write_int(INTFLG, 0x0001))
|
|
MDDI_MSG_ERR("Vsync interrupt clear failed!\n");
|
|
} else {
|
|
/* if detected = FALSE, we woke up from hibernation, but did not
|
|
* detect client initiated wakeup.
|
|
*/
|
|
mddi_toshiba_vsync_attempts++;
|
|
}
|
|
}
|
|
|
|
static void mddi_toshiba_prim_init(struct msm_fb_data_type *mfd)
|
|
{
|
|
|
|
switch (toshiba_state) {
|
|
case TOSHIBA_STATE_PRIM_SEC_READY:
|
|
break;
|
|
case TOSHIBA_STATE_OFF:
|
|
toshiba_state = TOSHIBA_STATE_PRIM_SEC_STANDBY;
|
|
toshiba_common_initial_setup(mfd);
|
|
break;
|
|
case TOSHIBA_STATE_PRIM_SEC_STANDBY:
|
|
toshiba_common_initial_setup(mfd);
|
|
break;
|
|
case TOSHIBA_STATE_SEC_NORMAL_MODE:
|
|
toshiba_sec_cont_update_stop(mfd);
|
|
toshiba_sec_sleep_in(mfd);
|
|
toshiba_sec_sleep_out(mfd);
|
|
toshiba_sec_lcd_off(mfd);
|
|
toshiba_common_initial_setup(mfd);
|
|
break;
|
|
default:
|
|
MDDI_MSG_ERR("mddi_toshiba_prim_init from state %d\n",
|
|
toshiba_state);
|
|
}
|
|
|
|
toshiba_prim_start(mfd);
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA)
|
|
gordon_disp_init();
|
|
mddi_host_write_pix_attr_reg(0x00C3);
|
|
}
|
|
|
|
static void mddi_toshiba_sec_init(struct msm_fb_data_type *mfd)
|
|
{
|
|
|
|
switch (toshiba_state) {
|
|
case TOSHIBA_STATE_PRIM_SEC_READY:
|
|
break;
|
|
case TOSHIBA_STATE_PRIM_SEC_STANDBY:
|
|
toshiba_common_initial_setup(mfd);
|
|
break;
|
|
case TOSHIBA_STATE_PRIM_NORMAL_MODE:
|
|
toshiba_prim_lcd_off(mfd);
|
|
toshiba_common_initial_setup(mfd);
|
|
break;
|
|
default:
|
|
MDDI_MSG_ERR("mddi_toshiba_sec_init from state %d\n",
|
|
toshiba_state);
|
|
}
|
|
|
|
toshiba_sec_start(mfd);
|
|
toshiba_sec_backlight_on(mfd);
|
|
toshiba_sec_cont_update_start(mfd);
|
|
mddi_host_write_pix_attr_reg(0x0400);
|
|
}
|
|
|
|
static void mddi_toshiba_lcd_powerdown(struct msm_fb_data_type *mfd)
|
|
{
|
|
switch (toshiba_state) {
|
|
case TOSHIBA_STATE_PRIM_SEC_READY:
|
|
mddi_toshiba_prim_init(mfd);
|
|
mddi_toshiba_lcd_powerdown(mfd);
|
|
return;
|
|
case TOSHIBA_STATE_PRIM_SEC_STANDBY:
|
|
break;
|
|
case TOSHIBA_STATE_PRIM_NORMAL_MODE:
|
|
toshiba_prim_lcd_off(mfd);
|
|
break;
|
|
case TOSHIBA_STATE_SEC_NORMAL_MODE:
|
|
toshiba_sec_cont_update_stop(mfd);
|
|
toshiba_sec_sleep_in(mfd);
|
|
toshiba_sec_sleep_out(mfd);
|
|
toshiba_sec_lcd_off(mfd);
|
|
break;
|
|
default:
|
|
MDDI_MSG_ERR("mddi_toshiba_lcd_powerdown from state %d\n",
|
|
toshiba_state);
|
|
}
|
|
}
|
|
|
|
static int mddi_sharpgordon_firsttime = 1;
|
|
|
|
static int mddi_toshiba_lcd_on(struct platform_device *pdev)
|
|
{
|
|
struct msm_fb_data_type *mfd;
|
|
mfd = platform_get_drvdata(pdev);
|
|
if (!mfd)
|
|
return -ENODEV;
|
|
if (mfd->key != MFD_KEY)
|
|
return -EINVAL;
|
|
|
|
if (TM_GET_DID(mfd->panel.id) == TOSHIBA_VGA_PRIM)
|
|
mddi_toshiba_prim_init(mfd);
|
|
else
|
|
mddi_toshiba_sec_init(mfd);
|
|
if (TM_GET_PID(mfd->panel.id) == LCD_SHARP_2P4_VGA) {
|
|
if (mddi_sharpgordon_firsttime) {
|
|
mddi_sharpgordon_firsttime = 0;
|
|
write_client_reg(REGENB, 0x00000001, TRUE);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int mddi_toshiba_lcd_off(struct platform_device *pdev)
|
|
{
|
|
mddi_toshiba_lcd_powerdown(platform_get_drvdata(pdev));
|
|
return 0;
|
|
}
|
|
|
|
static int __init mddi_toshiba_lcd_probe(struct platform_device *pdev)
|
|
{
|
|
if (pdev->id == 0) {
|
|
mddi_toshiba_pdata = pdev->dev.platform_data;
|
|
return 0;
|
|
}
|
|
|
|
msm_fb_add_device(pdev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static struct platform_driver this_driver = {
|
|
.probe = mddi_toshiba_lcd_probe,
|
|
.driver = {
|
|
.name = "mddi_toshiba",
|
|
},
|
|
};
|
|
|
|
static struct msm_fb_panel_data toshiba_panel_data = {
|
|
.on = mddi_toshiba_lcd_on,
|
|
.off = mddi_toshiba_lcd_off,
|
|
};
|
|
|
|
static int ch_used[3];
|
|
|
|
int mddi_toshiba_device_register(struct msm_panel_info *pinfo,
|
|
u32 channel, u32 panel)
|
|
{
|
|
struct platform_device *pdev = NULL;
|
|
int ret;
|
|
|
|
if ((channel >= 3) || ch_used[channel])
|
|
return -ENODEV;
|
|
|
|
if ((channel != TOSHIBA_VGA_PRIM) &&
|
|
mddi_toshiba_pdata && mddi_toshiba_pdata->panel_num)
|
|
if (mddi_toshiba_pdata->panel_num() < 2)
|
|
return -ENODEV;
|
|
|
|
ch_used[channel] = TRUE;
|
|
|
|
pdev = platform_device_alloc("mddi_toshiba", (panel << 8)|channel);
|
|
if (!pdev)
|
|
return -ENOMEM;
|
|
|
|
if (channel == TOSHIBA_VGA_PRIM) {
|
|
toshiba_panel_data.set_backlight =
|
|
mddi_toshiba_lcd_set_backlight;
|
|
|
|
if (pinfo->lcd.vsync_enable) {
|
|
toshiba_panel_data.set_vsync_notifier =
|
|
mddi_toshiba_vsync_set_handler;
|
|
mddi_lcd.vsync_detected =
|
|
mddi_toshiba_lcd_vsync_detected;
|
|
}
|
|
} else {
|
|
toshiba_panel_data.set_backlight = NULL;
|
|
toshiba_panel_data.set_vsync_notifier = NULL;
|
|
}
|
|
|
|
toshiba_panel_data.panel_info = *pinfo;
|
|
|
|
ret = platform_device_add_data(pdev, &toshiba_panel_data,
|
|
sizeof(toshiba_panel_data));
|
|
if (ret) {
|
|
printk(KERN_ERR
|
|
"%s: platform_device_add_data failed!\n", __func__);
|
|
goto err_device_put;
|
|
}
|
|
|
|
ret = platform_device_add(pdev);
|
|
if (ret) {
|
|
printk(KERN_ERR
|
|
"%s: platform_device_register failed!\n", __func__);
|
|
goto err_device_put;
|
|
}
|
|
|
|
return 0;
|
|
|
|
err_device_put:
|
|
platform_device_put(pdev);
|
|
return ret;
|
|
}
|
|
|
|
static int __init mddi_toshiba_lcd_init(void)
|
|
{
|
|
return platform_driver_register(&this_driver);
|
|
}
|
|
|
|
module_init(mddi_toshiba_lcd_init);
|