summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorManoj Rao <manojraj@codeaurora.org>2014-03-05 18:41:31 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:27:41 -0700
commit3c5a6d46a948797f5f72c8202afa8d8b79fb61a4 (patch)
tree8efbb6003df2dc01ba67554e71c7800cff46cade /drivers/video/fbdev
parentd3f3a3d5a66c6d9634867cdf23ff9fa63ffff7aa (diff)
msm: mdss: dsi: add pinctrl support
Add pinctrl support for the installation of the required GPIOs from DT. Document properties in bindings. Make appropriate changes in the driver to initialize and set the pins to active and sleep states during unblank and blank stages respectively in DSI driver. Change-Id: Ib58d9162d915adace38ca36a0a3af9fa964d8039 Signed-off-by: Manoj Rao <manojraj@codeaurora.org> Signed-off-by: Jeevan Shriram <jshriram@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss.h3
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.c64
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi.h9
3 files changed, 75 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss.h b/drivers/video/fbdev/msm/mdss.h
index 279a943253f1..dd8833a886ff 100644
--- a/drivers/video/fbdev/msm/mdss.h
+++ b/drivers/video/fbdev/msm/mdss.h
@@ -27,6 +27,9 @@
#define MAX_DRV_SUP_MMB_BLKS 44
+#define MDSS_PINCTRL_STATE_DEFAULT "mdss_default"
+#define MDSS_PINCTRL_STATE_SLEEP "mdss_sleep"
+
enum mdss_mdp_clk_type {
MDSS_CLK_AHB,
MDSS_CLK_AXI,
diff --git a/drivers/video/fbdev/msm/mdss_dsi.c b/drivers/video/fbdev/msm/mdss_dsi.c
index 10171d923159..63e1fa8e3fbe 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.c
+++ b/drivers/video/fbdev/msm/mdss_dsi.c
@@ -641,6 +641,59 @@ int mdss_dsi_on(struct mdss_panel_data *pdata)
return 0;
}
+static int mdss_dsi_pinctrl_set_state(
+ struct mdss_dsi_ctrl_pdata *ctrl_pdata,
+ bool active)
+{
+ struct pinctrl_state *pin_state;
+ int rc = -EFAULT;
+
+ if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.pinctrl))
+ return PTR_ERR(ctrl_pdata->pin_res.pinctrl);
+
+ pin_state = active ? ctrl_pdata->pin_res.gpio_state_active
+ : ctrl_pdata->pin_res.gpio_state_suspend;
+ if (!IS_ERR_OR_NULL(pin_state)) {
+ rc = pinctrl_select_state(ctrl_pdata->pin_res.pinctrl,
+ pin_state);
+ if (rc)
+ pr_err("%s: can not set %s pins\n", __func__,
+ active ? MDSS_PINCTRL_STATE_DEFAULT
+ : MDSS_PINCTRL_STATE_SLEEP);
+ } else {
+ pr_err("%s: invalid '%s' pinstate\n", __func__,
+ active ? MDSS_PINCTRL_STATE_DEFAULT
+ : MDSS_PINCTRL_STATE_SLEEP);
+ }
+ return rc;
+}
+
+static int mdss_dsi_pinctrl_init(struct platform_device *pdev)
+{
+ struct mdss_dsi_ctrl_pdata *ctrl_pdata;
+
+ ctrl_pdata = platform_get_drvdata(pdev);
+ ctrl_pdata->pin_res.pinctrl = devm_pinctrl_get(&pdev->dev);
+ if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.pinctrl)) {
+ pr_err("%s: failed to get pinctrl\n", __func__);
+ return PTR_ERR(ctrl_pdata->pin_res.pinctrl);
+ }
+
+ ctrl_pdata->pin_res.gpio_state_active
+ = pinctrl_lookup_state(ctrl_pdata->pin_res.pinctrl,
+ MDSS_PINCTRL_STATE_DEFAULT);
+ if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.gpio_state_active))
+ pr_warn("%s: can not get default pinstate\n", __func__);
+
+ ctrl_pdata->pin_res.gpio_state_suspend
+ = pinctrl_lookup_state(ctrl_pdata->pin_res.pinctrl,
+ MDSS_PINCTRL_STATE_SLEEP);
+ if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.gpio_state_suspend))
+ pr_warn("%s: can not get sleep pinstate\n", __func__);
+
+ return 0;
+}
+
static int mdss_dsi_unblank(struct mdss_panel_data *pdata)
{
int ret = 0;
@@ -657,6 +710,8 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata)
ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
panel_data);
mipi = &pdata->panel_info.mipi;
+ if (mdss_dsi_pinctrl_set_state(ctrl_pdata, true))
+ pr_debug("dsi unblank: pinctrl not enabled\n");
if (!(ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT)) {
ret = ctrl_pdata->on(pdata);
@@ -725,6 +780,9 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata)
}
ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_INIT;
}
+ if (mdss_dsi_pinctrl_set_state(ctrl_pdata, false))
+ pr_debug("dsi blank: pinctrl not enabled\n");
+
pr_debug("%s-:End\n", __func__);
return ret;
}
@@ -1129,11 +1187,15 @@ static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
goto error_no_mem;
}
+ rc = mdss_dsi_pinctrl_init(pdev);
+ if (rc)
+ pr_warn("%s: failed to get pin resources\n", __func__);
+
/* Parse the regulator information */
rc = mdss_dsi_get_dt_vreg_data(&pdev->dev,
&ctrl_pdata->power_data);
if (rc) {
- pr_err("%s: failed to get vreg data from dt. rc=%d\n",
+ pr_err("%s: failed to get vreg data from dt, rc=%d\n",
__func__, rc);
goto error_vreg;
}
diff --git a/drivers/video/fbdev/msm/mdss_dsi.h b/drivers/video/fbdev/msm/mdss_dsi.h
index e92da9fe0a51..e3605d5a268f 100644
--- a/drivers/video/fbdev/msm/mdss_dsi.h
+++ b/drivers/video/fbdev/msm/mdss_dsi.h
@@ -18,6 +18,7 @@
#include <linux/mdss_io_util.h>
#include <mach/scm-io.h>
#include <linux/irqreturn.h>
+#include <linux/pinctrl/consumer.h>
#include "mdss_panel.h"
#include "mdss_dsi_cmd.h"
@@ -213,6 +214,12 @@ struct dsi_drv_cm_data {
int broadcast_enable;
};
+struct dsi_pinctrl_res {
+ struct pinctrl *pinctrl;
+ struct pinctrl_state *gpio_state_active;
+ struct pinctrl_state *gpio_state_suspend;
+};
+
enum {
DSI_CTRL_0,
DSI_CTRL_1,
@@ -292,6 +299,8 @@ struct mdss_dsi_ctrl_pdata {
struct dsi_buf tx_buf;
struct dsi_buf rx_buf;
+
+ struct dsi_pinctrl_res pin_res;
};
int dsi_panel_device_register(struct device_node *pan_node,