summaryrefslogtreecommitdiff
path: root/drivers/video/fbdev
diff options
context:
space:
mode:
authorAjay Singh Parmar <aparmar@codeaurora.org>2016-08-17 15:27:03 -0700
committerAjay Singh Parmar <aparmar@codeaurora.org>2016-08-17 16:41:30 -0700
commit683b047d9e21ddb7c09700d004c1eddd6b1a7a7d (patch)
treeb19def1908e2546f48214fc53087c6d21f8498b6 /drivers/video/fbdev
parent68b901051b949972abb369ae4aa08ced18416929 (diff)
msm: mdss: dp: add connected sysfs node
Add sysfs node to provide the status of display-port's cable connection. Framework may query about the interface connection status before powering it on. Change-Id: I43d0d18b875c4516727f91c57cfb571e3ac91706 Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
Diffstat (limited to 'drivers/video/fbdev')
-rw-r--r--drivers/video/fbdev/msm/mdss_dp.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dp.c b/drivers/video/fbdev/msm/mdss_dp.c
index f9c875856a11..f7261d4e3fa4 100644
--- a/drivers/video/fbdev/msm/mdss_dp.c
+++ b/drivers/video/fbdev/msm/mdss_dp.c
@@ -1310,6 +1310,70 @@ error:
return rc;
}
+static struct mdss_dp_drv_pdata *mdss_dp_get_drvdata(struct device *device)
+{
+ struct msm_fb_data_type *mfd;
+ struct mdss_panel_data *pd;
+ struct mdss_dp_drv_pdata *dp = NULL;
+ struct fb_info *fbi = dev_get_drvdata(device);
+
+ if (fbi) {
+ mfd = (struct msm_fb_data_type *)fbi->par;
+ pd = dev_get_platdata(&mfd->pdev->dev);
+
+ dp = container_of(pd, struct mdss_dp_drv_pdata, panel_data);
+ }
+
+ return dp;
+}
+
+static ssize_t mdss_dp_rda_connected(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t ret;
+ struct mdss_dp_drv_pdata *dp = mdss_dp_get_drvdata(dev);
+
+ if (!dp)
+ return -EINVAL;
+
+ ret = snprintf(buf, PAGE_SIZE, "%d\n", dp->cable_connected);
+ pr_debug("%d\n", dp->cable_connected);
+
+ return ret;
+}
+static DEVICE_ATTR(connected, S_IRUGO, mdss_dp_rda_connected, NULL);
+
+static struct attribute *mdss_dp_fs_attrs[] = {
+ &dev_attr_connected.attr,
+ NULL,
+};
+
+static struct attribute_group mdss_dp_fs_attrs_group = {
+ .attrs = mdss_dp_fs_attrs,
+};
+
+static int mdss_dp_sysfs_create(struct mdss_dp_drv_pdata *dp,
+ struct fb_info *fbi)
+{
+ int rc;
+
+ if (!dp || !fbi) {
+ pr_err("ivalid input\n");
+ return -ENODEV;
+ }
+
+ rc = sysfs_create_group(&fbi->dev->kobj,
+ &mdss_dp_fs_attrs_group);
+ if (rc) {
+ pr_err("failed, rc=%d\n", rc);
+ return rc;
+ }
+
+ pr_debug("sysfs ceated\n");
+
+ return 0;
+}
+
static int mdss_dp_event_handler(struct mdss_panel_data *pdata,
int event, void *arg)
{
@@ -1354,6 +1418,7 @@ static int mdss_dp_event_handler(struct mdss_panel_data *pdata,
dp->kobj = &fbi->dev->kobj;
dp->fb_node = fbi->node;
+ mdss_dp_sysfs_create(dp, fbi);
mdss_dp_edid_init(pdata);
mdss_dp_hdcp_init(pdata);
mdss_dp_register_switch_event(dp);