From 30757e8c8a732cb6f0a9230a9842a2f3d44fd3e3 Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Mon, 22 Jun 2020 15:09:51 -0700 Subject: [PATCH] disp: msm: dsi: add parsing logic for panel gpio pins/address Add parsing code for getting the TLMM base address and size of each GPIO pin register space along with the GPIO pins used for the specific panel. This list is used to lend these IO ranges to trusted vm during the trusted UI usecase. Change-Id: I10429cfa14265d52e898815c6cf94be27daa5677 Signed-off-by: Veera Sundaram Sankaran --- msm/dsi/dsi_display.c | 10 ++++++ msm/dsi/dsi_panel.c | 81 +++++++++++++++++++++++++++++++++++++++++++ msm/dsi/dsi_panel.h | 3 ++ 3 files changed, 94 insertions(+) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index d8faf988b3b6..ed8b82c4d450 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -5182,12 +5182,22 @@ error: static int dsi_display_get_io_resources(struct msm_io_res *io_res, void *data) { int rc = 0; + struct dsi_display *display; + + if (!data) + return -EINVAL; rc = dsi_ctrl_get_io_resources(io_res); if (rc) goto end; rc = dsi_phy_get_io_resources(io_res); + if (rc) + goto end; + + display = (struct dsi_display *)data; + rc = dsi_panel_get_io_resources(display->panel, io_res); + end: return rc; } diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 389e34dfd3d9..563617859978 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -2044,6 +2044,87 @@ error: return rc; } +int dsi_panel_get_io_resources(struct dsi_panel *panel, + struct msm_io_res *io_res) +{ + struct list_head temp_head; + struct msm_io_mem_entry *io_mem, *pos, *tmp; + struct list_head *mem_list = &io_res->mem; + int i, rc = 0, address_count, pin_count; + u32 *pins = NULL, *address = NULL; + u32 base, size; + struct dsi_parser_utils *utils = &panel->utils; + + INIT_LIST_HEAD(&temp_head); + + address_count = utils->count_u32_elems(utils->data, + "qcom,dsi-panel-gpio-address"); + if (address_count != 2) { + DSI_DEBUG("panel gpio address not defined\n"); + return 0; + } + + address = kzalloc(sizeof(u32) * address_count, GFP_KERNEL); + if (!address) + return -ENOMEM; + + rc = utils->read_u32_array(utils->data, "qcom,dsi-panel-gpio-address", + address, address_count); + if (rc) { + DSI_ERR("panel gpio address not defined correctly\n"); + goto end; + } + base = address[0]; + size = address[1]; + + pin_count = utils->count_u32_elems(utils->data, + "qcom,dsi-panel-gpio-pins"); + if (pin_count < 0) { + DSI_ERR("panel gpio pins not defined\n"); + rc = pin_count; + goto end; + } + + pins = kzalloc(sizeof(u32) * pin_count, GFP_KERNEL); + if (!pins) { + rc = -ENOMEM; + goto end; + } + + rc = utils->read_u32_array(utils->data, "qcom,dsi-panel-gpio-pins", + pins, pin_count); + if (rc) { + DSI_ERR("panel gpio pins not defined correctly\n"); + goto end; + } + + for (i = 0; i < pin_count; i++) { + io_mem = kzalloc(sizeof(*io_mem), GFP_KERNEL); + if (!io_mem) { + rc = -ENOMEM; + goto parse_fail; + } + + io_mem->base = base + (pins[i] * size); + io_mem->size = size; + + list_add(&io_mem->list, &temp_head); + } + + list_splice(&temp_head, mem_list); + goto end; + +parse_fail: + list_for_each_entry_safe(pos, tmp, &temp_head, list) { + list_del(&pos->list); + kzfree(pos); + } +end: + kzfree(pins); + kzfree(address); + return rc; +} + static int dsi_panel_parse_gpios(struct dsi_panel *panel) { int rc = 0; diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 614cc2787c92..2c88f960dfa4 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -364,6 +364,9 @@ int dsi_panel_parse_esd_reg_read_configs(struct dsi_panel *panel); void dsi_panel_ext_bridge_put(struct dsi_panel *panel); +int dsi_panel_get_io_resources(struct dsi_panel *panel, + struct msm_io_res *io_res); + void dsi_panel_calc_dsi_transfer_time(struct dsi_host_common_cfg *config, struct dsi_display_mode *mode, u32 frame_threshold_us);