Skip to content

Commit 789a39a

Browse files
Mike TiptonGeorgi Djakov
authored andcommitted
interconnect: qcom: icc-rpmh: Consolidate probe functions
The current probe/remove functions are implemented separately for each target, but they are almost identical. Replace them with common functions that can be used across all rpmh targets. Signed-off-by: Mike Tipton <[email protected]> Reviewed-by: Matthias Kaehlcke <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Georgi Djakov <[email protected]>
1 parent e73f0f0 commit 789a39a

File tree

9 files changed

+109
-662
lines changed

9 files changed

+109
-662
lines changed

drivers/interconnect/qcom/icc-rpmh.c

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <linux/interconnect-provider.h>
88
#include <linux/module.h>
99
#include <linux/of.h>
10+
#include <linux/of_device.h>
1011
#include <linux/slab.h>
1112

1213
#include "bcm-voter.h"
@@ -184,4 +185,96 @@ int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev)
184185
}
185186
EXPORT_SYMBOL_GPL(qcom_icc_bcm_init);
186187

188+
int qcom_icc_rpmh_probe(struct platform_device *pdev)
189+
{
190+
const struct qcom_icc_desc *desc;
191+
struct device *dev = &pdev->dev;
192+
struct icc_onecell_data *data;
193+
struct icc_provider *provider;
194+
struct qcom_icc_node **qnodes, *qn;
195+
struct qcom_icc_provider *qp;
196+
struct icc_node *node;
197+
size_t num_nodes, i, j;
198+
int ret;
199+
200+
desc = of_device_get_match_data(dev);
201+
if (!desc)
202+
return -EINVAL;
203+
204+
qnodes = desc->nodes;
205+
num_nodes = desc->num_nodes;
206+
207+
qp = devm_kzalloc(dev, sizeof(*qp), GFP_KERNEL);
208+
if (!qp)
209+
return -ENOMEM;
210+
211+
data = devm_kzalloc(dev, struct_size(data, nodes, num_nodes), GFP_KERNEL);
212+
if (!data)
213+
return -ENOMEM;
214+
215+
provider = &qp->provider;
216+
provider->dev = dev;
217+
provider->set = qcom_icc_set;
218+
provider->pre_aggregate = qcom_icc_pre_aggregate;
219+
provider->aggregate = qcom_icc_aggregate;
220+
provider->xlate_extended = qcom_icc_xlate_extended;
221+
INIT_LIST_HEAD(&provider->nodes);
222+
provider->data = data;
223+
224+
qp->dev = dev;
225+
qp->bcms = desc->bcms;
226+
qp->num_bcms = desc->num_bcms;
227+
228+
qp->voter = of_bcm_voter_get(qp->dev, NULL);
229+
if (IS_ERR(qp->voter))
230+
return PTR_ERR(qp->voter);
231+
232+
ret = icc_provider_add(provider);
233+
if (ret)
234+
return ret;
235+
236+
for (i = 0; i < qp->num_bcms; i++)
237+
qcom_icc_bcm_init(qp->bcms[i], dev);
238+
239+
for (i = 0; i < num_nodes; i++) {
240+
qn = qnodes[i];
241+
if (!qn)
242+
continue;
243+
244+
node = icc_node_create(qn->id);
245+
if (IS_ERR(node)) {
246+
ret = PTR_ERR(node);
247+
goto err;
248+
}
249+
250+
node->name = qn->name;
251+
node->data = qn;
252+
icc_node_add(node, provider);
253+
254+
for (j = 0; j < qn->num_links; j++)
255+
icc_link_create(node, qn->links[j]);
256+
257+
data->nodes[i] = node;
258+
}
259+
260+
data->num_nodes = num_nodes;
261+
platform_set_drvdata(pdev, qp);
262+
263+
return 0;
264+
err:
265+
icc_nodes_remove(provider);
266+
icc_provider_del(provider);
267+
return ret;
268+
}
269+
EXPORT_SYMBOL_GPL(qcom_icc_rpmh_probe);
270+
271+
int qcom_icc_rpmh_remove(struct platform_device *pdev)
272+
{
273+
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
274+
275+
icc_nodes_remove(&qp->provider);
276+
return icc_provider_del(&qp->provider);
277+
}
278+
EXPORT_SYMBOL_GPL(qcom_icc_rpmh_remove);
279+
187280
MODULE_LICENSE("GPL v2");

drivers/interconnect/qcom/icc-rpmh.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,5 +134,7 @@ int qcom_icc_set(struct icc_node *src, struct icc_node *dst);
134134
struct icc_node_data *qcom_icc_xlate_extended(struct of_phandle_args *spec, void *data);
135135
int qcom_icc_bcm_init(struct qcom_icc_bcm *bcm, struct device *dev);
136136
void qcom_icc_pre_aggregate(struct icc_node *node);
137+
int qcom_icc_rpmh_probe(struct platform_device *pdev);
138+
int qcom_icc_rpmh_remove(struct platform_device *pdev);
137139

138140
#endif

drivers/interconnect/qcom/sc7180.c

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -504,98 +504,6 @@ static struct qcom_icc_desc sc7180_system_noc = {
504504
.num_bcms = ARRAY_SIZE(system_noc_bcms),
505505
};
506506

507-
static int qnoc_probe(struct platform_device *pdev)
508-
{
509-
const struct qcom_icc_desc *desc;
510-
struct icc_onecell_data *data;
511-
struct icc_provider *provider;
512-
struct qcom_icc_node **qnodes;
513-
struct qcom_icc_provider *qp;
514-
struct icc_node *node;
515-
size_t num_nodes, i;
516-
int ret;
517-
518-
desc = device_get_match_data(&pdev->dev);
519-
if (!desc)
520-
return -EINVAL;
521-
522-
qnodes = desc->nodes;
523-
num_nodes = desc->num_nodes;
524-
525-
qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL);
526-
if (!qp)
527-
return -ENOMEM;
528-
529-
data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
530-
if (!data)
531-
return -ENOMEM;
532-
533-
provider = &qp->provider;
534-
provider->dev = &pdev->dev;
535-
provider->set = qcom_icc_set;
536-
provider->pre_aggregate = qcom_icc_pre_aggregate;
537-
provider->aggregate = qcom_icc_aggregate;
538-
provider->xlate_extended = qcom_icc_xlate_extended;
539-
INIT_LIST_HEAD(&provider->nodes);
540-
provider->data = data;
541-
542-
qp->dev = &pdev->dev;
543-
qp->bcms = desc->bcms;
544-
qp->num_bcms = desc->num_bcms;
545-
546-
qp->voter = of_bcm_voter_get(qp->dev, NULL);
547-
if (IS_ERR(qp->voter))
548-
return PTR_ERR(qp->voter);
549-
550-
ret = icc_provider_add(provider);
551-
if (ret) {
552-
dev_err(&pdev->dev, "error adding interconnect provider\n");
553-
return ret;
554-
}
555-
556-
for (i = 0; i < qp->num_bcms; i++)
557-
qcom_icc_bcm_init(qp->bcms[i], &pdev->dev);
558-
559-
for (i = 0; i < num_nodes; i++) {
560-
size_t j;
561-
562-
if (!qnodes[i])
563-
continue;
564-
565-
node = icc_node_create(qnodes[i]->id);
566-
if (IS_ERR(node)) {
567-
ret = PTR_ERR(node);
568-
goto err;
569-
}
570-
571-
node->name = qnodes[i]->name;
572-
node->data = qnodes[i];
573-
icc_node_add(node, provider);
574-
575-
for (j = 0; j < qnodes[i]->num_links; j++)
576-
icc_link_create(node, qnodes[i]->links[j]);
577-
578-
data->nodes[i] = node;
579-
}
580-
data->num_nodes = num_nodes;
581-
582-
platform_set_drvdata(pdev, qp);
583-
584-
return 0;
585-
err:
586-
icc_nodes_remove(provider);
587-
icc_provider_del(provider);
588-
return ret;
589-
}
590-
591-
static int qnoc_remove(struct platform_device *pdev)
592-
{
593-
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
594-
595-
icc_nodes_remove(&qp->provider);
596-
return icc_provider_del(&qp->provider);
597-
}
598-
599507
static const struct of_device_id qnoc_of_match[] = {
600508
{ .compatible = "qcom,sc7180-aggre1-noc",
601509
.data = &sc7180_aggre1_noc},
@@ -628,8 +536,8 @@ static const struct of_device_id qnoc_of_match[] = {
628536
MODULE_DEVICE_TABLE(of, qnoc_of_match);
629537

630538
static struct platform_driver qnoc_driver = {
631-
.probe = qnoc_probe,
632-
.remove = qnoc_remove,
539+
.probe = qcom_icc_rpmh_probe,
540+
.remove = qcom_icc_rpmh_remove,
633541
.driver = {
634542
.name = "qnoc-sc7180",
635543
.of_match_table = qnoc_of_match,

drivers/interconnect/qcom/sc7280.c

Lines changed: 2 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,98 +1802,6 @@ static struct qcom_icc_desc sc7280_system_noc = {
18021802
.num_bcms = ARRAY_SIZE(system_noc_bcms),
18031803
};
18041804

1805-
static int qnoc_probe(struct platform_device *pdev)
1806-
{
1807-
const struct qcom_icc_desc *desc;
1808-
struct icc_onecell_data *data;
1809-
struct icc_provider *provider;
1810-
struct qcom_icc_node **qnodes;
1811-
struct qcom_icc_provider *qp;
1812-
struct icc_node *node;
1813-
size_t num_nodes, i;
1814-
int ret;
1815-
1816-
desc = device_get_match_data(&pdev->dev);
1817-
if (!desc)
1818-
return -EINVAL;
1819-
1820-
qnodes = desc->nodes;
1821-
num_nodes = desc->num_nodes;
1822-
1823-
qp = devm_kzalloc(&pdev->dev, sizeof(*qp), GFP_KERNEL);
1824-
if (!qp)
1825-
return -ENOMEM;
1826-
1827-
data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
1828-
if (!data)
1829-
return -ENOMEM;
1830-
1831-
provider = &qp->provider;
1832-
provider->dev = &pdev->dev;
1833-
provider->set = qcom_icc_set;
1834-
provider->pre_aggregate = qcom_icc_pre_aggregate;
1835-
provider->aggregate = qcom_icc_aggregate;
1836-
provider->xlate_extended = qcom_icc_xlate_extended;
1837-
INIT_LIST_HEAD(&provider->nodes);
1838-
provider->data = data;
1839-
1840-
qp->dev = &pdev->dev;
1841-
qp->bcms = desc->bcms;
1842-
qp->num_bcms = desc->num_bcms;
1843-
1844-
qp->voter = of_bcm_voter_get(qp->dev, NULL);
1845-
if (IS_ERR(qp->voter))
1846-
return PTR_ERR(qp->voter);
1847-
1848-
ret = icc_provider_add(provider);
1849-
if (ret) {
1850-
dev_err(&pdev->dev, "error adding interconnect provider\n");
1851-
return ret;
1852-
}
1853-
1854-
for (i = 0; i < qp->num_bcms; i++)
1855-
qcom_icc_bcm_init(qp->bcms[i], &pdev->dev);
1856-
1857-
for (i = 0; i < num_nodes; i++) {
1858-
size_t j;
1859-
1860-
if (!qnodes[i])
1861-
continue;
1862-
1863-
node = icc_node_create(qnodes[i]->id);
1864-
if (IS_ERR(node)) {
1865-
ret = PTR_ERR(node);
1866-
goto err;
1867-
}
1868-
1869-
node->name = qnodes[i]->name;
1870-
node->data = qnodes[i];
1871-
icc_node_add(node, provider);
1872-
1873-
for (j = 0; j < qnodes[i]->num_links; j++)
1874-
icc_link_create(node, qnodes[i]->links[j]);
1875-
1876-
data->nodes[i] = node;
1877-
}
1878-
data->num_nodes = num_nodes;
1879-
1880-
platform_set_drvdata(pdev, qp);
1881-
1882-
return 0;
1883-
err:
1884-
icc_nodes_remove(provider);
1885-
icc_provider_del(provider);
1886-
return ret;
1887-
}
1888-
1889-
static int qnoc_remove(struct platform_device *pdev)
1890-
{
1891-
struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
1892-
1893-
icc_nodes_remove(&qp->provider);
1894-
return icc_provider_del(&qp->provider);
1895-
}
1896-
18971805
static const struct of_device_id qnoc_of_match[] = {
18981806
{ .compatible = "qcom,sc7280-aggre1-noc",
18991807
.data = &sc7280_aggre1_noc},
@@ -1924,8 +1832,8 @@ static const struct of_device_id qnoc_of_match[] = {
19241832
MODULE_DEVICE_TABLE(of, qnoc_of_match);
19251833

19261834
static struct platform_driver qnoc_driver = {
1927-
.probe = qnoc_probe,
1928-
.remove = qnoc_remove,
1835+
.probe = qcom_icc_rpmh_probe,
1836+
.remove = qcom_icc_rpmh_remove,
19291837
.driver = {
19301838
.name = "qnoc-sc7280",
19311839
.of_match_table = qnoc_of_match,

0 commit comments

Comments
 (0)