static int power_on_l2_cache(struct device_node *l2ccc_node, int cpu) { int ret, i; const char *compat; ret = of_property_read_string(l2ccc_node, "compatible", &compat); if (ret) return ret; for (i = 0; i < ARRAY_SIZE(l2ccc_info); i++) { const struct msm_l2ccc_of_info *ptr = &l2ccc_info[i]; if (!of_compat_cmp(ptr->compat, compat, strlen(compat))) return ptr->l2_power_on(l2ccc_node, ptr->l2_power_on_mask, cpu); } pr_err("Compat string not found for L2CCC node\n"); return -EIO; }
/** Checks if the given "compat" string matches one of the strings in * the device's "compatible" property */ static int __of_device_is_compatible(const struct device_node *device, const char *compat) { const char* cp; int cplen, l; cp = __of_get_property(device, "compatible", &cplen); if (cp == NULL) return 0; while (cplen > 0) { if (of_compat_cmp(cp, compat, strlen(compat)) == 0) return 1; l = strlen(cp) + 1; cp += l; cplen -= l; } return 0; }
/** * of_fdt_is_compatible - Return true if given node from the given blob has * compat in its compatible list * @blob: A device tree blob * @node: node to test * @compat: compatible string to compare with compatible list. * * On match, returns a non-zero value with smaller values returned for more * specific compatible values. */ int of_fdt_is_compatible(struct boot_param_header *blob, unsigned long node, const char *compat) { const char *cp; unsigned long cplen, l, score = 0; cp = of_fdt_get_property(blob, node, "compatible", &cplen); if (cp == NULL) return 0; while (cplen > 0) { score++; if (of_compat_cmp(cp, compat, strlen(compat)) == 0) return score; l = strlen(cp) + 1; cp += l; cplen -= l; } return 0; }
/** * of_fdt_is_compatible - Return true if given node from the given blob has * compat in its compatible list * @blob: A device tree blob * @node: node to test * @compat: compatible string to compare with compatible list. * * On match, returns a non-zero value with smaller values returned for more * specific compatible values. */ int of_fdt_is_compatible(const void *blob, unsigned long node, const char *compat) { const char *cp; int cplen; unsigned long l, score = 0; cp = fdt_getprop(blob, node, "compatible", &cplen); if (cp == NULL) return 0; while (cplen > 0) { score++; if (of_compat_cmp(cp, compat, strlen(compat)) == 0) return score; l = strlen(cp) + 1; cp += l; cplen -= l; } return 0; }
int of_device_is_compatible(const struct device_node *device, const char *compat, const char *type, const char *name) { struct property *prop; const char *cp; int index = 0, score = 0; /* Compatible match has highest priority */ if (compat && compat[0]) { prop = of_find_property(device, "compatible", NULL); for (cp = of_prop_next_string(prop, NULL); cp; cp = of_prop_next_string(prop, cp), index++) { if (of_compat_cmp(cp, compat, strlen(compat)) == 0) { score = INT_MAX/2 - (index << 2); break; } } if (!score) return 0; } /* Matching type is better than matching name */ if (type && type[0]) { if (!device->type || of_node_cmp(type, device->type)) return 0; score += 2; } /* Matching name is a bit better than not */ if (name && name[0]) { if (!device->name || of_node_cmp(name, device->name)) return 0; score++; } return score; }