[U-Boot] [PATCH] dm: Use dev_get_addr() where possible

This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Signed-off-by: Simon Glass sjg@chromium.org ---
drivers/core/device.c | 2 ++ drivers/gpio/s5p_gpio.c | 3 +-- drivers/gpio/sunxi_gpio.c | 5 +---- drivers/gpio/tegra_gpio.c | 3 +-- drivers/i2c/s3c24x0_i2c.c | 6 ++---- drivers/i2c/tegra_i2c.c | 2 +- drivers/serial/ns16550.c | 2 +- drivers/serial/serial_arc.c | 3 +-- drivers/serial/serial_pl01x.c | 2 +- drivers/serial/serial_s5p.c | 2 +- drivers/serial/serial_uniphier.c | 2 +- drivers/spi/designware_spi.c | 2 +- drivers/spi/exynos_spi.c | 2 +- drivers/spi/fsl_dspi.c | 2 +- drivers/spi/tegra114_spi.c | 2 +- drivers/spi/tegra20_sflash.c | 2 +- drivers/spi/tegra20_slink.c | 2 +- drivers/spi/zynq_spi.c | 2 +- drivers/usb/host/ehci-tegra.c | 8 +++++--- drivers/usb/host/xhci-exynos5.c | 2 +- drivers/video/tegra124/dp.c | 3 +-- 21 files changed, 27 insertions(+), 32 deletions(-)
diff --git a/drivers/core/device.c b/drivers/core/device.c index bbe7a94..a5e73cf 100644 --- a/drivers/core/device.c +++ b/drivers/core/device.c @@ -566,8 +566,10 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); if (addr != FDT_ADDR_T_NONE) { +#ifndef CONFIG_SPL_BUILD if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); +#endif }
return addr; diff --git a/drivers/gpio/s5p_gpio.c b/drivers/gpio/s5p_gpio.c index 49b1054..17fcfbf 100644 --- a/drivers/gpio/s5p_gpio.c +++ b/drivers/gpio/s5p_gpio.c @@ -327,8 +327,7 @@ static int gpio_exynos_bind(struct udevice *parent) if (plat) return 0;
- base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob, - parent->of_offset, "reg"); + base = (struct s5p_gpio_bank *)dev_get_addr(parent); for (node = fdt_first_subnode(blob, parent->of_offset), bank = base; node > 0; node = fdt_next_subnode(blob, node), bank++) { diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c index afa165a..7226c8c 100644 --- a/drivers/gpio/sunxi_gpio.c +++ b/drivers/gpio/sunxi_gpio.c @@ -20,8 +20,6 @@ #include <asm/gpio.h> #include <dm/device-internal.h>
-DECLARE_GLOBAL_DATA_PTR; - #define SUNXI_GPIOS_PER_BANK SUNXI_GPIO_A_NR
struct sunxi_gpio_platdata { @@ -273,8 +271,7 @@ static int gpio_sunxi_bind(struct udevice *parent) if (plat) return 0;
- ctlr = (struct sunxi_gpio_reg *)fdtdec_get_addr(gd->fdt_blob, - parent->of_offset, "reg"); + ctlr = (struct sunxi_gpio_reg *)dev_get_addr(parent); for (bank = 0; bank < SUNXI_GPIO_BANKS; bank++) { struct sunxi_gpio_platdata *plat; struct udevice *dev; diff --git a/drivers/gpio/tegra_gpio.c b/drivers/gpio/tegra_gpio.c index 8017e35..4921f0f 100644 --- a/drivers/gpio/tegra_gpio.c +++ b/drivers/gpio/tegra_gpio.c @@ -343,8 +343,7 @@ static int gpio_tegra_bind(struct udevice *parent) if (!fdt_getprop(gd->fdt_blob, parent->of_offset, "interrupts", &len)) return -EINVAL; bank_count = len / 3 / sizeof(u32); - ctlr = (struct gpio_ctlr *)fdtdec_get_addr(gd->fdt_blob, - parent->of_offset, "reg"); + ctlr = (struct gpio_ctlr *)dev_get_addr(parent); } #endif for (bank = 0; bank < bank_count; bank++) { diff --git a/drivers/i2c/s3c24x0_i2c.c b/drivers/i2c/s3c24x0_i2c.c index c11a6be..3b7ba0e 100644 --- a/drivers/i2c/s3c24x0_i2c.c +++ b/drivers/i2c/s3c24x0_i2c.c @@ -1397,12 +1397,10 @@ static int s3c_i2c_ofdata_to_platdata(struct udevice *dev)
if (i2c_bus->is_highspeed) { flags = PINMUX_FLAG_HS_MODE; - i2c_bus->hsregs = (struct exynos5_hsi2c *) - fdtdec_get_addr(blob, node, "reg"); + i2c_bus->hsregs = (struct exynos5_hsi2c *)dev_get_addr(dev); } else { flags = 0; - i2c_bus->regs = (struct s3c24x0_i2c *) - fdtdec_get_addr(blob, node, "reg"); + i2c_bus->regs = (struct s3c24x0_i2c *)dev_get_addr(dev); }
i2c_bus->id = pinmux_decode_periph_id(blob, node); diff --git a/drivers/i2c/tegra_i2c.c b/drivers/i2c/tegra_i2c.c index a428978..2fa07f9 100644 --- a/drivers/i2c/tegra_i2c.c +++ b/drivers/i2c/tegra_i2c.c @@ -339,7 +339,7 @@ static int tegra_i2c_probe(struct udevice *dev)
i2c_bus->id = dev->seq; i2c_bus->type = dev_get_driver_data(dev); - i2c_bus->regs = (struct i2c_ctlr *)fdtdec_get_addr(blob, node, "reg"); + i2c_bus->regs = (struct i2c_ctlr *)dev_get_addr(dev);
/* * We don't have a binding for pinmux yet. Leave it out for now. So diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index c8a77e2..cfa8dcf 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -364,7 +364,7 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev) fdt_addr_t addr;
/* try Processor Local Bus device first */ - addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); + addr = dev_get_addr(dev); #ifdef CONFIG_PCI if (addr == FDT_ADDR_T_NONE) { /* then try pci device */ diff --git a/drivers/serial/serial_arc.c b/drivers/serial/serial_arc.c index 54e596c..7dbb49f 100644 --- a/drivers/serial/serial_arc.c +++ b/drivers/serial/serial_arc.c @@ -133,8 +133,7 @@ static int arc_serial_ofdata_to_platdata(struct udevice *dev) struct arc_serial_platdata *plat = dev_get_platdata(dev); DECLARE_GLOBAL_DATA_PTR;
- plat->reg = (struct arc_serial_regs *)fdtdec_get_addr(gd->fdt_blob, - dev->of_offset, "reg"); + plat->reg = (struct arc_serial_regs *)dev_get_addr(dev); plat->uartclk = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "clock-frequency", 0);
diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c index ad503af..70ea899 100644 --- a/drivers/serial/serial_pl01x.c +++ b/drivers/serial/serial_pl01x.c @@ -365,7 +365,7 @@ static int pl01x_serial_ofdata_to_platdata(struct udevice *dev) struct pl01x_serial_platdata *plat = dev_get_platdata(dev); fdt_addr_t addr;
- addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); + addr = dev_get_addr(dev); if (addr == FDT_ADDR_T_NONE) return -EINVAL;
diff --git a/drivers/serial/serial_s5p.c b/drivers/serial/serial_s5p.c index 21cb566..3f0b588 100644 --- a/drivers/serial/serial_s5p.c +++ b/drivers/serial/serial_s5p.c @@ -169,7 +169,7 @@ static int s5p_serial_ofdata_to_platdata(struct udevice *dev) struct s5p_serial_platdata *plat = dev->platdata; fdt_addr_t addr;
- addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); + addr = dev_get_addr(dev); if (addr == FDT_ADDR_T_NONE) return -EINVAL;
diff --git a/drivers/serial/serial_uniphier.c b/drivers/serial/serial_uniphier.c index f210986..0003fa5 100644 --- a/drivers/serial/serial_uniphier.c +++ b/drivers/serial/serial_uniphier.c @@ -124,7 +124,7 @@ static int uniphier_serial_ofdata_to_platdata(struct udevice *dev) struct uniphier_serial_platform_data *plat = dev_get_platdata(dev); DECLARE_GLOBAL_DATA_PTR;
- plat->base = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); + plat->base = dev_get_addr(dev); plat->uartclk = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "clock-frequency", 0);
diff --git a/drivers/spi/designware_spi.c b/drivers/spi/designware_spi.c index 8f5c0fc..86ee90f 100644 --- a/drivers/spi/designware_spi.c +++ b/drivers/spi/designware_spi.c @@ -134,7 +134,7 @@ static int dw_spi_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->regs = (struct dw_spi *)fdtdec_get_addr(blob, node, "reg"); + plat->regs = (struct dw_spi *)dev_get_addr(bus);
/* Use 500KHz as a suitable default */ plat->frequency = fdtdec_get_int(blob, node, "spi-max-frequency", diff --git a/drivers/spi/exynos_spi.c b/drivers/spi/exynos_spi.c index 6d77c31..d52a75e 100644 --- a/drivers/spi/exynos_spi.c +++ b/drivers/spi/exynos_spi.c @@ -255,7 +255,7 @@ static int exynos_spi_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->regs = (struct exynos_spi *)fdtdec_get_addr(blob, node, "reg"); + plat->regs = (struct exynos_spi *)dev_get_addr(bus); plat->periph_id = pinmux_decode_periph_id(blob, node);
if (plat->periph_id == PERIPH_ID_NONE) { diff --git a/drivers/spi/fsl_dspi.c b/drivers/spi/fsl_dspi.c index 3881b2e..887edd8 100644 --- a/drivers/spi/fsl_dspi.c +++ b/drivers/spi/fsl_dspi.c @@ -654,7 +654,7 @@ static int fsl_dspi_ofdata_to_platdata(struct udevice *bus) plat->num_chipselect = fdtdec_get_int(blob, node, "num-cs", FSL_DSPI_MAX_CHIPSELECT);
- addr = fdtdec_get_addr(blob, node, "reg"); + addr = dev_get_addr(bus); if (addr == FDT_ADDR_T_NONE) { debug("DSPI: Can't get base address or size\n"); return -ENOMEM; diff --git a/drivers/spi/tegra114_spi.c b/drivers/spi/tegra114_spi.c index d7eecd5..a965f80 100644 --- a/drivers/spi/tegra114_spi.c +++ b/drivers/spi/tegra114_spi.c @@ -118,7 +118,7 @@ static int tegra114_spi_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->base = fdtdec_get_addr(blob, node, "reg"); + plat->base = dev_get_addr(bus); plat->periph_id = clock_decode_periph_id(blob, node);
if (plat->periph_id == PERIPH_ID_NONE) { diff --git a/drivers/spi/tegra20_sflash.c b/drivers/spi/tegra20_sflash.c index 82c1b84..afa0848 100644 --- a/drivers/spi/tegra20_sflash.c +++ b/drivers/spi/tegra20_sflash.c @@ -90,7 +90,7 @@ static int tegra20_sflash_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->base = fdtdec_get_addr(blob, node, "reg"); + plat->base = dev_get_addr(bus); plat->periph_id = clock_decode_periph_id(blob, node);
if (plat->periph_id == PERIPH_ID_NONE) { diff --git a/drivers/spi/tegra20_slink.c b/drivers/spi/tegra20_slink.c index f6fb89b..fbb665b 100644 --- a/drivers/spi/tegra20_slink.c +++ b/drivers/spi/tegra20_slink.c @@ -106,7 +106,7 @@ static int tegra30_spi_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->base = fdtdec_get_addr(blob, node, "reg"); + plat->base = dev_get_addr(bus); plat->periph_id = clock_decode_periph_id(blob, node);
if (plat->periph_id == PERIPH_ID_NONE) { diff --git a/drivers/spi/zynq_spi.c b/drivers/spi/zynq_spi.c index 7ae1f0e..310fb69 100644 --- a/drivers/spi/zynq_spi.c +++ b/drivers/spi/zynq_spi.c @@ -72,7 +72,7 @@ static int zynq_spi_ofdata_to_platdata(struct udevice *bus) const void *blob = gd->fdt_blob; int node = bus->of_offset;
- plat->regs = (struct zynq_spi_regs *)fdtdec_get_addr(blob, node, "reg"); + plat->regs = (struct zynq_spi_regs *)dev_get_addr(bus);
/* FIXME: Use 250MHz as a suitable default */ plat->frequency = fdtdec_get_int(blob, node, "spi-max-frequency", diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index 4a4f559..31d54ab 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -684,11 +684,13 @@ static void config_clock(const u32 timing[]) timing[PARAM_CPCON], timing[PARAM_LFCON]); }
-static int fdt_decode_usb(const void *blob, int node, struct fdt_usb *config) +static int fdt_decode_usb(struct udevice *dev, struct fdt_usb *config) { + const void *blob = gd->fdt_blob; + int node = dev->of_offset; const char *phy, *mode;
- config->reg = (struct usb_ctlr *)fdtdec_get_addr(blob, node, "reg"); + config->reg = (struct usb_ctlr *)dev_get_addr(dev); mode = fdt_getprop(blob, node, "dr_mode", NULL); if (mode) { if (0 == strcmp(mode, "host")) @@ -812,7 +814,7 @@ static int ehci_usb_ofdata_to_platdata(struct udevice *dev) struct fdt_usb *priv = dev_get_priv(dev); int ret;
- ret = fdt_decode_usb(gd->fdt_blob, dev->of_offset, priv); + ret = fdt_decode_usb(dev, priv); if (ret) return ret;
diff --git a/drivers/usb/host/xhci-exynos5.c b/drivers/usb/host/xhci-exynos5.c index 251885b..28416ed 100644 --- a/drivers/usb/host/xhci-exynos5.c +++ b/drivers/usb/host/xhci-exynos5.c @@ -61,7 +61,7 @@ static int xhci_usb_ofdata_to_platdata(struct udevice *dev) /* * Get the base address for XHCI controller from the device node */ - plat->hcd_base = fdtdec_get_addr(blob, dev->of_offset, "reg"); + plat->hcd_base = dev_get_addr(dev); if (plat->hcd_base == FDT_ADDR_T_NONE) { debug("Can't get the XHCI register base address\n"); return -ENXIO; diff --git a/drivers/video/tegra124/dp.c b/drivers/video/tegra124/dp.c index 3c0b721..1bf9202 100644 --- a/drivers/video/tegra124/dp.c +++ b/drivers/video/tegra124/dp.c @@ -1555,9 +1555,8 @@ error_enable: static int tegra_dp_ofdata_to_platdata(struct udevice *dev) { struct tegra_dp_plat *plat = dev_get_platdata(dev); - const void *blob = gd->fdt_blob;
- plat->base = fdtdec_get_addr(blob, dev->of_offset, "reg"); + plat->base = dev_get_addr(dev);
return 0; }

Hi Simon,
On Tue, Aug 11, 2015 at 9:33 AM, Simon Glass sjg@chromium.org wrote:
This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Signed-off-by: Simon Glass sjg@chromium.org
This looks great!
Reviewed-by: Joe Hershberger joe.hershberger@ni.com

On 08/11/2015 08:33 AM, Simon Glass wrote:
This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Ah good; I was a little worried about the tiny number of users of dev_get_addr().
diff --git a/drivers/core/device.c b/drivers/core/device.c
@@ -566,8 +566,10 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); if (addr != FDT_ADDR_T_NONE) { +#ifndef CONFIG_SPL_BUILD if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); +#endif
That seems like an unrelated change; is it a fix for a pre-existing issue? Either way, it looks like that will cause SPL to get incorrect values for the address since addresses won't get translated (via the parent's ranges property??) in SPL. Isn't that a bad thing?
The rest of the patch, Acked-by: Stephen Warren swarren@wwwdotorg.org

Hi Stephen,
On 11 August 2015 at 11:33, Stephen Warren swarren@wwwdotorg.org wrote:
On 08/11/2015 08:33 AM, Simon Glass wrote:
This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Ah good; I was a little worried about the tiny number of users of dev_get_addr().
diff --git a/drivers/core/device.c b/drivers/core/device.c
@@ -566,8 +566,10 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); if (addr != FDT_ADDR_T_NONE) {
+#ifndef CONFIG_SPL_BUILD if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); +#endif
That seems like an unrelated change; is it a fix for a pre-existing issue? Either way, it looks like that will cause SPL to get incorrect values for the address since addresses won't get translated (via the parent's ranges property??) in SPL. Isn't that a bad thing?
Masahiro has a series pending which will clean this up, and I'll revisit it after that. But for now SPL does not support simple bus. It does not affect current platforms.
The rest of the patch, Acked-by: Stephen Warren swarren@wwwdotorg.org
Regards, Simon

Hi,
On 11 August 2015 at 11:41, Simon Glass sjg@chromium.org wrote:
Hi Stephen,
On 11 August 2015 at 11:33, Stephen Warren swarren@wwwdotorg.org wrote:
On 08/11/2015 08:33 AM, Simon Glass wrote:
This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Ah good; I was a little worried about the tiny number of users of dev_get_addr().
diff --git a/drivers/core/device.c b/drivers/core/device.c
@@ -566,8 +566,10 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); if (addr != FDT_ADDR_T_NONE) {
+#ifndef CONFIG_SPL_BUILD if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); +#endif
That seems like an unrelated change; is it a fix for a pre-existing issue? Either way, it looks like that will cause SPL to get incorrect values for the address since addresses won't get translated (via the parent's ranges property??) in SPL. Isn't that a bad thing?
Masahiro has a series pending which will clean this up, and I'll revisit it after that. But for now SPL does not support simple bus. It does not affect current platforms.
The rest of the patch, Acked-by: Stephen Warren swarren@wwwdotorg.org
Unless there are objections I plan to apply this clean-up patch to dm/master next week.
Regards, Simon

On 12 August 2015 at 20:16, Simon Glass sjg@chromium.org wrote:
Hi,
On 11 August 2015 at 11:41, Simon Glass sjg@chromium.org wrote:
Hi Stephen,
On 11 August 2015 at 11:33, Stephen Warren swarren@wwwdotorg.org wrote:
On 08/11/2015 08:33 AM, Simon Glass wrote:
This is a convenient way for a driver to get the hardware address of a device, when regmap or syscon are not being used. Change existing callers to use it as an example to others.
Ah good; I was a little worried about the tiny number of users of dev_get_addr().
diff --git a/drivers/core/device.c b/drivers/core/device.c
@@ -566,8 +566,10 @@ fdt_addr_t dev_get_addr(struct udevice *dev)
addr = fdtdec_get_addr(gd->fdt_blob, dev->of_offset, "reg"); if (addr != FDT_ADDR_T_NONE) {
+#ifndef CONFIG_SPL_BUILD if (device_get_uclass_id(dev->parent) == UCLASS_SIMPLE_BUS) addr = simple_bus_translate(dev->parent, addr); +#endif
That seems like an unrelated change; is it a fix for a pre-existing issue? Either way, it looks like that will cause SPL to get incorrect values for the address since addresses won't get translated (via the parent's ranges property??) in SPL. Isn't that a bad thing?
Masahiro has a series pending which will clean this up, and I'll revisit it after that. But for now SPL does not support simple bus. It does not affect current platforms.
The rest of the patch, Acked-by: Stephen Warren swarren@wwwdotorg.org
Unless there are objections I plan to apply this clean-up patch to dm/master next week.
Or maybe this week.
Applied to u-boot-dm.
participants (3)
-
Joe Hershberger
-
Simon Glass
-
Stephen Warren