Skip to content

Commit

Permalink
drm/omap: Prepare DSS for probing without legacy platform data
Browse files Browse the repository at this point in the history
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:

1. Parse also device tree subnodes for the compatible property fixup

2. 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>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Reviewed-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
  • Loading branch information
Tony Lindgren committed Feb 26, 2020
1 parent bb6d3fb commit cef7663
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 11 deletions.
25 changes: 22 additions & 3 deletions drivers/gpu/drm/omapdrm/dss/dss.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down
25 changes: 17 additions & 8 deletions drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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;
Expand Down

0 comments on commit cef7663

Please sign in to comment.