Merge tag 'drivers_soc_for_5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone into arm/drivers
drivers: soc: Keystone update for v5.12 Updates include: - Navigator refcount correction - probe fix in pm driver - fix clock init for PRUSS - PRUSS binding doc update - of_device_get_match_data() use in ringacc * tag 'drivers_soc_for_5.12' of git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone: soc: ti: k3-ringacc: Use of_device_get_match_data() soc: ti: pruss: Refactor the CFG sub-module init dt-bindings: soc: ti: Update TI PRUSS bindings about schemas to include soc: ti: pruss: Correct the pruss_clk_init error trace text soc: ti: pm33xx: Fix some resource leak in the error handling paths of the probe function soc: ti: knav_qmss: Put refcount for dev node in failure case Link: https://lore.kernel.org/r/1612156854-10929-1-git-send-email-santosh.shilimkar@oracle.com Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -81,6 +81,9 @@ properties:
|
|||||||
ranges:
|
ranges:
|
||||||
maxItems: 1
|
maxItems: 1
|
||||||
|
|
||||||
|
dma-ranges:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
power-domains:
|
power-domains:
|
||||||
description: |
|
description: |
|
||||||
This property is as per sci-pm-domain.txt.
|
This property is as per sci-pm-domain.txt.
|
||||||
@@ -278,6 +281,9 @@ patternProperties:
|
|||||||
that is common to all the PRU cores. This should be represented as an
|
that is common to all the PRU cores. This should be represented as an
|
||||||
interrupt-controller node.
|
interrupt-controller node.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/interrupt-controller/ti,pruss-intc.yaml#
|
||||||
|
|
||||||
type: object
|
type: object
|
||||||
|
|
||||||
mdio@[a-f0-9]+$:
|
mdio@[a-f0-9]+$:
|
||||||
@@ -299,6 +305,9 @@ patternProperties:
|
|||||||
present on K3 SoCs have additional auxiliary PRU cores with slightly
|
present on K3 SoCs have additional auxiliary PRU cores with slightly
|
||||||
different IP integration.
|
different IP integration.
|
||||||
|
|
||||||
|
allOf:
|
||||||
|
- $ref: /schemas/remoteproc/ti,pru-rproc.yaml#
|
||||||
|
|
||||||
type: object
|
type: object
|
||||||
|
|
||||||
required:
|
required:
|
||||||
@@ -371,6 +380,36 @@ examples:
|
|||||||
reg = <0x32000 0x58>;
|
reg = <0x32000 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pruss_intc: interrupt-controller@20000 {
|
||||||
|
compatible = "ti,pruss-intc";
|
||||||
|
reg = <0x20000 0x2000>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupts = <20 21 22 23 24 25 26 27>;
|
||||||
|
interrupt-names = "host_intr0", "host_intr1",
|
||||||
|
"host_intr2", "host_intr3",
|
||||||
|
"host_intr4", "host_intr5",
|
||||||
|
"host_intr6", "host_intr7";
|
||||||
|
};
|
||||||
|
|
||||||
|
pru0: pru@34000 {
|
||||||
|
compatible = "ti,am3356-pru";
|
||||||
|
reg = <0x34000 0x2000>,
|
||||||
|
<0x22000 0x400>,
|
||||||
|
<0x22400 0x100>;
|
||||||
|
reg-names = "iram", "control", "debug";
|
||||||
|
firmware-name = "am335x-pru0-fw";
|
||||||
|
};
|
||||||
|
|
||||||
|
pru1: pru@38000 {
|
||||||
|
compatible = "ti,am3356-pru";
|
||||||
|
reg = <0x38000 0x2000>,
|
||||||
|
<0x24000 0x400>,
|
||||||
|
<0x24400 0x100>;
|
||||||
|
reg-names = "iram", "control", "debug";
|
||||||
|
firmware-name = "am335x-pru1-fw";
|
||||||
|
};
|
||||||
|
|
||||||
pruss_mdio: mdio@32400 {
|
pruss_mdio: mdio@32400 {
|
||||||
compatible = "ti,davinci_mdio";
|
compatible = "ti,davinci_mdio";
|
||||||
reg = <0x32400 0x90>;
|
reg = <0x32400 0x90>;
|
||||||
@@ -425,6 +464,43 @@ examples:
|
|||||||
reg = <0x32000 0x58>;
|
reg = <0x32000 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pruss1_intc: interrupt-controller@20000 {
|
||||||
|
compatible = "ti,pruss-intc";
|
||||||
|
reg = <0x20000 0x2000>;
|
||||||
|
interrupt-controller;
|
||||||
|
#interrupt-cells = <3>;
|
||||||
|
interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
<GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
interrupt-names = "host_intr0", "host_intr1",
|
||||||
|
"host_intr2", "host_intr3",
|
||||||
|
"host_intr4",
|
||||||
|
"host_intr6", "host_intr7";
|
||||||
|
ti,irqs-reserved = /bits/ 8 <0x20>; /* BIT(5) */
|
||||||
|
};
|
||||||
|
|
||||||
|
pru1_0: pru@34000 {
|
||||||
|
compatible = "ti,am4376-pru";
|
||||||
|
reg = <0x34000 0x3000>,
|
||||||
|
<0x22000 0x400>,
|
||||||
|
<0x22400 0x100>;
|
||||||
|
reg-names = "iram", "control", "debug";
|
||||||
|
firmware-name = "am437x-pru1_0-fw";
|
||||||
|
};
|
||||||
|
|
||||||
|
pru1_1: pru@38000 {
|
||||||
|
compatible = "ti,am4376-pru";
|
||||||
|
reg = <0x38000 0x3000>,
|
||||||
|
<0x24000 0x400>,
|
||||||
|
<0x24400 0x100>;
|
||||||
|
reg-names = "iram", "control", "debug";
|
||||||
|
firmware-name = "am437x-pru1_1-fw";
|
||||||
|
};
|
||||||
|
|
||||||
pruss1_mdio: mdio@32400 {
|
pruss1_mdio: mdio@32400 {
|
||||||
compatible = "ti,davinci_mdio";
|
compatible = "ti,davinci_mdio";
|
||||||
reg = <0x32400 0x90>;
|
reg = <0x32400 0x90>;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/sys_soc.h>
|
#include <linux/sys_soc.h>
|
||||||
#include <linux/dma/ti-cppi5.h>
|
#include <linux/dma/ti-cppi5.h>
|
||||||
@@ -1517,15 +1518,13 @@ EXPORT_SYMBOL_GPL(k3_ringacc_dmarings_init);
|
|||||||
static int k3_ringacc_probe(struct platform_device *pdev)
|
static int k3_ringacc_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct ringacc_match_data *match_data;
|
const struct ringacc_match_data *match_data;
|
||||||
const struct of_device_id *match;
|
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
struct k3_ringacc *ringacc;
|
struct k3_ringacc *ringacc;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
match = of_match_node(k3_ringacc_of_match, dev->of_node);
|
match_data = of_device_get_match_data(&pdev->dev);
|
||||||
if (!match)
|
if (!match_data)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
match_data = match->data;
|
|
||||||
|
|
||||||
ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
|
ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
|
||||||
if (!ringacc)
|
if (!ringacc)
|
||||||
|
|||||||
@@ -758,6 +758,7 @@ static int knav_dma_probe(struct platform_device *pdev)
|
|||||||
for_each_child_of_node(node, child) {
|
for_each_child_of_node(node, child) {
|
||||||
ret = dma_init(node, child);
|
ret = dma_init(node, child);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
of_node_put(child);
|
||||||
dev_err(&pdev->dev, "init failed with %d\n", ret);
|
dev_err(&pdev->dev, "init failed with %d\n", ret);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1087,6 +1087,7 @@ static int knav_queue_setup_regions(struct knav_device *kdev,
|
|||||||
for_each_child_of_node(regions, child) {
|
for_each_child_of_node(regions, child) {
|
||||||
region = devm_kzalloc(dev, sizeof(*region), GFP_KERNEL);
|
region = devm_kzalloc(dev, sizeof(*region), GFP_KERNEL);
|
||||||
if (!region) {
|
if (!region) {
|
||||||
|
of_node_put(child);
|
||||||
dev_err(dev, "out of memory allocating region\n");
|
dev_err(dev, "out of memory allocating region\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -1399,6 +1400,7 @@ static int knav_queue_init_qmgrs(struct knav_device *kdev,
|
|||||||
for_each_child_of_node(qmgrs, child) {
|
for_each_child_of_node(qmgrs, child) {
|
||||||
qmgr = devm_kzalloc(dev, sizeof(*qmgr), GFP_KERNEL);
|
qmgr = devm_kzalloc(dev, sizeof(*qmgr), GFP_KERNEL);
|
||||||
if (!qmgr) {
|
if (!qmgr) {
|
||||||
|
of_node_put(child);
|
||||||
dev_err(dev, "out of memory allocating qmgr\n");
|
dev_err(dev, "out of memory allocating qmgr\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@@ -1498,6 +1500,7 @@ static int knav_queue_init_pdsps(struct knav_device *kdev,
|
|||||||
for_each_child_of_node(pdsps, child) {
|
for_each_child_of_node(pdsps, child) {
|
||||||
pdsp = devm_kzalloc(dev, sizeof(*pdsp), GFP_KERNEL);
|
pdsp = devm_kzalloc(dev, sizeof(*pdsp), GFP_KERNEL);
|
||||||
if (!pdsp) {
|
if (!pdsp) {
|
||||||
|
of_node_put(child);
|
||||||
dev_err(dev, "out of memory allocating pdsp\n");
|
dev_err(dev, "out of memory allocating pdsp\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -535,7 +535,7 @@ static int am33xx_pm_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
ret = am33xx_push_sram_idle();
|
ret = am33xx_push_sram_idle();
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_free_sram;
|
goto err_unsetup_rtc;
|
||||||
|
|
||||||
am33xx_pm_set_ipc_ops();
|
am33xx_pm_set_ipc_ops();
|
||||||
|
|
||||||
@@ -575,6 +575,9 @@ err_pm_runtime_put:
|
|||||||
err_pm_runtime_disable:
|
err_pm_runtime_disable:
|
||||||
pm_runtime_disable(dev);
|
pm_runtime_disable(dev);
|
||||||
wkup_m3_ipc_put(m3_ipc);
|
wkup_m3_ipc_put(m3_ipc);
|
||||||
|
err_unsetup_rtc:
|
||||||
|
iounmap(rtc_base_virt);
|
||||||
|
clk_put(rtc_fck);
|
||||||
err_free_sram:
|
err_free_sram:
|
||||||
am33xx_pm_free_sram();
|
am33xx_pm_free_sram();
|
||||||
pm33xx_dev = NULL;
|
pm33xx_dev = NULL;
|
||||||
|
|||||||
@@ -161,6 +161,53 @@ static struct regmap_config regmap_conf = {
|
|||||||
.reg_stride = 4,
|
.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)
|
static int pruss_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
@@ -239,56 +286,18 @@ static int pruss_probe(struct platform_device *pdev)
|
|||||||
goto rpm_disable;
|
goto rpm_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
child = of_get_child_by_name(np, "cfg");
|
ret = pruss_cfg_of_init(dev, pruss);
|
||||||
if (!child) {
|
if (ret < 0)
|
||||||
dev_err(dev, "%pOF is missing its 'cfg' node\n", child);
|
|
||||||
ret = -ENODEV;
|
|
||||||
goto rpm_put;
|
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, "failed to setup coreclk-mux\n");
|
|
||||||
goto node_put;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = devm_of_platform_populate(dev);
|
ret = devm_of_platform_populate(dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(dev, "failed to register child devices\n");
|
dev_err(dev, "failed to register child devices\n");
|
||||||
goto node_put;
|
goto rpm_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
of_node_put(child);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
node_put:
|
|
||||||
of_node_put(child);
|
|
||||||
rpm_put:
|
rpm_put:
|
||||||
pm_runtime_put_sync(dev);
|
pm_runtime_put_sync(dev);
|
||||||
rpm_disable:
|
rpm_disable:
|
||||||
|
|||||||
Reference in New Issue
Block a user