Hi,
On Mon, Feb 24, 2020 at 11:12:28AM -0800, Tony Lindgren wrote:
In order to probe display subsystem (DSS) components with ti-sysc interconnect target module without legacy platform data and using devicetree, we need to update dss probing a bit.
In the device tree, we will be defining the data also for the interconnect target modules as DSS really is a private interconnect. There is some information about that in 4460 TRM in "Figure 10-3. DSS Integration" for example where it mentions "32-bit interconnect (SLX)".
The changes we need to make are:
Parse also device tree subnodes for the compatible property fixup
Update the component code to consider device tree subnodes
Cc: dri-devel@lists.freedesktop.org Cc: Jyri Sarha jsarha@ti.com Cc: Laurent Pinchart laurent.pinchart@ideasonboard.com Cc: Tomi Valkeinen tomi.valkeinen@ti.com Signed-off-by: Tony Lindgren tony@atomide.com
This is needed for dropping DSS platform data that I'll be posting seprately. If this looks OK, can you guys please test and ack?
Reviewed-by: Sebastian Reichel sebastian.reichel@collabora.com
FWIW, I dropped omapdss-boot-init.c in my patch series updating DSI code to use common panel infrastructure, so this will conflict.
-- Sebastian
drivers/gpu/drm/omapdrm/dss/dss.c | 25 ++++++++++++++++--- .../gpu/drm/omapdrm/dss/omapdss-boot-init.c | 25 +++++++++++++------ 2 files changed, 39 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c --- a/drivers/gpu/drm/omapdrm/dss/dss.c +++ b/drivers/gpu/drm/omapdrm/dss/dss.c @@ -1339,9 +1339,15 @@ static int dss_component_compare(struct device *dev, void *data) return dev == child; }
+struct dss_component_match_data {
- struct device *dev;
- struct component_match **match;
+};
static int dss_add_child_component(struct device *dev, void *data) {
- struct component_match **match = data;
struct dss_component_match_data *cmatch = data;
struct component_match **match = cmatch->match;
/*
- HACK
@@ -1352,7 +1358,17 @@ static int dss_add_child_component(struct device *dev, void *data) if (strstr(dev_name(dev), "rfbi")) return 0;
- component_match_add(dev->parent, match, dss_component_compare, dev);
/*
* Handle possible interconnect target modules defined within the DSS.
* The DSS components can be children of an interconnect target module
* after the device tree has been updated for the module data.
* See also omapdss_boot_init() for compatible fixup.
*/
if (strstr(dev_name(dev), "target-module"))
return device_for_each_child(dev, cmatch,
dss_add_child_component);
component_match_add(cmatch->dev, match, dss_component_compare, dev);
return 0;
} @@ -1395,6 +1411,7 @@ static int dss_probe_hardware(struct dss_device *dss) static int dss_probe(struct platform_device *pdev) { const struct soc_device_attribute *soc;
- struct dss_component_match_data cmatch; struct component_match *match = NULL; struct resource *dss_mem; struct dss_device *dss;
@@ -1472,7 +1489,9 @@ static int dss_probe(struct platform_device *pdev)
omapdss_gather_components(&pdev->dev);
- device_for_each_child(&pdev->dev, &match, dss_add_child_component);
cmatch.dev = &pdev->dev;
cmatch.match = &match;
device_for_each_child(&pdev->dev, &cmatch, dss_add_child_component);
r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match); if (r)
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c --- a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c +++ b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c @@ -183,9 +183,24 @@ static const struct of_device_id omapdss_of_fixups_whitelist[] __initconst = { {}, };
+static void __init omapdss_find_children(struct device_node *np) +{
- struct device_node *child;
- for_each_available_child_of_node(np, child) {
if (!of_find_property(child, "compatible", NULL))
continue;
omapdss_walk_device(child, true);
if (of_device_is_compatible(child, "ti,sysc"))
omapdss_find_children(child);
- }
+}
static int __init omapdss_boot_init(void) {
- struct device_node *dss, *child;
struct device_node *dss;
INIT_LIST_HEAD(&dss_conv_list);
@@ -195,13 +210,7 @@ static int __init omapdss_boot_init(void) return 0;
omapdss_walk_device(dss, true);
- for_each_available_child_of_node(dss, child) {
if (!of_find_property(child, "compatible", NULL))
continue;
omapdss_walk_device(child, true);
- }
omapdss_find_children(dss);
while (!list_empty(&dss_conv_list)) { struct dss_conv_node *n;
-- 2.25.1