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

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
8 #include <linux/clk.h>
9 #include <linux/interconnect-provider.h>
16 #include <dt-bindings/interconnect/qcom,osm-l3.h>
38 container_of(_provider, struct qcom_osm_l3_icc_provider, provider)
45 struct icc_provider provider; member
49 * struct qcom_osm_l3_node - Qualcomm specific interconnect nodes
129 struct icc_provider *provider; in qcom_osm_l3_set() local
134 qn = src->data; in qcom_osm_l3_set()
135 provider = src->provider; in qcom_osm_l3_set()
136 qp = to_osm_l3_provider(provider); in qcom_osm_l3_set()
138 rate = icc_units_to_bps(dst->peak_bw); in qcom_osm_l3_set()
139 do_div(rate, qn->buswidth); in qcom_osm_l3_set()
141 for (index = 0; index < qp->max_state - 1; index++) { in qcom_osm_l3_set()
142 if (qp->lut_tables[index] >= rate) in qcom_osm_l3_set()
146 writel_relaxed(index, qp->base + qp->reg_perf_state); in qcom_osm_l3_set()
155 icc_provider_deregister(&qp->provider); in qcom_osm_l3_remove()
156 icc_nodes_remove(&qp->provider); in qcom_osm_l3_remove()
168 struct icc_provider *provider; in qcom_osm_l3_probe() local
172 struct clk *clk; in qcom_osm_l3_probe() local
175 clk = clk_get(&pdev->dev, "xo"); in qcom_osm_l3_probe()
176 if (IS_ERR(clk)) in qcom_osm_l3_probe()
177 return PTR_ERR(clk); in qcom_osm_l3_probe()
179 xo_rate = clk_get_rate(clk); in qcom_osm_l3_probe()
180 clk_put(clk); in qcom_osm_l3_probe()
182 clk = clk_get(&pdev->dev, "alternate"); in qcom_osm_l3_probe()
183 if (IS_ERR(clk)) in qcom_osm_l3_probe()
184 return PTR_ERR(clk); in qcom_osm_l3_probe()
186 hw_rate = clk_get_rate(clk) / CLK_HW_DIV; in qcom_osm_l3_probe()
187 clk_put(clk); in qcom_osm_l3_probe()
189 qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL); in qcom_osm_l3_probe()
191 return -ENOMEM; in qcom_osm_l3_probe()
193 qp->base = devm_platform_ioremap_resource(pdev, 0); in qcom_osm_l3_probe()
194 if (IS_ERR(qp->base)) in qcom_osm_l3_probe()
195 return PTR_ERR(qp->base); in qcom_osm_l3_probe()
198 if (!(readl_relaxed(qp->base + REG_ENABLE) & 0x1)) { in qcom_osm_l3_probe()
199 dev_err(&pdev->dev, "error hardware not enabled\n"); in qcom_osm_l3_probe()
200 return -ENODEV; in qcom_osm_l3_probe()
203 desc = device_get_match_data(&pdev->dev); in qcom_osm_l3_probe()
205 return -EINVAL; in qcom_osm_l3_probe()
207 qp->reg_perf_state = desc->reg_perf_state; in qcom_osm_l3_probe()
210 info = readl_relaxed(qp->base + desc->reg_freq_lut + in qcom_osm_l3_probe()
211 i * desc->lut_row_size); in qcom_osm_l3_probe()
223 dev_dbg(&pdev->dev, "index=%d freq=%d\n", i, freq); in qcom_osm_l3_probe()
225 qp->lut_tables[i] = freq; in qcom_osm_l3_probe()
228 qp->max_state = i; in qcom_osm_l3_probe()
230 qnodes = desc->nodes; in qcom_osm_l3_probe()
231 num_nodes = desc->num_nodes; in qcom_osm_l3_probe()
233 data = devm_kzalloc(&pdev->dev, struct_size(data, nodes, num_nodes), GFP_KERNEL); in qcom_osm_l3_probe()
235 return -ENOMEM; in qcom_osm_l3_probe()
236 data->num_nodes = num_nodes; in qcom_osm_l3_probe()
238 provider = &qp->provider; in qcom_osm_l3_probe()
239 provider->dev = &pdev->dev; in qcom_osm_l3_probe()
240 provider->set = qcom_osm_l3_set; in qcom_osm_l3_probe()
241 provider->aggregate = icc_std_aggregate; in qcom_osm_l3_probe()
242 provider->xlate = of_icc_xlate_onecell; in qcom_osm_l3_probe()
243 provider->data = data; in qcom_osm_l3_probe()
245 icc_provider_init(provider); in qcom_osm_l3_probe()
250 node = icc_node_create(qnodes[i]->id); in qcom_osm_l3_probe()
256 node->name = qnodes[i]->name; in qcom_osm_l3_probe()
258 node->data = (void *)qnodes[i]; in qcom_osm_l3_probe()
259 icc_node_add(node, provider); in qcom_osm_l3_probe()
261 for (j = 0; j < qnodes[i]->num_links; j++) in qcom_osm_l3_probe()
262 icc_link_create(node, qnodes[i]->links[j]); in qcom_osm_l3_probe()
264 data->nodes[i] = node; in qcom_osm_l3_probe()
267 ret = icc_provider_register(provider); in qcom_osm_l3_probe()
275 icc_nodes_remove(provider); in qcom_osm_l3_probe()
281 { .compatible = "qcom,epss-l3", .data = &epss_l3_l3_vote },
282 { .compatible = "qcom,osm-l3", .data = &osm_l3 },
283 { .compatible = "qcom,sc7180-osm-l3", .data = &osm_l3 },
284 { .compatible = "qcom,sc7280-epss-l3", .data = &epss_l3_perf_state },
285 { .compatible = "qcom,sdm845-osm-l3", .data = &osm_l3 },
286 { .compatible = "qcom,sm8150-osm-l3", .data = &osm_l3 },
287 { .compatible = "qcom,sc8180x-osm-l3", .data = &osm_l3 },
288 { .compatible = "qcom,sm8250-epss-l3", .data = &epss_l3_perf_state },
297 .name = "osm-l3",