Merge "disp: msm: dsi: add parsing logic for panel gpio pins/address"

This commit is contained in:
qctecmdr
2020-08-21 12:36:22 -07:00
committato da Gerrit - the friendly Code Review server
6 ha cambiato i file con 152 aggiunte e 0 eliminazioni

Vedi File

@@ -5216,12 +5216,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;
}

Vedi File

@@ -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;

Vedi File

@@ -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);