static int s6e63m0_write_dcs_vid_cmd(struct mcde_display_device *ddev, u8 cmd, u8* p_data, int len) { int retries = 1; int len_to_write; u8 *data; int write_len; int ret = 0; u8 globalPara = MAX_DCS_CMD_ALLOWED; do { len_to_write = len; data = p_data; write_len = len_to_write; if (write_len > MAX_DCS_CMD_ALLOWED) write_len = MAX_DCS_CMD_ALLOWED; ret = mcde_dsi_dcs_write(ddev->chnl_state, cmd, data, write_len); dev_vdbg(&ddev->dev, "Send DCS cmd %x, len %d, ret=%d\n", cmd, write_len, ret); len_to_write -= write_len; data += write_len; while ((len_to_write > 0) && (ret == 0)) { write_len = len_to_write; if (write_len > MAX_DCS_CMD_ALLOWED) write_len = MAX_DCS_CMD_ALLOWED; ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_GLOBAL_PARAM, &globalPara, 1); dev_vdbg(&ddev->dev, "Send DCS GLOBAL_PARAM, data %d, ret=%d\n", globalPara, ret); ret = mcde_dsi_dcs_write(ddev->chnl_state, cmd, data, write_len); dev_vdbg(&ddev->dev, "Send DCS cmd %x, len %d, ret=%d\n", cmd, write_len, ret); len_to_write-= write_len; data += write_len; globalPara += write_len; } if (ret) usleep_range(8000,8000); }while (ret && --retries); if (ret) { dev_warn(&ddev->dev, "Failed to send DCS cmd %x, error %d\n", cmd, ret); } return ret; }
static int hva40wv1_dsi_dcs_write_command(struct mcde_display_device *ddev, u8 cmd, u8* p_data, int len) { int write_len; int ret = 0; write_len = len; if (write_len > MAX_DCS_CMD_ALLOWED) write_len = MAX_DCS_CMD_ALLOWED; ret = mcde_dsi_dcs_write(ddev->chnl_state, cmd, p_data, write_len); len -= write_len; p_data += write_len; while ((len > 0) && (ret == 0)) { write_len = len; if (write_len > MAX_DCS_CMD_ALLOWED) write_len = MAX_DCS_CMD_ALLOWED; ret = mcde_dsi_generic_write(ddev->chnl_state, p_data, write_len); len -= write_len; p_data += write_len; } if (ret != 0) dev_err(&ddev->dev, "failed to send DCS command (0x%x)\n", cmd); else dev_vdbg(&ddev->dev, "Sent DCS cmd (0x%x)\n", cmd); return ret; }
static int dsi_dcs_write(struct mcde_chnl_state *chnl, u8 cmd, u8* data, int len) { return 0; int ret = mcde_dsi_dcs_write(chnl, cmd, data, len); /* pr_info("%s: cmd = 0x%X, returned %d\n", __func__, cmd, ret); */ return ret; }
static int s6e63m0_dsi_dcs_write_command(struct mcde_display_device *ddev, u8 cmd, u8* p_data, int len) { int retries = 1; int len_to_write; u8 *data; int write_len; int ret = 0; u8 globalPara = MCDE_MAX_DSI_DIRECT_CMD_WRITE; do { len_to_write = len; data = p_data; write_len = len_to_write; if (write_len > MCDE_MAX_DSI_DIRECT_CMD_WRITE) write_len = MCDE_MAX_DSI_DIRECT_CMD_WRITE; ret = mcde_dsi_dcs_write(ddev->chnl_state, cmd, data, write_len); len_to_write -= write_len; data += write_len; while ((len_to_write > 0) && (ret == 0)) { write_len = len_to_write; if (write_len > MCDE_MAX_DSI_DIRECT_CMD_WRITE) write_len = MCDE_MAX_DSI_DIRECT_CMD_WRITE; ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_GLOBAL_PARAM, &globalPara, 1); ret = mcde_dsi_dcs_write(ddev->chnl_state, cmd, data, write_len); len_to_write-= write_len; data += write_len; globalPara += write_len; } if (ret) usleep_range(8000,8000); }while (ret && --retries); if (ret) { dev_warn(&ddev->dev, "Failed to send DCS cmd %x, error %d\n", cmd, ret); } return ret; }
static int generic_set_power_mode(struct mcde_display_device *ddev, enum mcde_display_power_mode power_mode) { int ret = 0; struct mcde_display_generic_platform_data *pdata = ddev->dev.platform_data; dev_dbg(&ddev->dev, "%s:Set Power mode\n", __func__); /* OFF -> STANDBY */ if (ddev->power_mode == MCDE_DISPLAY_PM_OFF && power_mode != MCDE_DISPLAY_PM_OFF) { if (ddev->platform_enable) { ret = ddev->platform_enable(ddev); if (ret) return ret; } ddev->power_mode = MCDE_DISPLAY_PM_STANDBY; } /* STANDBY -> ON */ if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY && power_mode == MCDE_DISPLAY_PM_ON) { ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_EXIT_SLEEP_MODE, NULL, 0); if (ret) return ret; msleep(pdata->sleep_out_delay); ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_SET_DISPLAY_ON, NULL, 0); if (ret) return ret; ddev->power_mode = MCDE_DISPLAY_PM_ON; goto set_power_and_exit; } /* ON -> STANDBY */ else if (ddev->power_mode == MCDE_DISPLAY_PM_ON && power_mode <= MCDE_DISPLAY_PM_STANDBY) { ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_SET_DISPLAY_OFF, NULL, 0); if (ret) return ret; ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_ENTER_SLEEP_MODE, NULL, 0); if (ret) return ret; ddev->power_mode = MCDE_DISPLAY_PM_STANDBY; } /* SLEEP -> OFF */ if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY && power_mode == MCDE_DISPLAY_PM_OFF) { if (ddev->platform_disable) { ret = ddev->platform_disable(ddev); if (ret) return ret; } ddev->power_mode = MCDE_DISPLAY_PM_OFF; } set_power_and_exit: mcde_chnl_set_power_mode(ddev->chnl_state, ddev->power_mode); return ret; }
static ssize_t reg_write(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) { struct seq_file *s = file->private_data; struct mcde_display_device *ddev = s->private; struct device *dev; struct mcde_chnl_state *chnl; char *buf; const char *p; enum dbg_cmd_type cmd; u8 data[MCDE_MAX_DSI_DIRECT_CMD_WRITE + 1]; /* Make room for cmd */ int i = 0; int ret; char tmp[TMP_BUF_SZ]; if (!ddev || !&ddev->dev) { pr_err("%s: no device\n", __func__); ret = -ENODEV; goto exit; } chnl = ddev->chnl_state; dev = &ddev->dev; dev_dbg(dev, "%s\n", __func__); reset_res_buf(); buf = kzalloc(sizeof(char) * count, GFP_KERNEL); if (!buf) { dev_err(dev, "%s: Failed to allocate buffer\n", __func__); ret = -ENOMEM; goto exit; } dev_dbg(dev, "%s: buf = %p, ubuf = %p, count = %d, " "sizeof(char) * count = %d, line = %d\n", __func__, buf, ubuf, count, sizeof(char) * count, __LINE__); if (copy_from_user(buf, ubuf, count)) { ret = -EFAULT; goto fail_free_mem; } p = buf; if (!strncmp(buf, "dcs", 3)) { dev_dbg(dev, "%s: dcs\n", __func__); cmd = DCS; } else if (!strncmp(buf, "gen", 3)) { dev_dbg(dev, "%s: gen\n", __func__); cmd = GEN; } else { update_res_buf("Write - unknown type\n"); ret = -EFAULT; goto fail_free_mem; } p = p+4; /* Get first param, Register */ if (sscanf(p, "%4hhx", &data[0]) != 1) { update_res_buf("Write - parameter error\n"); ret = -EINVAL; goto fail_free_mem; } i++; while (isxdigit(*p) || (*p == 'x')) p++; /* Get data */ while (true) { if (isspace(*p)) { p++; } else { if (sscanf(p, "%4hhx", &data[i]) == 1) { while (isxdigit(*p) || (*p == 'x')) p++; } i++; } if (iscntrl(*p)) break; if (i > MCDE_MAX_DSI_DIRECT_CMD_WRITE) { update_res_buf("Write - Too many parameters\n"); ret = -EINVAL; goto fail_free_mem; } } if (cmd == DCS) { if (i == 1) ret = mcde_dsi_dcs_write(chnl, data[0], NULL, 0); else ret = mcde_dsi_dcs_write(chnl, data[0], &data[1], i - 1); } else { ret = mcde_dsi_generic_write(chnl, data, i); } if (!ret) { print_params(cmd, data[0], i - 1, &data[1]); } else { snprintf(tmp, sizeof(tmp), "Write failed, ret = %d!\n", ret); update_res_buf(tmp); } fail_free_mem: kfree(buf); exit: return count; }
static int mcde_display_set_power_mode_default(struct mcde_display_device *ddev, enum mcde_display_power_mode power_mode) { int ret = 0; /* OFF -> STANDBY */ if (ddev->power_mode == MCDE_DISPLAY_PM_OFF && power_mode != MCDE_DISPLAY_PM_OFF) { if (ddev->platform_enable) { ret = ddev->platform_enable(ddev); if (ret) return ret; } ddev->power_mode = MCDE_DISPLAY_PM_STANDBY; /* force register settings */ if (ddev->port->type == MCDE_PORTTYPE_DPI) ddev->update_flags = UPDATE_FLAG_VIDEO_MODE | UPDATE_FLAG_PIXEL_FORMAT; } if (ddev->port->type == MCDE_PORTTYPE_DSI) { /* STANDBY -> ON */ if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY && power_mode == MCDE_DISPLAY_PM_ON) { ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_EXIT_SLEEP_MODE, NULL, 0); if (ret) return ret; ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_SET_DISPLAY_ON, NULL, 0); if (ret) return ret; ddev->power_mode = MCDE_DISPLAY_PM_ON; } else if (ddev->power_mode == MCDE_DISPLAY_PM_ON && power_mode <= MCDE_DISPLAY_PM_STANDBY) { /* ON -> STANDBY */ ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_SET_DISPLAY_OFF, NULL, 0); if (ret) return ret; ret = mcde_dsi_dcs_write(ddev->chnl_state, DCS_CMD_ENTER_SLEEP_MODE, NULL, 0); if (ret) return ret; ddev->power_mode = MCDE_DISPLAY_PM_STANDBY; } } else if (ddev->port->type == MCDE_PORTTYPE_DPI) { ddev->power_mode = power_mode; } else if (ddev->power_mode != power_mode) { return -EINVAL; } /* SLEEP -> OFF */ if (ddev->power_mode == MCDE_DISPLAY_PM_STANDBY && power_mode == MCDE_DISPLAY_PM_OFF) { if (ddev->platform_disable) { ret = ddev->platform_disable(ddev); if (ret) return ret; } ddev->power_mode = MCDE_DISPLAY_PM_OFF; } mcde_chnl_set_power_mode(ddev->chnl_state, ddev->power_mode); return ret; }