static int reset(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) { struct seq_file *s = file->private_data; struct msm_fb_data_type *mfd = s->private; struct device *dev; long level; int ret = 0; char *buf; struct mipi_dsi_data *dsi_data; reset_res_buf(); dsi_data = platform_get_drvdata(mfd->panel_pdev); dev = &mfd->panel_pdev->dev; if (!dsi_data->lcd_reset) { ret = -EFAULT; goto exit; } buf = kzalloc(sizeof(char) * count, GFP_KERNEL); if (!buf) { ret = -ENOMEM; goto exit; } if (copy_from_user(buf, ubuf, count)) { ret = -EFAULT; goto fail_free_all; } /* Get parameter */ if (kstrtol(buf, 10, &level) < 0) { update_res_buf("Reset - parameter error\n"); ret = -EINVAL; goto fail_free_all; } if (level != 0 && level != 1) { update_res_buf("Reset - parameter error\n"); ret = -EINVAL; goto fail_free_all; } ret = dsi_data->lcd_reset(level); if (ret) goto fail_free_all; update_res_buf("Reset succeeded\n"); dev_info(dev, "%s: Display reset performed.\n", __func__); fail_free_all: kfree(buf); exit: if (ret) { dev_err(dev, "%s: Reset failed, ret = 0x%x\n", __func__, ret); update_res_buf("Reset failed\n"); } return count; }
static int setup_reg_access(struct device *dev, struct dsi_buf *rx_buf, struct dsi_buf *tx_buf, char **buf, const char __user *ubuf, size_t count) { int ret = 0; reset_res_buf(); if (rx_buf) { ret = mipi_dsi_buf_alloc(rx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(dev, "mipi_dsi_buf_alloc(rx) failed!\n"); ret = -ENOMEM; goto exit; } } if (tx_buf) { ret = mipi_dsi_buf_alloc(tx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(dev, "mipi_dsi_buf_alloc(tx) failed!\n"); ret = -ENOMEM; goto fail_free_rx; } } *buf = kzalloc(sizeof(char) * count, GFP_KERNEL); if (!*buf) { dev_err(dev, "%s: Failed to allocate buffer\n", __func__); ret = -ENOMEM; goto fail_free_all; } if (copy_from_user(*buf, ubuf, count)) { ret = -EFAULT; kfree(*buf); goto fail_free_all; } return 0; fail_free_all: if (tx_buf) mipi_dsi_buf_release(tx_buf); fail_free_rx: if (rx_buf) mipi_dsi_buf_release(rx_buf); exit: return ret; }
static int setup_reg_access(char **buf, const char __user *ubuf, size_t count) { int ret = 0; reset_res_buf(); *buf = kzalloc(sizeof(char) * count, GFP_KERNEL); if (!*buf) { pr_err("%s: Failed to allocate buffer\n", __func__); ret = -ENOMEM; goto exit; } if (copy_from_user(*buf, ubuf, count)) { ret = -EFAULT; goto exit; } return 0; exit: kfree(*buf); 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 ssize_t reg_read(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; u8 reg; int len; u32 tmp_data; u8 data[MCDE_MAX_DSI_DIRECT_CMD_WRITE]; char *buf; int ret; struct mcde_chnl_state *chnl; 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; } if (sscanf(buf, "%4hhx %1u", ®, &len) != 2) { update_res_buf("Read - parameter error\n"); ret = -EINVAL; goto fail_free_mem; } dev_dbg(dev, "reg=%hx, len=%d\n", reg, len); /* length restriction in mcde read function */ if (len > MCDE_MAX_DCS_READ) len = MCDE_MAX_DCS_READ; memset(data, 0, sizeof(data)); ret = mcde_dsi_dcs_read(chnl, reg, &tmp_data, &len); if (!ret) { memcpy(data, &tmp_data, len); print_params(READ_CMD, reg, len, data); } else { snprintf(tmp, sizeof(tmp), "Read failed, ret = %d!\n", ret); update_res_buf(tmp); } fail_free_mem: kfree(buf); exit: return count; }