summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dsi.c
diff options
context:
space:
mode:
authorVineel Kumar Reddy Kovvuri <vineelkumarr@nvidia.com>2013-05-16 07:34:03 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:04:26 -0400
commit224cdf186e04c5486aac9546dc5cca7c3b362111 (patch)
treecf3c1ce219dd7597e00399bb4b75cd5c98c9fab2 /drivers/video/tegra/dc/dsi.c
parentfec4906fa6eef35d1735ef8a75af6183c490d031 (diff)
video: tegra: dsi: Enable panel read functionality
Enables panel read functionality Bug 1287880 Bug 1057091 Change-Id: I3629a8ccc4de9a492a09309f11d49acf4fad7ac1 Signed-off-by: Vineel Kumar Reddy Kovvuri <vineelkumarr@nvidia.com> Reviewed-on: http://git-master/r/229332 Reviewed-by: Simone Willett <swillett@nvidia.com> Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/dsi.c')
-rw-r--r--drivers/video/tegra/dc/dsi.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 76b88b206..36ab55b93 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -3109,10 +3109,15 @@ int tegra_dsi_read_data(struct tegra_dc *dc,
3109 int err = 0; 3109 int err = 0;
3110 struct dsi_status *init_status; 3110 struct dsi_status *init_status;
3111 3111
3112 if (!dsi->enabled) {
3113 dev_err(&dc->ndev->dev, "DSI controller suspended\n");
3114 return -EINVAL;
3115 }
3116 tegra_dc_dsi_hold_host(dc);
3112 mutex_lock(&dsi->lock); 3117 mutex_lock(&dsi->lock);
3113 tegra_dc_io_start(dc); 3118 tegra_dc_io_start(dc);
3114 clk_prepare_enable(dsi->dsi_fixed_clk); 3119 clk_prepare_enable(dsi->dsi_fixed_clk);
3115 3120 clk_prepare_enable(dsi->dsi_lp_clk);
3116 init_status = tegra_dsi_prepare_host_transmission( 3121 init_status = tegra_dsi_prepare_host_transmission(
3117 dc, dsi, DSI_LP_OP_WRITE); 3122 dc, dsi, DSI_LP_OP_WRITE);
3118 if (IS_ERR_OR_NULL(init_status)) { 3123 if (IS_ERR_OR_NULL(init_status)) {
@@ -3168,9 +3173,11 @@ fail:
3168 err = tegra_dsi_restore_state(dc, dsi, init_status); 3173 err = tegra_dsi_restore_state(dc, dsi, init_status);
3169 if (err < 0) 3174 if (err < 0)
3170 dev_err(&dc->ndev->dev, "Failed to restore prev state\n"); 3175 dev_err(&dc->ndev->dev, "Failed to restore prev state\n");
3176 clk_disable_unprepare(dsi->dsi_lp_clk);
3171 clk_disable_unprepare(dsi->dsi_fixed_clk); 3177 clk_disable_unprepare(dsi->dsi_fixed_clk);
3172 tegra_dc_io_end(dc); 3178 tegra_dc_io_end(dc);
3173 mutex_unlock(&dsi->lock); 3179 mutex_unlock(&dsi->lock);
3180 tegra_dc_dsi_release_host(dc);
3174 return err; 3181 return err;
3175} 3182}
3176EXPORT_SYMBOL(tegra_dsi_read_data); 3183EXPORT_SYMBOL(tegra_dsi_read_data);
@@ -3184,8 +3191,14 @@ int tegra_dsi_panel_sanity_check(struct tegra_dc *dc,
3184 static struct tegra_dsi_cmd dsi_nop_cmd = 3191 static struct tegra_dsi_cmd dsi_nop_cmd =
3185 DSI_CMD_SHORT(0x05, 0x0, 0x0); 3192 DSI_CMD_SHORT(0x05, 0x0, 0x0);
3186 3193
3194 if (!dsi->enabled) {
3195 dev_err(&dc->ndev->dev, "DSI controller suspended\n");
3196 return -EINVAL;
3197 }
3198 tegra_dc_dsi_hold_host(dc);
3187 tegra_dc_io_start(dc); 3199 tegra_dc_io_start(dc);
3188 clk_prepare_enable(dsi->dsi_fixed_clk); 3200 clk_prepare_enable(dsi->dsi_fixed_clk);
3201 clk_prepare_enable(dsi->dsi_lp_clk);
3189 3202
3190 init_status = tegra_dsi_prepare_host_transmission( 3203 init_status = tegra_dsi_prepare_host_transmission(
3191 dc, dsi, DSI_LP_OP_WRITE); 3204 dc, dsi, DSI_LP_OP_WRITE);
@@ -3233,8 +3246,10 @@ fail:
3233 err = tegra_dsi_restore_state(dc, dsi, init_status); 3246 err = tegra_dsi_restore_state(dc, dsi, init_status);
3234 if (err < 0) 3247 if (err < 0)
3235 dev_err(&dc->ndev->dev, "Failed to restore prev state\n"); 3248 dev_err(&dc->ndev->dev, "Failed to restore prev state\n");
3249 clk_disable_unprepare(dsi->dsi_lp_clk);
3236 clk_disable_unprepare(dsi->dsi_fixed_clk); 3250 clk_disable_unprepare(dsi->dsi_fixed_clk);
3237 tegra_dc_io_end(dc); 3251 tegra_dc_io_end(dc);
3252 tegra_dc_dsi_release_host(dc);
3238 return err; 3253 return err;
3239} 3254}
3240EXPORT_SYMBOL(tegra_dsi_panel_sanity_check); 3255EXPORT_SYMBOL(tegra_dsi_panel_sanity_check);
@@ -3705,6 +3720,7 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
3705 struct clk *dc_clk = NULL; 3720 struct clk *dc_clk = NULL;
3706 struct clk *dsi_clk = NULL; 3721 struct clk *dsi_clk = NULL;
3707 struct clk *dsi_fixed_clk = NULL; 3722 struct clk *dsi_fixed_clk = NULL;
3723 struct clk *dsi_lp_clk = NULL;
3708 struct tegra_dsi_out *dsi_pdata; 3724 struct tegra_dsi_out *dsi_pdata;
3709 int err = 0; 3725 int err = 0;
3710 int dsi_enum = -1; 3726 int dsi_enum = -1;
@@ -3767,11 +3783,13 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
3767 dev_err(&dc->ndev->dev, "dsi: dsi data not available\n"); 3783 dev_err(&dc->ndev->dev, "dsi: dsi data not available\n");
3768 goto err_release_regs; 3784 goto err_release_regs;
3769 } 3785 }
3770 3786 if (dsi_enum) {
3771 if (dsi_enum)
3772 dsi_clk = clk_get(&dc->ndev->dev, "dsib"); 3787 dsi_clk = clk_get(&dc->ndev->dev, "dsib");
3773 else 3788 dsi_lp_clk = clk_get(&dc->ndev->dev, "dsiblp");
3789 } else {
3774 dsi_clk = clk_get(&dc->ndev->dev, "dsia"); 3790 dsi_clk = clk_get(&dc->ndev->dev, "dsia");
3791 dsi_lp_clk = clk_get(&dc->ndev->dev, "dsialp");
3792 }
3775 3793
3776 dsi_fixed_clk = clk_get(&dc->ndev->dev, "dsi-fixed"); 3794 dsi_fixed_clk = clk_get(&dc->ndev->dev, "dsi-fixed");
3777 3795
@@ -3797,6 +3815,7 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
3797 dsi->dc_clk = dc_clk; 3815 dsi->dc_clk = dc_clk;
3798 dsi->dsi_clk = dsi_clk; 3816 dsi->dsi_clk = dsi_clk;
3799 dsi->dsi_fixed_clk = dsi_fixed_clk; 3817 dsi->dsi_fixed_clk = dsi_fixed_clk;
3818 dsi->dsi_lp_clk = dsi_lp_clk;
3800 3819
3801 err = tegra_dc_dsi_cp_info(dsi, dsi_pdata); 3820 err = tegra_dc_dsi_cp_info(dsi, dsi_pdata);
3802 if (err < 0) 3821 if (err < 0)