/** * icc_clk_register() - register a new clk-based interconnect provider * @dev: device supporting this provider * @first_id: an ID of the first provider's node * @num_clocks: number of instances of struct icc_clk_data * @data: data for the provider * * Registers and returns a clk-based interconnect provider. It is a simple * wrapper around COMMON_CLK framework, allowing other devices to vote on the * clock rate. * * Return: 0 on success, or an error code otherwise
*/ struct icc_provider *icc_clk_register(struct device *dev, unsignedint first_id, unsignedint num_clocks, conststruct icc_clk_data *data)
{ struct icc_clk_provider *qp; struct icc_provider *provider; struct icc_onecell_data *onecell; struct icc_node *node; int ret, i, j;
for (i = 0, j = 0; i < num_clocks; i++) {
qp->clocks[i].clk = data[i].clk;
node = icc_node_create(first_id + data[i].master_id); if (IS_ERR(node)) {
ret = PTR_ERR(node); goto err;
}
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_master", data[i].name); if (!node->name) {
icc_node_destroy(node->id);
ret = -ENOMEM; goto err;
}
node->data = &qp->clocks[i];
icc_node_add(node, provider); /* link to the next node, slave */
icc_link_create(node, first_id + data[i].slave_id);
onecell->nodes[j++] = node;
node = icc_node_create(first_id + data[i].slave_id); if (IS_ERR(node)) {
ret = PTR_ERR(node); goto err;
}
node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name); if (!node->name) {
icc_node_destroy(node->id);
ret = -ENOMEM; goto err;
}
/* no data for slave node */
icc_node_add(node, provider);
onecell->nodes[j++] = node;
}
ret = icc_provider_register(provider); if (ret) 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.