drm/omap: Prepare DSS for probing without legacy platform data
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>
This commit is contained in:
parent
bb6d3fb354
commit
cef7663003
@ -1339,9 +1339,15 @@ static int dss_component_compare(struct device *dev, void *data)
|
|||||||
return dev == child;
|
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)
|
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
|
* HACK
|
||||||
@ -1352,7 +1358,17 @@ static int dss_add_child_component(struct device *dev, void *data)
|
|||||||
if (strstr(dev_name(dev), "rfbi"))
|
if (strstr(dev_name(dev), "rfbi"))
|
||||||
return 0;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1395,6 +1411,7 @@ static int dss_probe_hardware(struct dss_device *dss)
|
|||||||
static int dss_probe(struct platform_device *pdev)
|
static int dss_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct soc_device_attribute *soc;
|
const struct soc_device_attribute *soc;
|
||||||
|
struct dss_component_match_data cmatch;
|
||||||
struct component_match *match = NULL;
|
struct component_match *match = NULL;
|
||||||
struct resource *dss_mem;
|
struct resource *dss_mem;
|
||||||
struct dss_device *dss;
|
struct dss_device *dss;
|
||||||
@ -1472,7 +1489,9 @@ static int dss_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
omapdss_gather_components(&pdev->dev);
|
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);
|
r = component_master_add_with_match(&pdev->dev, &dss_component_ops, match);
|
||||||
if (r)
|
if (r)
|
||||||
|
@ -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)
|
static int __init omapdss_boot_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *dss, *child;
|
struct device_node *dss;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&dss_conv_list);
|
INIT_LIST_HEAD(&dss_conv_list);
|
||||||
|
|
||||||
@ -195,13 +210,7 @@ static int __init omapdss_boot_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
omapdss_walk_device(dss, true);
|
omapdss_walk_device(dss, true);
|
||||||
|
omapdss_find_children(dss);
|
||||||
for_each_available_child_of_node(dss, child) {
|
|
||||||
if (!of_find_property(child, "compatible", NULL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
omapdss_walk_device(child, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!list_empty(&dss_conv_list)) {
|
while (!list_empty(&dss_conv_list)) {
|
||||||
struct dss_conv_node *n;
|
struct dss_conv_node *n;
|
||||||
|
Loading…
Reference in New Issue
Block a user