Lines Matching +full:peak +full:- +full:to +full:- +full:peak
1 /* SPDX-License-Identifier: GPL-2.0 */
8 #include <linux/interconnect-clk.h>
9 #include <linux/interconnect-provider.h>
27 struct icc_clk_node *qn = src->data; in icc_clk_set()
30 if (!qn || !qn->clk) in icc_clk_set()
33 if (!src->peak_bw) { in icc_clk_set()
34 if (qn->enabled) in icc_clk_set()
35 clk_disable_unprepare(qn->clk); in icc_clk_set()
36 qn->enabled = false; in icc_clk_set()
41 if (!qn->enabled) { in icc_clk_set()
42 ret = clk_prepare_enable(qn->clk); in icc_clk_set()
45 qn->enabled = true; in icc_clk_set()
48 return clk_set_rate(qn->clk, icc_units_to_bps(src->peak_bw)); in icc_clk_set()
51 static int icc_clk_get_bw(struct icc_node *node, u32 *avg, u32 *peak) in icc_clk_get_bw() argument
53 struct icc_clk_node *qn = node->data; in icc_clk_get_bw()
55 if (!qn || !qn->clk) in icc_clk_get_bw()
56 *peak = INT_MAX; in icc_clk_get_bw()
58 *peak = Bps_to_icc(clk_get_rate(qn->clk)); in icc_clk_get_bw()
64 * icc_clk_register() - register a new clk-based interconnect provider
70 * Registers and returns a clk-based interconnect provider. It is a simple
71 * wrapper around COMMON_CLK framework, allowing other devices to vote on the
89 return ERR_PTR(-ENOMEM); in icc_clk_register()
90 onecell->num_nodes = 2 * num_clocks; in icc_clk_register()
94 return ERR_PTR(-ENOMEM); in icc_clk_register()
96 qp->num_clocks = num_clocks; in icc_clk_register()
98 provider = &qp->provider; in icc_clk_register()
99 provider->dev = dev; in icc_clk_register()
100 provider->get_bw = icc_clk_get_bw; in icc_clk_register()
101 provider->set = icc_clk_set; in icc_clk_register()
102 provider->aggregate = icc_std_aggregate; in icc_clk_register()
103 provider->xlate = of_icc_xlate_onecell; in icc_clk_register()
104 INIT_LIST_HEAD(&provider->nodes); in icc_clk_register()
105 provider->data = onecell; in icc_clk_register()
110 qp->clocks[i].clk = data[i].clk; in icc_clk_register()
118 node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_master", data[i].name); in icc_clk_register()
119 if (!node->name) { in icc_clk_register()
120 icc_node_destroy(node->id); in icc_clk_register()
121 ret = -ENOMEM; in icc_clk_register()
125 node->data = &qp->clocks[i]; in icc_clk_register()
127 /* link to the next node, slave */ in icc_clk_register()
129 onecell->nodes[j++] = node; in icc_clk_register()
137 node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name); in icc_clk_register()
138 if (!node->name) { in icc_clk_register()
139 icc_node_destroy(node->id); in icc_clk_register()
140 ret = -ENOMEM; in icc_clk_register()
146 onecell->nodes[j++] = node; in icc_clk_register()
181 * icc_clk_unregister() - unregister a previously registered clk interconnect provider
189 icc_provider_deregister(&qp->provider); in icc_clk_unregister()
190 icc_nodes_remove(&qp->provider); in icc_clk_unregister()
192 for (i = 0; i < qp->num_clocks; i++) { in icc_clk_unregister()
193 struct icc_clk_node *qn = &qp->clocks[i]; in icc_clk_unregister()
195 if (qn->enabled) in icc_clk_unregister()
196 clk_disable_unprepare(qn->clk); in icc_clk_unregister()