• Home
  • Raw
  • Download

Lines Matching +full:clk +full:- +full:provider

1 /* SPDX-License-Identifier: GPL-2.0 */
6 #include <linux/clk.h>
8 #include <linux/interconnect-clk.h>
9 #include <linux/interconnect-provider.h>
12 struct clk *clk; member
17 struct icc_provider provider; member
23 container_of(_provider, struct icc_clk_provider, provider)
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()
53 struct icc_clk_node *qn = node->data; in icc_clk_get_bw()
55 if (!qn || !qn->clk) 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
65 * @dev: device supporting this provider
66 * @first_id: an ID of the first provider's node
68 * @data: data for the provider
70 * Registers and returns a clk-based interconnect provider. It is a simple
82 struct icc_provider *provider; in icc_clk_register() local
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()
107 icc_provider_init(provider); 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 node->data = &qp->clocks[i]; in icc_clk_register()
120 icc_node_add(node, provider); in icc_clk_register()
123 onecell->nodes[j++] = node; in icc_clk_register()
131 node->name = devm_kasprintf(dev, GFP_KERNEL, "%s_slave", data[i].name); in icc_clk_register()
133 icc_node_add(node, provider); in icc_clk_register()
134 onecell->nodes[j++] = node; in icc_clk_register()
137 ret = icc_provider_register(provider); in icc_clk_register()
141 return provider; in icc_clk_register()
144 icc_nodes_remove(provider); in icc_clk_register()
151 * icc_clk_unregister() - unregister a previously registered clk interconnect provider
152 * @provider: provider returned by icc_clk_register()
154 void icc_clk_unregister(struct icc_provider *provider) in icc_clk_unregister() argument
156 struct icc_clk_provider *qp = container_of(provider, struct icc_clk_provider, provider); in icc_clk_unregister()
159 icc_provider_deregister(&qp->provider); in icc_clk_unregister()
160 icc_nodes_remove(&qp->provider); in icc_clk_unregister()
162 for (i = 0; i < qp->num_clocks; i++) { in icc_clk_unregister()
163 struct icc_clk_node *qn = &qp->clocks[i]; in icc_clk_unregister()
165 if (qn->enabled) in icc_clk_unregister()
166 clk_disable_unprepare(qn->clk); in icc_clk_unregister()