Lines Matching +full:sdm845 +full:- +full:osm +full:- +full:l3

1 // SPDX-License-Identifier: GPL-2.0
8 #include <linux/interconnect-provider.h>
15 #include <dt-bindings/interconnect/qcom,osm-l3.h>
19 #include "sdm845.h"
28 /* OSM Register offsets */
53 * struct qcom_osm_l3_node - Qualcomm specific interconnect nodes
176 qn = src->data; in qcom_osm_l3_set()
177 provider = src->provider; in qcom_osm_l3_set()
180 list_for_each_entry(n, &provider->nodes, node_list) in qcom_osm_l3_set()
181 provider->aggregate(n, 0, n->avg_bw, n->peak_bw, in qcom_osm_l3_set()
186 do_div(rate, qn->buswidth); in qcom_osm_l3_set()
188 for (index = 0; index < qp->max_state - 1; index++) { in qcom_osm_l3_set()
189 if (qp->lut_tables[index] >= rate) in qcom_osm_l3_set()
193 writel_relaxed(index, qp->base + qp->reg_perf_state); in qcom_osm_l3_set()
202 icc_nodes_remove(&qp->provider); in qcom_osm_l3_remove()
203 return icc_provider_del(&qp->provider); in qcom_osm_l3_remove()
220 clk = clk_get(&pdev->dev, "xo"); in qcom_osm_l3_probe()
227 clk = clk_get(&pdev->dev, "alternate"); in qcom_osm_l3_probe()
234 qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL); in qcom_osm_l3_probe()
236 return -ENOMEM; in qcom_osm_l3_probe()
238 qp->base = devm_platform_ioremap_resource(pdev, 0); in qcom_osm_l3_probe()
239 if (IS_ERR(qp->base)) in qcom_osm_l3_probe()
240 return PTR_ERR(qp->base); in qcom_osm_l3_probe()
243 if (!(readl_relaxed(qp->base + REG_ENABLE) & 0x1)) { in qcom_osm_l3_probe()
244 dev_err(&pdev->dev, "error hardware not enabled\n"); in qcom_osm_l3_probe()
245 return -ENODEV; in qcom_osm_l3_probe()
248 desc = device_get_match_data(&pdev->dev); in qcom_osm_l3_probe()
250 return -EINVAL; in qcom_osm_l3_probe()
252 qp->reg_perf_state = desc->reg_perf_state; in qcom_osm_l3_probe()
255 info = readl_relaxed(qp->base + desc->reg_freq_lut + in qcom_osm_l3_probe()
256 i * desc->lut_row_size); in qcom_osm_l3_probe()
268 dev_dbg(&pdev->dev, "index=%d freq=%d\n", i, freq); in qcom_osm_l3_probe()
270 qp->lut_tables[i] = freq; in qcom_osm_l3_probe()
273 qp->max_state = i; in qcom_osm_l3_probe()
275 qnodes = desc->nodes; in qcom_osm_l3_probe()
276 num_nodes = desc->num_nodes; in qcom_osm_l3_probe()
278 data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL); in qcom_osm_l3_probe()
280 return -ENOMEM; in qcom_osm_l3_probe()
282 provider = &qp->provider; in qcom_osm_l3_probe()
283 provider->dev = &pdev->dev; in qcom_osm_l3_probe()
284 provider->set = qcom_osm_l3_set; in qcom_osm_l3_probe()
285 provider->aggregate = icc_std_aggregate; in qcom_osm_l3_probe()
286 provider->xlate = of_icc_xlate_onecell; in qcom_osm_l3_probe()
287 INIT_LIST_HEAD(&provider->nodes); in qcom_osm_l3_probe()
288 provider->data = data; in qcom_osm_l3_probe()
292 dev_err(&pdev->dev, "error adding interconnect provider\n"); in qcom_osm_l3_probe()
299 node = icc_node_create(qnodes[i]->id); in qcom_osm_l3_probe()
305 node->name = qnodes[i]->name; in qcom_osm_l3_probe()
307 node->data = (void *)qnodes[i]; in qcom_osm_l3_probe()
310 for (j = 0; j < qnodes[i]->num_links; j++) in qcom_osm_l3_probe()
311 icc_link_create(node, qnodes[i]->links[j]); in qcom_osm_l3_probe()
313 data->nodes[i] = node; in qcom_osm_l3_probe()
315 data->num_nodes = num_nodes; in qcom_osm_l3_probe()
328 { .compatible = "qcom,sc7180-osm-l3", .data = &sc7180_icc_osm_l3 },
329 { .compatible = "qcom,sdm845-osm-l3", .data = &sdm845_icc_osm_l3 },
330 { .compatible = "qcom,sm8150-osm-l3", .data = &sm8150_icc_osm_l3 },
331 { .compatible = "qcom,sc8180x-osm-l3", .data = &sc8180x_icc_osm_l3 },
332 { .compatible = "qcom,sm8250-epss-l3", .data = &sm8250_icc_epss_l3 },
341 .name = "osm-l3",
348 MODULE_DESCRIPTION("Qualcomm OSM L3 interconnect driver");