msm: mdss: Refine panel register reading function
Allocate buffer for panel register results, which is to support any length of register reading request. Change-Id: I67905b3771ecfe5d56fe29928b2953b8435f1d71 Signed-off-by: Yang Xu <yangxu@codeaurora.org>
This commit is contained in:
parent
4698f91320
commit
35a90bda10
1 changed files with 43 additions and 29 deletions
|
@ -33,8 +33,9 @@
|
||||||
#define MAX_VSYNC_COUNT 0xFFFFFFF
|
#define MAX_VSYNC_COUNT 0xFFFFFFF
|
||||||
|
|
||||||
#define DEFAULT_READ_PANEL_POWER_MODE_REG 0x0A
|
#define DEFAULT_READ_PANEL_POWER_MODE_REG 0x0A
|
||||||
#define PANEL_RX_MAX_BUF 128
|
#define PANEL_REG_ADDR_LEN 8
|
||||||
#define PANEL_TX_MAX_BUF 64
|
#define PANEL_REG_FORMAT_LEN 5
|
||||||
|
#define PANEL_TX_MAX_BUF 256
|
||||||
#define PANEL_CMD_MIN_TX_COUNT 2
|
#define PANEL_CMD_MIN_TX_COUNT 2
|
||||||
#define PANEL_DATA_NODE_LEN 80
|
#define PANEL_DATA_NODE_LEN 80
|
||||||
|
|
||||||
|
@ -65,7 +66,7 @@ static ssize_t panel_debug_base_offset_write(struct file *file,
|
||||||
struct mdss_debug_base *dbg = file->private_data;
|
struct mdss_debug_base *dbg = file->private_data;
|
||||||
u32 off = 0;
|
u32 off = 0;
|
||||||
u32 cnt = DEFAULT_BASE_REG_CNT;
|
u32 cnt = DEFAULT_BASE_REG_CNT;
|
||||||
char buf[PANEL_RX_MAX_BUF] = {0x0};
|
char buf[PANEL_TX_MAX_BUF] = {0x0};
|
||||||
|
|
||||||
if (!dbg)
|
if (!dbg)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -78,7 +79,7 @@ static ssize_t panel_debug_base_offset_write(struct file *file,
|
||||||
|
|
||||||
buf[count] = 0; /* end of string */
|
buf[count] = 0; /* end of string */
|
||||||
|
|
||||||
if (sscanf(buf, "%x %x", &off, &cnt) != 2)
|
if (sscanf(buf, "%x %d", &off, &cnt) != 2)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
if (off > dbg->max_offset)
|
if (off > dbg->max_offset)
|
||||||
|
@ -90,7 +91,7 @@ static ssize_t panel_debug_base_offset_write(struct file *file,
|
||||||
dbg->off = off;
|
dbg->off = off;
|
||||||
dbg->cnt = cnt;
|
dbg->cnt = cnt;
|
||||||
|
|
||||||
pr_debug("offset=%x cnt=%x\n", off, cnt);
|
pr_debug("offset=%x cnt=%d\n", off, cnt);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +101,7 @@ static ssize_t panel_debug_base_offset_read(struct file *file,
|
||||||
{
|
{
|
||||||
struct mdss_debug_base *dbg = file->private_data;
|
struct mdss_debug_base *dbg = file->private_data;
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char buf[PANEL_RX_MAX_BUF] = {0x0};
|
char buf[PANEL_TX_MAX_BUF] = {0x0};
|
||||||
|
|
||||||
if (!dbg)
|
if (!dbg)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -108,7 +109,7 @@ static ssize_t panel_debug_base_offset_read(struct file *file,
|
||||||
if (*ppos)
|
if (*ppos)
|
||||||
return 0; /* the end */
|
return 0; /* the end */
|
||||||
|
|
||||||
len = snprintf(buf, sizeof(buf), "0x%02zx %zx\n", dbg->off, dbg->cnt);
|
len = snprintf(buf, sizeof(buf), "0x%02zx %zd\n", dbg->off, dbg->cnt);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -190,12 +191,8 @@ static ssize_t panel_debug_base_reg_read(struct file *file,
|
||||||
char __user *user_buf, size_t count, loff_t *ppos)
|
char __user *user_buf, size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct mdss_debug_base *dbg = file->private_data;
|
struct mdss_debug_base *dbg = file->private_data;
|
||||||
int len = 0;
|
u32 i, len = 0, reg_buf_len = 0;
|
||||||
int rx_len = 0;
|
char *panel_reg_buf, *rx_buf;
|
||||||
int i, lx = 0;
|
|
||||||
char to_user_buf[PANEL_RX_MAX_BUF] = {0x0};
|
|
||||||
char panel_reg_buf[PANEL_RX_MAX_BUF] = {0x0};
|
|
||||||
char rx_buf[PANEL_RX_MAX_BUF] = {0x0};
|
|
||||||
struct mdss_data_type *mdata = mdss_res;
|
struct mdss_data_type *mdata = mdss_res;
|
||||||
struct mdss_mdp_ctl *ctl = mdata->ctl_off + 0;
|
struct mdss_mdp_ctl *ctl = mdata->ctl_off + 0;
|
||||||
struct mdss_panel_data *panel_data = ctl->panel_data;
|
struct mdss_panel_data *panel_data = ctl->panel_data;
|
||||||
|
@ -205,40 +202,57 @@ static ssize_t panel_debug_base_reg_read(struct file *file,
|
||||||
if (!dbg)
|
if (!dbg)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (!dbg->cnt)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (*ppos)
|
if (*ppos)
|
||||||
return 0; /* the end */
|
return 0; /* the end */
|
||||||
|
|
||||||
|
/* '0x' + 2 digit + blank = 5 bytes for each number */
|
||||||
|
reg_buf_len = (dbg->cnt * PANEL_REG_FORMAT_LEN)
|
||||||
|
+ PANEL_REG_ADDR_LEN + 1;
|
||||||
|
rx_buf = kzalloc(dbg->cnt, GFP_KERNEL);
|
||||||
|
panel_reg_buf = kzalloc(reg_buf_len, GFP_KERNEL);
|
||||||
|
|
||||||
|
if (!rx_buf || !panel_reg_buf) {
|
||||||
|
pr_err("not enough memory to hold panel reg dump\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
if (mdata->debug_inf.debug_enable_clock)
|
if (mdata->debug_inf.debug_enable_clock)
|
||||||
mdata->debug_inf.debug_enable_clock(1);
|
mdata->debug_inf.debug_enable_clock(1);
|
||||||
|
|
||||||
panel_reg[0] = dbg->off;
|
panel_reg[0] = dbg->off;
|
||||||
mdss_dsi_panel_cmd_read(ctrl_pdata, panel_reg[0],
|
mdss_dsi_panel_cmd_read(ctrl_pdata, panel_reg[0], panel_reg[1],
|
||||||
panel_reg[1], NULL, rx_buf, dbg->cnt);
|
NULL, rx_buf, dbg->cnt);
|
||||||
|
|
||||||
rx_len = ctrl_pdata->rx_len;
|
len = snprintf(panel_reg_buf, reg_buf_len, "0x%02zx: ", dbg->off);
|
||||||
|
if (len < 0)
|
||||||
|
goto read_reg_fail;
|
||||||
|
|
||||||
for (i = 0; i < rx_len; i++) {
|
for (i = 0; (len < reg_buf_len) && (i < ctrl_pdata->rx_len); i++)
|
||||||
lx += snprintf(panel_reg_buf + lx, sizeof(panel_reg_buf),
|
len += scnprintf(panel_reg_buf + len, reg_buf_len - len,
|
||||||
"%s%02x", " 0x", rx_buf[i]);
|
"0x%02x ", rx_buf[i]);
|
||||||
}
|
|
||||||
|
|
||||||
pr_debug("lx =%d,panel_reg_buf= %s,data[%d]=%x\n",
|
panel_reg_buf[len - 1] = '\n';
|
||||||
lx, panel_reg_buf, i, rx_buf[i]);
|
|
||||||
|
|
||||||
len = snprintf(to_user_buf, sizeof(to_user_buf), "0x%02zx:%s\n",
|
|
||||||
dbg->off, panel_reg_buf);
|
|
||||||
|
|
||||||
if (mdata->debug_inf.debug_enable_clock)
|
if (mdata->debug_inf.debug_enable_clock)
|
||||||
mdata->debug_inf.debug_enable_clock(0);
|
mdata->debug_inf.debug_enable_clock(0);
|
||||||
|
|
||||||
if (len < 0)
|
if (copy_to_user(user_buf, panel_reg_buf, len))
|
||||||
return 0;
|
goto read_reg_fail;
|
||||||
|
|
||||||
if (copy_to_user(user_buf, to_user_buf, len))
|
kfree(rx_buf);
|
||||||
return -EFAULT;
|
kfree(panel_reg_buf);
|
||||||
|
|
||||||
*ppos += len; /* increase offset */
|
*ppos += len; /* increase offset */
|
||||||
return len;
|
return len;
|
||||||
|
|
||||||
|
read_reg_fail:
|
||||||
|
kfree(rx_buf);
|
||||||
|
kfree(panel_reg_buf);
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations panel_off_fops = {
|
static const struct file_operations panel_off_fops = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue