From 58c6b1a5ebe0ea25faec1f513391984fa9f4e0e1 Mon Sep 17 00:00:00 2001 From: houdz1 Date: Fri, 21 Dec 2018 12:58:04 +0800 Subject: [PATCH] drm: mipi: disable Elvss dim of HBM for MIPI DSI Added 3 MIPI commands to set/get the ELVSS setting information from the MIPI DSI panel. Port from a5b269d7. Change-Id: I3aa1612c7afc35247f0db86ee1dd8484bae8d7b4 Signed-off-by: daiss1 Reviewed-on: https://gerrit.mot.com/1469340 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Guobin Zhang Submit-Approved: Jira Key Reviewed-by: Bang Nguyen Reviewed-by: Dezhen Hou Reviewed-on: https://gerrit.mot.com/1509787 Reviewed-by: Xiangpo Zhao --- drivers/gpu/drm/drm_mipi_dsi.c | 53 ++++++++++++++++++++++++++++++++++ include/drm/drm_mipi_dsi.h | 4 +++ 2 files changed, 57 insertions(+) diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c index 2c713b277934..6003b2e9b894 100644 --- a/drivers/gpu/drm/drm_mipi_dsi.c +++ b/drivers/gpu/drm/drm_mipi_dsi.c @@ -1176,6 +1176,59 @@ int mipi_dsi_driver_register_full(struct mipi_dsi_driver *drv, } EXPORT_SYMBOL(mipi_dsi_driver_register_full); +int mipi_dsi_dcs_get_elvss_data(struct mipi_dsi_device *dsi) +{ + u8 payload_f0[2] = { 0x5A, 0x5A }; + u8 payload_b0 = 0x07; + ssize_t err; + + err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0, sizeof(payload_f0)); + err = mipi_dsi_dcs_write(dsi, 0xB0, &payload_b0, sizeof(payload_b0)); + + if (err < 0) + return err; + + return 0; +} +EXPORT_SYMBOL(mipi_dsi_dcs_get_elvss_data); + +int mipi_dsi_dcs_get_elvss_data_1(struct mipi_dsi_device *dsi) +{ + u8 payload_f0_1[2] = { 0xA5, 0xA5 }; + ssize_t err; + err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0_1, sizeof(payload_f0_1)); + + if (err < 0) + return err; + + return 0; +} +EXPORT_SYMBOL(mipi_dsi_dcs_get_elvss_data_1); + +int mipi_dsi_dcs_set_elvss_dim_off(struct mipi_dsi_device *dsi, + u8 val) +{ + u8 payload_f0[2] = { 0x5A, 0x5A }; + u8 payload_f0_1[2] = { 0xA5, 0xA5 }; + u8 payload_b7[2] = { 0x01, 0x5B }; + u8 payload_b0 = 0x07; + ssize_t err; + + pr_info("set elvss data:%d\n", val); + + err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0, sizeof(payload_f0)); + err = mipi_dsi_dcs_write(dsi, 0xB7, payload_b7, sizeof(payload_b7)); + err = mipi_dsi_dcs_write(dsi, 0xB0, &payload_b0, sizeof(payload_b0)); + err = mipi_dsi_dcs_write(dsi, 0xB7, &val, sizeof(val)); + err = mipi_dsi_dcs_write(dsi, 0xF0, payload_f0_1, sizeof(payload_f0_1)); + + if (err < 0) + return err; + + return 0; +} +EXPORT_SYMBOL(mipi_dsi_dcs_set_elvss_dim_off); + /** * mipi_dsi_driver_unregister() - unregister a driver for DSI devices * @drv: DSI driver structure diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h index 5cc2671d0b3c..dcdeaed3e2da 100644 --- a/include/drm/drm_mipi_dsi.h +++ b/include/drm/drm_mipi_dsi.h @@ -322,6 +322,10 @@ static inline void mipi_dsi_set_drvdata(struct mipi_dsi_device *dsi, void *data) dev_set_drvdata(&dsi->dev, data); } +int mipi_dsi_dcs_get_elvss_data(struct mipi_dsi_device *dsi); +int mipi_dsi_dcs_get_elvss_data_1(struct mipi_dsi_device *dsi); +int mipi_dsi_dcs_set_elvss_dim_off(struct mipi_dsi_device *dsi, u8 val); + int mipi_dsi_driver_register_full(struct mipi_dsi_driver *driver, struct module *owner); void mipi_dsi_driver_unregister(struct mipi_dsi_driver *driver);