summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/tegra/dc/dsi.c121
-rw-r--r--drivers/video/tegra/dc/dsi.h4
-rw-r--r--drivers/video/tegra/dc/dsi_debug.c42
-rw-r--r--drivers/video/tegra/dc/of_dc.c3
4 files changed, 70 insertions, 100 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 928d5f9e1fe4..32aa8387db92 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -313,17 +313,6 @@ const u32 init_reg_vs1_ext[] = {
DSI_GANGED_MODE_SIZE,
};
-static int tegra_dsi_start_host_cmd_v_blank_video(
- struct tegra_dc_dsi_data *dsi,
- struct tegra_dsi_cmd *cmd);
-static void tegra_dsi_stop_host_cmd_v_blank_video(
- struct tegra_dc_dsi_data *dsi);
-static int tegra_dsi_start_host_cmd_v_blank_dcs(
- struct tegra_dc_dsi_data *dsi,
- struct tegra_dsi_cmd *cmd);
-static void tegra_dsi_stop_host_cmd_v_blank_dcs(
- struct tegra_dc_dsi_data *dsi);
-
static int tegra_dsi_host_suspend(struct tegra_dc *dc);
static int tegra_dsi_host_resume(struct tegra_dc *dc);
static void tegra_dc_dsi_idle_work(struct work_struct *work);
@@ -2968,7 +2957,7 @@ static int _tegra_dsi_write_data(struct tegra_dc_dsi_data *dsi,
}
}
- if (cmd->cmd_type != TEGRA_DSI_PACKET_VBLANK_CMD) {
+ if (cmd->cmd_type != TEGRA_DSI_PACKET_VIDEO_VBLANK_CMD) {
err = tegra_dsi_host_trigger(dsi, cmd->link_id);
if (err < 0)
dev_err(&dsi->dc->ndev->dev, "DSI host trigger failed\n");
@@ -3053,97 +3042,57 @@ int tegra_dsi_write_data(struct tegra_dc *dc,
EXPORT_SYMBOL(tegra_dsi_write_data);
-int tegra_dsi_start_host_cmd_v_blank(struct tegra_dc_dsi_data *dsi,
+int tegra_dsi_start_host_cmd_v_blank_video(struct tegra_dc_dsi_data *dsi,
struct tegra_dsi_cmd *cmd)
{
struct tegra_dc *dc = dsi->dc;
int err = 0;
+ u32 val;
if (!dsi->enabled) {
dev_err(&dsi->dc->ndev->dev, "DSI controller suspended\n");
return -EINVAL;
}
- if (cmd->cmd_type != TEGRA_DSI_PACKET_VBLANK_CMD) {
- dev_err(&dc->ndev->dev, "Invalid VBLANK command\n");
- return -EINVAL;
- }
-
- mutex_lock(&dsi->lock);
tegra_dc_io_start(dc);
tegra_dc_dsi_hold_host(dc);
-
- if (dsi->info.video_data_type ==
- TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE)
- tegra_dsi_start_host_cmd_v_blank_video(dsi, cmd);
- else
- tegra_dsi_start_host_cmd_v_blank_dcs(dsi, cmd);
-
+ val = (DSI_CMD_PKT_VID_ENABLE(1) | DSI_LINE_TYPE(4));
+ tegra_dsi_writel(dsi, val, DSI_VID_MODE_CONTROL);
+ _tegra_dsi_write_data(dsi, cmd);
if (dsi->status.lphs != DSI_LPHS_IN_HS_MODE) {
err = tegra_dsi_set_to_hs_mode(dc, dsi,
TEGRA_DSI_DRIVEN_BY_DC);
if (err < 0) {
dev_err(&dc->ndev->dev,
- "dsi: not able to set to hs mode: %d\n", err);
+ "dsi: not able to set to hs mode\n");
goto fail;
}
}
-
- if (dsi->status.dc_stream == DSI_DC_STREAM_DISABLE)
- tegra_dsi_start_dc_stream(dc, dsi);
+ tegra_dsi_start_dc_stream(dc, dsi);
tegra_dsi_wait_frame_end(dc, dsi, 2);
-
-fail:
+ fail:
tegra_dc_dsi_release_host(dc);
tegra_dc_io_end(dc);
- mutex_unlock(&dsi->lock);
+
return err;
}
-EXPORT_SYMBOL(tegra_dsi_start_host_cmd_v_blank);
+EXPORT_SYMBOL(tegra_dsi_start_host_cmd_v_blank_video);
-int tegra_dsi_stop_host_cmd_v_blank(struct tegra_dc_dsi_data *dsi)
+int tegra_dsi_end_host_cmd_v_blank_video(struct tegra_dc *dc,
+ struct tegra_dc_dsi_data *dsi)
{
- struct tegra_dc *dc = dsi->dc;
-
if (!dsi->enabled) {
dev_err(&dsi->dc->ndev->dev, "DSI controller suspended\n");
return -EINVAL;
}
- mutex_lock(&dsi->lock);
tegra_dc_io_start(dc);
- tegra_dc_dsi_hold_host(dc);
-
- if (dsi->info.video_data_type ==
- TEGRA_DSI_VIDEO_TYPE_VIDEO_MODE)
- tegra_dsi_stop_host_cmd_v_blank_video(dsi);
- else
- tegra_dsi_stop_host_cmd_v_blank_dcs(dsi);
-
- tegra_dc_dsi_release_host(dc);
+ tegra_dsi_writel(dsi, 0, DSI_VID_MODE_CONTROL);
tegra_dc_io_end(dc);
- mutex_unlock(&dsi->lock);
- return 0;
-}
-EXPORT_SYMBOL(tegra_dsi_stop_host_cmd_v_blank);
-static int tegra_dsi_start_host_cmd_v_blank_video(
- struct tegra_dc_dsi_data *dsi,
- struct tegra_dsi_cmd *cmd)
-{
- u32 val;
-
- val = (DSI_CMD_PKT_VID_ENABLE(1) | DSI_LINE_TYPE(4));
- tegra_dsi_writel(dsi, val, DSI_VID_MODE_CONTROL);
- _tegra_dsi_write_data(dsi, cmd);
return 0;
}
-
-static void tegra_dsi_stop_host_cmd_v_blank_video(
- struct tegra_dc_dsi_data *dsi)
-{
- tegra_dsi_writel(dsi, 0, DSI_VID_MODE_CONTROL);
-}
+EXPORT_SYMBOL(tegra_dsi_end_host_cmd_v_blank_video);
static int tegra_dsi_send_panel_cmd(struct tegra_dc *dc,
struct tegra_dc_dsi_data *dsi,
@@ -3173,9 +3122,9 @@ static int tegra_dsi_send_panel_cmd(struct tegra_dc *dc,
dsi,
cur_cmd->sp_len_dly.frame_cnt);
} else if (cur_cmd->cmd_type ==
- TEGRA_DSI_PACKET_VBLANK_CMD) {
- tegra_dsi_start_host_cmd_v_blank(dsi, cur_cmd);
- tegra_dsi_stop_host_cmd_v_blank(dsi);
+ TEGRA_DSI_PACKET_VIDEO_VBLANK_CMD) {
+ tegra_dsi_start_host_cmd_v_blank_video(dsi, cur_cmd);
+ tegra_dsi_end_host_cmd_v_blank_video(dc, dsi);
} else {
delay_ms = DEFAULT_DELAY_MS;
if ((i + 1 < n_cmd) &&
@@ -3292,9 +3241,8 @@ static int tegra_dsi_dcs_pkt_seq_ctrl_init(struct tegra_dc_dsi_data *dsi,
return 0;
}
-static int tegra_dsi_start_host_cmd_v_blank_dcs(
- struct tegra_dc_dsi_data *dsi,
- struct tegra_dsi_cmd *cmd)
+int tegra_dsi_start_host_cmd_v_blank_dcs(struct tegra_dc_dsi_data *dsi,
+ struct tegra_dsi_cmd *cmd)
{
#define PKT_HEADER_LEN_BYTE 4
#define CHECKSUM_LEN_BYTE 2
@@ -3302,6 +3250,14 @@ static int tegra_dsi_start_host_cmd_v_blank_dcs(
int err = 0;
u32 val;
u16 tot_pkt_len = PKT_HEADER_LEN_BYTE;
+ struct tegra_dc *dc = dsi->dc;
+
+ if (cmd->cmd_type != TEGRA_DSI_PACKET_CMD)
+ return -EINVAL;
+
+ mutex_lock(&dsi->lock);
+ tegra_dc_io_start(dc);
+ tegra_dc_dsi_hold_host(dc);
#if DSI_USE_SYNC_POINTS
atomic_set(&dsi_syncpt_rst, 1);
@@ -3310,7 +3266,7 @@ static int tegra_dsi_start_host_cmd_v_blank_dcs(
err = tegra_dsi_dcs_pkt_seq_ctrl_init(dsi, cmd);
if (err < 0) {
dev_err(&dsi->dc->ndev->dev,
- "dsi: dcs pkt seq ctrl init failed: %d\n", err);
+ "dsi: dcs pkt seq ctrl init failed\n");
goto fail;
}
@@ -3325,20 +3281,28 @@ static int tegra_dsi_start_host_cmd_v_blank_dcs(
tegra_dsi_writel(dsi, val, DSI_INIT_SEQ_CONTROL);
fail:
+ tegra_dc_dsi_release_host(dc);
+ tegra_dc_io_end(dc);
+ mutex_unlock(&dsi->lock);
return err;
#undef PKT_HEADER_LEN_BYTE
#undef CHECKSUM_LEN_BYTE
}
+EXPORT_SYMBOL(tegra_dsi_start_host_cmd_v_blank_dcs);
-static void tegra_dsi_stop_host_cmd_v_blank_dcs(
- struct tegra_dc_dsi_data *dsi)
+void tegra_dsi_stop_host_cmd_v_blank_dcs(struct tegra_dc_dsi_data *dsi)
{
+ struct tegra_dc *dc = dsi->dc;
u32 cnt;
+ mutex_lock(&dsi->lock);
+ tegra_dc_io_start(dc);
+ tegra_dc_dsi_hold_host(dc);
+
if (!tegra_cpu_is_asim() && DSI_USE_SYNC_POINTS)
if (atomic_read(&dsi_syncpt_rst)) {
- tegra_dsi_wait_frame_end(dsi->dc, dsi, 2);
+ tegra_dsi_wait_frame_end(dc, dsi, 2);
tegra_dsi_syncpt_reset(dsi);
atomic_set(&dsi_syncpt_rst, 0);
}
@@ -3349,7 +3313,12 @@ static void tegra_dsi_stop_host_cmd_v_blank_dcs(
for (cnt = 0; cnt < 8; cnt++)
tegra_dsi_writel(dsi, 0, DSI_INIT_SEQ_DATA_0 + cnt);
+ tegra_dc_dsi_release_host(dc);
+ tegra_dc_io_end(dc);
+
+ mutex_unlock(&dsi->lock);
}
+EXPORT_SYMBOL(tegra_dsi_stop_host_cmd_v_blank_dcs);
static int tegra_dsi_bta(struct tegra_dc_dsi_data *dsi)
{
diff --git a/drivers/video/tegra/dc/dsi.h b/drivers/video/tegra/dc/dsi.h
index c3067cb07ce4..cf977ae3e50a 100644
--- a/drivers/video/tegra/dc/dsi.h
+++ b/drivers/video/tegra/dc/dsi.h
@@ -466,9 +466,9 @@ int tegra_dsi_panel_sanity_check(struct tegra_dc *dc,
struct sanity_status *san);
bool tegra_dsi_enable_read_debug(struct tegra_dc_dsi_data *dsi);
bool tegra_dsi_disable_read_debug(struct tegra_dc_dsi_data *dsi);
-int tegra_dsi_start_host_cmd_v_blank(struct tegra_dc_dsi_data *dsi,
+int tegra_dsi_start_host_cmd_v_blank_dcs(struct tegra_dc_dsi_data *dsi,
struct tegra_dsi_cmd *cmd);
-int tegra_dsi_stop_host_cmd_v_blank(struct tegra_dc_dsi_data *dsi);
+void tegra_dsi_stop_host_cmd_v_blank_dcs(struct tegra_dc_dsi_data *dsi);
int tegra_dsi_write_data(struct tegra_dc *dc,
struct tegra_dc_dsi_data *dsi,
struct tegra_dsi_cmd *cmd, u8 delay_ms);
diff --git a/drivers/video/tegra/dc/dsi_debug.c b/drivers/video/tegra/dc/dsi_debug.c
index d5c6b1f44dd3..9011e14c367a 100644
--- a/drivers/video/tegra/dc/dsi_debug.c
+++ b/drivers/video/tegra/dc/dsi_debug.c
@@ -304,7 +304,7 @@ static u32 command_value;
static u32 data_id;
static u32 command_value1;
-static int start_host_cmd_v_blank(struct seq_file *s, void *unused)
+static int send_host_cmd_v_blank_dcs(struct seq_file *s, void *unused)
{
struct tegra_dc_dsi_data *dsi = s->private;
int err;
@@ -323,12 +323,12 @@ static int start_host_cmd_v_blank(struct seq_file *s, void *unused)
seq_printf(s, "command value taken :0x%x\n", command_value);
seq_printf(s, "second command value taken :0x%x\n", command_value1);
- err = tegra_dsi_start_host_cmd_v_blank(dsi, user_command);
+ err = tegra_dsi_start_host_cmd_v_blank_dcs(dsi, user_command);
return err;
}
-static ssize_t host_cmd_v_blank_set_cmd(struct file *file,
+static ssize_t host_cmd_v_blank_dcs_get_cmd(struct file *file,
const char *buf, size_t count, loff_t *off)
{
struct seq_file *s = file->private_data;
@@ -350,36 +350,36 @@ static ssize_t host_cmd_v_blank_set_cmd(struct file *file,
return count;
}
-static int start_host_cmd_v_blank_open(struct inode *inode, struct file *file)
+static int host_cmd_v_blank_dcs_open(struct inode *inode, struct file *file)
{
- return single_open(file, start_host_cmd_v_blank, inode->i_private);
+ return single_open(file, send_host_cmd_v_blank_dcs, inode->i_private);
}
-static const struct file_operations host_cmd_v_blank_fops = {
- .open = start_host_cmd_v_blank_open,
+static const struct file_operations host_cmd_v_blank_dcs_fops = {
+ .open = host_cmd_v_blank_dcs_open,
.read = seq_read,
- .write = host_cmd_v_blank_set_cmd,
+ .write = host_cmd_v_blank_dcs_get_cmd,
.llseek = seq_lseek,
.release = single_release,
};
-static int stop_host_cmd_v_blank(struct seq_file *s, void *unused)
+static int remove_host_cmd_dcs(struct seq_file *s, void *unused)
{
struct tegra_dc_dsi_data *dsi = s->private;
- tegra_dsi_stop_host_cmd_v_blank(dsi);
- seq_puts(s, "host_cmd_v_blank stopped\n");
+ tegra_dsi_stop_host_cmd_v_blank_dcs(dsi);
+ seq_puts(s, "host_cmd_v_blank_dcs stopped\n");
return 0;
}
-static int stop_host_cmd_v_blank_open(struct inode *inode, struct file *file)
+static int rm_host_cmd_dcs_open(struct inode *inode, struct file *file)
{
- return single_open(file, stop_host_cmd_v_blank, inode->i_private);
+ return single_open(file, remove_host_cmd_dcs, inode->i_private);
}
-static const struct file_operations stop_host_cmd_v_blank_fops = {
- .open = stop_host_cmd_v_blank_open,
+static const struct file_operations remove_host_cmd_dcs_fops = {
+ .open = rm_host_cmd_dcs_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
@@ -406,7 +406,7 @@ static int send_write_data_cmd(struct seq_file *s, void *unused)
return err;
}
-static ssize_t write_data_set_cmd(struct file *file,
+static ssize_t write_data_get_cmd(struct file *file,
const char *buf, size_t count, loff_t *off)
{
struct seq_file *s = file->private_data;
@@ -432,7 +432,7 @@ static int write_data_open(struct inode *inode, struct file *file)
static const struct file_operations write_data_fops = {
.open = write_data_open,
.read = seq_read,
- .write = write_data_set_cmd,
+ .write = write_data_get_cmd,
.llseek = seq_lseek,
.release = single_release,
};
@@ -458,12 +458,12 @@ void tegra_dc_dsi_debug_create(struct tegra_dc_dsi_data *dsi)
dsi, &sanity_panel_fops);
if (!retval)
goto free_out;
- retval = debugfs_create_file("host_cmd_v_blank", S_IRUGO|S_IWUSR,
- dsidir, dsi, &host_cmd_v_blank_fops);
+ retval = debugfs_create_file("host_cmd_v_blank_dcs", S_IRUGO|S_IWUSR,
+ dsidir, dsi, &host_cmd_v_blank_dcs_fops);
if (!retval)
goto free_out;
- retval = debugfs_create_file("stop_host_cmd_v_blank", S_IRUGO|S_IWUSR,
- dsidir, dsi, &stop_host_cmd_v_blank_fops);
+ retval = debugfs_create_file("remove_host_cmd_dcs", S_IRUGO|S_IWUSR,
+ dsidir, dsi, &remove_host_cmd_dcs_fops);
if (!retval)
goto free_out;
retval = debugfs_create_file("write_data", S_IRUGO|S_IWUSR,
diff --git a/drivers/video/tegra/dc/of_dc.c b/drivers/video/tegra/dc/of_dc.c
index 98aec8ecbc6e..f126ad10e351 100644
--- a/drivers/video/tegra/dc/of_dc.c
+++ b/drivers/video/tegra/dc/of_dc.c
@@ -817,7 +817,8 @@ struct tegra_dsi_cmd *tegra_dsi_parse_cmd_dt(struct platform_device *ndev,
for (cnt = 0; cnt < n_cmd; cnt++, temp++) {
temp->cmd_type = be32_to_cpu(*prop_val_ptr++);
if ((temp->cmd_type == TEGRA_DSI_PACKET_CMD) ||
- (temp->cmd_type == TEGRA_DSI_PACKET_VBLANK_CMD)) {
+ (temp->cmd_type ==
+ TEGRA_DSI_PACKET_VIDEO_VBLANK_CMD)) {
temp->data_id = be32_to_cpu(*prop_val_ptr++);
arg1 = be32_to_cpu(*prop_val_ptr++);
arg2 = be32_to_cpu(*prop_val_ptr++);