All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/5] dm: core: Fix devfdt_get_addr_ptr return value
@ 2020-05-27  6:41 Ovidiu Panait
  2020-05-27  6:41 ` [PATCH 2/5] pinctrl: bcm283x: DM_FLAG_PRE_RELOC: Remove OF_CONTROL check Ovidiu Panait
                   ` (6 more replies)
  0 siblings, 7 replies; 11+ messages in thread
From: Ovidiu Panait @ 2020-05-27  6:41 UTC (permalink / raw)
  To: u-boot

According to the description of devfdt_get_addr_ptr, this function should
return NULL on failure, but currently it returns (void *)FDT_ADDR_T_NONE.

This is also a problem because there are two definitions for
dev_read_addr_ptr, depending on CONFIG_DM_DEV_READ_INLINE:

1. one returning NULL on failure (drivers/core/read.c):
void *dev_read_addr_ptr(const struct udevice *dev)
{
        fdt_addr_t addr = dev_read_addr(dev);

        return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
}

2. another one, which is a wrapper over devfdt_get_addr_ptr, returning
(void *)FDT_ADDR_T_NONE (include/dm/read.h)

static inline void *dev_read_addr_ptr(const struct udevice *dev)
{
        return devfdt_get_addr_ptr(dev);
}

Currently, some drivers which make use of devfdt_get_addr_ptr check the
return value for NULL:
drivers/i2c/mvtwsi.c
drivers/i2c/designware_i2c.c
drivers/usb/host/ehci-zynq.c

while others check the return value for (void *)FDT_ADDR_T_NONE:
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/timer/ast_timer.c
drivers/watchdog/ast_wdt.c

Fix this by making devfdt_get_addr_ptr return NULL on failure, as
described in the function comments. Also, update the drivers currently
checking (void *)FDT_ADDR_T_NONE to check for NULL.

Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
---

 drivers/clk/aspeed/clk_ast2500.c      | 4 ++--
 drivers/core/fdtaddr.c                | 5 ++++-
 drivers/i2c/ast_i2c.c                 | 4 ++--
 drivers/pinctrl/mvebu/pinctrl-mvebu.c | 2 +-
 drivers/timer/ast_timer.c             | 4 ++--
 drivers/watchdog/ast_wdt.c            | 4 ++--
 6 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/clk/aspeed/clk_ast2500.c b/drivers/clk/aspeed/clk_ast2500.c
index ccfeded30c..284f5f58d6 100644
--- a/drivers/clk/aspeed/clk_ast2500.c
+++ b/drivers/clk/aspeed/clk_ast2500.c
@@ -498,8 +498,8 @@ static int ast2500_clk_ofdata_to_platdata(struct udevice *dev)
 	struct ast2500_clk_priv *priv = dev_get_priv(dev);
 
 	priv->scu = devfdt_get_addr_ptr(dev);
-	if (IS_ERR(priv->scu))
-		return PTR_ERR(priv->scu);
+	if (!priv->scu)
+		return -EINVAL;
 
 	return 0;
 }
diff --git a/drivers/core/fdtaddr.c b/drivers/core/fdtaddr.c
index dfcb868f65..044d5871b0 100644
--- a/drivers/core/fdtaddr.c
+++ b/drivers/core/fdtaddr.c
@@ -14,6 +14,7 @@
 #include <log.h>
 #include <asm/io.h>
 #include <dm/device-internal.h>
+#include <mapmem.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -154,7 +155,9 @@ fdt_addr_t devfdt_get_addr(const struct udevice *dev)
 
 void *devfdt_get_addr_ptr(const struct udevice *dev)
 {
-	return (void *)(uintptr_t)devfdt_get_addr_index(dev, 0);
+	fdt_addr_t addr = devfdt_get_addr_index(dev, 0);
+
+	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0);
 }
 
 void *devfdt_remap_addr_index(const struct udevice *dev, int index)
diff --git a/drivers/i2c/ast_i2c.c b/drivers/i2c/ast_i2c.c
index 214362d04b..253e653666 100644
--- a/drivers/i2c/ast_i2c.c
+++ b/drivers/i2c/ast_i2c.c
@@ -93,8 +93,8 @@ static int ast_i2c_ofdata_to_platdata(struct udevice *dev)
 	int ret;
 
 	priv->regs = devfdt_get_addr_ptr(dev);
-	if (IS_ERR(priv->regs))
-		return PTR_ERR(priv->regs);
+	if (!priv->regs)
+		return -EINVAL;
 
 	ret = clk_get_by_index(dev, 0, &priv->clk);
 	if (ret < 0) {
diff --git a/drivers/pinctrl/mvebu/pinctrl-mvebu.c b/drivers/pinctrl/mvebu/pinctrl-mvebu.c
index 2206e958ec..ac0377e796 100644
--- a/drivers/pinctrl/mvebu/pinctrl-mvebu.c
+++ b/drivers/pinctrl/mvebu/pinctrl-mvebu.c
@@ -194,7 +194,7 @@ int mvebu_pinctl_probe(struct udevice *dev)
 	}
 
 	priv->base_reg = devfdt_get_addr_ptr(dev);
-	if (priv->base_reg == (void *)FDT_ADDR_T_NONE) {
+	if (!priv->base_reg) {
 		debug("%s: Failed to get base address\n", __func__);
 		return -EINVAL;
 	}
diff --git a/drivers/timer/ast_timer.c b/drivers/timer/ast_timer.c
index 3838601f54..9f28cbfcf9 100644
--- a/drivers/timer/ast_timer.c
+++ b/drivers/timer/ast_timer.c
@@ -65,8 +65,8 @@ static int ast_timer_ofdata_to_platdata(struct udevice *dev)
 	struct ast_timer_priv *priv = dev_get_priv(dev);
 
 	priv->regs = devfdt_get_addr_ptr(dev);
-	if (IS_ERR(priv->regs))
-		return PTR_ERR(priv->regs);
+	if (!priv->regs)
+		return -EINVAL;
 
 	priv->tmc = ast_get_timer_counter(priv->regs, AST_TICK_TIMER);
 
diff --git a/drivers/watchdog/ast_wdt.c b/drivers/watchdog/ast_wdt.c
index 7e11465a57..a21f9a4d14 100644
--- a/drivers/watchdog/ast_wdt.c
+++ b/drivers/watchdog/ast_wdt.c
@@ -91,8 +91,8 @@ static int ast_wdt_ofdata_to_platdata(struct udevice *dev)
 	struct ast_wdt_priv *priv = dev_get_priv(dev);
 
 	priv->regs = devfdt_get_addr_ptr(dev);
-	if (IS_ERR(priv->regs))
-		return PTR_ERR(priv->regs);
+	if (!priv->regs)
+		return -EINVAL;
 
 	return 0;
 }
-- 
2.17.1

^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-06-11  9:07 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-27  6:41 [PATCH 1/5] dm: core: Fix devfdt_get_addr_ptr return value Ovidiu Panait
2020-05-27  6:41 ` [PATCH 2/5] pinctrl: bcm283x: DM_FLAG_PRE_RELOC: Remove OF_CONTROL check Ovidiu Panait
2020-05-27  6:41 ` [PATCH 3/5] pinctrl: bcm283x: Read address from DT in ofdata_to_platdata Ovidiu Panait
2020-05-27  6:41 ` [PATCH 4/5] pinctrl: bcm283x: Fix return value check for dev_read_addr_ptr Ovidiu Panait
2020-05-27  6:41 ` [PATCH 5/5] pinctrl: bcm283x: Store the return value of dev_read_u32_default to int Ovidiu Panait
2020-05-27 12:05 ` [PATCH 1/5] dm: core: Fix devfdt_get_addr_ptr return value Matthias Brugger
2020-06-11  9:07   ` Ovidiu Panait
2020-05-28  9:22 ` Cédric Le Goater
2020-05-28 14:32 ` Simon Glass
2020-05-28 19:29   ` Sean Anderson
2020-05-29  0:28     ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.