Lines Matching +full:osm +full:- +full:l3
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
9 #include <linux/interconnect-provider.h>
16 #include <dt-bindings/interconnect/qcom,osm-l3.h>
23 /* OSM Register offsets */
49 * struct qcom_osm_l3_node - Qualcomm specific interconnect nodes
134 qn = src->data; in qcom_osm_l3_set()
135 provider = src->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()
173 clk = clk_get(&pdev->dev, "xo"); in qcom_osm_l3_probe()
180 clk = clk_get(&pdev->dev, "alternate"); in qcom_osm_l3_probe()
187 qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL); in qcom_osm_l3_probe()
189 return -ENOMEM; in qcom_osm_l3_probe()
191 qp->base = devm_platform_ioremap_resource(pdev, 0); in qcom_osm_l3_probe()
192 if (IS_ERR(qp->base)) in qcom_osm_l3_probe()
193 return PTR_ERR(qp->base); in qcom_osm_l3_probe()
196 if (!(readl_relaxed(qp->base + REG_ENABLE) & 0x1)) { in qcom_osm_l3_probe()
197 dev_err(&pdev->dev, "error hardware not enabled\n"); in qcom_osm_l3_probe()
198 return -ENODEV; in qcom_osm_l3_probe()
201 desc = device_get_match_data(&pdev->dev); in qcom_osm_l3_probe()
203 return -EINVAL; in qcom_osm_l3_probe()
205 qp->reg_perf_state = desc->reg_perf_state; in qcom_osm_l3_probe()
208 info = readl_relaxed(qp->base + desc->reg_freq_lut + in qcom_osm_l3_probe()
209 i * desc->lut_row_size); in qcom_osm_l3_probe()
221 dev_dbg(&pdev->dev, "index=%d freq=%d\n", i, freq); in qcom_osm_l3_probe()
223 qp->lut_tables[i] = freq; in qcom_osm_l3_probe()
226 qp->max_state = i; in qcom_osm_l3_probe()
228 qnodes = desc->nodes; in qcom_osm_l3_probe()
229 num_nodes = desc->num_nodes; in qcom_osm_l3_probe()
231 data = devm_kzalloc(&pdev->dev, struct_size(data, nodes, num_nodes), GFP_KERNEL); in qcom_osm_l3_probe()
233 return -ENOMEM; in qcom_osm_l3_probe()
234 data->num_nodes = num_nodes; in qcom_osm_l3_probe()
236 provider = &qp->provider; in qcom_osm_l3_probe()
237 provider->dev = &pdev->dev; in qcom_osm_l3_probe()
238 provider->set = qcom_osm_l3_set; in qcom_osm_l3_probe()
239 provider->aggregate = icc_std_aggregate; in qcom_osm_l3_probe()
240 provider->xlate = of_icc_xlate_onecell; in qcom_osm_l3_probe()
241 provider->data = data; in qcom_osm_l3_probe()
248 node = icc_node_create(qnodes[i]->id); in qcom_osm_l3_probe()
254 node->name = qnodes[i]->name; in qcom_osm_l3_probe()
256 node->data = (void *)qnodes[i]; in qcom_osm_l3_probe()
259 for (j = 0; j < qnodes[i]->num_links; j++) in qcom_osm_l3_probe()
260 icc_link_create(node, qnodes[i]->links[j]); in qcom_osm_l3_probe()
262 data->nodes[i] = node; in qcom_osm_l3_probe()
279 { .compatible = "qcom,epss-l3", .data = &epss_l3_l3_vote },
280 { .compatible = "qcom,osm-l3", .data = &osm_l3 },
281 { .compatible = "qcom,sc7180-osm-l3", .data = &osm_l3 },
282 { .compatible = "qcom,sc7280-epss-l3", .data = &epss_l3_perf_state },
283 { .compatible = "qcom,sdm845-osm-l3", .data = &osm_l3 },
284 { .compatible = "qcom,sm8150-osm-l3", .data = &osm_l3 },
285 { .compatible = "qcom,sc8180x-osm-l3", .data = &osm_l3 },
286 { .compatible = "qcom,sm8250-epss-l3", .data = &epss_l3_perf_state },
295 .name = "osm-l3",
302 MODULE_DESCRIPTION("Qualcomm OSM L3 interconnect driver");