mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
net: Use of_reserved_mem_region_to_resource{_byname}() for "memory-region"
Use the newly added of_reserved_mem_region_to_resource{_byname}() functions to handle "memory-region" properties. The error handling is a bit different for mtk_wed_mcu_load_firmware(). A failed match of the "memory-region-names" would skip the entry, but then other errors in the lookup and retrieval of the address would not skip the entry. However, that distinction is not really important. Either the region is available and usable or it is not. So now, errors from of_reserved_mem_region_to_resource() are ignored so the region is simply skipped. Signed-off-by: Rob Herring (Arm) <robh@kernel.org> Link: https://patch.msgid.link/20250703183459.2074381-1-robh@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
f142028e30
commit
e27dba1951
4 changed files with 27 additions and 66 deletions
|
@ -161,7 +161,7 @@ static int airoha_npu_send_msg(struct airoha_npu *npu, int func_id,
|
|||
}
|
||||
|
||||
static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
|
||||
struct reserved_mem *rmem)
|
||||
struct resource *res)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
void __iomem *addr;
|
||||
|
@ -178,7 +178,7 @@ static int airoha_npu_run_firmware(struct device *dev, void __iomem *base,
|
|||
goto out;
|
||||
}
|
||||
|
||||
addr = devm_ioremap(dev, rmem->base, rmem->size);
|
||||
addr = devm_ioremap_resource(dev, res);
|
||||
if (!addr) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
|
@ -474,9 +474,8 @@ static const struct regmap_config regmap_config = {
|
|||
static int airoha_npu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct reserved_mem *rmem;
|
||||
struct airoha_npu *npu;
|
||||
struct device_node *np;
|
||||
struct resource res;
|
||||
void __iomem *base;
|
||||
int i, irq, err;
|
||||
|
||||
|
@ -498,15 +497,9 @@ static int airoha_npu_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(npu->regmap))
|
||||
return PTR_ERR(npu->regmap);
|
||||
|
||||
np = of_parse_phandle(dev->of_node, "memory-region", 0);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
rmem = of_reserved_mem_lookup(np);
|
||||
of_node_put(np);
|
||||
|
||||
if (!rmem)
|
||||
return -ENODEV;
|
||||
err = of_reserved_mem_region_to_resource(dev->of_node, 0, &res);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq < 0)
|
||||
|
@ -539,12 +532,12 @@ static int airoha_npu_probe(struct platform_device *pdev)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
err = airoha_npu_run_firmware(dev, base, rmem);
|
||||
err = airoha_npu_run_firmware(dev, base, &res);
|
||||
if (err)
|
||||
return dev_err_probe(dev, err, "failed to run npu firmware\n");
|
||||
|
||||
regmap_write(npu->regmap, REG_CR_NPU_MIB(10),
|
||||
rmem->base + NPU_EN7581_FIRMWARE_RV32_MAX_SIZE);
|
||||
res.start + NPU_EN7581_FIRMWARE_RV32_MAX_SIZE);
|
||||
regmap_write(npu->regmap, REG_CR_NPU_MIB(11), 0x40000); /* SRAM 256K */
|
||||
regmap_write(npu->regmap, REG_CR_NPU_MIB(12), 0);
|
||||
regmap_write(npu->regmap, REG_CR_NPU_MIB(21), 1);
|
||||
|
@ -552,7 +545,7 @@ static int airoha_npu_probe(struct platform_device *pdev)
|
|||
|
||||
/* setting booting address */
|
||||
for (i = 0; i < NPU_NUM_CORES; i++)
|
||||
regmap_write(npu->regmap, REG_CR_BOOT_BASE(i), rmem->base);
|
||||
regmap_write(npu->regmap, REG_CR_BOOT_BASE(i), res.start);
|
||||
usleep_range(1000, 2000);
|
||||
|
||||
/* enable NPU cores */
|
||||
|
|
|
@ -1318,26 +1318,14 @@ mtk_wed_rro_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
|
|||
static int
|
||||
mtk_wed_rro_alloc(struct mtk_wed_device *dev)
|
||||
{
|
||||
struct reserved_mem *rmem;
|
||||
struct device_node *np;
|
||||
int index;
|
||||
struct resource res;
|
||||
int ret;
|
||||
|
||||
index = of_property_match_string(dev->hw->node, "memory-region-names",
|
||||
"wo-dlm");
|
||||
if (index < 0)
|
||||
return index;
|
||||
ret = of_reserved_mem_region_to_resource_byname(dev->hw->node, "wo-dlm", &res);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
np = of_parse_phandle(dev->hw->node, "memory-region", index);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
rmem = of_reserved_mem_lookup(np);
|
||||
of_node_put(np);
|
||||
|
||||
if (!rmem)
|
||||
return -ENODEV;
|
||||
|
||||
dev->rro.miod_phys = rmem->base;
|
||||
dev->rro.miod_phys = res.start;
|
||||
dev->rro.fdbk_phys = MTK_WED_MIOD_COUNT + dev->rro.miod_phys;
|
||||
|
||||
return mtk_wed_rro_ring_alloc(dev, &dev->rro.ring,
|
||||
|
|
|
@ -234,25 +234,19 @@ int mtk_wed_mcu_msg_update(struct mtk_wed_device *dev, int id, void *data,
|
|||
}
|
||||
|
||||
static int
|
||||
mtk_wed_get_memory_region(struct mtk_wed_hw *hw, int index,
|
||||
mtk_wed_get_memory_region(struct mtk_wed_hw *hw, const char *name,
|
||||
struct mtk_wed_wo_memory_region *region)
|
||||
{
|
||||
struct reserved_mem *rmem;
|
||||
struct device_node *np;
|
||||
struct resource res;
|
||||
int ret;
|
||||
|
||||
np = of_parse_phandle(hw->node, "memory-region", index);
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
ret = of_reserved_mem_region_to_resource_byname(hw->node, name, &res);
|
||||
if (ret)
|
||||
return 0;
|
||||
|
||||
rmem = of_reserved_mem_lookup(np);
|
||||
of_node_put(np);
|
||||
|
||||
if (!rmem)
|
||||
return -ENODEV;
|
||||
|
||||
region->phy_addr = rmem->base;
|
||||
region->size = rmem->size;
|
||||
region->addr = devm_ioremap(hw->dev, region->phy_addr, region->size);
|
||||
region->phy_addr = res.start;
|
||||
region->size = resource_size(&res);
|
||||
region->addr = devm_ioremap_resource(hw->dev, &res);
|
||||
|
||||
return !region->addr ? -EINVAL : 0;
|
||||
}
|
||||
|
@ -319,13 +313,7 @@ mtk_wed_mcu_load_firmware(struct mtk_wed_wo *wo)
|
|||
|
||||
/* load firmware region metadata */
|
||||
for (i = 0; i < ARRAY_SIZE(mem_region); i++) {
|
||||
int index = of_property_match_string(wo->hw->node,
|
||||
"memory-region-names",
|
||||
mem_region[i].name);
|
||||
if (index < 0)
|
||||
continue;
|
||||
|
||||
ret = mtk_wed_get_memory_region(wo->hw, index, &mem_region[i]);
|
||||
ret = mtk_wed_get_memory_region(wo->hw, mem_region[i].name, &mem_region[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_reserved_mem.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/types.h>
|
||||
|
@ -586,7 +586,6 @@ static void ipa_deconfig(struct ipa *ipa)
|
|||
static int ipa_firmware_load(struct device *dev)
|
||||
{
|
||||
const struct firmware *fw;
|
||||
struct device_node *node;
|
||||
struct resource res;
|
||||
phys_addr_t phys;
|
||||
const char *path;
|
||||
|
@ -594,14 +593,7 @@ static int ipa_firmware_load(struct device *dev)
|
|||
void *virt;
|
||||
int ret;
|
||||
|
||||
node = of_parse_phandle(dev->of_node, "memory-region", 0);
|
||||
if (!node) {
|
||||
dev_err(dev, "DT error getting \"memory-region\" property\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = of_address_to_resource(node, 0, &res);
|
||||
of_node_put(node);
|
||||
ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res);
|
||||
if (ret) {
|
||||
dev_err(dev, "error %d getting \"memory-region\" resource\n",
|
||||
ret);
|
||||
|
|
Loading…
Add table
Reference in a new issue