if (of_address_to_resource(np, 0, &res)) return ERR_PTR(-ENOMEM);
base = of_iomap(np, 0); if (!base) return ERR_PTR(-ENOMEM);
/* Parse the device's DT node for an endianness specification */ if (of_property_read_bool(np, "big-endian"))
syscon_config.val_format_endian = REGMAP_ENDIAN_BIG; elseif (of_property_read_bool(np, "little-endian"))
syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE; elseif (of_property_read_bool(np, "native-endian"))
syscon_config.val_format_endian = REGMAP_ENDIAN_NATIVE;
/* * search for reg-io-width property in DT. If it is not provided, * default to 4 bytes. regmap_init_mmio will return an error if values * are invalid so there is no need to check them here.
*/
ret = of_property_read_u32(np, "reg-io-width", ®_io_width); if (ret)
reg_io_width = 4;
ret = of_hwspin_lock_get_id(np, 0); if (ret > 0 || (IS_ENABLED(CONFIG_HWSPINLOCK) && ret == 0)) {
syscon_config.use_hwlock = true;
syscon_config.hwlock_id = ret;
syscon_config.hwlock_mode = HWLOCK_IRQSTATE;
} elseif (ret < 0) { switch (ret) { case -ENOENT: /* Ignore missing hwlock, it's optional. */ break; default:
pr_err("Failed to retrieve valid hwlock: %d\n", ret);
fallthrough; case -EPROBE_DEFER: goto err_regmap;
}
}
res_size = resource_size(&res); if (res_size < reg_io_width) {
ret = -EFAULT; goto err_regmap;
}
if (!syscon) { if (create_regmap)
syscon = of_syscon_register(np, check_res); else
syscon = ERR_PTR(-EINVAL);
}
mutex_unlock(&syscon_list_lock);
if (IS_ERR(syscon)) return ERR_CAST(syscon);
return syscon->regmap;
}
/** * of_syscon_register_regmap() - Register regmap for specified device node * @np: Device tree node * @regmap: Pointer to regmap object * * Register an externally created regmap object with syscon for the specified * device tree node. This regmap will then be returned to client drivers using * the syscon_regmap_lookup_by_phandle() API. * * Return: 0 on success, negative error code on failure.
*/ int of_syscon_register_regmap(struct device_node *np, struct regmap *regmap)
{ struct syscon *entry, *syscon = NULL; int ret;
if (!np || !regmap) return -EINVAL;
syscon = kzalloc(sizeof(*syscon), GFP_KERNEL); if (!syscon) return -ENOMEM;
/* check if syscon entry already exists */
mutex_lock(&syscon_list_lock);
list_for_each_entry(entry, &syscon_list, list) if (entry->np == np) {
ret = -EEXIST; goto err_unlock;
}
syscon->regmap = regmap;
syscon->np = np;
/* register the regmap in syscon list */
list_add_tail(&syscon->list, &syscon_list);
mutex_unlock(&syscon_list_lock);
/** * device_node_to_regmap() - Get or create a regmap for specified device node * @np: Device tree node * * Get a regmap for the specified device node. If there's not an existing * regmap, then one is instantiated. This function should not be used if the * device node has a custom regmap driver or has resources (clocks, resets) to * be managed. Use syscon_node_to_regmap() instead for those cases. * * Return: regmap ptr on success, negative error code on failure.
*/ struct regmap *device_node_to_regmap(struct device_node *np)
{ return device_node_get_regmap(np, true, false);
}
EXPORT_SYMBOL_GPL(device_node_to_regmap);
/** * syscon_node_to_regmap() - Get or create a regmap for specified syscon device node * @np: Device tree node * * Get a regmap for the specified device node. If there's not an existing * regmap, then one is instantiated if the node is a generic "syscon". This * function is safe to use for a syscon registered with * of_syscon_register_regmap(). * * Return: regmap ptr on success, negative error code on failure.
*/ struct regmap *syscon_node_to_regmap(struct device_node *np)
{ return device_node_get_regmap(np, of_device_is_compatible(np, "syscon"), true);
}
EXPORT_SYMBOL_GPL(syscon_node_to_regmap);
/* * It behaves the same as syscon_regmap_lookup_by_phandle() except where * there is no regmap phandle. In this case, instead of returning -ENODEV, * the function returns NULL.
*/ struct regmap *syscon_regmap_lookup_by_phandle_optional(struct device_node *np, constchar *property)
{ struct regmap *regmap;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.0Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.