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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJgF4wmAAoJEHJsHOdBp5c/wpIP/R/1Rhro+9FXCF1i9RdjUebT uklxB/VDM/G4TKmyGKHvEyyroa1U/fL5wxKY67Ey3sGlOjWTe+DgoXHJ97Saw2ya 5M/wWe453DwD3JVMrzKR7GnciEf8t/QqVdoOsSLDKVFteXLWqET1Jw4hEGJ+cc3y EfjTQ8q+CtdJ0eEpigsNaY146WZzHCugRGhwwQORy4XKNJbrzPneQ1/BAabyfcca h6bDZXl4Bf9Tej7tJWq083LwS+MEPaeq+8gbmquyrrFxaOXE7nOT5BZCuJbCweGs /e4TT8q3iLK0l+QjcxzR0QzHzr5sSAVW6UShFHIrr+EfBkfHnn2qKJBQQ7HGqkFG fYn1h1O2A/60Licgn9Km1/czCf6wSsKk+AjXeadRneIeZmAgi2ZPJvxLGM02ejHC KixsIQLsZEsxUV5FDcjMWcAmXewmd+QiJKeg6+DSj8JWGxwWunAaFfVqAGFZjQeb ChRwP/k/qmHlZZP/a8lnfmFykEKr5Mm28XNLRrXo/LNr/LA95fS7lb26AwMzpH/Z eD8elo73TZxR0LFx7eJ+VCzlh/Yt/WHbX6dqei5iBTXgW91yqjVvh1gqoen+3xlE iwFt+XBlc7wROpcHp7P8KdEScM4M4zDLiU9+sGN89PJnbm11Cps6aKZFAVHDtYf2 IVbvsyaAo+N8WT7aEb6y =aMV2 -----END PGP SIGNATURE----- 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:
Коммит
b04c38b666
|
@ -81,6 +81,9 @@ properties:
|
|||
ranges:
|
||||
maxItems: 1
|
||||
|
||||
dma-ranges:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
description: |
|
||||
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
|
||||
interrupt-controller node.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/interrupt-controller/ti,pruss-intc.yaml#
|
||||
|
||||
type: object
|
||||
|
||||
mdio@[a-f0-9]+$:
|
||||
|
@ -299,6 +305,9 @@ patternProperties:
|
|||
present on K3 SoCs have additional auxiliary PRU cores with slightly
|
||||
different IP integration.
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/remoteproc/ti,pru-rproc.yaml#
|
||||
|
||||
type: object
|
||||
|
||||
required:
|
||||
|
@ -371,6 +380,36 @@ examples:
|
|||
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 {
|
||||
compatible = "ti,davinci_mdio";
|
||||
reg = <0x32400 0x90>;
|
||||
|
@ -425,6 +464,43 @@ examples:
|
|||
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 {
|
||||
compatible = "ti,davinci_mdio";
|
||||
reg = <0x32400 0x90>;
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sys_soc.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)
|
||||
{
|
||||
const struct ringacc_match_data *match_data;
|
||||
const struct of_device_id *match;
|
||||
struct device *dev = &pdev->dev;
|
||||
struct k3_ringacc *ringacc;
|
||||
int ret;
|
||||
|
||||
match = of_match_node(k3_ringacc_of_match, dev->of_node);
|
||||
if (!match)
|
||||
match_data = of_device_get_match_data(&pdev->dev);
|
||||
if (!match_data)
|
||||
return -ENODEV;
|
||||
match_data = match->data;
|
||||
|
||||
ringacc = devm_kzalloc(dev, sizeof(*ringacc), GFP_KERNEL);
|
||||
if (!ringacc)
|
||||
|
|
|
@ -758,6 +758,7 @@ static int knav_dma_probe(struct platform_device *pdev)
|
|||
for_each_child_of_node(node, child) {
|
||||
ret = dma_init(node, child);
|
||||
if (ret) {
|
||||
of_node_put(child);
|
||||
dev_err(&pdev->dev, "init failed with %d\n", ret);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1087,6 +1087,7 @@ static int knav_queue_setup_regions(struct knav_device *kdev,
|
|||
for_each_child_of_node(regions, child) {
|
||||
region = devm_kzalloc(dev, sizeof(*region), GFP_KERNEL);
|
||||
if (!region) {
|
||||
of_node_put(child);
|
||||
dev_err(dev, "out of memory allocating region\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -1399,6 +1400,7 @@ static int knav_queue_init_qmgrs(struct knav_device *kdev,
|
|||
for_each_child_of_node(qmgrs, child) {
|
||||
qmgr = devm_kzalloc(dev, sizeof(*qmgr), GFP_KERNEL);
|
||||
if (!qmgr) {
|
||||
of_node_put(child);
|
||||
dev_err(dev, "out of memory allocating qmgr\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -1498,6 +1500,7 @@ static int knav_queue_init_pdsps(struct knav_device *kdev,
|
|||
for_each_child_of_node(pdsps, child) {
|
||||
pdsp = devm_kzalloc(dev, sizeof(*pdsp), GFP_KERNEL);
|
||||
if (!pdsp) {
|
||||
of_node_put(child);
|
||||
dev_err(dev, "out of memory allocating pdsp\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
@ -535,7 +535,7 @@ static int am33xx_pm_probe(struct platform_device *pdev)
|
|||
|
||||
ret = am33xx_push_sram_idle();
|
||||
if (ret)
|
||||
goto err_free_sram;
|
||||
goto err_unsetup_rtc;
|
||||
|
||||
am33xx_pm_set_ipc_ops();
|
||||
|
||||
|
@ -575,6 +575,9 @@ err_pm_runtime_put:
|
|||
err_pm_runtime_disable:
|
||||
pm_runtime_disable(dev);
|
||||
wkup_m3_ipc_put(m3_ipc);
|
||||
err_unsetup_rtc:
|
||||
iounmap(rtc_base_virt);
|
||||
clk_put(rtc_fck);
|
||||
err_free_sram:
|
||||
am33xx_pm_free_sram();
|
||||
pm33xx_dev = NULL;
|
||||
|
|
|
@ -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, "failed to setup coreclk-mux\n");
|
||||
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:
|
||||
|
|
Загрузка…
Ссылка в новой задаче