for (i = 0; i < num_maps; ++i) {
kfree_const(map[i].dev_name);
map[i].dev_name = NULL;
}
if (pctldev) { conststruct pinctrl_ops *ops = pctldev->desc->pctlops; if (ops->dt_free_map)
ops->dt_free_map(pctldev, map, num_maps);
} else { /* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */
kfree(map);
}
}
/* Find the pin controller containing np_config */
np_pctldev = of_node_get(np_config); for (;;) { if (!allow_default)
allow_default = of_property_read_bool(np_pctldev, "pinctrl-use-default");
np_pctldev = of_get_next_parent(np_pctldev); if (!np_pctldev || of_node_is_root(np_pctldev)) {
of_node_put(np_pctldev);
ret = -ENODEV; /* keep deferring if modules are enabled */ if (IS_ENABLED(CONFIG_MODULES) && !allow_default && ret < 0)
ret = -EPROBE_DEFER; return ret;
} /* If we're creating a hog we can use the passed pctldev */ if (hog_pctldev && (np_pctldev == p->dev->of_node)) {
pctldev = hog_pctldev; break;
}
pctldev = get_pinctrl_dev_from_of_node(np_pctldev); if (pctldev) break; /* *Donotdeferprobingofhogs(circularloop) * *Return1toletthecallercatchthecase.
*/ if (np_pctldev == p->dev->of_node) {
of_node_put(np_pctldev); return1;
}
}
of_node_put(np_pctldev);
/* *Callpinctrldrivertoparsedevicetreenode,and *generatemappingtableentries
*/
ops = pctldev->desc->pctlops; if (!ops->dt_node_to_map) {
dev_err(p->dev, "pctldev %s doesn't support DT\n",
dev_name(pctldev->dev)); return -ENODEV;
}
ret = ops->dt_node_to_map(pctldev, np_config, &map, &num_maps); if (ret < 0) return ret; elseif (num_maps == 0) { /* *Ifwehavenovalidmaps(maybecausedbyemptypinctrlnode *ortypingerror)therisnoneedrememberthis,sojust *return.
*/
dev_info(p->dev, "there is not valid maps for state %s\n", statename); return0;
}
/* Stash the mapping table chunk away for later use */ return dt_remember_or_free_map(p, statename, pctldev, map, num_maps);
}
/* CONFIG_OF enabled, p->dev not instantiated from DT */ if (!np) { if (of_have_populated_dt())
dev_dbg(p->dev, "no of_node; not parsing pinctrl DT\n"); return0;
}
/* We may store pointers to property names within the node */
of_node_get(np);
/* For each defined state ID */ for (state = 0; ; state++) { /* Retrieve the pinctrl-* property */
propname = kasprintf(GFP_KERNEL, "pinctrl-%d", state); if (!propname) {
ret = -ENOMEM; goto err;
}
prop = of_find_property(np, propname, &size);
kfree(propname); if (!prop) { if (state == 0) {
ret = -ENODEV; goto err;
} break;
}
list = prop->value;
size /= sizeof(*list);
/* Determine whether pinctrl-names property names the state */
ret = of_property_read_string_index(np, "pinctrl-names",
state, &statename); /* *Ifnot,statenameisjusttheintegerstateID.Butrather *thandynamicallyallocateitandhavetofreeitlater, *justpointpartwayintothepropertynameforthestring.
*/ if (ret < 0)
statename = prop->name + strlen("pinctrl-");
/* For every referenced pin configuration node in it */ for (config = 0; config < size; config++) {
phandle = be32_to_cpup(list++);
/* Look up the pin configuration node */
np_config = of_find_node_by_phandle(phandle); if (!np_config) {
dev_err(p->dev, "prop %s index %i invalid phandle\n",
prop->name, config);
ret = -EINVAL; goto err;
}
/* Parse the node */
ret = dt_to_map_one_config(p, pctldev, statename,
np_config);
of_node_put(np_config); if (ret == 1) continue; if (ret < 0) goto err;
}
/* No entries in DT? Generate a dummy state table entry */ if (!size) {
ret = dt_remember_dummy_state(p, statename); if (ret < 0) goto err;
}
}
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.