Re: [PATCH 1/2][OF] Add of_device_is_disabled function
Josh Boyer wrote: On Sat, 23 Feb 2008 15:58:23 -0600 Josh Boyer [EMAIL PROTECTED] wrote: IEEE 1275 defined a standard status property to indicate the operational status of a device. The property has four possible values: okay, disabled, fail, fail-xxx. The absence of this property means the operational status of the device is unknown or okay. This adds a function called of_device_is_disabled that checks to see if a node has the status property set to disabled. This can be quite useful for devices that may be present but disabled due to pin sharing, etc. Talking with Ben H a bit, he suggested to reverse this API. Basically, create an of_device_is_available that returns 1 if the status property is completely missing, or if it's set to okay or ok. The latter is to cope with some broken firmwares. I agree with Ben's suggestion. The rtas_pci and eeh code could be converted to use this, which gives a net savings of a few bytes with ppc64_defconfig: diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index 433a0a0..39a752b 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c @@ -56,21 +56,6 @@ static inline int config_access_valid(struct pci_dn *dn, int where) return 0; } -static int of_device_available(struct device_node * dn) -{ -const char *status; - -status = of_get_property(dn, status, NULL); - -if (!status) -return 1; - -if (!strcmp(status, okay)) -return 1; - -return 0; -} - int rtas_read_config(struct pci_dn *pdn, int where, int size, u32 *val) { int returnval = -1; @@ -117,7 +102,7 @@ static int rtas_pci_read_config(struct pci_bus *bus, for (dn = busdn-child; dn; dn = dn-sibling) { struct pci_dn *pdn = PCI_DN(dn); if (pdn pdn-devfn == devfn -of_device_available(dn)) +of_device_is_available(dn)) return rtas_read_config(pdn, where, size, val); } @@ -164,7 +149,7 @@ static int rtas_pci_write_config(struct pci_bus *bus, for (dn = busdn-child; dn; dn = dn-sibling) { struct pci_dn *pdn = PCI_DN(dn); if (pdn pdn-devfn == devfn -of_device_available(dn)) +of_device_is_available(dn)) return rtas_write_config(pdn, where, size, val); } return PCIBIOS_DEVICE_NOT_FOUND; diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 9eb539e..550b2f7 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c @@ -945,7 +945,6 @@ static void *early_enable_eeh(struct device_node *dn, void *data) unsigned int rets[3]; struct eeh_early_enable_info *info = data; int ret; - const char *status = of_get_property(dn, status, NULL); const u32 *class_code = of_get_property(dn, class-code, NULL); const u32 *vendor_id = of_get_property(dn, vendor-id, NULL); const u32 *device_id = of_get_property(dn, device-id, NULL); @@ -959,8 +958,8 @@ static void *early_enable_eeh(struct device_node *dn, void *data) pdn-eeh_freeze_count = 0; pdn-eeh_false_positives = 0; - if (status strncmp(status, ok, 2) != 0) - return NULL;/* ignore devices with bad status */ + if (!of_device_is_available(dn)) + return NULL; /* Ignore bad nodes. */ if (!class_code || !vendor_id || !device_id) ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
[PATCH 1/2][OF] Add of_device_is_disabled function
IEEE 1275 defined a standard status property to indicate the operational status of a device. The property has four possible values: okay, disabled, fail, fail-xxx. The absence of this property means the operational status of the device is unknown or okay. This adds a function called of_device_is_disabled that checks to see if a node has the status property set to disabled. This can be quite useful for devices that may be present but disabled due to pin sharing, etc. Signed-off-by: Josh Boyer [EMAIL PROTECTED] --- drivers/of/base.c | 18 ++ include/linux/of.h |1 + 2 files changed, 19 insertions(+) --- linux-2.6.orig/drivers/of/base.c +++ linux-2.6/drivers/of/base.c @@ -117,6 +117,24 @@ int of_device_is_compatible(const struct EXPORT_SYMBOL(of_device_is_compatible); /** + * of_device_is_disabled - Check if a device's status is disabled + * @device: device node to check + * + * Returns true or false depending on the value of the staus property + */ +int of_device_is_disabled(const struct device_node *device) +{ + const char *status; + + status = of_get_property(device, status, NULL); + if (status == NULL) + return 0; + + return !(strcmp(status, disabled)); +} +EXPORT_SYMBOL(of_device_is_disabled); + +/** * of_get_parent - Get a node's parent if any * @node: Node to get parent * --- linux-2.6.orig/include/linux/of.h +++ linux-2.6/include/linux/of.h @@ -62,6 +62,7 @@ extern struct property *of_find_property int *lenp); extern int of_device_is_compatible(const struct device_node *device, const char *); +extern int of_device_is_disabled(const struct device_node *device); extern const void *of_get_property(const struct device_node *node, const char *name, int *lenp); ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 1/2][OF] Add of_device_is_disabled function
On Sat, 23 Feb 2008 15:58:23 -0600 Josh Boyer [EMAIL PROTECTED] wrote: IEEE 1275 defined a standard status property to indicate the operational status of a device. The property has four possible values: okay, disabled, fail, fail-xxx. The absence of this property means the operational status of the device is unknown or okay. This adds a function called of_device_is_disabled that checks to see if a node has the status property set to disabled. This can be quite useful for devices that may be present but disabled due to pin sharing, etc. Signed-off-by: Josh Boyer [EMAIL PROTECTED] Talking with Ben H a bit, he suggested to reverse this API. Basically, create an of_device_is_available that returns 1 if the status property is completely missing, or if it's set to okay or ok. The latter is to cope with some broken firmwares. I can do either really. Eventually you could embed the is_available check in the of_platform code so that devices don't even get presented to drivers if they aren't available. Dave, I'm not sure how applicable this all is to sparc. But for some of the newer embedded ports that are coming into powerpc I can see it being very useful. Thoughts? josh ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev
Re: [PATCH 1/2][OF] Add of_device_is_disabled function
From: Josh Boyer [EMAIL PROTECTED] Date: Sat, 23 Feb 2008 18:59:04 -0600 Dave, I'm not sure how applicable this all is to sparc. But for some of the newer embedded ports that are coming into powerpc I can see it being very useful. I think I've seen this property on sparc boxes too, I'm fine with whatever you guys come up with. ___ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev