static void sony_tft_set_pwm_val(int val) { uint8_t data[4] = {0,0,0,0}; unsigned int min_pwm, def_pwm, max_pwm; pr_info("%s: %d\n", __func__, val); last_val = val; if (!tft_panel_on) return; if(!is_sony_spi()) { min_pwm = SONY_TFT_MIN_PANEL_UP_VAL; def_pwm = SONY_TFT_DEF_PANEL_UP_VAL; max_pwm = SONY_TFT_MAX_PANEL_UP_VAL; } else { min_pwm = SONY_TFT_MIN_PANEL_VAL; def_pwm = SONY_TFT_DEF_PANEL_VAL; max_pwm = SONY_TFT_MAX_PANEL_VAL; } if (val <= SONY_TFT_DEF_USER_VAL) { if (val <= SONY_TFT_MIN_USER_VAL) val = min_pwm; else val = (def_pwm - min_pwm) * (val - SONY_TFT_MIN_USER_VAL) / SONY_TFT_DEF_USER_DELTA + min_pwm; } else { val = (max_pwm - def_pwm) * (val - SONY_TFT_DEF_USER_VAL) / (SONY_TFT_MAX_USER_VAL - SONY_TFT_DEF_USER_VAL) + def_pwm; } if (!is_sony_spi()) { data[0] = 5; data[1] = val; data[3] = 1; microp_i2c_write(0x25, data, 4); } else { clk_enable(spi_clk); qspi_send_9bit(0x0, 0x51); qspi_send_9bit(0x1, val); qspi_send_9bit(0x0, 0x53); qspi_send_9bit(0x1, 0x24); clk_disable(spi_clk); } }
static int sony_tft_panel_blank(struct msm_lcdc_panel_ops *ops) { uint8_t data[4] = {0, 0, 0, 0}; pr_info("%s: +()\n", __func__); mutex_lock(&panel_lock); clk_enable(spi_clk); qspi_send_9bit(0x0, 0x28); qspi_send_9bit(0x0, 0x10); clk_disable(spi_clk); msleep(40); sony_tft_panel_power(0); tft_panel_on = 0; mutex_unlock(&panel_lock); if (!is_sony_spi()) { data[0] = 5; data[1] = 0; data[3] = 1; microp_i2c_write(0x25, data, 4); } pr_info("%s: -()\n", __func__); return 0; }
static int sonywvga_panel_blank(struct msm_lcdc_panel_ops *panel_data) { uint8_t data[4] = {0, 0, 0, 0}; LCMDBG("%s\n", __func__); mutex_lock(&panel_lock); blank_msg.cmd = 0x28; qspi_send_9bit(&blank_msg); blank_msg.cmd = 0x10; qspi_send_9bit(&blank_msg); hr_msleep(40); g_unblank_stage = 0; mutex_unlock(&panel_lock); sonywvga_panel_power(0); if (!is_sony_spi()) { data[0] = 5; data[1] = 0; data[3] = 1; microp_i2c_write(0x25, data, 4); } return 0; }
static int sonywvga_panel_shrink_pwm(int brightness) { int level; unsigned int min_pwm, def_pwm, max_pwm; if(!is_sony_spi()) { min_pwm = SONYWVGA_BR_MIN_PANEL_UP_PWM; def_pwm = SONYWVGA_BR_DEF_PANEL_UP_PWM; max_pwm = SONYWVGA_BR_MAX_PANEL_UP_PWM; } else { min_pwm = SONYWVGA_BR_MIN_PANEL_PWM; def_pwm = SONYWVGA_BR_DEF_PANEL_PWM; max_pwm = SONYWVGA_BR_MAX_PANEL_PWM; } if (brightness <= SONYWVGA_BR_DEF_USER_PWM) { if (brightness <= SONYWVGA_BR_MIN_USER_PWM) level = min_pwm; else level = (def_pwm - min_pwm) * (brightness - SONYWVGA_BR_MIN_USER_PWM) / (SONYWVGA_BR_DEF_USER_PWM - SONYWVGA_BR_MIN_USER_PWM) + min_pwm; } else level = (max_pwm - def_pwm) * (brightness - SONYWVGA_BR_DEF_USER_PWM) / (SONYWVGA_BR_MAX_USER_PWM - SONYWVGA_BR_DEF_USER_PWM) + def_pwm; return level; }
static int sony_tft_panel_unblank(struct msm_lcdc_panel_ops *ops) { pr_info("%s: +()\n", __func__); mutex_lock(&panel_lock); if (tft_panel_on) { pr_info("%s: -() already unblanked\n", __func__); goto done; } sony_tft_panel_power(1); msleep(45); clk_enable(spi_clk); qspi_send_9bit(0x0, 0x11); msleep(5); qspi_send_9bit(0x0, 0x3a); if (is_sony_RGB666()) qspi_send_9bit(0x1, 0x06); else qspi_send_9bit(0x1, 0x05); msleep(100); qspi_send_9bit(0x0, 0x29); msleep(20); //init gamma setting if(!is_sony_with_gamma()) sony_tft_panel_without_gamma_init(); /* unlock register page for pwm setting */ if (is_sony_spi()) { qspi_send_9bit(0x0, 0xf0); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x0, 0xf1); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x0, 0xd0); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x1, 0x5a); qspi_send_9bit(0x0, 0xc2); qspi_send_9bit(0x1, 0x53); qspi_send_9bit(0x1, 0x12); } clk_disable(spi_clk); msleep(100); tft_panel_on = 1; sony_tft_set_pwm_val(last_val); pr_info("%s: -()\n", __func__); done: mutex_unlock(&panel_lock); return 0; }
/* * Caller must make sure the spi is ready * */ static void sonywvga_set_gamma_val(int val) { uint8_t data[4] = {0, 0, 0, 0}; if (!is_sony_spi()) { //turn on backlight data[0] = 5; data[1] = sonywvga_panel_shrink_pwm(val); data[3] = 1; microp_i2c_write(0x25, data, 4); } else { shrink_pwm = sonywvga_panel_shrink_pwm(val); qspi_send_9bit(&gamma_update); lcm_write_tb(SONY_GAMMA_UPDATE_TABLE, ARRAY_SIZE(SONY_GAMMA_UPDATE_TABLE)); } last_val_pwm = val; }
static int sonywvga_probe(struct platform_device *pdev) { int rc = -EIO; struct panel_platform_data *pdata; pdata = pdev->dev.platform_data; sonywvga_power = pdata->power; gpio_switch = pdata->gpio_switch; sonywvga_lcdc_platform_data.fb_resource = pdata->fb_res; if(!is_sony_spi()) last_val_pwm = SONYWVGA_DEFAULT_VAL; else last_val_pwm = SONYWVGA_BR_DEF_PANEL_PWM; rc = sonywvga_init_panel(); if (rc) printk(KERN_ERR "%s fail %d\n", __func__, rc); display_sysfs_init(); return rc; }