Lines Matching +full:sdm845 +full:- +full:osm +full:- +full:l3
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
10 #include <linux/interconnect-provider.h>
17 #include <dt-bindings/interconnect/qcom,osm-l3.h>
24 /* OSM Register offsets */
48 * struct qcom_osm_l3_node - Qualcomm specific interconnect nodes
119 qn = src->data; in qcom_osm_l3_set()
120 provider = src->provider; in qcom_osm_l3_set()
123 rate = icc_units_to_bps(dst->peak_bw); in qcom_osm_l3_set()
124 do_div(rate, qn->buswidth); in qcom_osm_l3_set()
126 for (index = 0; index < qp->max_state - 1; index++) { in qcom_osm_l3_set()
127 if (qp->lut_tables[index] >= rate) in qcom_osm_l3_set()
131 writel_relaxed(index, qp->base + qp->reg_perf_state); in qcom_osm_l3_set()
140 icc_provider_deregister(&qp->provider); in qcom_osm_l3_remove()
141 icc_nodes_remove(&qp->provider); in qcom_osm_l3_remove()
158 clk = clk_get(&pdev->dev, "xo"); in qcom_osm_l3_probe()
165 clk = clk_get(&pdev->dev, "alternate"); in qcom_osm_l3_probe()
172 qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL); in qcom_osm_l3_probe()
174 return -ENOMEM; in qcom_osm_l3_probe()
176 qp->base = devm_platform_ioremap_resource(pdev, 0); in qcom_osm_l3_probe()
177 if (IS_ERR(qp->base)) in qcom_osm_l3_probe()
178 return PTR_ERR(qp->base); in qcom_osm_l3_probe()
181 if (!(readl_relaxed(qp->base + REG_ENABLE) & 0x1)) { in qcom_osm_l3_probe()
182 dev_err(&pdev->dev, "error hardware not enabled\n"); in qcom_osm_l3_probe()
183 return -ENODEV; in qcom_osm_l3_probe()
186 desc = device_get_match_data(&pdev->dev); in qcom_osm_l3_probe()
188 return -EINVAL; in qcom_osm_l3_probe()
190 qp->reg_perf_state = desc->reg_perf_state; in qcom_osm_l3_probe()
193 info = readl_relaxed(qp->base + desc->reg_freq_lut + in qcom_osm_l3_probe()
194 i * desc->lut_row_size); in qcom_osm_l3_probe()
206 dev_dbg(&pdev->dev, "index=%d freq=%d\n", i, freq); in qcom_osm_l3_probe()
208 qp->lut_tables[i] = freq; in qcom_osm_l3_probe()
211 qp->max_state = i; in qcom_osm_l3_probe()
213 qnodes = desc->nodes; in qcom_osm_l3_probe()
214 num_nodes = desc->num_nodes; in qcom_osm_l3_probe()
216 data = devm_kzalloc(&pdev->dev, struct_size(data, nodes, num_nodes), GFP_KERNEL); in qcom_osm_l3_probe()
218 return -ENOMEM; in qcom_osm_l3_probe()
219 data->num_nodes = num_nodes; in qcom_osm_l3_probe()
221 provider = &qp->provider; in qcom_osm_l3_probe()
222 provider->dev = &pdev->dev; in qcom_osm_l3_probe()
223 provider->set = qcom_osm_l3_set; in qcom_osm_l3_probe()
224 provider->aggregate = icc_std_aggregate; in qcom_osm_l3_probe()
225 provider->xlate = of_icc_xlate_onecell; in qcom_osm_l3_probe()
226 provider->data = data; in qcom_osm_l3_probe()
239 ret = icc_node_set_name(node, provider, qnodes[i]->name); in qcom_osm_l3_probe()
241 icc_node_destroy(node->id); in qcom_osm_l3_probe()
246 node->data = (void *)qnodes[i]; in qcom_osm_l3_probe()
249 data->nodes[i] = node; in qcom_osm_l3_probe()
253 icc_link_nodes(data->nodes[MASTER_OSM_L3_APPS], &data->nodes[SLAVE_OSM_L3]); in qcom_osm_l3_probe()
269 { .compatible = "qcom,epss-l3", .data = &epss_l3_l3_vote },
270 { .compatible = "qcom,osm-l3", .data = &osm_l3 },
271 { .compatible = "qcom,sa8775p-epss-l3", .data = &epss_l3_perf_state },
272 { .compatible = "qcom,sc7180-osm-l3", .data = &osm_l3 },
273 { .compatible = "qcom,sc7280-epss-l3", .data = &epss_l3_perf_state },
274 { .compatible = "qcom,sdm845-osm-l3", .data = &osm_l3 },
275 { .compatible = "qcom,sm8150-osm-l3", .data = &osm_l3 },
276 { .compatible = "qcom,sc8180x-osm-l3", .data = &osm_l3 },
277 { .compatible = "qcom,sm8250-epss-l3", .data = &epss_l3_perf_state },
286 .name = "osm-l3",
293 MODULE_DESCRIPTION("Qualcomm OSM L3 interconnect driver");