diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/video/tegra/dc/dsi.c | 121 | ||||
-rw-r--r-- | drivers/video/tegra/dc/dsi.h | 4 | ||||
-rw-r--r-- | drivers/video/tegra/dc/dsi_debug.c | 42 | ||||
-rw-r--r-- | drivers/video/tegra/dc/of_dc.c | 3 |
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++); |