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
WARNING: multiple messages have this Message-ID (diff)
From: Deepak Saxena <deepak_saxena-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
To: devicetree-discuss-mnsaURCQ41sdnm+yROfE0A@public.gmane.org
Cc: linuxppc-dev-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.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-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
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-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
Signed-off-by: Deepak Saxena <deepak_saxena-nmGgyN9QBj3QT0dZR+AlfA@public.gmane.org>
---
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: 23+ 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-08 19:29 ` 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 ` 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 ` 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 1:33 ` Michael Ellerman
2010-12-09 3:09 ` David Gibson
2010-12-09 3:09 ` David Gibson
2010-12-15 18:35 ` Hollis Blanchard
2010-12-15 18:35 ` Hollis Blanchard
2010-12-15 22:40 ` Michael Ellerman
2010-12-15 22:40 ` Michael Ellerman
2010-12-31 7:39 ` Grant Likely
2010-12-31 7:39 ` Grant Likely
2010-12-08 19:29 ` Deepak Saxena [this message]
2010-12-08 19:29 ` [PATCH 2/5] of/device: make for_each_node* " Deepak Saxena
2010-12-31 7:46 ` Grant Likely
2010-12-31 7:46 ` 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.