diff options
author | Vineel Kumar Reddy Kovvuri <vineelkumarr@nvidia.com> | 2013-05-16 07:34:03 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:04:26 -0400 |
commit | 224cdf186e04c5486aac9546dc5cca7c3b362111 (patch) | |
tree | cf3c1ce219dd7597e00399bb4b75cd5c98c9fab2 /drivers/video/tegra/dc/dsi.c | |
parent | fec4906fa6eef35d1735ef8a75af6183c490d031 (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.c | 27 |
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 | } |
3176 | EXPORT_SYMBOL(tegra_dsi_read_data); | 3183 | EXPORT_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 | } |
3240 | EXPORT_SYMBOL(tegra_dsi_panel_sanity_check); | 3255 | EXPORT_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) |