summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWlogsky <wlogsky@google.com>2023-06-06 02:05:44 +0000
committerWlogsky <wlogsky@google.com>2023-06-28 02:09:02 +0000
commitd80cf63a737510ca3562a4941717ffb28e47dc8f (patch)
treefac12150ab8cb37c46901fd3eb06ee188be951ba
parent4216bb955341b142b326a07a7a2d217450e4cb7f (diff)
downloaddisplay-drivers-d80cf63a737510ca3562a4941717ffb28e47dc8f.tar.gz
panel: Add adb command to read panel vendor string
Add adb command that can read vendor string from dtsi. Since we have done panel detection in the bootloader, we could leverage it and simply use the panel name in kernel dtsi, so that we don't need to read 0xDA every time. And the below is the list of vendor string of the panels. Eos-BOE-WF012FBM Eos-SDC-AMB120DD01 P11-BOE-RM690C0 FSE22-BOE-WJ013PGM FSE22-SDC-AMB127FP01 FL22-BOE-WJ014SGM Bug: 271373896 Test: adb shell "cat /sys/class/drm/sde-conn-0-DSI-1/vendor_string" Change-Id: I150acb9c4e85c0d3900f4a84c748ae2d37772f07 Signed-off-by: Wlogsky <wlogsky@google.com>
-rw-r--r--msm/dsi/dsi_display.c15
-rw-r--r--msm/dsi/dsi_display.h12
-rw-r--r--msm/sde/sde_connector.c31
-rw-r--r--msm/sde/sde_connector.h12
-rw-r--r--msm/sde/sde_kms.c1
5 files changed, 66 insertions, 5 deletions
diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c
index fabc981a..476b54e8 100644
--- a/msm/dsi/dsi_display.c
+++ b/msm/dsi/dsi_display.c
@@ -1393,6 +1393,21 @@ int dsi_display_set_hbm(struct drm_connector *connector, bool cmd, void *disp)
return rc;
}
+int dsi_display_get_vendor_string(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len)
+{
+ struct dsi_display *disp = (struct dsi_display *)display;
+ int len = 0;
+
+ if (!disp || !disp->panel) {
+ DSI_ERR("Invalid param(s) dsi_display or dsi_panel");
+ return -EINVAL;
+ }
+
+ len = scnprintf(buf, buf_len, "%s", disp->panel->name);
+ return len;
+}
+
#if IS_ENABLED(CONFIG_DEBUG_FS)
static bool dsi_display_is_te_based_esd(struct dsi_display *display)
{
diff --git a/msm/dsi/dsi_display.h b/msm/dsi/dsi_display.h
index 2458fb13..144af668 100644
--- a/msm/dsi/dsi_display.h
+++ b/msm/dsi/dsi_display.h
@@ -879,4 +879,16 @@ int dsi_display_ctrl_vreg_off(struct dsi_display *display);
*/
int dsi_display_set_hbm(struct drm_connector *connector, bool cmd, void *disp);
+/**
+ * dsi_display_get_vendor_string() - Get panel's vendor string
+ * @connector: Pointer to drm connector structure
+ * @display: Pointer to private display structure
+ * @buf: String buffer
+ * @buf_len: String buffer length
+ *
+ * Return: Size of string written to buffer
+ */
+int dsi_display_get_vendor_string(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len);
+
#endif /* _DSI_DISPLAY_H_ */
diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c
index ba3b200d..3e869bae 100644
--- a/msm/sde/sde_connector.c
+++ b/msm/sde/sde_connector.c
@@ -3386,14 +3386,35 @@ static ssize_t twm_enable_show(struct device *device,
return scnprintf(buf, PAGE_SIZE, "%d\n", sde_conn->twm_en);
}
+static ssize_t vendor_string_show(struct device *device, struct device_attribute *attr, char *buf)
+{
+ struct drm_connector *conn;
+ struct sde_connector *sde_conn;
+ int len = 0;
+
+ conn = dev_get_drvdata(device);
+ sde_conn = to_sde_connector(conn);
+ if (!sde_conn->ops.get_vendor_string) {
+ SDE_ERROR("no cmd get_vendor_string for connector name %s\n", sde_conn->name);
+ return -EINVAL;
+ }
+
+ len = sde_conn->ops.get_vendor_string(conn, sde_conn->display, buf, PAGE_SIZE);
+ if (len <= 0) {
+ SDE_ERROR("cannot get vendor string %s\n", sde_conn->name);
+ return -EINVAL;
+ }
+
+ return len;
+}
+
static DEVICE_ATTR_RO(panel_power_state);
static DEVICE_ATTR_RW(twm_enable);
+static DEVICE_ATTR_RO(vendor_string);
-static struct attribute *sde_connector_dev_attrs[] = {
- &dev_attr_panel_power_state.attr,
- &dev_attr_twm_enable.attr,
- NULL
-};
+static struct attribute *sde_connector_dev_attrs[] = { &dev_attr_panel_power_state.attr,
+ &dev_attr_twm_enable.attr,
+ &dev_attr_vendor_string.attr, NULL };
static const struct attribute_group sde_connector_attr_group = {
.attrs = sde_connector_dev_attrs,
diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h
index c155bc68..cd0b2fa1 100644
--- a/msm/sde/sde_connector.h
+++ b/msm/sde/sde_connector.h
@@ -446,6 +446,18 @@ struct sde_connector_ops {
* Return: Zero on Success
*/
int (*set_hbm)(struct drm_connector *connector, bool cmd, void *disp);
+
+ /**
+ * get_vendor_string() - Get panel's vendor string
+ * @connector: Pointer to drm connector structure
+ * @display: Pointer to private display structure
+ * @buf: String buffer
+ * @buf_len: String buffer length
+ *
+ * Return: String length written to buffer
+ */
+ int (*get_vendor_string)(struct drm_connector *connector, void *display, char *buf,
+ u32 buf_len);
};
/**
diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c
index 2d834db7..5cfe7e24 100644
--- a/msm/sde/sde_kms.c
+++ b/msm/sde/sde_kms.c
@@ -1830,6 +1830,7 @@ static int _sde_kms_setup_displays(struct drm_device *dev,
.get_num_lm_from_mode = dsi_conn_get_lm_from_mode,
.update_transfer_time = dsi_display_update_transfer_time,
.set_hbm = dsi_display_set_hbm,
+ .get_vendor_string = dsi_display_get_vendor_string,
};
static const struct sde_connector_ops wb_ops = {
.post_init = sde_wb_connector_post_init,