Hi Am 19.04.22 um 15:30 schrieb Rob Herring: ... >> -#ifndef CONFIG_PPC >> static const struct of_device_id reserved_mem_matches[] = { >> { .compatible = "qcom,rmtfs-mem" }, >> { .compatible = "qcom,cmd-db" }, >> @@ -520,33 +519,81 @@ static const struct of_device_id reserved_mem_matches[] = { >> >> static int __init of_platform_default_populate_init(void) >> { >> - struct device_node *node; >> - > > As both if/else clauses need 'node', I'd keep this declared here. Ok. > >> device_links_supplier_sync_state_pause(); >> >> if (!of_have_populated_dt()) >> return -ENODEV; >> >> - /* >> - * Handle certain compatibles explicitly, since we don't want to create >> - * platform_devices for every node in /reserved-memory with a >> - * "compatible", >> - */ >> - for_each_matching_node(node, reserved_mem_matches) >> - of_platform_device_create(node, NULL, NULL); >> + if (IS_ENABLED(CONFIG_PPC)) { >> + struct device_node *boot_display = NULL; >> + struct device_node *node; >> + struct platform_device *dev; >> + int ret; >> + >> + /* Check if we have a MacOS display without a node spec */ >> + if (of_get_property(of_chosen, "linux,bootx-noscreen", NULL)) { >> + /* >> + * The old code tried to work out which node was the MacOS >> + * display based on the address. I'm dropping that since the >> + * lack of a node spec only happens with old BootX versions >> + * (users can update) and with this code, they'll still get >> + * a display (just not the palette hacks). >> + */ >> + dev = platform_device_alloc("bootx-noscreen", 0); >> + if (WARN_ON(!dev)) >> + return -ENOMEM; >> + ret = platform_device_add(dev); >> + if (WARN_ON(ret)) { >> + platform_device_put(dev); >> + return ret; >> + } >> + } >> >> - node = of_find_node_by_path("/firmware"); >> - if (node) { >> - of_platform_populate(node, NULL, NULL, NULL); >> - of_node_put(node); >> - } >> + /* >> + * For OF framebuffers, first create the device for the boot display, >> + * then for the other framebuffers. Only fail for the boot display; >> + * ignore errors for the rest. >> + */ >> + for_each_node_by_type(node, "display") { >> + if (!of_get_property(node, "linux,opened", NULL) || >> + !of_get_property(node, "linux,boot-display", NULL)) >> + continue; >> + dev = of_platform_device_create(node, "of-display", NULL); >> + if (WARN_ON(!dev)) >> + return -ENOMEM; >> + boot_display = node; >> + break; >> + } >> + for_each_node_by_type(node, "display") { >> + if (!of_get_property(node, "linux,opened", NULL) || node == boot_display) >> + continue; >> + of_platform_device_create(node, "of-display", NULL); >> + } >> >> - node = of_get_compatible_child(of_chosen, "simple-framebuffer"); >> - of_platform_device_create(node, NULL, NULL); >> - of_node_put(node); >> + } else { >> + struct device_node *node; >> + >> + /* >> + * Handle certain compatibles explicitly, since we don't want to create >> + * platform_devices for every node in /reserved-memory with a >> + * "compatible", >> + */ >> + for_each_matching_node(node, reserved_mem_matches) >> + of_platform_device_create(node, NULL, NULL); >> >> - /* Populate everything else. */ >> - of_platform_default_populate(NULL, NULL, NULL); >> + node = of_find_node_by_path("/firmware"); >> + if (node) { >> + of_platform_populate(node, NULL, NULL, NULL); >> + of_node_put(node); >> + } >> + >> + node = of_get_compatible_child(of_chosen, "simple-framebuffer"); >> + of_platform_device_create(node, NULL, NULL); >> + of_node_put(node); > > In v1, you supported "simple-framebuffer" on PPC. Don't we want to allow > that? Maybe no one cares ATM, but that could change. Either way: Support for these framebuffers has always been mutually exclusive. The offb driver, which originally contained the code, depends on CONFIG_PPC. And PPC never supported simple-framebuffer anywhere. > > Reviewed-by: Rob Herring Thank you. Best regards Thomas > > >> + >> + /* Populate everything else. */ >> + of_platform_default_populate(NULL, NULL, NULL); >> + } >> >> return 0; >> } >> @@ -558,7 +605,6 @@ static int __init of_platform_sync_state_init(void) >> return 0; >> } >> late_initcall_sync(of_platform_sync_state_init); >> -#endif >> >> int of_platform_device_destroy(struct device *dev, void *data) >> { -- Thomas Zimmermann Graphics Driver Developer SUSE Software Solutions Germany GmbH Maxfeldstr. 5, 90409 Nürnberg, Germany (HRB 36809, AG Nürnberg) Geschäftsführer: Ivo Totev