123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- From 0b81c5fbe821f75cf21be29afb9952a47ac40a50 Mon Sep 17 00:00:00 2001
- From: Suman Anna <s-anna@ti.com>
- Date: Sun, 31 Jan 2021 20:53:43 -0800
- Subject: [PATCH] soc: ti: pruss: Refactor the CFG sub-module init
- The CFG sub-module is not present on some earlier SoCs like the
- DA850/OMAPL-138 in the TI Davinci family. Refactor out the CFG
- sub-module parse and initialization logic into a separate function
- to make it easier to add logic for the PRUSS IP on the above legacy
- SoC families.
- Signed-off-by: Suman Anna <s-anna@ti.com>
- Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
- ---
- drivers/soc/ti/pruss.c | 91 +++++++++++++++++++++++-------------------
- 1 file changed, 50 insertions(+), 41 deletions(-)
- diff --git a/drivers/soc/ti/pruss.c b/drivers/soc/ti/pruss.c
- index dc94335fc351..afc8aae68035 100644
- --- a/drivers/soc/ti/pruss.c
- +++ b/drivers/soc/ti/pruss.c
- @@ -161,6 +161,53 @@ static struct regmap_config regmap_conf = {
- .reg_stride = 4,
- };
-
- +static int pruss_cfg_of_init(struct device *dev, struct pruss *pruss)
- +{
- + struct device_node *np = dev_of_node(dev);
- + struct device_node *child;
- + struct resource res;
- + int ret;
- +
- + child = of_get_child_by_name(np, "cfg");
- + if (!child) {
- + dev_err(dev, "%pOF is missing its 'cfg' node\n", child);
- + return -ENODEV;
- + }
- +
- + if (of_address_to_resource(child, 0, &res)) {
- + ret = -ENOMEM;
- + goto node_put;
- + }
- +
- + pruss->cfg_base = devm_ioremap(dev, res.start, resource_size(&res));
- + if (!pruss->cfg_base) {
- + ret = -ENOMEM;
- + goto node_put;
- + }
- +
- + regmap_conf.name = kasprintf(GFP_KERNEL, "%pOFn@%llx", child,
- + (u64)res.start);
- + regmap_conf.max_register = resource_size(&res) - 4;
- +
- + pruss->cfg_regmap = devm_regmap_init_mmio(dev, pruss->cfg_base,
- + ®map_conf);
- + kfree(regmap_conf.name);
- + if (IS_ERR(pruss->cfg_regmap)) {
- + dev_err(dev, "regmap_init_mmio failed for cfg, ret = %ld\n",
- + PTR_ERR(pruss->cfg_regmap));
- + ret = PTR_ERR(pruss->cfg_regmap);
- + goto node_put;
- + }
- +
- + ret = pruss_clk_init(pruss, child);
- + if (ret)
- + dev_err(dev, "pruss_clk_init failed, ret = %d\n", ret);
- +
- +node_put:
- + of_node_put(child);
- + return ret;
- +}
- +
- static int pruss_probe(struct platform_device *pdev)
- {
- struct device *dev = &pdev->dev;
- @@ -239,56 +286,18 @@ static int pruss_probe(struct platform_device *pdev)
- goto rpm_disable;
- }
-
- - child = of_get_child_by_name(np, "cfg");
- - if (!child) {
- - dev_err(dev, "%pOF is missing its 'cfg' node\n", child);
- - ret = -ENODEV;
- + ret = pruss_cfg_of_init(dev, pruss);
- + if (ret < 0)
- goto rpm_put;
- - }
- -
- - if (of_address_to_resource(child, 0, &res)) {
- - ret = -ENOMEM;
- - goto node_put;
- - }
- -
- - pruss->cfg_base = devm_ioremap(dev, res.start, resource_size(&res));
- - if (!pruss->cfg_base) {
- - ret = -ENOMEM;
- - goto node_put;
- - }
- -
- - regmap_conf.name = kasprintf(GFP_KERNEL, "%pOFn@%llx", child,
- - (u64)res.start);
- - regmap_conf.max_register = resource_size(&res) - 4;
- -
- - pruss->cfg_regmap = devm_regmap_init_mmio(dev, pruss->cfg_base,
- - ®map_conf);
- - kfree(regmap_conf.name);
- - if (IS_ERR(pruss->cfg_regmap)) {
- - dev_err(dev, "regmap_init_mmio failed for cfg, ret = %ld\n",
- - PTR_ERR(pruss->cfg_regmap));
- - ret = PTR_ERR(pruss->cfg_regmap);
- - goto node_put;
- - }
- -
- - ret = pruss_clk_init(pruss, child);
- - if (ret) {
- - dev_err(dev, "pruss_clk_init failed, ret = %d\n", ret);
- - goto node_put;
- - }
-
- ret = devm_of_platform_populate(dev);
- if (ret) {
- dev_err(dev, "failed to register child devices\n");
- - goto node_put;
- + goto rpm_put;
- }
-
- - of_node_put(child);
- -
- return 0;
-
- -node_put:
- - of_node_put(child);
- rpm_put:
- pm_runtime_put_sync(dev);
- rpm_disable:
|