From: Deepak Saxena <deepak_saxena@mentor.com>
To: devicetree-discuss@ozlabs.org
Cc: linuxppc-dev@lists.ozlabs.org
Subject: [PATCH 2/5] of/device: make for_each_node* check status properties
Date: Wed, 8 Dec 2010 11:29:57 -0800 [thread overview]
Message-ID: <20101208192957.GF32473@mentor.com> (raw)
In-Reply-To: <cover.1291799069.git.deepak_saxena@mentor.com>
Some early device drivers don't actually implement a struct of_platform_driver,
and instead use the for_each_node* iterators to search for matching device
nodes. Disabled device nodes will no longer be returned by these iterators.
Signed-off-by: Hollis Blanchard <hollis_blanchard@mentor.com>
Signed-off-by: Deepak Saxena <deepak_saxena@mentor.com>
---
arch/powerpc/kernel/pci_of_scan.c | 2 --
arch/powerpc/platforms/83xx/usb.c | 2 +-
arch/powerpc/platforms/85xx/mpc85xx_mds.c | 13 ++-----------
arch/powerpc/sysdev/fsl_pci.c | 5 -----
arch/powerpc/sysdev/ppc4xx_pci.c | 15 ---------------
drivers/of/base.c | 25 +++++++++++++++++++++++--
6 files changed, 26 insertions(+), 36 deletions(-)
diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c
index e751506..fa4f719 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -310,8 +310,6 @@ static void __devinit __of_scan_bus(struct device_node *node,
/* Scan direct children */
for_each_child_of_node(node, child) {
pr_debug(" * %s\n", child->full_name);
- if (!of_device_is_available(child))
- continue;
reg = of_get_property(child, "reg", ®len);
if (reg == NULL || reglen < 20)
continue;
diff --git a/arch/powerpc/platforms/83xx/usb.c b/arch/powerpc/platforms/83xx/usb.c
index 3ba4bb7..749c70b 100644
--- a/arch/powerpc/platforms/83xx/usb.c
+++ b/arch/powerpc/platforms/83xx/usb.c
@@ -211,7 +211,7 @@ int mpc837x_usb_cfg(void)
int ret = 0;
np = of_find_compatible_node(NULL, NULL, "fsl-usb2-dr");
- if (!np || !of_device_is_available(np))
+ if (!np)
return -ENODEV;
prop = of_get_property(np, "phy_type", NULL);
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
index aa34cac..5d1a33f 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
@@ -170,10 +170,8 @@ static void __init mpc85xx_publish_qe_devices(void)
struct device_node *np;
np = of_find_compatible_node(NULL, NULL, "fsl,qe");
- if (!of_device_is_available(np)) {
- of_node_put(np);
+ if (!np)
return;
- }
of_platform_bus_probe(NULL, mpc85xx_qe_ids, NULL);
}
@@ -267,11 +265,6 @@ static void __init mpc85xx_mds_qe_init(void)
return;
}
- if (!of_device_is_available(np)) {
- of_node_put(np);
- return;
- }
-
qe_reset();
of_node_put(np);
@@ -328,10 +321,8 @@ static void __init mpc85xx_mds_qeic_init(void)
struct device_node *np;
np = of_find_compatible_node(NULL, NULL, "fsl,qe");
- if (!of_device_is_available(np)) {
- of_node_put(np);
+ if (!np)
return;
- }
np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
if (!np) {
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index 818f7c6..fba4ec7 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -623,11 +623,6 @@ int __init mpc83xx_add_bridge(struct device_node *dev)
is_mpc83xx_pci = 1;
- if (!of_device_is_available(dev)) {
- pr_warning("%s: disabled by the firmware.\n",
- dev->full_name);
- return -ENODEV;
- }
pr_debug("Adding PCI host bridge %s\n", dev->full_name);
/* Fetch host bridge registers address */
diff --git a/arch/powerpc/sysdev/ppc4xx_pci.c b/arch/powerpc/sysdev/ppc4xx_pci.c
index 156aa7d..cf2adec 100644
--- a/arch/powerpc/sysdev/ppc4xx_pci.c
+++ b/arch/powerpc/sysdev/ppc4xx_pci.c
@@ -321,13 +321,6 @@ static void __init ppc4xx_probe_pci_bridge(struct device_node *np)
const int *bus_range;
int primary = 0;
- /* Check if device is enabled */
- if (!of_device_is_available(np)) {
- printk(KERN_INFO "%s: Port disabled via device-tree\n",
- np->full_name);
- return;
- }
-
/* Fetch config space registers address */
if (of_address_to_resource(np, 0, &rsrc_cfg)) {
printk(KERN_ERR "%s: Can't get PCI config register base !",
@@ -1890,14 +1883,6 @@ static void __init ppc4xx_probe_pciex_bridge(struct device_node *np)
port = &ppc4xx_pciex_ports[portno];
port->index = portno;
- /*
- * Check if device is enabled
- */
- if (!of_device_is_available(np)) {
- printk(KERN_INFO "PCIE%d: Port disabled via device-tree\n", port->index);
- return;
- }
-
port->node = of_node_get(np);
pval = of_get_property(np, "sdr-base", NULL);
if (pval == NULL) {
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 710b53b..5d269a4 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -344,6 +344,8 @@ EXPORT_SYMBOL(of_get_next_child);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_node_by_path(const char *path)
{
@@ -352,6 +354,7 @@ struct device_node *of_find_node_by_path(const char *path)
read_lock(&devtree_lock);
for (; np; np = np->allnext) {
if (np->full_name && (of_node_cmp(np->full_name, path) == 0)
+ && of_device_is_available(np)
&& of_node_get(np))
break;
}
@@ -370,6 +373,8 @@ EXPORT_SYMBOL(of_find_node_by_path);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_node_by_name(struct device_node *from,
const char *name)
@@ -380,6 +385,7 @@ struct device_node *of_find_node_by_name(struct device_node *from,
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext)
if (np->name && (of_node_cmp(np->name, name) == 0)
+ && of_device_is_available(np)
&& of_node_get(np))
break;
of_node_put(from);
@@ -399,6 +405,8 @@ EXPORT_SYMBOL(of_find_node_by_name);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_node_by_type(struct device_node *from,
const char *type)
@@ -409,6 +417,7 @@ struct device_node *of_find_node_by_type(struct device_node *from,
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext)
if (np->type && (of_node_cmp(np->type, type) == 0)
+ && of_device_is_available(np)
&& of_node_get(np))
break;
of_node_put(from);
@@ -430,6 +439,8 @@ EXPORT_SYMBOL(of_find_node_by_type);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_compatible_node(struct device_node *from,
const char *type, const char *compatible)
@@ -442,7 +453,9 @@ struct device_node *of_find_compatible_node(struct device_node *from,
if (type
&& !(np->type && (of_node_cmp(np->type, type) == 0)))
continue;
- if (of_device_is_compatible(np, compatible) && of_node_get(np))
+ if (of_device_is_compatible(np, compatible)
+ && of_device_is_available(np)
+ && of_node_get(np))
break;
}
of_node_put(from);
@@ -462,6 +475,8 @@ EXPORT_SYMBOL(of_find_compatible_node);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_node_with_property(struct device_node *from,
const char *prop_name)
@@ -472,6 +487,8 @@ struct device_node *of_find_node_with_property(struct device_node *from,
read_lock(&devtree_lock);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext) {
+ if (!of_device_is_available(np))
+ continue;
for (pp = np->properties; pp != 0; pp = pp->next) {
if (of_prop_cmp(pp->name, prop_name) == 0) {
of_node_get(np);
@@ -526,6 +543,8 @@ EXPORT_SYMBOL(of_match_node);
*
* Returns a node pointer with refcount incremented, use
* of_node_put() on it when done.
+ *
+ * Does not return nodes marked unavailable by a status property.
*/
struct device_node *of_find_matching_node(struct device_node *from,
const struct of_device_id *matches)
@@ -535,7 +554,9 @@ struct device_node *of_find_matching_node(struct device_node *from,
read_lock(&devtree_lock);
np = from ? from->allnext : allnodes;
for (; np; np = np->allnext) {
- if (of_match_node(matches, np) && of_node_get(np))
+ if (of_match_node(matches, np)
+ && of_device_is_available(np)
+ && of_node_get(np))
break;
}
of_node_put(from);
--
1.6.3.3
next prev parent reply other threads:[~2010-12-08 19:57 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1291799069.git.deepak_saxena@mentor.com>
2010-12-08 19:29 ` [PATCH 1/5] of/device: Centralize checking of 'status' properties Deepak Saxena
2010-12-31 7:43 ` Grant Likely
2010-12-08 19:29 ` [PATCH 4/5] of/device: Create _of_get_next_child() Deepak Saxena
2010-12-08 19:29 ` [PATCH 5/5] of/device: Show even unavailable nodes in procfs Deepak Saxena
2010-12-08 19:29 ` [PATCH 3/5] of/device: Make of_get_next_child() check status properties Deepak Saxena
2010-12-08 21:01 ` Scott Wood
2010-12-09 1:33 ` Michael Ellerman
2010-12-09 3:09 ` David Gibson
2010-12-15 18:35 ` Hollis Blanchard
2010-12-15 22:40 ` Michael Ellerman
2010-12-31 7:39 ` Grant Likely
2010-12-08 19:29 ` Deepak Saxena [this message]
2010-12-31 7:46 ` [PATCH 2/5] of/device: make for_each_node* " Grant Likely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101208192957.GF32473@mentor.com \
--to=deepak_saxena@mentor.com \
--cc=devicetree-discuss@ozlabs.org \
--cc=linuxppc-dev@lists.ozlabs.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).