Loading drivers/gpu/drm/msm/dsi-staging/dsi_display.c +70 −62 Original line number Diff line number Diff line Loading @@ -48,13 +48,16 @@ static LIST_HEAD(dsi_display_list); static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN]; static char dsi_display_secondary[MAX_CMDLINE_PARAM_LEN]; static struct dsi_display_boot_param boot_displays[MAX_DSI_ACTIVE_DISPLAY]; static struct device_node *default_active_node; static struct device_node *primary_active_node; static struct device_node *secondary_active_node; static const struct of_device_id dsi_display_dt_match[] = { {.compatible = "qcom,dsi-display"}, {} }; static struct dsi_display *main_display; static struct dsi_display *primary_display; static struct dsi_display *secondary_display; static void dsi_display_mask_ctrl_error_interrupts(struct dsi_display *display) { Loading Loading @@ -2019,12 +2022,10 @@ static int dsi_display_parse_boot_display_selection(void) boot_displays[i].name[j] = *(disp_buf + j); boot_displays[i].name[j] = '\0'; if (i == DSI_PRIMARY) { if (i == DSI_PRIMARY) boot_displays[i].is_primary = true; /* Currently, secondary DSI display is not supported */ boot_displays[i].boot_disp_en = true; } } return 0; } Loading @@ -2046,6 +2047,8 @@ static bool validate_dsi_display_selection(void) for (i = 0; i < MAX_DSI_ACTIVE_DISPLAY; i++) { node = boot_displays[i].node; if (!node) continue; ctrl_count = of_count_phandle_with_args(node, "qcom,dsi-ctrl", NULL); Loading Loading @@ -2087,11 +2090,12 @@ struct device_node *dsi_display_get_boot_display(int index) pr_err("index = %d\n", index); if (boot_displays[index].node) return boot_displays[index].node; else if ((index == (MAX_DSI_ACTIVE_DISPLAY - 1)) && (default_active_node)) return default_active_node; if ((index == DSI_PRIMARY) && (primary_active_node)) return primary_active_node; else if ((index == DSI_SECONDARY) && (secondary_active_node)) return secondary_active_node; else return NULL; } Loading Loading @@ -4648,8 +4652,7 @@ int dsi_display_dev_probe(struct platform_device *pdev) { int rc = 0; struct dsi_display *display; static bool display_from_cmdline, boot_displays_parsed; static bool comp_add_success; static bool boot_displays_parsed; static struct device_node *primary_np, *secondary_np; if (!pdev || !pdev->dev.of_node) { Loading Loading @@ -4678,20 +4681,17 @@ int dsi_display_dev_probe(struct platform_device *pdev) display->cmdline_topology = NO_OVERRIDE; display->cmdline_timing = 0; if ((!display_from_cmdline) && (boot_displays[DSI_PRIMARY].boot_disp_en)) { display->is_active = dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_PRIMARY); if (display->is_active) { if (comp_add_success) { (void)_dsi_display_dev_deinit(main_display); component_del(&main_display->pdev->dev, if (boot_displays[DSI_PRIMARY].boot_disp_en && !primary_np && dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_PRIMARY)) { if (primary_display) { (void)_dsi_display_dev_deinit(primary_display); component_del(&primary_display->pdev->dev, &dsi_display_comp_ops); mutex_lock(&dsi_display_list_lock); list_del(&main_display->list); list_del(&primary_display->list); mutex_unlock(&dsi_display_list_lock); comp_add_success = false; default_active_node = NULL; primary_active_node = NULL; pr_debug("removed the existing comp ops\n"); } /* Loading @@ -4700,33 +4700,34 @@ int dsi_display_dev_probe(struct platform_device *pdev) * when more than one DSI display * is supported. */ pr_debug("cmdline primary dsi: %s\n", display->name); display_from_cmdline = true; dsi_display_parse_cmdline_topology(display, DSI_PRIMARY); pr_debug("cmdline primary dsi: %s\n", display->name); display->is_active = true; dsi_display_parse_cmdline_topology(display, DSI_PRIMARY); primary_np = pdev->dev.of_node; } } if (boot_displays[DSI_SECONDARY].boot_disp_en) { if (!secondary_np) { if (dsi_display_name_compare(pdev->dev.of_node, if (boot_displays[DSI_SECONDARY].boot_disp_en && !secondary_np && dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_SECONDARY)) { pr_debug("cmdline secondary dsi: %s\n", display->name); secondary_np = pdev->dev.of_node; if (primary_np) { pr_debug("cmdline secondary dsi: %s\n", display->name); if (validate_dsi_display_selection()) { if (secondary_display) { (void)_dsi_display_dev_deinit( secondary_display); component_del(&secondary_display->pdev->dev, &dsi_display_comp_ops); mutex_lock(&dsi_display_list_lock); list_del(&secondary_display->list); mutex_unlock(&dsi_display_list_lock); secondary_active_node = NULL; pr_debug("removed the existing comp ops\n"); } display->is_active = true; dsi_display_parse_cmdline_topology (display, DSI_SECONDARY); dsi_display_parse_cmdline_topology(display, DSI_SECONDARY); secondary_np = pdev->dev.of_node; } else { boot_displays[DSI_SECONDARY] .boot_disp_en = false; } } } boot_displays[DSI_SECONDARY].boot_disp_en = false; } } display->display_type = of_get_property(pdev->dev.of_node, Loading @@ -4741,12 +4742,18 @@ int dsi_display_dev_probe(struct platform_device *pdev) list_add(&display->list, &dsi_display_list); mutex_unlock(&dsi_display_list_lock); if (!display_from_cmdline) if (!strcmp(display->display_type, "primary") && !primary_np) display->is_active = of_property_read_bool(pdev->dev.of_node, "qcom,dsi-display-active"); else if (strcmp(display->display_type, "primary") && !secondary_np) display->is_active = of_property_read_bool(pdev->dev.of_node, "qcom,dsi-display-active"); if (display->is_active) { main_display = display; if (!strcmp(display->display_type, "primary")) primary_display = display; else secondary_display = display; rc = _dsi_display_dev_init(display); if (rc) { pr_err("device init failed, rc=%d\n", rc); Loading @@ -4757,10 +4764,11 @@ int dsi_display_dev_probe(struct platform_device *pdev) if (rc) pr_err("component add failed, rc=%d\n", rc); comp_add_success = true; pr_debug("Component_add success: %s\n", display->name); if (!display_from_cmdline) default_active_node = pdev->dev.of_node; if (!strcmp(display->display_type, "primary")) primary_active_node = pdev->dev.of_node; else secondary_active_node = pdev->dev.of_node; } return rc; } Loading Loading
drivers/gpu/drm/msm/dsi-staging/dsi_display.c +70 −62 Original line number Diff line number Diff line Loading @@ -48,13 +48,16 @@ static LIST_HEAD(dsi_display_list); static char dsi_display_primary[MAX_CMDLINE_PARAM_LEN]; static char dsi_display_secondary[MAX_CMDLINE_PARAM_LEN]; static struct dsi_display_boot_param boot_displays[MAX_DSI_ACTIVE_DISPLAY]; static struct device_node *default_active_node; static struct device_node *primary_active_node; static struct device_node *secondary_active_node; static const struct of_device_id dsi_display_dt_match[] = { {.compatible = "qcom,dsi-display"}, {} }; static struct dsi_display *main_display; static struct dsi_display *primary_display; static struct dsi_display *secondary_display; static void dsi_display_mask_ctrl_error_interrupts(struct dsi_display *display) { Loading Loading @@ -2019,12 +2022,10 @@ static int dsi_display_parse_boot_display_selection(void) boot_displays[i].name[j] = *(disp_buf + j); boot_displays[i].name[j] = '\0'; if (i == DSI_PRIMARY) { if (i == DSI_PRIMARY) boot_displays[i].is_primary = true; /* Currently, secondary DSI display is not supported */ boot_displays[i].boot_disp_en = true; } } return 0; } Loading @@ -2046,6 +2047,8 @@ static bool validate_dsi_display_selection(void) for (i = 0; i < MAX_DSI_ACTIVE_DISPLAY; i++) { node = boot_displays[i].node; if (!node) continue; ctrl_count = of_count_phandle_with_args(node, "qcom,dsi-ctrl", NULL); Loading Loading @@ -2087,11 +2090,12 @@ struct device_node *dsi_display_get_boot_display(int index) pr_err("index = %d\n", index); if (boot_displays[index].node) return boot_displays[index].node; else if ((index == (MAX_DSI_ACTIVE_DISPLAY - 1)) && (default_active_node)) return default_active_node; if ((index == DSI_PRIMARY) && (primary_active_node)) return primary_active_node; else if ((index == DSI_SECONDARY) && (secondary_active_node)) return secondary_active_node; else return NULL; } Loading Loading @@ -4648,8 +4652,7 @@ int dsi_display_dev_probe(struct platform_device *pdev) { int rc = 0; struct dsi_display *display; static bool display_from_cmdline, boot_displays_parsed; static bool comp_add_success; static bool boot_displays_parsed; static struct device_node *primary_np, *secondary_np; if (!pdev || !pdev->dev.of_node) { Loading Loading @@ -4678,20 +4681,17 @@ int dsi_display_dev_probe(struct platform_device *pdev) display->cmdline_topology = NO_OVERRIDE; display->cmdline_timing = 0; if ((!display_from_cmdline) && (boot_displays[DSI_PRIMARY].boot_disp_en)) { display->is_active = dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_PRIMARY); if (display->is_active) { if (comp_add_success) { (void)_dsi_display_dev_deinit(main_display); component_del(&main_display->pdev->dev, if (boot_displays[DSI_PRIMARY].boot_disp_en && !primary_np && dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_PRIMARY)) { if (primary_display) { (void)_dsi_display_dev_deinit(primary_display); component_del(&primary_display->pdev->dev, &dsi_display_comp_ops); mutex_lock(&dsi_display_list_lock); list_del(&main_display->list); list_del(&primary_display->list); mutex_unlock(&dsi_display_list_lock); comp_add_success = false; default_active_node = NULL; primary_active_node = NULL; pr_debug("removed the existing comp ops\n"); } /* Loading @@ -4700,33 +4700,34 @@ int dsi_display_dev_probe(struct platform_device *pdev) * when more than one DSI display * is supported. */ pr_debug("cmdline primary dsi: %s\n", display->name); display_from_cmdline = true; dsi_display_parse_cmdline_topology(display, DSI_PRIMARY); pr_debug("cmdline primary dsi: %s\n", display->name); display->is_active = true; dsi_display_parse_cmdline_topology(display, DSI_PRIMARY); primary_np = pdev->dev.of_node; } } if (boot_displays[DSI_SECONDARY].boot_disp_en) { if (!secondary_np) { if (dsi_display_name_compare(pdev->dev.of_node, if (boot_displays[DSI_SECONDARY].boot_disp_en && !secondary_np && dsi_display_name_compare(pdev->dev.of_node, display->name, DSI_SECONDARY)) { pr_debug("cmdline secondary dsi: %s\n", display->name); secondary_np = pdev->dev.of_node; if (primary_np) { pr_debug("cmdline secondary dsi: %s\n", display->name); if (validate_dsi_display_selection()) { if (secondary_display) { (void)_dsi_display_dev_deinit( secondary_display); component_del(&secondary_display->pdev->dev, &dsi_display_comp_ops); mutex_lock(&dsi_display_list_lock); list_del(&secondary_display->list); mutex_unlock(&dsi_display_list_lock); secondary_active_node = NULL; pr_debug("removed the existing comp ops\n"); } display->is_active = true; dsi_display_parse_cmdline_topology (display, DSI_SECONDARY); dsi_display_parse_cmdline_topology(display, DSI_SECONDARY); secondary_np = pdev->dev.of_node; } else { boot_displays[DSI_SECONDARY] .boot_disp_en = false; } } } boot_displays[DSI_SECONDARY].boot_disp_en = false; } } display->display_type = of_get_property(pdev->dev.of_node, Loading @@ -4741,12 +4742,18 @@ int dsi_display_dev_probe(struct platform_device *pdev) list_add(&display->list, &dsi_display_list); mutex_unlock(&dsi_display_list_lock); if (!display_from_cmdline) if (!strcmp(display->display_type, "primary") && !primary_np) display->is_active = of_property_read_bool(pdev->dev.of_node, "qcom,dsi-display-active"); else if (strcmp(display->display_type, "primary") && !secondary_np) display->is_active = of_property_read_bool(pdev->dev.of_node, "qcom,dsi-display-active"); if (display->is_active) { main_display = display; if (!strcmp(display->display_type, "primary")) primary_display = display; else secondary_display = display; rc = _dsi_display_dev_init(display); if (rc) { pr_err("device init failed, rc=%d\n", rc); Loading @@ -4757,10 +4764,11 @@ int dsi_display_dev_probe(struct platform_device *pdev) if (rc) pr_err("component add failed, rc=%d\n", rc); comp_add_success = true; pr_debug("Component_add success: %s\n", display->name); if (!display_from_cmdline) default_active_node = pdev->dev.of_node; if (!strcmp(display->display_type, "primary")) primary_active_node = pdev->dev.of_node; else secondary_active_node = pdev->dev.of_node; } return rc; } Loading