summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVenkat Reddy Talla <vreddytalla@nvidia.com>2018-06-14 05:51:44 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-08 06:46:36 -0400
commit77f170a2507f4d40f73c2b41c863fccb988da247 (patch)
treefab58e4b735ef4750a7416cf2bc75dc6f9f97adf
parent249afc36161c11d16402933215a8bbf0071b07d4 (diff)
tegra: dc: use pinctrl fw to configure io pad dpd
Using pincontrol framework to configure io pad dpd mode for display io pads.In k4.14 programming io pad dpd mode(enable/disable) using padcontrol framework deprecated, so moving display io pad dpd mode programming to pin control framework. Bug 200414242 Bug 200416228 Change-Id: Iffe84f3c19f3b8bbdfe546c3a891a163035dee92 Signed-off-by: Venkat Reddy Talla <vreddytalla@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1749804 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/video/tegra/dc/dsi.c51
-rw-r--r--drivers/video/tegra/dc/dsi.h3
-rw-r--r--drivers/video/tegra/dc/sor.c96
-rw-r--r--drivers/video/tegra/dc/sor.h4
4 files changed, 96 insertions, 58 deletions
diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 7019d0cf7..7d2a68279 100644
--- a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -39,7 +39,6 @@
39#include <linux/nvhost.h> 39#include <linux/nvhost.h>
40#include <linux/of_address.h> 40#include <linux/of_address.h>
41#include <linux/io.h> 41#include <linux/io.h>
42#include <linux/padctrl/padctrl.h>
43#include <linux/tegra_prod.h> 42#include <linux/tegra_prod.h>
44 43
45#include "dc.h" 44#include "dc.h"
@@ -4472,14 +4471,13 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4472 struct clk *dsi_fixed_clk = NULL; 4471 struct clk *dsi_fixed_clk = NULL;
4473 struct clk *dsi_lp_clk = NULL; 4472 struct clk *dsi_lp_clk = NULL;
4474 struct reset_control *dsi_reset = NULL; 4473 struct reset_control *dsi_reset = NULL;
4475 struct padctrl *dsi_io_padctrl = NULL;
4476
4477 struct tegra_dsi_out *dsi_pdata = NULL; 4474 struct tegra_dsi_out *dsi_pdata = NULL;
4478 int err = 0, i; 4475 int err = 0, i;
4479 int dsi_instance; 4476 int dsi_instance;
4480 int index = 0; 4477 int index = 0;
4481 4478
4482 char *dsi_io_padctrl_name[4] = {"dsia", "dsib", "dsic", "dsid"}; 4479 char *dsi_pad_dpd_on[4] = {"dsi-dpd-enable", "dsib-dpd-enable",
4480 "dsic-dpd-enable", "dsid-dpd-enable"};
4483 char *dsi_clk_name[4] = {"dsi", "dsib", "dsic", "dsid"}; 4481 char *dsi_clk_name[4] = {"dsi", "dsib", "dsic", "dsid"};
4484 char *dsi_lp_clk_name[4] = {"dsia_lp", "dsib_lp", "dsic_lp", "dsid_lp"}; 4482 char *dsi_lp_clk_name[4] = {"dsia_lp", "dsib_lp", "dsic_lp", "dsid_lp"};
4485 char *dsi_reset_name[4] = {"dsia", "dsib", "dsic", "dsid"}; 4483 char *dsi_reset_name[4] = {"dsia", "dsib", "dsic", "dsid"};
@@ -4538,14 +4536,6 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4538 goto err_free_dsi_lp_clk; 4536 goto err_free_dsi_lp_clk;
4539 } 4537 }
4540 4538
4541 dsi->dsi_io_padctrl = kzalloc(tegra_dc_get_max_dsi_instance() *
4542 sizeof(struct tegra_dsi_padctrl *),
4543 GFP_KERNEL);
4544 if (!dsi->dsi_io_padctrl) {
4545 err = -ENOMEM;
4546 goto err_free_dsi_reset;
4547 }
4548
4549 /* Detect when user provides wrong dsi_instance or 4539 /* Detect when user provides wrong dsi_instance or
4550 * max dsi instances. 4540 * max dsi instances.
4551 */ 4541 */
@@ -4556,6 +4546,13 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4556 goto err_free_dsi_reset; 4546 goto err_free_dsi_reset;
4557 } 4547 }
4558 4548
4549 dsi->dsi_io_pad_pinctrl = devm_pinctrl_get(&dc->ndev->dev);
4550 if (IS_ERR_OR_NULL(dsi->dsi_io_pad_pinctrl)) {
4551 dev_err(&dc->ndev->dev, "dsi: missing io pinctrl info:%ld\n",
4552 PTR_ERR(dsi->dsi_io_pad_pinctrl));
4553 dsi->dsi_io_pad_pinctrl = NULL;
4554 }
4555
4559 for (i = 0; i < dsi->max_instances; i++) { 4556 for (i = 0; i < dsi->max_instances; i++) {
4560 4557
4561 index = i + dsi_instance; /*index for dsi instance*/ 4558 index = i + dsi_instance; /*index for dsi instance*/
@@ -4564,13 +4561,13 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4564 if (!base) { 4561 if (!base) {
4565 dev_err(&dc->ndev->dev, "dsi: ioremap failed\n"); 4562 dev_err(&dc->ndev->dev, "dsi: ioremap failed\n");
4566 err = -ENOENT; 4563 err = -ENOENT;
4567 goto err_free_dsi_io_padctrl; 4564 goto err_free_dsi_reset;
4568 } 4565 }
4569 4566
4570 dsi_pdata = dc->pdata->default_out->dsi; 4567 dsi_pdata = dc->pdata->default_out->dsi;
4571 if (!dsi_pdata) { 4568 if (!dsi_pdata) {
4572 dev_err(&dc->ndev->dev, "dsi: dsi data not available\n"); 4569 dev_err(&dc->ndev->dev, "dsi: dsi data not available\n");
4573 goto err_free_dsi_io_padctrl; 4570 goto err_free_dsi_reset;
4574 } 4571 }
4575 4572
4576 dsi_clk = tegra_disp_of_clk_get_by_name(np_dsi, 4573 dsi_clk = tegra_disp_of_clk_get_by_name(np_dsi,
@@ -4596,19 +4593,20 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4596 reset_control_reset(dsi_reset); 4593 reset_control_reset(dsi_reset);
4597 } 4594 }
4598 4595
4599 dsi_io_padctrl = devm_padctrl_get_from_node(&dc->ndev->dev, 4596 if (dsi->dsi_io_pad_pinctrl) {
4600 np_dsi, dsi_io_padctrl_name[index]); 4597 dsi->dpd_enable[i] = pinctrl_lookup_state(dsi->dsi_io_pad_pinctrl,
4601 if (IS_ERR_OR_NULL(dsi_io_padctrl)) { 4598 dsi_pad_dpd_on[i]);
4602 dev_err(&dc->ndev->dev, "dsi: %s IO padctrl unavailable\n", 4599 if (IS_ERR_OR_NULL(dsi->dpd_enable[i])) {
4603 dsi_io_padctrl_name[index]); 4600 dev_err(&dc->ndev->dev, "dsi: dpd lookup fail:%ld\n",
4604 dsi_io_padctrl = NULL; 4601 PTR_ERR(dsi->dpd_enable[i]));
4602 dsi->dpd_enable[i] = NULL;
4603 }
4605 } 4604 }
4606 4605
4607 dsi->base[i] = base; 4606 dsi->base[i] = base;
4608 dsi->dsi_clk[i] = dsi_clk; 4607 dsi->dsi_clk[i] = dsi_clk;
4609 dsi->dsi_lp_clk[i] = dsi_lp_clk; 4608 dsi->dsi_lp_clk[i] = dsi_lp_clk;
4610 dsi->dsi_reset[i] = dsi_reset; 4609 dsi->dsi_reset[i] = dsi_reset;
4611 dsi->dsi_io_padctrl[i] = dsi_io_padctrl;
4612 } 4610 }
4613 4611
4614 if (tegra_dc_is_t21x()) { 4612 if (tegra_dc_is_t21x()) {
@@ -4687,8 +4685,13 @@ static int _tegra_dc_dsi_init(struct tegra_dc *dc)
4687 int i; 4685 int i;
4688 for (i = 0; i < tegra_dc_get_max_dsi_instance(); i++) { 4686 for (i = 0; i < tegra_dc_get_max_dsi_instance(); i++) {
4689 if ((dsi->info.dpd_dsi_pads & DSI_DPD_EN(i)) && 4687 if ((dsi->info.dpd_dsi_pads & DSI_DPD_EN(i)) &&
4690 dsi->dsi_io_padctrl[i]) 4688 dsi->dpd_enable[i]) {
4691 padctrl_power_disable(dsi->dsi_io_padctrl[i]); 4689 err = pinctrl_select_state(dsi->dsi_io_pad_pinctrl,
4690 dsi->dpd_enable[i]);
4691 if (err < 0)
4692 dev_err(&dc->ndev->dev,
4693 "io pad power-down fail:%d\n", err);
4694 }
4692 } 4695 }
4693 } 4696 }
4694 4697
@@ -4718,8 +4721,6 @@ err_dsi_clk_put:
4718 if (dsi->dsi_reset[i]) 4721 if (dsi->dsi_reset[i])
4719 reset_control_put(dsi->dsi_reset[i]); 4722 reset_control_put(dsi->dsi_reset[i]);
4720 } 4723 }
4721err_free_dsi_io_padctrl:
4722 kfree(dsi->dsi_io_padctrl);
4723err_free_dsi_reset: 4724err_free_dsi_reset:
4724 kfree(dsi->dsi_reset); 4725 kfree(dsi->dsi_reset);
4725err_free_dsi_lp_clk: 4726err_free_dsi_lp_clk:
diff --git a/drivers/video/tegra/dc/dsi.h b/drivers/video/tegra/dc/dsi.h
index 330926444..cde06b9b8 100644
--- a/drivers/video/tegra/dc/dsi.h
+++ b/drivers/video/tegra/dc/dsi.h
@@ -146,7 +146,8 @@ struct tegra_dc_dsi_data {
146 u32 device_shutdown; 146 u32 device_shutdown;
147 147
148 struct sysedp_consumer *sysedpc; 148 struct sysedp_consumer *sysedpc;
149 struct padctrl **dsi_io_padctrl; 149 struct pinctrl *dsi_io_pad_pinctrl;
150 struct pinctrl_state *dpd_enable[4];
150 151
151 struct tegra_dsi_padctrl *pad_ctrl; 152 struct tegra_dsi_padctrl *pad_ctrl;
152 struct tegra_prod *prod_list; 153 struct tegra_prod *prod_list;
diff --git a/drivers/video/tegra/dc/sor.c b/drivers/video/tegra/dc/sor.c
index 4506ac7de..8c61f0722 100644
--- a/drivers/video/tegra/dc/sor.c
+++ b/drivers/video/tegra/dc/sor.c
@@ -27,7 +27,6 @@
27#include <linux/tegra_prod.h> 27#include <linux/tegra_prod.h>
28#include <linux/uaccess.h> 28#include <linux/uaccess.h>
29#include <linux/version.h> 29#include <linux/version.h>
30#include <linux/padctrl/padctrl.h>
31#include <linux/tegra_pm_domains.h> 30#include <linux/tegra_pm_domains.h>
32#include <video/tegra_dc_ext.h> 31#include <video/tegra_dc_ext.h>
33 32
@@ -740,7 +739,8 @@ struct tegra_dc_sor_data *tegra_dc_sor_init(struct tegra_dc *dc,
740 u32 temp; 739 u32 temp;
741 int err, i; 740 int err, i;
742 char res_name[CHAR_BUF_SIZE_MAX] = {0}; 741 char res_name[CHAR_BUF_SIZE_MAX] = {0};
743 char io_padctrl_name[CHAR_BUF_SIZE_MAX] = {0}; 742 char io_pinctrl_en_name[CHAR_BUF_SIZE_MAX] = {0};
743 char io_pinctrl_dis_name[CHAR_BUF_SIZE_MAX] = {0};
744 struct clk *sor_clk = NULL; 744 struct clk *sor_clk = NULL;
745 struct clk *safe_clk = NULL; 745 struct clk *safe_clk = NULL;
746 struct clk *pad_clk = NULL; 746 struct clk *pad_clk = NULL;
@@ -844,20 +844,45 @@ struct tegra_dc_sor_data *tegra_dc_sor_init(struct tegra_dc *dc,
844 sor->xbar_ctrl[i] = i; 844 sor->xbar_ctrl[i] = i;
845 845
846 if (tegra_dc_is_t21x() && (sor->ctrl_num == 1)) { /* todo: fix this */ 846 if (tegra_dc_is_t21x() && (sor->ctrl_num == 1)) { /* todo: fix this */
847 snprintf(io_padctrl_name, CHAR_BUF_SIZE_MAX, "hdmi"); 847 snprintf(io_pinctrl_en_name, CHAR_BUF_SIZE_MAX,
848 "hdmi-dpd-enable");
849 snprintf(io_pinctrl_dis_name, CHAR_BUF_SIZE_MAX,
850 "hdmi-dpd-disable");
848 } else { 851 } else {
849 snprintf(io_padctrl_name, CHAR_BUF_SIZE_MAX, "hdmi-dp%d", 852 snprintf(io_pinctrl_en_name, CHAR_BUF_SIZE_MAX,
850 sor->ctrl_num); 853 "hdmi-dp%d-dpd-enable", sor->ctrl_num);
854 snprintf(io_pinctrl_dis_name, CHAR_BUF_SIZE_MAX,
855 "hdmi-dp%d-dpd-disable", sor->ctrl_num);
856 }
857
858 sor->pinctrl_sor = devm_pinctrl_get(&dc->ndev->dev);
859 if (IS_ERR_OR_NULL(sor->pinctrl_sor)) {
860 dev_err(&dc->ndev->dev, "pinctrl get fail: %ld\n",
861 PTR_ERR(sor->pinctrl_sor));
862 sor->pinctrl_sor = NULL;
863 goto bypass_pads;
851 } 864 }
852 865
853 sor->io_padctrl = devm_padctrl_get_from_node(&dc->ndev->dev, 866 if (sor->pinctrl_sor) {
854 sor_np, io_padctrl_name); 867 sor->dpd_enable = pinctrl_lookup_state(sor->pinctrl_sor,
855 if (IS_ERR(sor->io_padctrl)) { 868 io_pinctrl_en_name);
856 dev_err(&dc->ndev->dev, "sor: %s IO padctrl unavailable\n", 869 if (IS_ERR_OR_NULL(sor->dpd_enable)) {
857 io_padctrl_name); 870 dev_err(&dc->ndev->dev, "dpd enable lookup fail:%ld\n",
858 sor->io_padctrl = NULL; 871 PTR_ERR(sor->dpd_enable));
872 sor->dpd_enable = NULL;
873 goto bypass_pads;
874 }
875
876 sor->dpd_disable = pinctrl_lookup_state(sor->pinctrl_sor,
877 io_pinctrl_dis_name);
878 if (IS_ERR_OR_NULL(sor->dpd_disable)) {
879 dev_err(&dc->ndev->dev, "dpd disable lookup fail:%ld\n",
880 PTR_ERR(sor->dpd_disable));
881 sor->dpd_disable = NULL;
882 }
859 } 883 }
860 884
885bypass_pads:
861 if (of_property_read_u32_array(sor_np, "nvidia,xbar-ctrl", 886 if (of_property_read_u32_array(sor_np, "nvidia,xbar-ctrl",
862 sor->xbar_ctrl, sizeof(sor->xbar_ctrl)/sizeof(u32))) 887 sor->xbar_ctrl, sizeof(sor->xbar_ctrl)/sizeof(u32)))
863 dev_err(&dc->ndev->dev, "%s: error reading nvidia,xbar-ctrl\n", 888 dev_err(&dc->ndev->dev, "%s: error reading nvidia,xbar-ctrl\n",
@@ -961,6 +986,10 @@ void tegra_dc_sor_destroy(struct tegra_dc_sor_data *sor)
961 986
962 iounmap(sor->base); 987 iounmap(sor->base);
963 988
989 devm_pinctrl_put(sor->pinctrl_sor);
990 sor->dpd_enable = NULL;
991 sor->dpd_disable = NULL;
992
964 if (tegra_dc_is_nvdisplay()) 993 if (tegra_dc_is_nvdisplay())
965 devm_kfree(dev, sor->win_state_arr); 994 devm_kfree(dev, sor->win_state_arr);
966 devm_kfree(dev, sor); 995 devm_kfree(dev, sor);
@@ -1153,21 +1182,26 @@ static inline void tegra_dc_sor_update(struct tegra_dc_sor_data *sor)
1153 1182
1154static void tegra_dc_sor_io_set_dpd(struct tegra_dc_sor_data *sor, bool up) 1183static void tegra_dc_sor_io_set_dpd(struct tegra_dc_sor_data *sor, bool up)
1155{ 1184{
1185 int ret = 0;
1186
1156 if (tegra_platform_is_vdk()) 1187 if (tegra_platform_is_vdk())
1157 return; 1188 return;
1158 1189
1159 if (sor->io_padctrl) { 1190 if (!sor->pinctrl_sor)
1160 int ret; 1191 return;
1161 1192
1162 if (up) 1193 if (up) {
1163 ret = padctrl_power_enable(sor->io_padctrl); 1194 if (sor->dpd_disable)
1164 else 1195 ret = pinctrl_select_state(sor->pinctrl_sor,
1165 ret = padctrl_power_disable(sor->io_padctrl); 1196 sor->dpd_disable);
1166 if (ret < 0) 1197 } else {
1167 dev_err(&sor->dc->ndev->dev, 1198 if (sor->dpd_enable)
1168 "padctrl power %s fail %d\n", 1199 ret = pinctrl_select_state(sor->pinctrl_sor,
1169 up ? "up" : "down", ret); 1200 sor->dpd_enable);
1170 } 1201 }
1202 if (ret < 0)
1203 dev_err(&sor->dc->ndev->dev, "io pad power %s fail:%d\n",
1204 up ? "disable" : "enable", ret);
1171} 1205}
1172 1206
1173/* hdmi uses sor sequencer for pad power up */ 1207/* hdmi uses sor sequencer for pad power up */
@@ -1176,6 +1210,7 @@ void tegra_sor_hdmi_pad_power_up(struct tegra_dc_sor_data *sor)
1176 u32 nv_sor_pll0_reg = nv_sor_pll0(); 1210 u32 nv_sor_pll0_reg = nv_sor_pll0();
1177 u32 nv_sor_pll1_reg = nv_sor_pll1(); 1211 u32 nv_sor_pll1_reg = nv_sor_pll1();
1178 u32 nv_sor_pll2_reg = nv_sor_pll2(); 1212 u32 nv_sor_pll2_reg = nv_sor_pll2();
1213 int ret = 0;
1179 1214
1180 /* seamless */ 1215 /* seamless */
1181 if (sor->dc->initialized) 1216 if (sor->dc->initialized)
@@ -1212,12 +1247,11 @@ void tegra_sor_hdmi_pad_power_up(struct tegra_dc_sor_data *sor)
1212 tegra_sor_pad_cal_power(sor, false); 1247 tegra_sor_pad_cal_power(sor, false);
1213 usleep_range(20, 70); 1248 usleep_range(20, 70);
1214 1249
1215 if (sor->io_padctrl) { 1250 if (sor->dpd_disable) {
1216 int ret = padctrl_power_enable(sor->io_padctrl); 1251 ret = pinctrl_select_state(sor->pinctrl_sor, sor->dpd_disable);
1217
1218 if (ret < 0) 1252 if (ret < 0)
1219 dev_err(&sor->dc->ndev->dev, "padctrl power up fail %d\n", 1253 dev_err(&sor->dc->ndev->dev,
1220 ret); 1254 "io pad power-up fail:%d\n", ret);
1221 } 1255 }
1222 usleep_range(20, 70); 1256 usleep_range(20, 70);
1223 1257
@@ -1253,6 +1287,7 @@ void tegra_sor_hdmi_pad_power_down(struct tegra_dc_sor_data *sor)
1253{ 1287{
1254 u32 nv_sor_pll0_reg = nv_sor_pll0(); 1288 u32 nv_sor_pll0_reg = nv_sor_pll0();
1255 u32 nv_sor_pll2_reg = nv_sor_pll2(); 1289 u32 nv_sor_pll2_reg = nv_sor_pll2();
1290 int ret = 0;
1256 1291
1257 tegra_sor_write_field(sor, nv_sor_pll2_reg, 1292 tegra_sor_write_field(sor, nv_sor_pll2_reg,
1258 NV_SOR_PLL2_AUX7_PORT_POWERDOWN_MASK, 1293 NV_SOR_PLL2_AUX7_PORT_POWERDOWN_MASK,
@@ -1273,12 +1308,11 @@ void tegra_sor_hdmi_pad_power_down(struct tegra_dc_sor_data *sor)
1273 NV_SOR_PLL2_AUX6_BANDGAP_POWERDOWN_ENABLE); 1308 NV_SOR_PLL2_AUX6_BANDGAP_POWERDOWN_ENABLE);
1274 tegra_sor_pad_cal_power(sor, false); 1309 tegra_sor_pad_cal_power(sor, false);
1275 1310
1276 if (sor->io_padctrl) { 1311 if (sor->dpd_enable) {
1277 int ret = padctrl_power_disable(sor->io_padctrl); 1312 ret = pinctrl_select_state(sor->pinctrl_sor, sor->dpd_enable);
1278
1279 if (ret < 0) 1313 if (ret < 0)
1280 dev_err(&sor->dc->ndev->dev, "padctrl power down fail %d\n", 1314 dev_err(&sor->dc->ndev->dev,
1281 ret); 1315 "io pad power-down fail:%d\n", ret);
1282 } 1316 }
1283 usleep_range(20, 70); 1317 usleep_range(20, 70);
1284} 1318}
diff --git a/drivers/video/tegra/dc/sor.h b/drivers/video/tegra/dc/sor.h
index 9a9363ebd..3b84307b9 100644
--- a/drivers/video/tegra/dc/sor.h
+++ b/drivers/video/tegra/dc/sor.h
@@ -202,7 +202,9 @@ struct tegra_dc_sor_data {
202 u8 clk_type; 202 u8 clk_type;
203 u32 xbar_ctrl[5]; 203 u32 xbar_ctrl[5];
204 bool audio_support; 204 bool audio_support;
205 struct padctrl *io_padctrl; 205 struct pinctrl *pinctrl_sor;
206 struct pinctrl_state *dpd_enable;
207 struct pinctrl_state *dpd_disable;
206 int powergate_id; 208 int powergate_id;
207 struct rw_semaphore reset_lock; 209 struct rw_semaphore reset_lock;
208 struct dentry *debugdir; 210 struct dentry *debugdir;