public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree
@ 2017-05-19 14:30 Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace Simon Glass
                   ` (26 more replies)
  0 siblings, 27 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

This moves an entire board to use a live device tree as an example of the
impact.

Nyan-big was chosen because I can easily and boot U-Boot without any
media swapping, etc.

Total code size impact on this board is approximately 9KB on U-Boot and
64 bytes on SPL:

27: dm: tegra: nyan-big: Move to livetree
       arm: (for 1/1 boards) all +9264.0 bss -16.0 data +44.0 rodata +92.0
          spl/u-boot-spl:all +326.0 spl/u-boot-spl:rodata +262.0
          spl/u-boot-spl:text +64.0 text +9144.0

Tegra does not use Thumb2, which would likely reduce the code size by about
25%, indicating a code-size impact of perhaps 7KB.

I have not yet collected reliable detailed timing information. I will do
that with the next version of this series, after comments are received.
I expect that building the live tree will take a little time, and that
using it will be very slightly faster.

The use of livetree is controlled by a the CONFIG_OF_LIVE option. When
enabled, U-Boot builds a livetree immediately after relocation and uses
it from then on.

This series is available at u-boot-dm/livet-working

(note that some work remains for apalis-tk1, jetson-tk1, cei-tk1-som)


Simon Glass (26):
  dm: video: Sync display on backspace
  dm: video: Update pwm_backlight to support livetree
  video: simple-panel: Add a little more debugging
  tegra: Fix up include file ordering
  tegra: spl: Enable debug UART
  tegra: nyan: Add a PMC syscon driver
  dm: tegra: Convert USB setup to livetree
  dm: tegra: Convert clock_decode_periph_id() to support livetree
  dm: video: tegra124: Convert to livetree
  tegra: dts: Move stdout-path to /chosen
  tegra: Don't set up the UART clocks again in U-Boot
  dm: tegra: gpio: Convert to support livetree
  dm: tegra: usb: Convert to livetree
  dm: tegra: spi: Convert to livetree
  dm: tegra: i2c: Convert to livetree
  dm: tegra: pwm: Convert to livetree
  dm: tegra: mmc: Convert to livetree
  power: Add a regulator driver for the as3722 PMIC
  power: Add a GPIO driver for the as3722 PMIC
  dm: power: Convert as3722 to driver model
  dm: serial: ns16550: Convert to livetree
  dm: serial: Separate out the core serial-device finding code
  dm: serial: Add livetree support
  tegra: Show a debug message if the LCD PMIC fails to start
  fdtdec: Drop old compatible values
  dm: tegra: nyan-big: Move to livetree

 arch/arm/dts/tegra124-nyan-big.dts            |   5 +-
 arch/arm/include/asm/arch-tegra/clock.h       |   2 +-
 arch/arm/include/asm/arch-tegra/tegra.h       |   5 +
 arch/arm/include/asm/arch-tegra/xusb-padctl.h |   2 +-
 arch/arm/mach-tegra/board.c                   |   2 +
 arch/arm/mach-tegra/board2.c                  |  34 ++-
 arch/arm/mach-tegra/clock.c                   |   9 +-
 arch/arm/mach-tegra/spl.c                     |   4 +
 arch/arm/mach-tegra/tegra124/Makefile         |   1 +
 arch/arm/mach-tegra/tegra124/pmc.c            |  19 ++
 arch/arm/mach-tegra/tegra124/xusb-padctl.c    |  36 +++-
 arch/arm/mach-tegra/tegra210/xusb-padctl.c    |  40 +++-
 arch/arm/mach-tegra/xusb-padctl-common.c      |  84 ++++----
 arch/arm/mach-tegra/xusb-padctl-common.h      |  11 +-
 arch/arm/mach-tegra/xusb-padctl-dummy.c       |   2 +-
 board/nvidia/nyan-big/nyan-big.c              |  22 +-
 configs/nyan-big_defconfig                    |   4 +
 drivers/gpio/tegra_gpio.c                     |  10 +-
 drivers/i2c/tegra_i2c.c                       |   6 +-
 drivers/mmc/tegra_mmc.c                       |  17 +-
 drivers/power/pmic/Makefile                   |   2 +-
 drivers/power/pmic/as3722.c                   | 292 +++++++++-----------------
 drivers/power/pmic/as3722_gpio.c              | 120 +++++++++++
 drivers/power/regulator/Kconfig               |   9 +
 drivers/power/regulator/Makefile              |   1 +
 drivers/power/regulator/as3722_regulator.c    | 149 +++++++++++++
 drivers/pwm/tegra_pwm.c                       |   2 +-
 drivers/serial/ns16550.c                      |  15 +-
 drivers/serial/serial-uclass.c                |  92 ++++----
 drivers/spi/tegra114_spi.c                    |  15 +-
 drivers/spi/tegra20_sflash.c                  |   2 +-
 drivers/spi/tegra20_slink.c                   |   2 +-
 drivers/spi/tegra210_qspi.c                   |   2 +-
 drivers/usb/host/ehci-tegra.c                 |  36 ++--
 drivers/video/pwm_backlight.c                 |  23 +-
 drivers/video/simple_panel.c                  |   2 +
 drivers/video/tegra124/display.c              |   8 +-
 drivers/video/tegra124/dp.c                   |   3 +-
 drivers/video/tegra124/sor.c                  |  25 +--
 drivers/video/vidconsole-uclass.c             |   1 +
 include/fdtdec.h                              |   6 -
 include/power/as3722.h                        |  27 ++-
 lib/fdtdec.c                                  |   6 -
 43 files changed, 699 insertions(+), 456 deletions(-)
 create mode 100644 arch/arm/mach-tegra/tegra124/pmc.c
 create mode 100644 drivers/power/pmic/as3722_gpio.c
 create mode 100644 drivers/power/regulator/as3722_regulator.c

-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:53   ` Anatolij Gustschin
  2017-05-19 14:30 ` [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree Simon Glass
                   ` (25 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

We should sync the display (e.g. flush cache) when backspace is pressed
to ensure that the character is erased correctly.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/video/vidconsole-uclass.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/video/vidconsole-uclass.c b/drivers/video/vidconsole-uclass.c
index e9a90b1b9b..b5afd72227 100644
--- a/drivers/video/vidconsole-uclass.c
+++ b/drivers/video/vidconsole-uclass.c
@@ -77,6 +77,7 @@ static int vidconsole_back(struct udevice *dev)
 		if (priv->ycur < 0)
 			priv->ycur = 0;
 	}
+	video_sync(dev->parent);
 
 	return 0;
 }
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:55   ` Anatolij Gustschin
  2017-05-19 14:30 ` [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging Simon Glass
                   ` (24 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update this driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/video/pwm_backlight.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/drivers/video/pwm_backlight.c b/drivers/video/pwm_backlight.c
index 3697f4905c..359f8fa186 100644
--- a/drivers/video/pwm_backlight.c
+++ b/drivers/video/pwm_backlight.c
@@ -28,11 +28,13 @@ struct pwm_backlight_priv {
 static int pwm_backlight_enable(struct udevice *dev)
 {
 	struct pwm_backlight_priv *priv = dev_get_priv(dev);
+	struct dm_regulator_uclass_platdata *plat;
 	uint duty_cycle;
 	int ret;
 
-	debug("%s: Enable '%s', regulator '%s'\n", __func__, dev->name,
-	      priv->reg->name);
+	plat = dev_get_uclass_platdata(priv->reg);
+	debug("%s: Enable '%s', regulator '%s'/'%s'\n", __func__, dev->name,
+	      priv->reg->name, plat->name);
 	ret = regulator_set_enable(priv->reg, true);
 	if (ret) {
 		debug("%s: Cannot enable regulator for PWM '%s'\n", __func__,
@@ -59,12 +61,11 @@ static int pwm_backlight_enable(struct udevice *dev)
 static int pwm_backlight_ofdata_to_platdata(struct udevice *dev)
 {
 	struct pwm_backlight_priv *priv = dev_get_priv(dev);
-	struct fdtdec_phandle_args args;
-	const void *blob = gd->fdt_blob;
-	int node = dev_of_offset(dev);
+	struct ofnode_phandle_args args;
 	int index, ret, count, len;
 	const u32 *cell;
 
+	debug("%s: start\n", __func__);
 	ret = uclass_get_device_by_phandle(UCLASS_REGULATOR, dev,
 					   "power-supply", &priv->reg);
 	if (ret) {
@@ -79,14 +80,15 @@ static int pwm_backlight_ofdata_to_platdata(struct udevice *dev)
 		if (ret != -ENOENT)
 			return ret;
 	}
-	ret = fdtdec_parse_phandle_with_args(blob, node, "pwms", "#pwm-cells",
-					     0, 0, &args);
+	ret = dev_read_phandle_with_args(dev, "pwms", "#pwm-cells", 0, 0,
+					  &args);
 	if (ret) {
 		debug("%s: Cannot get PWM phandle: ret=%d\n", __func__, ret);
 		return ret;
 	}
 
-	ret = uclass_get_device_by_of_offset(UCLASS_PWM, args.node, &priv->pwm);
+	ret = uclass_get_device_by_ofnode(UCLASS_PWM, args.node,
+					  &priv->pwm);
 	if (ret) {
 		debug("%s: Cannot get PWM: ret=%d\n", __func__, ret);
 		return ret;
@@ -94,8 +96,8 @@ static int pwm_backlight_ofdata_to_platdata(struct udevice *dev)
 	priv->channel = args.args[0];
 	priv->period_ns = args.args[1];
 
-	index = fdtdec_get_int(blob, node, "default-brightness-level", 255);
-	cell = fdt_getprop(blob, node, "brightness-levels", &len);
+	index = dev_read_u32_default(dev, "default-brightness-level", 255);
+	cell = dev_read_prop(dev, "brightness-levels", &len);
 	count = len / sizeof(u32);
 	if (cell && count > index) {
 		priv->default_level = fdt32_to_cpu(cell[index]);
@@ -104,6 +106,7 @@ static int pwm_backlight_ofdata_to_platdata(struct udevice *dev)
 		priv->default_level = index;
 		priv->max_level = 255;
 	}
+	debug("%s: done\n", __func__);
 
 
 	return 0;
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:56   ` Anatolij Gustschin
  2017-05-19 14:30 ` [U-Boot] [PATCH 04/26] tegra: Fix up include file ordering Simon Glass
                   ` (23 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Add some debugging to show when the backlight is enabled.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/video/simple_panel.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/simple_panel.c b/drivers/video/simple_panel.c
index baa95f6a12..c0ce199c6a 100644
--- a/drivers/video/simple_panel.c
+++ b/drivers/video/simple_panel.c
@@ -25,8 +25,10 @@ static int simple_panel_enable_backlight(struct udevice *dev)
 	struct simple_panel_priv *priv = dev_get_priv(dev);
 	int ret;
 
+	debug("%s: start, backlight = '%s'\n", __func__, priv->backlight->name);
 	dm_gpio_set_value(&priv->enable, 1);
 	ret = backlight_enable(priv->backlight);
+	debug("%s: done, ret = %d\n", __func__, ret);
 	if (ret)
 		return ret;
 
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 04/26] tegra: Fix up include file ordering
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (2 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 05/26] tegra: spl: Enable debug UART Simon Glass
                   ` (22 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update these two files so include files in the right order.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/mach-tegra/board2.c | 22 ++++++++--------------
 arch/arm/mach-tegra/clock.c  |  4 ++--
 2 files changed, 10 insertions(+), 16 deletions(-)

diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
index 84f1ee5035..943ee24e59 100644
--- a/arch/arm/mach-tegra/board2.c
+++ b/arch/arm/mach-tegra/board2.c
@@ -9,14 +9,8 @@
 #include <dm.h>
 #include <errno.h>
 #include <ns16550.h>
-#include <linux/compiler.h>
-#include <linux/sizes.h>
+#include <usb.h>
 #include <asm/io.h>
-#include <asm/arch/clock.h>
-#include <asm/arch/funcmux.h>
-#include <asm/arch/pinmux.h>
-#include <asm/arch/pmu.h>
-#include <asm/arch/tegra.h>
 #include <asm/arch-tegra/ap.h>
 #include <asm/arch-tegra/board.h>
 #include <asm/arch-tegra/clk_rst.h>
@@ -25,17 +19,17 @@
 #include <asm/arch-tegra/uart.h>
 #include <asm/arch-tegra/warmboot.h>
 #include <asm/arch-tegra/gpu.h>
+#include <asm/arch-tegra/usb.h>
+#include <asm/arch-tegra/xusb-padctl.h>
+#include <asm/arch/clock.h>
+#include <asm/arch/funcmux.h>
+#include <asm/arch/pinmux.h>
+#include <asm/arch/pmu.h>
+#include <asm/arch/tegra.h>
 #ifdef CONFIG_TEGRA_CLOCK_SCALING
 #include <asm/arch/emc.h>
 #endif
-#include <asm/arch-tegra/usb.h>
-#ifdef CONFIG_USB_EHCI_TEGRA
-#include <usb.h>
-#endif
-#include <asm/arch-tegra/xusb-padctl.h>
 #include <power/as3722.h>
-#include <i2c.h>
-#include <spi.h>
 #include "emc.h"
 
 DECLARE_GLOBAL_DATA_PTR;
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 3bb72331a4..f547942022 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -7,6 +7,8 @@
 /* Tegra SoC common clock control functions */
 
 #include <common.h>
+#include <div64.h>
+#include <dm.h>
 #include <errno.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
@@ -15,8 +17,6 @@
 #include <asm/arch-tegra/clk_rst.h>
 #include <asm/arch-tegra/pmc.h>
 #include <asm/arch-tegra/timer.h>
-#include <div64.h>
-#include <fdtdec.h>
 
 /*
  * This is our record of the current clock rate of each clock. We don't
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 05/26] tegra: spl: Enable debug UART
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (3 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 04/26] tegra: Fix up include file ordering Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 06/26] tegra: nyan: Add a PMC syscon driver Simon Glass
                   ` (21 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Enable the debug UART in SPL to allow early serial output even if the
standard UART does not work (e.g. due to driver model problem).

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/mach-tegra/spl.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/mach-tegra/spl.c b/arch/arm/mach-tegra/spl.c
index 41c88cb2b4..189b3da026 100644
--- a/arch/arm/mach-tegra/spl.c
+++ b/arch/arm/mach-tegra/spl.c
@@ -7,6 +7,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 #include <common.h>
+#include <debug_uart.h>
 #include <spl.h>
 
 #include <asm/io.h>
@@ -32,6 +33,9 @@ void spl_board_init(void)
 	gpio_early_init_uart();
 
 	clock_early_init();
+#ifdef CONFIG_DEBUG_UART
+	debug_uart_init();
+#endif
 	preloader_console_init();
 }
 
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 06/26] tegra: nyan: Add a PMC syscon driver
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (4 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 05/26] tegra: spl: Enable debug UART Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 07/26] dm: tegra: Convert USB setup to livetree Simon Glass
                   ` (20 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

The PMC can be modelled as a syscon peripheral. Add a driver for this
so that it can be accessed by drivers when needed.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/include/asm/arch-tegra/tegra.h |  5 +++++
 arch/arm/mach-tegra/tegra124/Makefile   |  1 +
 arch/arm/mach-tegra/tegra124/pmc.c      | 19 +++++++++++++++++++
 configs/nyan-big_defconfig              |  2 ++
 4 files changed, 27 insertions(+)
 create mode 100644 arch/arm/mach-tegra/tegra124/pmc.c

diff --git a/arch/arm/include/asm/arch-tegra/tegra.h b/arch/arm/include/asm/arch-tegra/tegra.h
index 3add1b3c09..3b9711d28e 100644
--- a/arch/arm/include/asm/arch-tegra/tegra.h
+++ b/arch/arm/include/asm/arch-tegra/tegra.h
@@ -97,6 +97,11 @@ enum {
 	TEGRA_SOC_UNKNOWN	= -1,
 };
 
+/* Tegra system controller (SYSCON) devices */
+enum {
+	TEGRA_SYSCON_PMC,
+};
+
 #else  /* __ASSEMBLY__ */
 #define PRM_RSTCTRL		NV_PA_PMC_BASE
 #endif
diff --git a/arch/arm/mach-tegra/tegra124/Makefile b/arch/arm/mach-tegra/tegra124/Makefile
index c00de6151e..d275dafdc4 100644
--- a/arch/arm/mach-tegra/tegra124/Makefile
+++ b/arch/arm/mach-tegra/tegra124/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_SPL_BUILD) += cpu.o
 obj-y	+= clock.o
 obj-y	+= funcmux.o
 obj-y	+= pinmux.o
+obj-y	+= pmc.o
 obj-y	+= xusb-padctl.o
 obj-y	+= ../xusb-padctl-common.o
 
diff --git a/arch/arm/mach-tegra/tegra124/pmc.c b/arch/arm/mach-tegra/tegra124/pmc.c
new file mode 100644
index 0000000000..be82acf11e
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra124/pmc.c
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2017 Google, Inc
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <syscon.h>
+
+static const struct udevice_id tegra124_syscon_ids[] = {
+	{ .compatible = "nvidia,tegra124-pmc", .data = TEGRA_SYSCON_PMC },
+};
+
+U_BOOT_DRIVER(syscon_tegra124) = {
+	.name = "tegra124_syscon",
+	.id = UCLASS_SYSCON,
+	.of_match = tegra124_syscon_ids,
+};
diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
index 8345aea27b..22769bdc93 100644
--- a/configs/nyan-big_defconfig
+++ b/configs/nyan-big_defconfig
@@ -34,6 +34,8 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
 CONFIG_SPL_DM=y
+CONFIG_REGMAP=y
+CONFIG_SYSCON=y
 CONFIG_DFU_MMC=y
 CONFIG_DFU_RAM=y
 CONFIG_DFU_SF=y
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 07/26] dm: tegra: Convert USB setup to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (5 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 06/26] tegra: nyan: Add a PMC syscon driver Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 08/26] dm: tegra: Convert clock_decode_periph_id() to support livetree Simon Glass
                   ` (19 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Adjust this code to support a live device tree. This should be implemented
as a PHY driver but that is left as an exercise for the maintainer.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/include/asm/arch-tegra/xusb-padctl.h |  2 +-
 arch/arm/mach-tegra/board2.c                  |  2 +-
 arch/arm/mach-tegra/tegra124/xusb-padctl.c    | 36 +++++++++---
 arch/arm/mach-tegra/tegra210/xusb-padctl.c    | 40 +++++++++----
 arch/arm/mach-tegra/xusb-padctl-common.c      | 84 ++++++++++++++-------------
 arch/arm/mach-tegra/xusb-padctl-common.h      | 11 ++--
 arch/arm/mach-tegra/xusb-padctl-dummy.c       |  2 +-
 7 files changed, 112 insertions(+), 65 deletions(-)

diff --git a/arch/arm/include/asm/arch-tegra/xusb-padctl.h b/arch/arm/include/asm/arch-tegra/xusb-padctl.h
index b4b4c8ba4d..deccdf455d 100644
--- a/arch/arm/include/asm/arch-tegra/xusb-padctl.h
+++ b/arch/arm/include/asm/arch-tegra/xusb-padctl.h
@@ -15,7 +15,7 @@ struct tegra_xusb_phy;
  */
 struct tegra_xusb_phy *tegra_xusb_phy_get(unsigned int type);
 
-void tegra_xusb_padctl_init(const void *fdt);
+void tegra_xusb_padctl_init(void);
 int tegra_xusb_phy_prepare(struct tegra_xusb_phy *phy);
 int tegra_xusb_phy_enable(struct tegra_xusb_phy *phy);
 int tegra_xusb_phy_disable(struct tegra_xusb_phy *phy);
diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
index 943ee24e59..5aedd3ef9d 100644
--- a/arch/arm/mach-tegra/board2.c
+++ b/arch/arm/mach-tegra/board2.c
@@ -164,7 +164,7 @@ int board_init(void)
 	pin_mux_nand();
 #endif
 
-	tegra_xusb_padctl_init(gd->fdt_blob);
+	tegra_xusb_padctl_init();
 
 #ifdef CONFIG_TEGRA_LP0
 	/* save Sdram params to PMC 2, 4, and 24 for WB0 */
diff --git a/arch/arm/mach-tegra/tegra124/xusb-padctl.c b/arch/arm/mach-tegra/tegra124/xusb-padctl.c
index 76af924b94..d326a6ae57 100644
--- a/arch/arm/mach-tegra/tegra124/xusb-padctl.c
+++ b/arch/arm/mach-tegra/tegra124/xusb-padctl.c
@@ -8,6 +8,8 @@
 
 #include <common.h>
 #include <errno.h>
+#include <dm/of_access.h>
+#include <dm/ofnode.h>
 
 #include "../xusb-padctl-common.h"
 
@@ -317,13 +319,33 @@ static const struct tegra_xusb_padctl_soc tegra124_socdata = {
 	.num_phys = ARRAY_SIZE(tegra124_phys),
 };
 
-void tegra_xusb_padctl_init(const void *fdt)
+void tegra_xusb_padctl_init(void)
 {
-	int count, nodes[1];
+	ofnode nodes[1];
+	int count = 0;
+	int ret;
+
+	debug("%s: start\n", __func__);
+	if (of_live_active()) {
+		struct device_node *np = of_find_compatible_node(NULL, NULL,
+						"nvidia,tegra124-xusb-padctl");
+
+		debug("np=%p\n", np);
+		if (np) {
+			nodes[0] = np_to_ofnode(np);
+			count = 1;
+		}
+	} else {
+		int node_offsets[1];
+		int i;
+
+		count = fdtdec_find_aliases_for_id(gd->fdt_blob, "padctl",
+				COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL,
+				node_offsets, ARRAY_SIZE(node_offsets));
+		for (i = 0; i < count; i++)
+			nodes[i] = offset_to_ofnode(node_offsets[i]);
+	}
 
-	count = fdtdec_find_aliases_for_id(fdt, "padctl",
-					   COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL,
-					   nodes, ARRAY_SIZE(nodes));
-	if (tegra_xusb_process_nodes(fdt, nodes, count, &tegra124_socdata))
-		return;
+	ret = tegra_xusb_process_nodes(nodes, count, &tegra124_socdata);
+	debug("%s: done, ret=%d\n", __func__, ret);
 }
diff --git a/arch/arm/mach-tegra/tegra210/xusb-padctl.c b/arch/arm/mach-tegra/tegra210/xusb-padctl.c
index 9ec93e7c4c..fde76dda01 100644
--- a/arch/arm/mach-tegra/tegra210/xusb-padctl.c
+++ b/arch/arm/mach-tegra/tegra210/xusb-padctl.c
@@ -8,6 +8,8 @@
 
 #include <common.h>
 #include <errno.h>
+#include <dm/of_access.h>
+#include <dm/ofnode.h>
 
 #include "../xusb-padctl-common.h"
 
@@ -421,17 +423,33 @@ static const struct tegra_xusb_padctl_soc tegra210_socdata = {
 	.num_phys = ARRAY_SIZE(tegra210_phys),
 };
 
-void tegra_xusb_padctl_init(const void *fdt)
+void tegra_xusb_padctl_init(void)
 {
-	int count, nodes[1];
-
-	debug("> %s(fdt=%p)\n", __func__, fdt);
-
-	count = fdtdec_find_aliases_for_id(fdt, "padctl",
-					   COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL,
-					   nodes, ARRAY_SIZE(nodes));
-	if (tegra_xusb_process_nodes(fdt, nodes, count, &tegra210_socdata))
-		return;
+	ofnode nodes[1];
+	int count = 0;
+	int ret;
+
+	debug("%s: start\n", __func__);
+	if (of_live_active()) {
+		struct device_node *np = of_find_compatible_node(NULL, NULL,
+						"nvidia,tegra210-xusb-padctl");
+
+		debug("np=%p\n", np);
+		if (np) {
+			nodes[0] = np_to_ofnode(np);
+			count = 1;
+		}
+	} else {
+		int node_offsets[1];
+		int i;
+
+		count = fdtdec_find_aliases_for_id(gd->fdt_blob, "padctl",
+				COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL,
+				node_offsets, ARRAY_SIZE(node_offsets));
+		for (i = 0; i < count; i++)
+			nodes[i] = offset_to_ofnode(node_offsets[i]);
+	}
 
-	debug("< %s()\n", __func__);
+	ret = tegra_xusb_process_nodes(nodes, count, &tegra210_socdata);
+	debug("%s: done, ret=%d\n", __func__, ret);
 }
diff --git a/arch/arm/mach-tegra/xusb-padctl-common.c b/arch/arm/mach-tegra/xusb-padctl-common.c
index 43f5bb7da6..4114273b6d 100644
--- a/arch/arm/mach-tegra/xusb-padctl-common.c
+++ b/arch/arm/mach-tegra/xusb-padctl-common.c
@@ -75,39 +75,35 @@ tegra_xusb_padctl_find_lane(struct tegra_xusb_padctl *padctl, const char *name)
 static int
 tegra_xusb_padctl_group_parse_dt(struct tegra_xusb_padctl *padctl,
 				 struct tegra_xusb_padctl_group *group,
-				 const void *fdt, int node)
+				 ofnode node)
 {
 	unsigned int i;
-	int len;
-
-	group->name = fdt_get_name(fdt, node, &len);
-
-	len = fdt_stringlist_count(fdt, node, "nvidia,lanes");
-	if (len < 0) {
-		error("failed to parse \"nvidia,lanes\" property");
-		return -EINVAL;
-	}
-
-	group->num_pins = len;
-
-	for (i = 0; i < group->num_pins; i++) {
-		group->pins[i] = fdt_stringlist_get(fdt, node, "nvidia,lanes",
-						    i, NULL);
-		if (!group->pins[i]) {
-			error("failed to read string from \"nvidia,lanes\" property");
-			return -EINVAL;
+	int ret;
+
+	group->name = ofnode_get_name(node);
+
+	for (i = 0; ; i++) {
+		ret = ofnode_read_string_index(node, "nvidia,lanes", i,
+					       &group->pins[i]);
+		if (ret) {
+			if (!i) {
+				error("failed to read string from \"nvidia,lanes\" property");
+				return -EINVAL;
+			}
+			break;
 		}
 	}
 
-	group->num_pins = len;
+	group->num_pins = i;
 
-	group->func = fdt_stringlist_get(fdt, node, "nvidia,function", 0, NULL);
-	if (!group->func) {
+	ret = ofnode_read_string_index(node, "nvidia,function", 0,
+				       &group->func);
+	if (ret) {
 		error("failed to parse \"nvidia,func\" property");
 		return -EINVAL;
 	}
 
-	group->iddq = fdtdec_get_int(fdt, node, "nvidia,iddq", -1);
+	group->iddq = ofnode_read_u32_default(node, "nvidia,iddq", -1);
 
 	return 0;
 }
@@ -217,20 +213,21 @@ tegra_xusb_padctl_config_apply(struct tegra_xusb_padctl *padctl,
 static int
 tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
 				  struct tegra_xusb_padctl_config *config,
-				  const void *fdt, int node)
+				  ofnode node)
 {
-	int subnode;
+	ofnode subnode;
 
-	config->name = fdt_get_name(fdt, node, NULL);
+	config->name = ofnode_get_name(node);
 
-	fdt_for_each_subnode(subnode, fdt, node) {
+	for (subnode = ofnode_first_subnode(node);
+	     ofnode_valid(node);
+	     subnode = ofnode_next_subnode(subnode)) {
 		struct tegra_xusb_padctl_group *group;
 		int err;
 
 		group = &config->groups[config->num_groups];
 
-		err = tegra_xusb_padctl_group_parse_dt(padctl, group, fdt,
-						       subnode);
+		err = tegra_xusb_padctl_group_parse_dt(padctl, group, subnode);
 		if (err < 0) {
 			error("failed to parse group %s", group->name);
 			return err;
@@ -243,20 +240,25 @@ tegra_xusb_padctl_config_parse_dt(struct tegra_xusb_padctl *padctl,
 }
 
 static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
-				      const void *fdt, int node)
+				      ofnode node)
 {
-	int subnode, err;
+	ofnode subnode;
+	int err;
 
-	err = fdt_get_resource(fdt, node, "reg", 0, &padctl->regs);
-	if (err < 0) {
+	debug("%s: start %s\n", __func__, node.np->name);
+	padctl->regs = ofnode_get_addr(node);
+	if (padctl->regs == FDT_ADDR_T_NONE) {
 		error("registers not found");
 		return err;
 	}
 
-	fdt_for_each_subnode(subnode, fdt, node) {
+	for (subnode = ofnode_first_subnode(node);
+	     ofnode_valid(subnode);
+	     subnode = ofnode_next_subnode(subnode)) {
 		struct tegra_xusb_padctl_config *config = &padctl->config;
 
-		err = tegra_xusb_padctl_config_parse_dt(padctl, config, fdt,
+		debug("%s: subnode=%s\n", __func__, subnode.np->name);
+		err = tegra_xusb_padctl_config_parse_dt(padctl, config,
 							subnode);
 		if (err < 0) {
 			error("failed to parse entry %s: %d",
@@ -264,25 +266,28 @@ static int tegra_xusb_padctl_parse_dt(struct tegra_xusb_padctl *padctl,
 			continue;
 		}
 	}
+	debug("%s: done\n", __func__);
 
 	return 0;
 }
 
 struct tegra_xusb_padctl padctl;
 
-int tegra_xusb_process_nodes(const void *fdt, int nodes[], unsigned int count,
-	const struct tegra_xusb_padctl_soc *socdata)
+int tegra_xusb_process_nodes(ofnode nodes[], unsigned int count,
+			     const struct tegra_xusb_padctl_soc *socdata)
 {
 	unsigned int i;
 	int err;
 
+	debug("%s: count=%d\n", __func__, count);
 	for (i = 0; i < count; i++) {
-		if (!fdtdec_get_is_enabled(fdt, nodes[i]))
+		debug("%s: i=%d, node=%p\n", __func__, i, nodes[i].np);
+		if (!ofnode_is_available(nodes[i]))
 			continue;
 
 		padctl.socdata = socdata;
 
-		err = tegra_xusb_padctl_parse_dt(&padctl, fdt, nodes[i]);
+		err = tegra_xusb_padctl_parse_dt(&padctl, nodes[i]);
 		if (err < 0) {
 			error("failed to parse DT: %d", err);
 			continue;
@@ -300,6 +305,7 @@ int tegra_xusb_process_nodes(const void *fdt, int nodes[], unsigned int count,
 		/* only a single instance is supported */
 		break;
 	}
+	debug("%s: done\n", __func__);
 
 	return 0;
 }
diff --git a/arch/arm/mach-tegra/xusb-padctl-common.h b/arch/arm/mach-tegra/xusb-padctl-common.h
index f44790a650..afb62a9adc 100644
--- a/arch/arm/mach-tegra/xusb-padctl-common.h
+++ b/arch/arm/mach-tegra/xusb-padctl-common.h
@@ -9,6 +9,7 @@
 
 #include <common.h>
 #include <fdtdec.h>
+#include <dm/ofnode.h>
 
 #include <asm/io.h>
 #include <asm/arch-tegra/xusb-padctl.h>
@@ -77,7 +78,7 @@ struct tegra_xusb_padctl_config {
 struct tegra_xusb_padctl {
 	const struct tegra_xusb_padctl_soc *socdata;
 	struct tegra_xusb_padctl_config config;
-	struct fdt_resource regs;
+	ulong regs;
 	unsigned int enable;
 
 };
@@ -86,16 +87,16 @@ extern struct tegra_xusb_padctl padctl;
 static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
 			       unsigned long offset)
 {
-	return readl(padctl->regs.start + offset);
+	return readl(padctl->regs + offset);
 }
 
 static inline void padctl_writel(struct tegra_xusb_padctl *padctl,
 				 u32 value, unsigned long offset)
 {
-	writel(value, padctl->regs.start + offset);
+	writel(value, padctl->regs + offset);
 }
 
-int tegra_xusb_process_nodes(const void *fdt, int nodes[], unsigned int count,
-	const struct tegra_xusb_padctl_soc *socdata);
+int tegra_xusb_process_nodes(ofnode nodes[], unsigned int count,
+			     const struct tegra_xusb_padctl_soc *socdata);
 
 #endif
diff --git a/arch/arm/mach-tegra/xusb-padctl-dummy.c b/arch/arm/mach-tegra/xusb-padctl-dummy.c
index 65f8d2ea96..856d712512 100644
--- a/arch/arm/mach-tegra/xusb-padctl-dummy.c
+++ b/arch/arm/mach-tegra/xusb-padctl-dummy.c
@@ -34,6 +34,6 @@ int __weak tegra_xusb_phy_unprepare(struct tegra_xusb_phy *phy)
 	return -ENOSYS;
 }
 
-void __weak tegra_xusb_padctl_init(const void *fdt)
+void __weak tegra_xusb_padctl_init(void)
 {
 }
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 08/26] dm: tegra: Convert clock_decode_periph_id() to support livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (6 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 07/26] dm: tegra: Convert USB setup to livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree Simon Glass
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Adjust this to take a device as a parameter instead of a node.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/include/asm/arch-tegra/clock.h | 2 +-
 arch/arm/mach-tegra/clock.c             | 5 ++---
 drivers/spi/tegra114_spi.c              | 2 +-
 drivers/spi/tegra20_sflash.c            | 2 +-
 drivers/spi/tegra20_slink.c             | 2 +-
 drivers/spi/tegra210_qspi.c             | 2 +-
 drivers/usb/host/ehci-tegra.c           | 2 +-
 7 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/arch/arm/include/asm/arch-tegra/clock.h b/arch/arm/include/asm/arch-tegra/clock.h
index 388afcb723..301de4a899 100644
--- a/arch/arm/include/asm/arch-tegra/clock.h
+++ b/arch/arm/include/asm/arch-tegra/clock.h
@@ -266,7 +266,7 @@ void clock_ll_start_uart(enum periph_id periph_id);
  * @param node		Node to look at
  * @return peripheral ID, or PERIPH_ID_NONE if none
  */
-enum periph_id clock_decode_periph_id(const void *blob, int node);
+int clock_decode_periph_id(struct udevice *dev);
 
 /**
  * Checks if the oscillator bypass is enabled (XOBP bit)
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index f547942022..090dba629c 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -652,14 +652,13 @@ void clock_ll_start_uart(enum periph_id periph_id)
 }
 
 #if CONFIG_IS_ENABLED(OF_CONTROL)
-int clock_decode_periph_id(const void *blob, int node)
+int clock_decode_periph_id(struct udevice *dev)
 {
 	enum periph_id id;
 	u32 cell[2];
 	int err;
 
-	err = fdtdec_get_int_array(blob, node, "clocks", cell,
-				   ARRAY_SIZE(cell));
+	err = dev_read_u32_array(dev, "clocks", cell, ARRAY_SIZE(cell));
 	if (err)
 		return -1;
 	id = clk_id_to_periph_id(cell[1]);
diff --git a/drivers/spi/tegra114_spi.c b/drivers/spi/tegra114_spi.c
index 802117eb49..86b1019585 100644
--- a/drivers/spi/tegra114_spi.c
+++ b/drivers/spi/tegra114_spi.c
@@ -104,7 +104,7 @@ static int tegra114_spi_ofdata_to_platdata(struct udevice *bus)
 	int node = dev_of_offset(bus);
 
 	plat->base = devfdt_get_addr(bus);
-	plat->periph_id = clock_decode_periph_id(blob, node);
+	plat->periph_id = clock_decode_periph_id(bus);
 
 	if (plat->periph_id == PERIPH_ID_NONE) {
 		debug("%s: could not decode periph id %d\n", __func__,
diff --git a/drivers/spi/tegra20_sflash.c b/drivers/spi/tegra20_sflash.c
index 299e1b44fa..e70210d7ab 100644
--- a/drivers/spi/tegra20_sflash.c
+++ b/drivers/spi/tegra20_sflash.c
@@ -91,7 +91,7 @@ static int tegra20_sflash_ofdata_to_platdata(struct udevice *bus)
 	int node = dev_of_offset(bus);
 
 	plat->base = devfdt_get_addr(bus);
-	plat->periph_id = clock_decode_periph_id(blob, node);
+	plat->periph_id = clock_decode_periph_id(bus);
 
 	if (plat->periph_id == PERIPH_ID_NONE) {
 		debug("%s: could not decode periph id %d\n", __func__,
diff --git a/drivers/spi/tegra20_slink.c b/drivers/spi/tegra20_slink.c
index 4cbde7b22f..f242574760 100644
--- a/drivers/spi/tegra20_slink.c
+++ b/drivers/spi/tegra20_slink.c
@@ -97,7 +97,7 @@ static int tegra30_spi_ofdata_to_platdata(struct udevice *bus)
 	int node = dev_of_offset(bus);
 
 	plat->base = devfdt_get_addr(bus);
-	plat->periph_id = clock_decode_periph_id(blob, node);
+	plat->periph_id = clock_decode_periph_id(bus);
 
 	if (plat->periph_id == PERIPH_ID_NONE) {
 		debug("%s: could not decode periph id %d\n", __func__,
diff --git a/drivers/spi/tegra210_qspi.c b/drivers/spi/tegra210_qspi.c
index 6d0b5da261..2a35a583f5 100644
--- a/drivers/spi/tegra210_qspi.c
+++ b/drivers/spi/tegra210_qspi.c
@@ -100,7 +100,7 @@ static int tegra210_qspi_ofdata_to_platdata(struct udevice *bus)
 	int node = dev_of_offset(bus);
 
 	plat->base = devfdt_get_addr(bus);
-	plat->periph_id = clock_decode_periph_id(blob, node);
+	plat->periph_id = clock_decode_periph_id(bus);
 
 	if (plat->periph_id == PERIPH_ID_NONE) {
 		debug("%s: could not decode periph id %d\n", __func__,
diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 7dc37f045d..873bf8ecfd 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -723,7 +723,7 @@ static int fdt_decode_usb(struct udevice *dev, struct fdt_usb *config)
 	config->enabled = fdtdec_get_is_enabled(blob, node);
 	config->has_legacy_mode = fdtdec_get_bool(blob, node,
 						  "nvidia,has-legacy-mode");
-	config->periph_id = clock_decode_periph_id(blob, node);
+	config->periph_id = clock_decode_periph_id(dev);
 	if (config->periph_id == PERIPH_ID_NONE) {
 		debug("%s: Missing/invalid peripheral ID\n", __func__);
 		return -EINVAL;
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (7 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 08/26] dm: tegra: Convert clock_decode_periph_id() to support livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 15:02   ` Anatolij Gustschin
  2017-05-19 14:30 ` [U-Boot] [PATCH 10/26] tegra: dts: Move stdout-path to /chosen Simon Glass
                   ` (17 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update these drivers to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/video/tegra124/display.c |  8 +++-----
 drivers/video/tegra124/dp.c      |  3 +--
 drivers/video/tegra124/sor.c     | 25 +++++++------------------
 3 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/drivers/video/tegra124/display.c b/drivers/video/tegra124/display.c
index 47752b27f1..4164fa1bd9 100644
--- a/drivers/video/tegra124/display.c
+++ b/drivers/video/tegra124/display.c
@@ -12,7 +12,6 @@
 #include <errno.h>
 #include <display.h>
 #include <edid.h>
-#include <fdtdec.h>
 #include <lcd.h>
 #include <video.h>
 #include <asm/gpio.h>
@@ -334,7 +333,6 @@ static int display_init(struct udevice *dev, void *lcdbase,
 {
 	struct display_plat *disp_uc_plat;
 	struct dc_ctlr *dc_ctlr;
-	const void *blob = gd->fdt_blob;
 	struct udevice *dp_dev;
 	const int href_to_sync = 1, vref_to_sync = 1;
 	int panel_bpp = 18;	/* default 18 bits per pixel */
@@ -363,9 +361,8 @@ static int display_init(struct udevice *dev, void *lcdbase,
 		return ret;
 	}
 
-	dc_ctlr = (struct dc_ctlr *)fdtdec_get_addr(blob, dev_of_offset(dev),
-						    "reg");
-	if (fdtdec_decode_display_timing(blob, dev_of_offset(dev), 0, timing)) {
+	dc_ctlr = (struct dc_ctlr *)dev_read_addr(dev);
+	if (ofnode_decode_display_timing(dev_ofnode(dev), 0, timing)) {
 		debug("%s: Failed to decode display timing\n", __func__);
 		return -EINVAL;
 	}
@@ -416,6 +413,7 @@ static int display_init(struct udevice *dev, void *lcdbase,
 		debug("dc: failed to update window\n");
 		return ret;
 	}
+	debug("%s: ready\n", __func__);
 
 	return 0;
 }
diff --git a/drivers/video/tegra124/dp.c b/drivers/video/tegra124/dp.c
index c38b3e5335..95d743d0f4 100644
--- a/drivers/video/tegra124/dp.c
+++ b/drivers/video/tegra124/dp.c
@@ -10,7 +10,6 @@
 #include <dm.h>
 #include <div64.h>
 #include <errno.h>
-#include <fdtdec.h>
 #include <video_bridge.h>
 #include <asm/io.h>
 #include <asm/arch-tegra/dc.h>
@@ -1572,7 +1571,7 @@ static int tegra_dp_ofdata_to_platdata(struct udevice *dev)
 {
 	struct tegra_dp_plat *plat = dev_get_platdata(dev);
 
-	plat->base = devfdt_get_addr(dev);
+	plat->base = dev_read_addr(dev);
 
 	return 0;
 }
diff --git a/drivers/video/tegra124/sor.c b/drivers/video/tegra124/sor.c
index 5e4140ff53..1f5e572bda 100644
--- a/drivers/video/tegra124/sor.c
+++ b/drivers/video/tegra124/sor.c
@@ -7,9 +7,9 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
-#include <fdtdec.h>
 #include <malloc.h>
 #include <panel.h>
+#include <syscon.h>
 #include <video_bridge.h>
 #include <asm/io.h>
 #include <asm/arch/clock.h>
@@ -750,15 +750,12 @@ int tegra_dc_sor_attach(struct udevice *dc_dev, struct udevice *dev,
 			const struct display_timing *timing)
 {
 	struct tegra_dc_sor_data *sor = dev_get_priv(dev);
-	const void *blob = gd->fdt_blob;
 	struct dc_ctlr *disp_ctrl;
 	u32 reg_val;
-	int node;
 
 	/* Use the first display controller */
 	debug("%s\n", __func__);
-	node = dev_of_offset(dc_dev);
-	disp_ctrl = (struct dc_ctlr *)fdtdec_get_addr(blob, node, "reg");
+	disp_ctrl = (struct dc_ctlr *)dev_read_addr(dc_dev);
 
 	tegra_dc_sor_enable_dc(disp_ctrl);
 	tegra_dc_sor_config_panel(sor, 0, link_cfg, timing);
@@ -965,16 +962,13 @@ int tegra_dc_sor_detach(struct udevice *dc_dev, struct udevice *dev)
 {
 	struct tegra_dc_sor_data *sor = dev_get_priv(dev);
 	int dc_reg_ctx[DC_REG_SAVE_SPACE];
-	const void *blob = gd->fdt_blob;
 	struct dc_ctlr *disp_ctrl;
 	unsigned long dc_int_mask;
-	int node;
 	int ret;
 
 	debug("%s\n", __func__);
 	/* Use the first display controller */
-	node = dev_of_offset(dc_dev);
-	disp_ctrl = (struct dc_ctlr *)fdtdec_get_addr(blob, node, "reg");
+	disp_ctrl = (struct dc_ctlr *)dev_read_addr(dev);
 
 	/* Sleep mode */
 	tegra_sor_writel(sor, SUPER_STATE1, SUPER_STATE1_ASY_HEAD_OP_SLEEP |
@@ -1041,18 +1035,13 @@ static int tegra_sor_set_backlight(struct udevice *dev, int percent)
 static int tegra_sor_ofdata_to_platdata(struct udevice *dev)
 {
 	struct tegra_dc_sor_data *priv = dev_get_priv(dev);
-	const void *blob = gd->fdt_blob;
-	int node;
 	int ret;
 
-	priv->base = (void *)fdtdec_get_addr(blob, dev_of_offset(dev), "reg");
+	priv->base = (void *)dev_read_addr(dev);
 
-	node = fdtdec_next_compatible(blob, 0, COMPAT_NVIDIA_TEGRA124_PMC);
-	if (node < 0) {
-		debug("%s: Cannot find PMC\n", __func__);
-		return -ENOENT;
-	}
-	priv->pmc_base = (void *)fdtdec_get_addr(blob, node, "reg");
+	priv->pmc_base = (void *)syscon_get_first_range(TEGRA_SYSCON_PMC);
+	if (IS_ERR(priv->pmc_base))
+		return PTR_ERR(priv->pmc_base);
 
 	ret = uclass_get_device_by_phandle(UCLASS_PANEL, dev, "nvidia,panel",
 					   &priv->panel);
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 10/26] tegra: dts: Move stdout-path to /chosen
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (8 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 11/26] tegra: Don't set up the UART clocks again in U-Boot Simon Glass
                   ` (16 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

This property should be in the /chosen node, not /aliases.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/dts/tegra124-nyan-big.dts | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/arch/arm/dts/tegra124-nyan-big.dts b/arch/arm/dts/tegra124-nyan-big.dts
index 62f89d0f1a..f1c97052a8 100644
--- a/arch/arm/dts/tegra124-nyan-big.dts
+++ b/arch/arm/dts/tegra124-nyan-big.dts
@@ -8,7 +8,6 @@
 
 	aliases {
 		console = &uarta;
-		stdout-path = &uarta;
 		i2c0 = "/i2c at 7000d000";
 		i2c1 = "/i2c at 7000c000";
 		i2c2 = "/i2c at 7000c400";
@@ -26,6 +25,10 @@
 		usb2 = "/usb at 7d004000";
 	};
 
+	chosen {
+		stdout-path = &uarta;
+	};
+
 	host1x at 50000000 {
 		dc at 54200000 {
 			display-timings {
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 11/26] tegra: Don't set up the UART clocks again in U-Boot
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (9 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 10/26] tegra: dts: Move stdout-path to /chosen Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 12/26] dm: tegra: gpio: Convert to support livetree Simon Glass
                   ` (15 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

The UART clocks are already set up in SPL so we don't need to do it again
in U-Boot. This seems to cause a hang on Nyan.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/mach-tegra/board.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/mach-tegra/board.c b/arch/arm/mach-tegra/board.c
index b3a041b539..c478420655 100644
--- a/arch/arm/mach-tegra/board.c
+++ b/arch/arm/mach-tegra/board.c
@@ -187,7 +187,9 @@ static void setup_uarts(int uart_ids)
 			enum periph_id id = id_for_uart[i];
 
 			funcmux_select(id, uart_configs[i]);
+#ifdef CONFIG_SPL_BUILD
 			clock_ll_start_uart(id);
+#endif
 		}
 	}
 }
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 12/26] dm: tegra: gpio: Convert to support livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (10 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 11/26] tegra: Don't set up the UART clocks again in U-Boot Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 13/26] dm: tegra: usb: Convert to livetree Simon Glass
                   ` (14 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update the GPIO driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/gpio/tegra_gpio.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/gpio/tegra_gpio.c b/drivers/gpio/tegra_gpio.c
index 687cd74fee..4965583158 100644
--- a/drivers/gpio/tegra_gpio.c
+++ b/drivers/gpio/tegra_gpio.c
@@ -337,11 +337,13 @@ static int gpio_tegra_bind(struct udevice *parent)
 	 * This driver does not make use of interrupts, other than to figure
 	 * out the number of GPIO banks
 	 */
-	if (!fdt_getprop(gd->fdt_blob, dev_of_offset(parent), "interrupts",
-			 &len))
-		return -EINVAL;
+	len = dev_read_size(parent, "interrupts");
+	if (len < 0)
+		return len;
 	bank_count = len / 3 / sizeof(u32);
-	ctlr = (struct gpio_ctlr *)devfdt_get_addr(parent);
+	ctlr = (struct gpio_ctlr *)dev_read_addr(parent);
+	if ((ulong)ctlr == FDT_ADDR_T_NONE)
+		return -EINVAL;
 	}
 #endif
 	for (bank = 0; bank < bank_count; bank++) {
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 13/26] dm: tegra: usb: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (11 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 12/26] dm: tegra: gpio: Convert to support livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 14/26] dm: tegra: spi: " Simon Glass
                   ` (13 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update the Tegra EHCI driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/usb/host/ehci-tegra.c | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c
index 873bf8ecfd..1c72330b0c 100644
--- a/drivers/usb/host/ehci-tegra.c
+++ b/drivers/usb/host/ehci-tegra.c
@@ -17,7 +17,6 @@
 #include <usb.h>
 #include <usb/ulpi.h>
 #include <libfdt.h>
-#include <fdtdec.h>
 
 #include "ehci.h"
 
@@ -695,12 +694,11 @@ static void config_clock(const u32 timing[])
 
 static int fdt_decode_usb(struct udevice *dev, struct fdt_usb *config)
 {
-	const void *blob = gd->fdt_blob;
-	int node = dev_of_offset(dev);
 	const char *phy, *mode;
 
-	config->reg = (struct usb_ctlr *)devfdt_get_addr(dev);
-	mode = fdt_getprop(blob, node, "dr_mode", NULL);
+	config->reg = (struct usb_ctlr *)dev_read_addr(dev);
+	debug("reg=%p\n", config->reg);
+	mode = dev_read_string(dev, "dr_mode");
 	if (mode) {
 		if (0 == strcmp(mode, "host"))
 			config->dr_mode = DR_MODE_HOST;
@@ -717,28 +715,24 @@ static int fdt_decode_usb(struct udevice *dev, struct fdt_usb *config)
 		config->dr_mode = DR_MODE_HOST;
 	}
 
-	phy = fdt_getprop(blob, node, "phy_type", NULL);
+	phy = dev_read_string(dev, "phy_type");
 	config->utmi = phy && 0 == strcmp("utmi", phy);
 	config->ulpi = phy && 0 == strcmp("ulpi", phy);
-	config->enabled = fdtdec_get_is_enabled(blob, node);
-	config->has_legacy_mode = fdtdec_get_bool(blob, node,
-						  "nvidia,has-legacy-mode");
+	config->has_legacy_mode = dev_read_bool(dev, "nvidia,has-legacy-mode");
 	config->periph_id = clock_decode_periph_id(dev);
 	if (config->periph_id == PERIPH_ID_NONE) {
 		debug("%s: Missing/invalid peripheral ID\n", __func__);
 		return -EINVAL;
 	}
-	gpio_request_by_name_nodev(offset_to_ofnode(node), "nvidia,vbus-gpio",
-				   0, &config->vbus_gpio, GPIOD_IS_OUT);
-	gpio_request_by_name_nodev(offset_to_ofnode(node),
-				   "nvidia,phy-reset-gpio", 0,
-				   &config->phy_reset_gpio, GPIOD_IS_OUT);
-	debug("enabled=%d, legacy_mode=%d, utmi=%d, ulpi=%d, periph_id=%d, "
-		"vbus=%d, phy_reset=%d, dr_mode=%d\n",
-		config->enabled, config->has_legacy_mode, config->utmi,
-		config->ulpi, config->periph_id,
-		gpio_get_number(&config->vbus_gpio),
-		gpio_get_number(&config->phy_reset_gpio), config->dr_mode);
+	gpio_request_by_name(dev, "nvidia,vbus-gpio", 0, &config->vbus_gpio,
+			     GPIOD_IS_OUT);
+	gpio_request_by_name(dev, "nvidia,phy-reset-gpio", 0,
+			     &config->phy_reset_gpio, GPIOD_IS_OUT);
+	debug("legacy_mode=%d, utmi=%d, ulpi=%d, periph_id=%d, vbus=%d, phy_reset=%d, dr_mode=%d, reg=%p\n",
+	      config->has_legacy_mode, config->utmi, config->ulpi,
+	      config->periph_id, gpio_get_number(&config->vbus_gpio),
+	      gpio_get_number(&config->phy_reset_gpio), config->dr_mode,
+	      config->reg);
 
 	return 0;
 }
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 14/26] dm: tegra: spi: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (12 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 13/26] dm: tegra: usb: Convert to livetree Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 15/26] dm: tegra: i2c: " Simon Glass
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update the tegra114 spi driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/spi/tegra114_spi.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/tegra114_spi.c b/drivers/spi/tegra114_spi.c
index 86b1019585..013bc82380 100644
--- a/drivers/spi/tegra114_spi.c
+++ b/drivers/spi/tegra114_spi.c
@@ -12,7 +12,6 @@
 #include <asm/arch/clock.h>
 #include <asm/arch-tegra/clk_rst.h>
 #include <spi.h>
-#include <fdtdec.h>
 #include "tegra_spi.h"
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -100,10 +99,8 @@ struct tegra114_spi_priv {
 static int tegra114_spi_ofdata_to_platdata(struct udevice *bus)
 {
 	struct tegra_spi_platdata *plat = bus->platdata;
-	const void *blob = gd->fdt_blob;
-	int node = dev_of_offset(bus);
 
-	plat->base = devfdt_get_addr(bus);
+	plat->base = dev_read_addr(bus);
 	plat->periph_id = clock_decode_periph_id(bus);
 
 	if (plat->periph_id == PERIPH_ID_NONE) {
@@ -113,10 +110,10 @@ static int tegra114_spi_ofdata_to_platdata(struct udevice *bus)
 	}
 
 	/* Use 500KHz as a suitable default */
-	plat->frequency = fdtdec_get_int(blob, node, "spi-max-frequency",
-					500000);
-	plat->deactivate_delay_us = fdtdec_get_int(blob, node,
-					"spi-deactivate-delay", 0);
+	plat->frequency = dev_read_u32_default(bus, "spi-max-frequency",
+					       500000);
+	plat->deactivate_delay_us = dev_read_u32_default(bus,
+						"spi-deactivate-delay", 0);
 	debug("%s: base=%#08lx, periph_id=%d, max-frequency=%d, deactivate_delay=%d\n",
 	      __func__, plat->base, plat->periph_id, plat->frequency,
 	      plat->deactivate_delay_us);
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 15/26] dm: tegra: i2c: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (13 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 14/26] dm: tegra: spi: " Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:30 ` [U-Boot] [PATCH 16/26] dm: tegra: pwm: " Simon Glass
                   ` (11 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update the tegra i2c driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/i2c/tegra_i2c.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/tegra_i2c.c b/drivers/i2c/tegra_i2c.c
index 055f48153a..4163d798d5 100644
--- a/drivers/i2c/tegra_i2c.c
+++ b/drivers/i2c/tegra_i2c.c
@@ -365,7 +365,11 @@ 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 *)devfdt_get_addr(dev);
+	i2c_bus->regs = (struct i2c_ctlr *)dev_read_addr(dev);
+	if ((ulong)i2c_bus->regs == FDT_ADDR_T_NONE) {
+		debug("%s: Cannot get regs address\n", __func__);
+		return -EINVAL;
+	}
 
 	ret = reset_get_by_name(dev, "i2c", &i2c_bus->reset_ctl);
 	if (ret) {
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 16/26] dm: tegra: pwm: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (14 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 15/26] dm: tegra: i2c: " Simon Glass
@ 2017-05-19 14:30 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 17/26] dm: tegra: mmc: " Simon Glass
                   ` (10 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:30 UTC (permalink / raw)
  To: u-boot

Update the tegra pwm driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/pwm/tegra_pwm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/pwm/tegra_pwm.c b/drivers/pwm/tegra_pwm.c
index d93ac28c31..b8acc1583f 100644
--- a/drivers/pwm/tegra_pwm.c
+++ b/drivers/pwm/tegra_pwm.c
@@ -59,7 +59,7 @@ static int tegra_pwm_ofdata_to_platdata(struct udevice *dev)
 {
 	struct tegra_pwm_priv *priv = dev_get_priv(dev);
 
-	priv->regs = (struct pwm_ctlr *)devfdt_get_addr(dev);
+	priv->regs = (struct pwm_ctlr *)dev_read_addr(dev);
 
 	return 0;
 }
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 17/26] dm: tegra: mmc: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (15 preceding siblings ...)
  2017-05-19 14:30 ` [U-Boot] [PATCH 16/26] dm: tegra: pwm: " Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC Simon Glass
                   ` (9 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

Update the tegra mmc driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/mmc/tegra_mmc.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/mmc/tegra_mmc.c b/drivers/mmc/tegra_mmc.c
index 338e42b528..9f7e7195f1 100644
--- a/drivers/mmc/tegra_mmc.c
+++ b/drivers/mmc/tegra_mmc.c
@@ -11,10 +11,10 @@
 #include <common.h>
 #include <dm.h>
 #include <errno.h>
+#include <mmc.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/arch-tegra/tegra_mmc.h>
-#include <mmc.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -599,8 +599,7 @@ static int tegra_mmc_probe(struct udevice *dev)
 
 	cfg->name = dev->name;
 
-	bus_width = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
-				   "bus-width", 1);
+	bus_width = dev_read_u32_default(dev, "bus-width", 1);
 
 	cfg->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
 	cfg->host_caps = 0;
@@ -621,7 +620,7 @@ static int tegra_mmc_probe(struct udevice *dev)
 
 	cfg->b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT;
 
-	priv->reg = (void *)devfdt_get_addr(dev);
+	priv->reg = (void *)dev_read_addr(dev);
 
 	ret = reset_get_by_name(dev, "sdhci", &priv->reset_ctl);
 	if (ret) {
@@ -648,12 +647,10 @@ static int tegra_mmc_probe(struct udevice *dev)
 		return ret;
 
 	/* These GPIOs are optional */
-	gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio,
-			     GPIOD_IS_IN);
-	gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio,
-			     GPIOD_IS_IN);
-	gpio_request_by_name(dev, "power-gpios", 0,
-			     &priv->pwr_gpio, GPIOD_IS_OUT);
+	gpio_request_by_name(dev, "cd-gpios", 0, &priv->cd_gpio, GPIOD_IS_IN);
+	gpio_request_by_name(dev, "wp-gpios", 0, &priv->wp_gpio, GPIOD_IS_IN);
+	gpio_request_by_name(dev, "power-gpios", 0, &priv->pwr_gpio,
+			     GPIOD_IS_OUT);
 	if (dm_gpio_is_valid(&priv->pwr_gpio))
 		dm_gpio_set_value(&priv->pwr_gpio, 1);
 
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (16 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 17/26] dm: tegra: mmc: " Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-20 23:40   ` Lukasz Majewski
  2017-05-19 14:31 ` [U-Boot] [PATCH 19/26] power: Add a GPIO " Simon Glass
                   ` (8 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

This pmic includes regulators which should have their own driver. Add
a driver to support these.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/power/regulator/Kconfig            |   9 ++
 drivers/power/regulator/Makefile           |   1 +
 drivers/power/regulator/as3722_regulator.c | 149 +++++++++++++++++++++++++++++
 include/power/as3722.h                     |   8 ++
 4 files changed, 167 insertions(+)
 create mode 100644 drivers/power/regulator/as3722_regulator.c

diff --git a/drivers/power/regulator/Kconfig b/drivers/power/regulator/Kconfig
index ef057e0e2f..2583a19910 100644
--- a/drivers/power/regulator/Kconfig
+++ b/drivers/power/regulator/Kconfig
@@ -34,6 +34,15 @@ config REGULATOR_ACT8846
 	by the PMIC device. This driver is controlled by a device tree node
 	which includes voltage limits.
 
+config REGULATOR_AS3722
+	bool "Enable driver for AS7322 regulator"
+	depends on DM_REGULATOR && PMIC_AS3722
+	help
+	  Enable support for the regulator functions of the AS3722. The
+	  driver implements enable/disable for step-down bucks and LDOs,
+	  but does not yet support change voltages. Currently this must be
+	  done using direct register writes to the PMIC.
+
 config DM_REGULATOR_PFUZE100
 	bool "Enable Driver Model for REGULATOR PFUZE100"
 	depends on DM_REGULATOR && DM_PMIC_PFUZE100
diff --git a/drivers/power/regulator/Makefile b/drivers/power/regulator/Makefile
index 3e01021b76..48d3735d6c 100644
--- a/drivers/power/regulator/Makefile
+++ b/drivers/power/regulator/Makefile
@@ -7,6 +7,7 @@
 
 obj-$(CONFIG_$(SPL_)DM_REGULATOR) += regulator-uclass.o
 obj-$(CONFIG_REGULATOR_ACT8846) += act8846.o
+obj-$(CONFIG_REGULATOR_AS3722)	+= as3722_regulator.o
 obj-$(CONFIG_DM_REGULATOR_MAX77686) += max77686.o
 obj-$(CONFIG_DM_REGULATOR_PFUZE100) += pfuze100.o
 obj-$(CONFIG_REGULATOR_PWM) += pwm_regulator.o
diff --git a/drivers/power/regulator/as3722_regulator.c b/drivers/power/regulator/as3722_regulator.c
new file mode 100644
index 0000000000..0122e1e389
--- /dev/null
+++ b/drivers/power/regulator/as3722_regulator.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright (C) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * Placeholder regulator driver for as3722.
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <power/as3722.h>
+#include <power/pmic.h>
+#include <power/regulator.h>
+
+static int stepdown_get_value(struct udevice *dev)
+{
+	return -ENOSYS;
+}
+
+static int stepdown_set_value(struct udevice *dev, int uvolt)
+{
+	return -ENOSYS;
+}
+
+static int stepdown_set_enable(struct udevice *dev, bool enable)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	int sd = dev->driver_data;
+	int ret;
+
+	ret = pmic_clrsetbits(pmic, AS3722_SD_CONTROL, 0, 1 << sd);
+	if (ret < 0) {
+		debug("%s: failed to write SD control register: %d", __func__,
+		      ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static bool stepdown_get_enable(struct udevice *dev)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	int sd = dev->driver_data;
+	int ret;
+
+	ret = pmic_reg_read(pmic, AS3722_SD_CONTROL);
+	if (ret < 0) {
+		debug("%s: failed to read SD control register: %d", __func__,
+		      ret);
+		return false;
+	}
+
+	return ret & (1 << sd) ? true : false;
+}
+
+static int ldo_get_value(struct udevice *dev)
+{
+	return -ENOSYS;
+}
+
+static int ldo_set_value(struct udevice *dev, int uvolt)
+{
+	return -ENOSYS;
+}
+
+static int ldo_set_enable(struct udevice *dev, bool enable)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	int ldo = dev->driver_data;
+	int ret;
+
+	ret = pmic_clrsetbits(pmic, AS3722_LDO_CONTROL, 0, 1 << ldo);
+	if (ret < 0) {
+		debug("%s: failed to write LDO control register: %d", __func__,
+		      ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static bool ldo_get_enable(struct udevice *dev)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	int ldo = dev->driver_data;
+	int ret;
+
+	ret = pmic_reg_read(pmic, AS3722_LDO_CONTROL);
+	if (ret < 0) {
+		debug("%s: failed to read SD control register: %d", __func__,
+		      ret);
+		return false;
+	}
+
+	return ret & (1 << ldo) ? true : false;
+}
+
+static int as3722_stepdown_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_platdata *uc_pdata;
+
+	uc_pdata = dev_get_uclass_platdata(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_BUCK;
+
+	return 0;
+}
+
+static int as3722_ldo_probe(struct udevice *dev)
+{
+	struct dm_regulator_uclass_platdata *uc_pdata;
+
+	uc_pdata = dev_get_uclass_platdata(dev);
+
+	uc_pdata->type = REGULATOR_TYPE_LDO;
+
+	return 0;
+}
+
+static const struct dm_regulator_ops as3722_stepdown_ops = {
+	.get_value  = stepdown_get_value,
+	.set_value  = stepdown_set_value,
+	.get_enable = stepdown_get_enable,
+	.set_enable = stepdown_set_enable,
+};
+
+static const struct dm_regulator_ops as3722_ldo_ops = {
+	.get_value  = ldo_get_value,
+	.set_value  = ldo_set_value,
+	.get_enable = ldo_get_enable,
+	.set_enable = ldo_set_enable,
+};
+
+U_BOOT_DRIVER(as3722_stepdown) = {
+	.name = "as3722_stepdown",
+	.id = UCLASS_REGULATOR,
+	.ops = &as3722_stepdown_ops,
+	.probe = as3722_stepdown_probe,
+};
+
+U_BOOT_DRIVER(as3722_ldo) = {
+	.name = "as3722_ldo",
+	.id = UCLASS_REGULATOR,
+	.ops = &as3722_ldo_ops,
+	.probe = as3722_ldo_probe,
+};
diff --git a/include/power/as3722.h b/include/power/as3722.h
index 0f22482ff7..14afa0c81a 100644
--- a/include/power/as3722.h
+++ b/include/power/as3722.h
@@ -12,6 +12,14 @@
 #define AS3722_GPIO_OUTPUT_VDDH (1 << 0)
 #define AS3722_GPIO_INVERT (1 << 1)
 
+#define AS3722_DEVICE_ID 0x0c
+#define AS3722_SD_VOLTAGE(n) (0x00 + (n))
+#define AS3722_LDO_VOLTAGE(n) (0x10 + (n))
+#define AS3722_SD_CONTROL 0x4d
+#define AS3722_LDO_CONTROL 0x4e
+#define AS3722_ASIC_ID1 0x90
+#define AS3722_ASIC_ID2 0x91
+
 struct udevice;
 
 int as3722_init(struct udevice **devp);
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 19/26] power: Add a GPIO driver for the as3722 PMIC
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (17 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-20 23:40   ` Lukasz Majewski
  2017-05-19 14:31 ` [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model Simon Glass
                   ` (7 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

This pmic includes GPIOs which should have their own driver. Add
a driver to support these.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/power/pmic/as3722_gpio.c | 120 +++++++++++++++++++++++++++++++++++++++
 include/power/as3722.h           |   5 ++
 2 files changed, 125 insertions(+)
 create mode 100644 drivers/power/pmic/as3722_gpio.c

diff --git a/drivers/power/pmic/as3722_gpio.c b/drivers/power/pmic/as3722_gpio.c
new file mode 100644
index 0000000000..d0b681ca4a
--- /dev/null
+++ b/drivers/power/pmic/as3722_gpio.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2014 NVIDIA Corporation
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/gpio.h>
+#include <power/as3722.h>
+#include <power/pmic.h>
+
+#define NUM_GPIOS	8
+
+int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
+			  unsigned long flags)
+{
+	u8 value = 0;
+	int err;
+
+	if (flags & AS3722_GPIO_OUTPUT_VDDH)
+		value |= AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
+
+	if (flags & AS3722_GPIO_INVERT)
+		value |= AS3722_GPIO_CONTROL_INVERT;
+
+	err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
+	if (err) {
+		error("failed to configure GPIO#%u: %d", gpio, err);
+		return err;
+	}
+
+	return 0;
+}
+
+static int as3722_gpio_set_value(struct udevice *dev, unsigned int gpio,
+				 int level)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	const char *l;
+	u8 value;
+	int err;
+
+	if (gpio >= NUM_GPIOS)
+		return -EINVAL;
+
+	err = pmic_reg_read(pmic, AS3722_GPIO_SIGNAL_OUT);
+	if (err < 0) {
+		error("failed to read GPIO signal out register: %d", err);
+		return err;
+	}
+	value = err;
+
+	if (level == 0) {
+		value &= ~(1 << gpio);
+		l = "low";
+	} else {
+		value |= 1 << gpio;
+		l = "high";
+	}
+
+	err = pmic_reg_write(pmic, AS3722_GPIO_SIGNAL_OUT, value);
+	if (err) {
+		error("failed to set GPIO#%u %s: %d", gpio, l, err);
+		return err;
+	}
+
+	return 0;
+}
+
+int as3722_gpio_direction_output(struct udevice *dev, unsigned int gpio,
+				 int value)
+{
+	struct udevice *pmic = dev_get_parent(dev);
+	int err;
+
+	if (gpio > 7)
+		return -EINVAL;
+
+	if (value == 0)
+		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL;
+	else
+		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
+
+	err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
+	if (err) {
+		error("failed to configure GPIO#%u as output: %d", gpio, err);
+		return err;
+	}
+
+	err = as3722_gpio_set_value(pmic, gpio, value);
+	if (err < 0) {
+		error("failed to set GPIO#%u high: %d", gpio, err);
+		return err;
+	}
+
+	return 0;
+}
+
+static int as3722_gpio_probe(struct udevice *dev)
+{
+	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
+
+	uc_priv->gpio_count = NUM_GPIOS;
+	uc_priv->bank_name = "as3722_";
+
+	return 0;
+}
+
+static const struct dm_gpio_ops gpio_as3722_ops = {
+	.direction_output	= as3722_gpio_direction_output,
+	.set_value		= as3722_gpio_set_value,
+};
+
+U_BOOT_DRIVER(gpio_as3722) = {
+	.name	= "gpio_as3722",
+	.id	= UCLASS_GPIO,
+	.ops	= &gpio_as3722_ops,
+	.probe	= as3722_gpio_probe,
+};
diff --git a/include/power/as3722.h b/include/power/as3722.h
index 14afa0c81a..713e79840f 100644
--- a/include/power/as3722.h
+++ b/include/power/as3722.h
@@ -20,6 +20,11 @@
 #define AS3722_ASIC_ID1 0x90
 #define AS3722_ASIC_ID2 0x91
 
+#define AS3722_GPIO_CONTROL(n) (0x08 + (n))
+#define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
+#define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
+#define AS3722_GPIO_CONTROL_INVERT (1 << 7)
+
 struct udevice;
 
 int as3722_init(struct udevice **devp);
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (18 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 19/26] power: Add a GPIO " Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-20 23:41   ` Lukasz Majewski
  2017-05-19 14:31 ` [U-Boot] [PATCH 21/26] dm: serial: ns16550: Convert to livetree Simon Glass
                   ` (6 subsequent siblings)
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

Convert this PMIC driver to driver model and fix up other users. The
regulator and GPIO functions are now handled by separate drivers.

Note that this currently breaks apalis-tk1, jetson-tk1 and cei-tk1-som.
I have the middle one so will tidy that up in the next version, at least.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/mach-tegra/board2.c     |   6 -
 board/nvidia/nyan-big/nyan-big.c |  22 +--
 configs/nyan-big_defconfig       |   1 +
 drivers/power/pmic/Makefile      |   2 +-
 drivers/power/pmic/as3722.c      | 292 +++++++++++++--------------------------
 include/power/as3722.h           |  18 +--
 6 files changed, 114 insertions(+), 227 deletions(-)

diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
index 5aedd3ef9d..0291c7fb33 100644
--- a/arch/arm/mach-tegra/board2.c
+++ b/arch/arm/mach-tegra/board2.c
@@ -29,7 +29,6 @@
 #ifdef CONFIG_TEGRA_CLOCK_SCALING
 #include <asm/arch/emc.h>
 #endif
-#include <power/as3722.h>
 #include "emc.h"
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -142,11 +141,6 @@ int board_init(void)
 		debug("Memory controller init failed: %d\n", err);
 #  endif
 # endif /* CONFIG_TEGRA_PMU */
-#ifdef CONFIG_PMIC_AS3722
-	err = as3722_init(NULL);
-	if (err && err != -ENODEV)
-		return err;
-#endif
 #endif /* CONFIG_SYS_I2C_TEGRA */
 
 #ifdef CONFIG_USB_EHCI_TEGRA
diff --git a/board/nvidia/nyan-big/nyan-big.c b/board/nvidia/nyan-big/nyan-big.c
index 8f68ae9fbe..54acf5418d 100644
--- a/board/nvidia/nyan-big/nyan-big.c
+++ b/board/nvidia/nyan-big/nyan-big.c
@@ -6,6 +6,7 @@
  */
 
 #include <common.h>
+#include <dm.h>
 #include <errno.h>
 #include <asm/gpio.h>
 #include <asm/io.h>
@@ -46,20 +47,23 @@ int tegra_board_id(void)
 
 int tegra_lcd_pmic_init(int board_id)
 {
-	struct udevice *pmic;
+	struct udevice *dev;
 	int ret;
 
-	ret = as3722_get(&pmic);
-	if (ret)
-		return -ENOENT;
+	ret = uclass_get_device_by_driver(UCLASS_PMIC,
+					  DM_GET_DRIVER(pmic_as3722), &dev);
+	if (ret) {
+		debug("%s: Failed to find PMIC\n", __func__);
+		return ret;
+	}
 
 	if (board_id == 0)
-		as3722_write(pmic, 0x00, 0x3c);
+		pmic_reg_write(dev, 0x00, 0x3c);
 	else
-		as3722_write(pmic, 0x00, 0x50);
-	as3722_write(pmic, 0x12, 0x10);
-	as3722_write(pmic, 0x0c, 0x07);
-	as3722_write(pmic, 0x20, 0x10);
+		pmic_reg_write(dev, 0x00, 0x50);
+	pmic_reg_write(dev, 0x12, 0x10);
+	pmic_reg_write(dev, 0x0c, 0x07);
+	pmic_reg_write(dev, 0x20, 0x10);
 
 	return 0;
 }
diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
index 22769bdc93..a152ff6915 100644
--- a/configs/nyan-big_defconfig
+++ b/configs/nyan-big_defconfig
@@ -47,6 +47,7 @@ CONFIG_SPI_FLASH_WINBOND=y
 CONFIG_DM_PMIC=y
 CONFIG_PMIC_AS3722=y
 CONFIG_DM_REGULATOR=y
+CONFIG_REGULATOR_AS3722=y
 CONFIG_DM_REGULATOR_FIXED=y
 CONFIG_PWM_TEGRA=y
 CONFIG_SYS_NS16550=y
diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
index f409e3a0b3..76dda2a070 100644
--- a/drivers/power/pmic/Makefile
+++ b/drivers/power/pmic/Makefile
@@ -12,7 +12,7 @@ obj-$(CONFIG_DM_PMIC_PFUZE100) += pfuze100.o
 obj-$(CONFIG_PMIC_S2MPS11) += s2mps11.o
 obj-$(CONFIG_DM_PMIC_SANDBOX) += sandbox.o i2c_pmic_emul.o
 obj-$(CONFIG_PMIC_ACT8846) += act8846.o
-obj-$(CONFIG_PMIC_AS3722) += as3722.o
+obj-$(CONFIG_PMIC_AS3722) += as3722.o as3722_gpio.o
 obj-$(CONFIG_PMIC_MAX8997) += max8997.o
 obj-$(CONFIG_PMIC_PM8916) += pm8916.o
 obj-$(CONFIG_PMIC_RK8XX) += rk8xx.o
diff --git a/drivers/power/pmic/as3722.c b/drivers/power/pmic/as3722.c
index c09e1de06f..4efe8ee183 100644
--- a/drivers/power/pmic/as3722.c
+++ b/drivers/power/pmic/as3722.c
@@ -11,264 +11,168 @@
 #include <errno.h>
 #include <fdtdec.h>
 #include <i2c.h>
-
+#include <dm/lists.h>
 #include <power/as3722.h>
+#include <power/pmic.h>
 
-#define AS3722_SD_VOLTAGE(n) (0x00 + (n))
-#define AS3722_GPIO_CONTROL(n) (0x08 + (n))
-#define  AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
-#define  AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
-#define  AS3722_GPIO_CONTROL_INVERT (1 << 7)
-#define AS3722_LDO_VOLTAGE(n) (0x10 + (n))
-#define AS3722_GPIO_SIGNAL_OUT 0x20
-#define AS3722_SD_CONTROL 0x4d
-#define AS3722_LDO_CONTROL 0x4e
-#define AS3722_ASIC_ID1 0x90
-#define  AS3722_DEVICE_ID 0x0c
-#define AS3722_ASIC_ID2 0x91
-
-int as3722_read(struct udevice *pmic, u8 reg, u8 *value)
-{
-	int err;
-
-	err = dm_i2c_read(pmic, reg, value, 1);
-	if (err < 0)
-		return err;
-
-	return 0;
-}
+#define AS3722_NUM_OF_REGS	0x92
 
-int as3722_write(struct udevice *pmic, u8 reg, u8 value)
+static int as3722_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
 {
-	int err;
+	int ret;
 
-	err = dm_i2c_write(pmic, reg, &value, 1);
-	if (err < 0)
-		return err;
+	ret = dm_i2c_read(dev, reg, buff, len);
+	if (ret < 0)
+		return ret;
 
 	return 0;
 }
 
-static int as3722_read_id(struct udevice *pmic, u8 *id, u8 *revision)
+static int as3722_write(struct udevice *dev, uint reg, const uint8_t *buff,
+			int len)
 {
-	int err;
+	int ret;
 
-	err = as3722_read(pmic, AS3722_ASIC_ID1, id);
-	if (err) {
-		error("failed to read ID1 register: %d", err);
-		return err;
-	}
-
-	err = as3722_read(pmic, AS3722_ASIC_ID2, revision);
-	if (err) {
-		error("failed to read ID2 register: %d", err);
-		return err;
-	}
+	ret = dm_i2c_write(dev, reg, buff, len);
+	if (ret < 0)
+		return ret;
 
 	return 0;
 }
 
-int as3722_sd_enable(struct udevice *pmic, unsigned int sd)
+static int as3722_read_id(struct udevice *dev, uint *idp, uint *revisionp)
 {
-	u8 value;
-	int err;
-
-	if (sd > 6)
-		return -EINVAL;
+	int ret;
 
-	err = as3722_read(pmic, AS3722_SD_CONTROL, &value);
-	if (err) {
-		error("failed to read SD control register: %d", err);
-		return err;
+	ret = pmic_reg_read(dev, AS3722_ASIC_ID1);
+	if (ret < 0) {
+		error("failed to read ID1 register: %d", ret);
+		return ret;
 	}
+	*idp = ret;
 
-	value |= 1 << sd;
-
-	err = as3722_write(pmic, AS3722_SD_CONTROL, value);
-	if (err < 0) {
-		error("failed to write SD control register: %d", err);
-		return err;
+	ret = pmic_reg_read(dev, AS3722_ASIC_ID2);
+	if (ret < 0) {
+		error("failed to read ID2 register: %d", ret);
+		return ret;
 	}
+	*revisionp = ret;
 
 	return 0;
 }
 
-int as3722_sd_set_voltage(struct udevice *pmic, unsigned int sd, u8 value)
+/* TODO(treding@nvidia.com): Add proper regulator support to avoid this */
+int as3722_sd_set_voltage(struct udevice *dev, unsigned int sd, u8 value)
 {
-	int err;
+	int ret;
 
 	if (sd > 6)
 		return -EINVAL;
 
-	err = as3722_write(pmic, AS3722_SD_VOLTAGE(sd), value);
-	if (err < 0) {
-		error("failed to write SD%u voltage register: %d", sd, err);
-		return err;
+	ret = pmic_reg_write(dev, AS3722_SD_VOLTAGE(sd), value);
+	if (ret < 0) {
+		error("failed to write SD%u voltage register: %d", sd, ret);
+		return ret;
 	}
 
 	return 0;
 }
 
-int as3722_ldo_enable(struct udevice *pmic, unsigned int ldo)
+int as3722_ldo_set_voltage(struct udevice *dev, unsigned int ldo, u8 value)
 {
-	u8 value;
-	int err;
+	int ret;
 
 	if (ldo > 11)
 		return -EINVAL;
 
-	err = as3722_read(pmic, AS3722_LDO_CONTROL, &value);
-	if (err) {
-		error("failed to read LDO control register: %d", err);
-		return err;
-	}
-
-	value |= 1 << ldo;
-
-	err = as3722_write(pmic, AS3722_LDO_CONTROL, value);
-	if (err < 0) {
-		error("failed to write LDO control register: %d", err);
-		return err;
-	}
-
-	return 0;
-}
-
-int as3722_ldo_set_voltage(struct udevice *pmic, unsigned int ldo, u8 value)
-{
-	int err;
-
-	if (ldo > 11)
-		return -EINVAL;
-
-	err = as3722_write(pmic, AS3722_LDO_VOLTAGE(ldo), value);
-	if (err < 0) {
+	ret = pmic_reg_write(dev, AS3722_LDO_VOLTAGE(ldo), value);
+	if (ret < 0) {
 		error("failed to write LDO%u voltage register: %d", ldo,
-		      err);
-		return err;
+		      ret);
+		return ret;
 	}
 
 	return 0;
 }
 
-int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
-			  unsigned long flags)
+static int as3722_probe(struct udevice *dev)
 {
-	u8 value = 0;
-	int err;
+	uint id, revision;
+	int ret;
 
-	if (flags & AS3722_GPIO_OUTPUT_VDDH)
-		value |= AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
-
-	if (flags & AS3722_GPIO_INVERT)
-		value |= AS3722_GPIO_CONTROL_INVERT;
-
-	err = as3722_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
-	if (err) {
-		error("failed to configure GPIO#%u: %d", gpio, err);
-		return err;
+	ret = as3722_read_id(dev, &id, &revision);
+	if (ret < 0) {
+		error("failed to read ID: %d", ret);
+		return ret;
 	}
 
-	return 0;
-}
-
-static int as3722_gpio_set(struct udevice *pmic, unsigned int gpio,
-			   unsigned int level)
-{
-	const char *l;
-	u8 value;
-	int err;
-
-	if (gpio > 7)
-		return -EINVAL;
-
-	err = as3722_read(pmic, AS3722_GPIO_SIGNAL_OUT, &value);
-	if (err < 0) {
-		error("failed to read GPIO signal out register: %d", err);
-		return err;
-	}
-
-	if (level == 0) {
-		value &= ~(1 << gpio);
-		l = "low";
-	} else {
-		value |= 1 << gpio;
-		l = "high";
+	if (id != AS3722_DEVICE_ID) {
+		error("unknown device");
+		return -ENOENT;
 	}
 
-	err = as3722_write(pmic, AS3722_GPIO_SIGNAL_OUT, value);
-	if (err) {
-		error("failed to set GPIO#%u %s: %d", gpio, l, err);
-		return err;
-	}
+	debug("AS3722 revision %#x found on I2C bus %s\n", revision, dev->name);
 
 	return 0;
 }
 
-int as3722_gpio_direction_output(struct udevice *pmic, unsigned int gpio,
-				 unsigned int level)
-{
-	u8 value;
-	int err;
-
-	if (gpio > 7)
-		return -EINVAL;
+#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
+static const struct pmic_child_info pmic_children_info[] = {
+	{ .prefix = "sd", .driver = "as3722_stepdown"},
+	{ .prefix = "ldo", .driver = "as3722_ldo"},
+	{ },
+};
 
-	if (level == 0)
-		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL;
-	else
-		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
+static int as3722_bind(struct udevice *dev)
+{
+	struct udevice *gpio_dev;
+	ofnode regulators_node;
+	int children;
+	int ret;
 
-	err = as3722_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
-	if (err) {
-		error("failed to configure GPIO#%u as output: %d", gpio, err);
-		return err;
+	regulators_node = dev_read_subnode(dev, "regulators");
+	if (!ofnode_valid(regulators_node)) {
+		debug("%s: %s regulators subnode not found\n", __func__,
+		      dev->name);
+		return -ENXIO;
 	}
 
-	err = as3722_gpio_set(pmic, gpio, level);
-	if (err < 0) {
-		error("failed to set GPIO#%u high: %d", gpio, err);
-		return err;
+	children = pmic_bind_children(dev, regulators_node, pmic_children_info);
+	if (!children)
+		debug("%s: %s - no child found\n", __func__, dev->name);
+	ret = device_bind_driver(dev, "gpio_as3722", "gpio_as3722", &gpio_dev);
+	if (ret) {
+		debug("%s: Cannot bind GPIOs (ret=%d)\n", __func__, ret);
+		return ret;
 	}
 
 	return 0;
 }
+#endif
 
-/* Temporary function until we get the pmic framework */
-int as3722_get(struct udevice **devp)
+static int as3722_reg_count(struct udevice *dev)
 {
-	int bus = 0;
-	int address = 0x40;
-
-	return i2c_get_chip_for_busnum(bus, address, 1, devp);
+	return AS3722_NUM_OF_REGS;
 }
 
-int as3722_init(struct udevice **devp)
-{
-	struct udevice *pmic;
-	u8 id, revision;
-	const unsigned int bus = 0;
-	const unsigned int address = 0x40;
-	int err;
-
-	err = i2c_get_chip_for_busnum(bus, address, 1, &pmic);
-	if (err)
-		return err;
-	err = as3722_read_id(pmic, &id, &revision);
-	if (err < 0) {
-		error("failed to read ID: %d", err);
-		return err;
-	}
-
-	if (id != AS3722_DEVICE_ID) {
-		error("unknown device");
-		return -ENOENT;
-	}
-
-	debug("AS3722 revision %#x found on I2C bus %u, address %#x\n",
-	      revision, bus, address);
-	if (devp)
-		*devp = pmic;
-
-	return 0;
-}
+static struct dm_pmic_ops as3722_ops = {
+	.reg_count = as3722_reg_count,
+	.read = as3722_read,
+	.write = as3722_write,
+};
+
+static const struct udevice_id as3722_ids[] = {
+	{ .compatible = "ams,as3722" },
+	{ }
+};
+
+U_BOOT_DRIVER(pmic_as3722) = {
+	.name = "as3722_pmic",
+	.id = UCLASS_PMIC,
+	.of_match = as3722_ids,
+#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
+	.bind = as3722_bind,
+#endif
+	.probe = as3722_probe,
+	.ops = &as3722_ops,
+};
diff --git a/include/power/as3722.h b/include/power/as3722.h
index 713e79840f..491f1b7ea7 100644
--- a/include/power/as3722.h
+++ b/include/power/as3722.h
@@ -7,8 +7,6 @@
 #ifndef __POWER_AS3722_H__
 #define __POWER_AS3722_H__
 
-#include <asm/types.h>
-
 #define AS3722_GPIO_OUTPUT_VDDH (1 << 0)
 #define AS3722_GPIO_INVERT (1 << 1)
 
@@ -21,23 +19,9 @@
 #define AS3722_ASIC_ID2 0x91
 
 #define AS3722_GPIO_CONTROL(n) (0x08 + (n))
+#define AS3722_GPIO_SIGNAL_OUT 0x20
 #define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
 #define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
 #define AS3722_GPIO_CONTROL_INVERT (1 << 7)
 
-struct udevice;
-
-int as3722_init(struct udevice **devp);
-int as3722_sd_enable(struct udevice *pmic, unsigned int sd);
-int as3722_sd_set_voltage(struct udevice *pmic, unsigned int sd, u8 value);
-int as3722_ldo_enable(struct udevice *pmic, unsigned int ldo);
-int as3722_ldo_set_voltage(struct udevice *pmic, unsigned int ldo, u8 value);
-int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
-			  unsigned long flags);
-int as3722_gpio_direction_output(struct udevice *pmic, unsigned int gpio,
-				 unsigned int level);
-int as3722_read(struct udevice *pmic, u8 reg, u8 *value);
-int as3722_write(struct udevice *pmic, u8 reg, u8 value);
-int as3722_get(struct udevice **devp);
-
 #endif /* __POWER_AS3722_H__ */
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 21/26] dm: serial: ns16550: Convert to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (19 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 22/26] dm: serial: Separate out the core serial-device finding code Simon Glass
                   ` (5 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

Update this driver to support a live device tree.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/serial/ns16550.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index 52c52c1ad1..330c5e186a 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -8,7 +8,6 @@
 #include <clk.h>
 #include <dm.h>
 #include <errno.h>
-#include <fdtdec.h>
 #include <ns16550.h>
 #include <serial.h>
 #include <watchdog.h>
@@ -395,7 +394,7 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
 	int err;
 
 	/* try Processor Local Bus device first */
-	addr = devfdt_get_addr(dev);
+	addr = dev_read_addr(dev);
 #if defined(CONFIG_PCI) && defined(CONFIG_DM_PCI)
 	if (addr == FDT_ADDR_T_NONE) {
 		/* then try pci device */
@@ -434,11 +433,8 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
 	plat->base = (unsigned long)map_physmem(addr, 0, MAP_NOCACHE);
 #endif
 
-	plat->reg_offset = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
-				     "reg-offset", 0);
-	plat->reg_shift = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
-					 "reg-shift", 0);
-
+	plat->reg_offset = dev_read_u32_default(dev, "reg-offset", 0);
+	plat->reg_shift = dev_read_u32_default(dev, "reg-shift", 0);
 	err = clk_get_by_index(dev, 0, &clk);
 	if (!err) {
 		err = clk_get_rate(&clk);
@@ -450,9 +446,8 @@ int ns16550_serial_ofdata_to_platdata(struct udevice *dev)
 	}
 
 	if (!plat->clock)
-		plat->clock = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
-					     "clock-frequency",
-					     CONFIG_SYS_NS16550_CLK);
+		plat->clock = dev_read_u32_default(dev, "clock-frequency",
+						   CONFIG_SYS_NS16550_CLK);
 	if (!plat->clock) {
 		debug("ns16550 clock not defined\n");
 		return -EINVAL;
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 22/26] dm: serial: Separate out the core serial-device finding code
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (20 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 21/26] dm: serial: ns16550: Convert to livetree Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 23/26] dm: serial: Add livetree support Simon Glass
                   ` (4 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

This function is quite long. Move the core code into a separate function
in preparation for adding livetree support.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/serial/serial-uclass.c | 84 ++++++++++++++++++++++--------------------
 1 file changed, 44 insertions(+), 40 deletions(-)

diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index a9c4f89e1a..ede5c2c0be 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -8,7 +8,6 @@
 #include <dm.h>
 #include <environment.h>
 #include <errno.h>
-#include <fdtdec.h>
 #include <os.h>
 #include <serial.h>
 #include <stdio_dev.h>
@@ -27,11 +26,53 @@ static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
 #error "Serial is required before relocation - define CONFIG_SYS_MALLOC_F_LEN to make this work"
 #endif
 
+static int serial_check_stdout(const void *blob, struct udevice **devp)
+{
+	int node;
+
+	/* Check for a chosen console */
+	node = fdtdec_get_chosen_node(blob, "stdout-path");
+	if (node < 0) {
+		const char *str, *p, *name;
+
+		/*
+		 * Deal with things like
+		 *	stdout-path = "serial0:115200n8";
+		 *
+		 * We need to look up the alias and then follow it to the
+		 * correct node.
+		 */
+		str = fdtdec_get_chosen_prop(blob, "stdout-path");
+		if (str) {
+			p = strchr(str, ':');
+			name = fdt_get_alias_namelen(blob, str,
+					p ? p - str : strlen(str));
+			if (name)
+				node = fdt_path_offset(blob, name);
+		}
+	}
+	if (node < 0)
+		node = fdt_path_offset(blob, "console");
+	if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node, devp))
+		return 0;
+
+	/*
+	 * If the console is not marked to be bound before relocation, bind it
+	 * anyway.
+	 */
+	if (node > 0 && !lists_bind_fdt(gd->dm_root, offset_to_ofnode(node),
+					devp)) {
+		if (!device_probe(*devp))
+			return 0;
+	}
+
+	return -ENODEV;
+}
+
 static void serial_find_console_or_panic(void)
 {
 	const void *blob = gd->fdt_blob;
 	struct udevice *dev;
-	int node;
 
 	if (CONFIG_IS_ENABLED(OF_PLATDATA)) {
 		uclass_first_device(UCLASS_SERIAL, &dev);
@@ -40,47 +81,10 @@ static void serial_find_console_or_panic(void)
 			return;
 		}
 	} else if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
-		/* Check for a chosen console */
-		node = fdtdec_get_chosen_node(blob, "stdout-path");
-		if (node < 0) {
-			const char *str, *p, *name;
-
-			/*
-			 * Deal with things like
-			 *	stdout-path = "serial0:115200n8";
-			 *
-			 * We need to look up the alias and then follow it to
-			 * the correct node.
-			 */
-			str = fdtdec_get_chosen_prop(blob, "stdout-path");
-			if (str) {
-				p = strchr(str, ':');
-				name = fdt_get_alias_namelen(blob, str,
-						p ? p - str : strlen(str));
-				if (name)
-					node = fdt_path_offset(blob, name);
-			}
-		}
-		if (node < 0)
-			node = fdt_path_offset(blob, "console");
-		if (!uclass_get_device_by_of_offset(UCLASS_SERIAL, node,
-						    &dev)) {
+		if (!serial_check_stdout(blob, &dev)) {
 			gd->cur_serial_dev = dev;
 			return;
 		}
-
-		/*
-		 * If the console is not marked to be bound before relocation,
-		 * bind it anyway.
-		 */
-		if (node > 0 &&
-		    !lists_bind_fdt(gd->dm_root, offset_to_ofnode(node),
-				    &dev)) {
-			if (!device_probe(dev)) {
-				gd->cur_serial_dev = dev;
-				return;
-			}
-		}
 	}
 	if (!SPL_BUILD || !CONFIG_IS_ENABLED(OF_CONTROL) || !blob) {
 		/*
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 23/26] dm: serial: Add livetree support
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (21 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 22/26] dm: serial: Separate out the core serial-device finding code Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 24/26] tegra: Show a debug message if the LCD PMIC fails to start Simon Glass
                   ` (3 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

Add support for a live device tree to the core serial uclass.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 drivers/serial/serial-uclass.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index ede5c2c0be..976b99ce7c 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -14,6 +14,7 @@
 #include <watchdog.h>
 #include <dm/lists.h>
 #include <dm/device-internal.h>
+#include <dm/of_access.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -81,9 +82,20 @@ static void serial_find_console_or_panic(void)
 			return;
 		}
 	} else if (CONFIG_IS_ENABLED(OF_CONTROL) && blob) {
-		if (!serial_check_stdout(blob, &dev)) {
-			gd->cur_serial_dev = dev;
-			return;
+		/* Live tree has support for stdout */
+		if (of_live_active()) {
+			struct device_node *np = of_get_stdout();
+
+			if (np && !uclass_get_device_by_ofnode(UCLASS_SERIAL,
+					np_to_ofnode(np), &dev)) {
+				gd->cur_serial_dev = dev;
+				return;
+			}
+		} else {
+			if (!serial_check_stdout(blob, &dev)) {
+				gd->cur_serial_dev = dev;
+				return;
+			}
 		}
 	}
 	if (!SPL_BUILD || !CONFIG_IS_ENABLED(OF_CONTROL) || !blob) {
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 24/26] tegra: Show a debug message if the LCD PMIC fails to start
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (22 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 23/26] dm: serial: Add livetree support Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 25/26] fdtdec: Drop old compatible values Simon Glass
                   ` (2 subsequent siblings)
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

This error condition should have a debug() message. Add it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 arch/arm/mach-tegra/board2.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-tegra/board2.c b/arch/arm/mach-tegra/board2.c
index 0291c7fb33..e0a39e1a32 100644
--- a/arch/arm/mach-tegra/board2.c
+++ b/arch/arm/mach-tegra/board2.c
@@ -150,8 +150,10 @@ int board_init(void)
 #if defined(CONFIG_DM_VIDEO)
 	board_id = tegra_board_id();
 	err = tegra_lcd_pmic_init(board_id);
-	if (err)
+	if (err) {
+		debug("Failed to set up LCD PMIC\n");
 		return err;
+	}
 #endif
 
 #ifdef CONFIG_TEGRA_NAND
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 25/26] fdtdec: Drop old compatible values
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (23 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 24/26] tegra: Show a debug message if the LCD PMIC fails to start Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-19 14:31 ` [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree Simon Glass
  2017-05-22 22:15 ` [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big " Tom Rini
  26 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

These are not needed now since the drivers now use driver model. Drop
them.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 include/fdtdec.h | 6 ------
 lib/fdtdec.c     | 6 ------
 2 files changed, 12 deletions(-)

diff --git a/include/fdtdec.h b/include/fdtdec.h
index eda2ffaf66..4a0947c626 100644
--- a/include/fdtdec.h
+++ b/include/fdtdec.h
@@ -119,12 +119,6 @@ enum fdt_compat_id {
 	COMPAT_NVIDIA_TEGRA20_EMC,	/* Tegra20 memory controller */
 	COMPAT_NVIDIA_TEGRA20_EMC_TABLE, /* Tegra20 memory timing table */
 	COMPAT_NVIDIA_TEGRA20_NAND,	/* Tegra2 NAND controller */
-	COMPAT_NVIDIA_TEGRA124_PMC,	/* Tegra 124 power mgmt controller */
-	COMPAT_NVIDIA_TEGRA186_SDMMC,	/* Tegra186 SDMMC controller */
-	COMPAT_NVIDIA_TEGRA210_SDMMC,	/* Tegra210 SDMMC controller */
-	COMPAT_NVIDIA_TEGRA124_SDMMC,	/* Tegra124 SDMMC controller */
-	COMPAT_NVIDIA_TEGRA30_SDMMC,	/* Tegra30 SDMMC controller */
-	COMPAT_NVIDIA_TEGRA20_SDMMC,	/* Tegra20 SDMMC controller */
 	COMPAT_NVIDIA_TEGRA124_XUSB_PADCTL,
 					/* Tegra124 XUSB pad controller */
 	COMPAT_NVIDIA_TEGRA210_XUSB_PADCTL,
diff --git a/lib/fdtdec.c b/lib/fdtdec.c
index 91503b8cb9..9818f78c51 100644
--- a/lib/fdtdec.c
+++ b/lib/fdtdec.c
@@ -33,12 +33,6 @@ static const char * const compat_names[COMPAT_COUNT] = {
 	COMPAT(NVIDIA_TEGRA20_EMC, "nvidia,tegra20-emc"),
 	COMPAT(NVIDIA_TEGRA20_EMC_TABLE, "nvidia,tegra20-emc-table"),
 	COMPAT(NVIDIA_TEGRA20_NAND, "nvidia,tegra20-nand"),
-	COMPAT(NVIDIA_TEGRA124_PMC, "nvidia,tegra124-pmc"),
-	COMPAT(NVIDIA_TEGRA186_SDMMC, "nvidia,tegra186-sdhci"),
-	COMPAT(NVIDIA_TEGRA210_SDMMC, "nvidia,tegra210-sdhci"),
-	COMPAT(NVIDIA_TEGRA124_SDMMC, "nvidia,tegra124-sdhci"),
-	COMPAT(NVIDIA_TEGRA30_SDMMC, "nvidia,tegra30-sdhci"),
-	COMPAT(NVIDIA_TEGRA20_SDMMC, "nvidia,tegra20-sdhci"),
 	COMPAT(NVIDIA_TEGRA124_XUSB_PADCTL, "nvidia,tegra124-xusb-padctl"),
 	COMPAT(NVIDIA_TEGRA210_XUSB_PADCTL, "nvidia,tegra210-xusb-padctl"),
 	COMPAT(SMSC_LAN9215, "smsc,lan9215"),
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (24 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 25/26] fdtdec: Drop old compatible values Simon Glass
@ 2017-05-19 14:31 ` Simon Glass
  2017-05-29 15:08   ` Marcel Ziswiler
  2017-05-22 22:15 ` [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big " Tom Rini
  26 siblings, 1 reply; 38+ messages in thread
From: Simon Glass @ 2017-05-19 14:31 UTC (permalink / raw)
  To: u-boot

Change this board to use a live device tree after relocation.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 configs/nyan-big_defconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
index a152ff6915..82be85a834 100644
--- a/configs/nyan-big_defconfig
+++ b/configs/nyan-big_defconfig
@@ -33,6 +33,7 @@ CONFIG_CMD_EXT4_WRITE=y
 # CONFIG_SPL_DOS_PARTITION is not set
 # CONFIG_SPL_ISO_PARTITION is not set
 # CONFIG_SPL_EFI_PARTITION is not set
+CONFIG_OF_LIVE=y
 CONFIG_SPL_DM=y
 CONFIG_REGMAP=y
 CONFIG_SYSCON=y
-- 
2.13.0.303.g4ebf302169-goog

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

* [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace
  2017-05-19 14:30 ` [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace Simon Glass
@ 2017-05-19 14:53   ` Anatolij Gustschin
  0 siblings, 0 replies; 38+ messages in thread
From: Anatolij Gustschin @ 2017-05-19 14:53 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:30:44 -0600
Simon Glass sjg at chromium.org wrote:

> We should sync the display (e.g. flush cache) when backspace is pressed
> to ensure that the character is erased correctly.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/video/vidconsole-uclass.c | 1 +
>  1 file changed, 1 insertion(+)

Acked-by: Anatolij Gustschin <agust@denx.de>

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

* [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree
  2017-05-19 14:30 ` [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree Simon Glass
@ 2017-05-19 14:55   ` Anatolij Gustschin
  0 siblings, 0 replies; 38+ messages in thread
From: Anatolij Gustschin @ 2017-05-19 14:55 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:30:45 -0600
Simon Glass sjg at chromium.org wrote:

> Update this driver to support a live device tree.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/video/pwm_backlight.c | 23 +++++++++++++----------
>  1 file changed, 13 insertions(+), 10 deletions(-)

Acked-by: Anatolij Gustschin <agust@denx.de>

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

* [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging
  2017-05-19 14:30 ` [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging Simon Glass
@ 2017-05-19 14:56   ` Anatolij Gustschin
  0 siblings, 0 replies; 38+ messages in thread
From: Anatolij Gustschin @ 2017-05-19 14:56 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:30:46 -0600
Simon Glass sjg at chromium.org wrote:

> Add some debugging to show when the backlight is enabled.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/video/simple_panel.c | 2 ++
>  1 file changed, 2 insertions(+)

Acked-by: Anatolij Gustschin <agust@denx.de>

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

* [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree
  2017-05-19 14:30 ` [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree Simon Glass
@ 2017-05-19 15:02   ` Anatolij Gustschin
  0 siblings, 0 replies; 38+ messages in thread
From: Anatolij Gustschin @ 2017-05-19 15:02 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:30:52 -0600
Simon Glass sjg at chromium.org wrote:

> Update these drivers to support a live device tree.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/video/tegra124/display.c |  8 +++-----
>  drivers/video/tegra124/dp.c      |  3 +--
>  drivers/video/tegra124/sor.c     | 25 +++++++------------------
>  3 files changed, 11 insertions(+), 25 deletions(-)

Acked-by: Anatolij Gustschin <agust@denx.de>

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

* [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC
  2017-05-19 14:31 ` [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC Simon Glass
@ 2017-05-20 23:40   ` Lukasz Majewski
  0 siblings, 0 replies; 38+ messages in thread
From: Lukasz Majewski @ 2017-05-20 23:40 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:31:01 -0600
Simon Glass <sjg@chromium.org> wrote:

> This pmic includes regulators which should have their own driver. Add
> a driver to support these.

Reviewed-by: Lukasz Majewski <lukma@denx.de>

> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/power/regulator/Kconfig            |   9 ++
>  drivers/power/regulator/Makefile           |   1 +
>  drivers/power/regulator/as3722_regulator.c | 149
> +++++++++++++++++++++++++++++
> include/power/as3722.h                     |   8 ++ 4 files changed,
> 167 insertions(+) create mode 100644
> drivers/power/regulator/as3722_regulator.c
> 
> diff --git a/drivers/power/regulator/Kconfig
> b/drivers/power/regulator/Kconfig index ef057e0e2f..2583a19910 100644
> --- a/drivers/power/regulator/Kconfig
> +++ b/drivers/power/regulator/Kconfig
> @@ -34,6 +34,15 @@ config REGULATOR_ACT8846
>  	by the PMIC device. This driver is controlled by a device
> tree node which includes voltage limits.
>  
> +config REGULATOR_AS3722
> +	bool "Enable driver for AS7322 regulator"
> +	depends on DM_REGULATOR && PMIC_AS3722
> +	help
> +	  Enable support for the regulator functions of the AS3722.
> The
> +	  driver implements enable/disable for step-down bucks and
> LDOs,
> +	  but does not yet support change voltages. Currently this
> must be
> +	  done using direct register writes to the PMIC.
> +
>  config DM_REGULATOR_PFUZE100
>  	bool "Enable Driver Model for REGULATOR PFUZE100"
>  	depends on DM_REGULATOR && DM_PMIC_PFUZE100
> diff --git a/drivers/power/regulator/Makefile
> b/drivers/power/regulator/Makefile index 3e01021b76..48d3735d6c 100644
> --- a/drivers/power/regulator/Makefile
> +++ b/drivers/power/regulator/Makefile
> @@ -7,6 +7,7 @@
>  
>  obj-$(CONFIG_$(SPL_)DM_REGULATOR) += regulator-uclass.o
>  obj-$(CONFIG_REGULATOR_ACT8846) += act8846.o
> +obj-$(CONFIG_REGULATOR_AS3722)	+= as3722_regulator.o
>  obj-$(CONFIG_DM_REGULATOR_MAX77686) += max77686.o
>  obj-$(CONFIG_DM_REGULATOR_PFUZE100) += pfuze100.o
>  obj-$(CONFIG_REGULATOR_PWM) += pwm_regulator.o
> diff --git a/drivers/power/regulator/as3722_regulator.c
> b/drivers/power/regulator/as3722_regulator.c new file mode 100644
> index 0000000000..0122e1e389
> --- /dev/null
> +++ b/drivers/power/regulator/as3722_regulator.c
> @@ -0,0 +1,149 @@
> +/*
> + * Copyright (C) 2017 Google, Inc
> + * Written by Simon Glass <sjg@chromium.org>
> + *
> + * Placeholder regulator driver for as3722.
> + *
> + * SPDX-License-Identifier:	GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <errno.h>
> +#include <power/as3722.h>
> +#include <power/pmic.h>
> +#include <power/regulator.h>
> +
> +static int stepdown_get_value(struct udevice *dev)
> +{
> +	return -ENOSYS;
> +}
> +
> +static int stepdown_set_value(struct udevice *dev, int uvolt)
> +{
> +	return -ENOSYS;
> +}
> +
> +static int stepdown_set_enable(struct udevice *dev, bool enable)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	int sd = dev->driver_data;
> +	int ret;
> +
> +	ret = pmic_clrsetbits(pmic, AS3722_SD_CONTROL, 0, 1 << sd);
> +	if (ret < 0) {
> +		debug("%s: failed to write SD control register: %d",
> __func__,
> +		      ret);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static bool stepdown_get_enable(struct udevice *dev)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	int sd = dev->driver_data;
> +	int ret;
> +
> +	ret = pmic_reg_read(pmic, AS3722_SD_CONTROL);
> +	if (ret < 0) {
> +		debug("%s: failed to read SD control register: %d",
> __func__,
> +		      ret);
> +		return false;
> +	}
> +
> +	return ret & (1 << sd) ? true : false;
> +}
> +
> +static int ldo_get_value(struct udevice *dev)
> +{
> +	return -ENOSYS;
> +}
> +
> +static int ldo_set_value(struct udevice *dev, int uvolt)
> +{
> +	return -ENOSYS;
> +}
> +
> +static int ldo_set_enable(struct udevice *dev, bool enable)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	int ldo = dev->driver_data;
> +	int ret;
> +
> +	ret = pmic_clrsetbits(pmic, AS3722_LDO_CONTROL, 0, 1 << ldo);
> +	if (ret < 0) {
> +		debug("%s: failed to write LDO control register:
> %d", __func__,
> +		      ret);
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static bool ldo_get_enable(struct udevice *dev)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	int ldo = dev->driver_data;
> +	int ret;
> +
> +	ret = pmic_reg_read(pmic, AS3722_LDO_CONTROL);
> +	if (ret < 0) {
> +		debug("%s: failed to read SD control register: %d",
> __func__,
> +		      ret);
> +		return false;
> +	}
> +
> +	return ret & (1 << ldo) ? true : false;
> +}
> +
> +static int as3722_stepdown_probe(struct udevice *dev)
> +{
> +	struct dm_regulator_uclass_platdata *uc_pdata;
> +
> +	uc_pdata = dev_get_uclass_platdata(dev);
> +
> +	uc_pdata->type = REGULATOR_TYPE_BUCK;
> +
> +	return 0;
> +}
> +
> +static int as3722_ldo_probe(struct udevice *dev)
> +{
> +	struct dm_regulator_uclass_platdata *uc_pdata;
> +
> +	uc_pdata = dev_get_uclass_platdata(dev);
> +
> +	uc_pdata->type = REGULATOR_TYPE_LDO;
> +
> +	return 0;
> +}
> +
> +static const struct dm_regulator_ops as3722_stepdown_ops = {
> +	.get_value  = stepdown_get_value,
> +	.set_value  = stepdown_set_value,
> +	.get_enable = stepdown_get_enable,
> +	.set_enable = stepdown_set_enable,
> +};
> +
> +static const struct dm_regulator_ops as3722_ldo_ops = {
> +	.get_value  = ldo_get_value,
> +	.set_value  = ldo_set_value,
> +	.get_enable = ldo_get_enable,
> +	.set_enable = ldo_set_enable,
> +};
> +
> +U_BOOT_DRIVER(as3722_stepdown) = {
> +	.name = "as3722_stepdown",
> +	.id = UCLASS_REGULATOR,
> +	.ops = &as3722_stepdown_ops,
> +	.probe = as3722_stepdown_probe,
> +};
> +
> +U_BOOT_DRIVER(as3722_ldo) = {
> +	.name = "as3722_ldo",
> +	.id = UCLASS_REGULATOR,
> +	.ops = &as3722_ldo_ops,
> +	.probe = as3722_ldo_probe,
> +};
> diff --git a/include/power/as3722.h b/include/power/as3722.h
> index 0f22482ff7..14afa0c81a 100644
> --- a/include/power/as3722.h
> +++ b/include/power/as3722.h
> @@ -12,6 +12,14 @@
>  #define AS3722_GPIO_OUTPUT_VDDH (1 << 0)
>  #define AS3722_GPIO_INVERT (1 << 1)
>  
> +#define AS3722_DEVICE_ID 0x0c
> +#define AS3722_SD_VOLTAGE(n) (0x00 + (n))
> +#define AS3722_LDO_VOLTAGE(n) (0x10 + (n))
> +#define AS3722_SD_CONTROL 0x4d
> +#define AS3722_LDO_CONTROL 0x4e
> +#define AS3722_ASIC_ID1 0x90
> +#define AS3722_ASIC_ID2 0x91
> +
>  struct udevice;
>  
>  int as3722_init(struct udevice **devp);




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

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

* [U-Boot] [PATCH 19/26] power: Add a GPIO driver for the as3722 PMIC
  2017-05-19 14:31 ` [U-Boot] [PATCH 19/26] power: Add a GPIO " Simon Glass
@ 2017-05-20 23:40   ` Lukasz Majewski
  0 siblings, 0 replies; 38+ messages in thread
From: Lukasz Majewski @ 2017-05-20 23:40 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:31:02 -0600
Simon Glass <sjg@chromium.org> wrote:

> This pmic includes GPIOs which should have their own driver. Add
> a driver to support these.


Reviewed-by: Lukasz Majewski <lukma@denx.de>


> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  drivers/power/pmic/as3722_gpio.c | 120
> +++++++++++++++++++++++++++++++++++++++
> include/power/as3722.h           |   5 ++ 2 files changed, 125
> insertions(+) create mode 100644 drivers/power/pmic/as3722_gpio.c
> 
> diff --git a/drivers/power/pmic/as3722_gpio.c
> b/drivers/power/pmic/as3722_gpio.c new file mode 100644
> index 0000000000..d0b681ca4a
> --- /dev/null
> +++ b/drivers/power/pmic/as3722_gpio.c
> @@ -0,0 +1,120 @@
> +/*
> + * Copyright (C) 2014 NVIDIA Corporation
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <dm.h>
> +#include <asm/gpio.h>
> +#include <power/as3722.h>
> +#include <power/pmic.h>
> +
> +#define NUM_GPIOS	8
> +
> +int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
> +			  unsigned long flags)
> +{
> +	u8 value = 0;
> +	int err;
> +
> +	if (flags & AS3722_GPIO_OUTPUT_VDDH)
> +		value |= AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
> +
> +	if (flags & AS3722_GPIO_INVERT)
> +		value |= AS3722_GPIO_CONTROL_INVERT;
> +
> +	err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
> +	if (err) {
> +		error("failed to configure GPIO#%u: %d", gpio, err);
> +		return err;
> +	}
> +
> +	return 0;
> +}
> +
> +static int as3722_gpio_set_value(struct udevice *dev, unsigned int
> gpio,
> +				 int level)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	const char *l;
> +	u8 value;
> +	int err;
> +
> +	if (gpio >= NUM_GPIOS)
> +		return -EINVAL;
> +
> +	err = pmic_reg_read(pmic, AS3722_GPIO_SIGNAL_OUT);
> +	if (err < 0) {
> +		error("failed to read GPIO signal out register: %d",
> err);
> +		return err;
> +	}
> +	value = err;
> +
> +	if (level == 0) {
> +		value &= ~(1 << gpio);
> +		l = "low";
> +	} else {
> +		value |= 1 << gpio;
> +		l = "high";
> +	}
> +
> +	err = pmic_reg_write(pmic, AS3722_GPIO_SIGNAL_OUT, value);
> +	if (err) {
> +		error("failed to set GPIO#%u %s: %d", gpio, l, err);
> +		return err;
> +	}
> +
> +	return 0;
> +}
> +
> +int as3722_gpio_direction_output(struct udevice *dev, unsigned int
> gpio,
> +				 int value)
> +{
> +	struct udevice *pmic = dev_get_parent(dev);
> +	int err;
> +
> +	if (gpio > 7)
> +		return -EINVAL;
> +
> +	if (value == 0)
> +		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL;
> +	else
> +		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
> +
> +	err = pmic_reg_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
> +	if (err) {
> +		error("failed to configure GPIO#%u as output: %d",
> gpio, err);
> +		return err;
> +	}
> +
> +	err = as3722_gpio_set_value(pmic, gpio, value);
> +	if (err < 0) {
> +		error("failed to set GPIO#%u high: %d", gpio, err);
> +		return err;
> +	}
> +
> +	return 0;
> +}
> +
> +static int as3722_gpio_probe(struct udevice *dev)
> +{
> +	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
> +
> +	uc_priv->gpio_count = NUM_GPIOS;
> +	uc_priv->bank_name = "as3722_";
> +
> +	return 0;
> +}
> +
> +static const struct dm_gpio_ops gpio_as3722_ops = {
> +	.direction_output	= as3722_gpio_direction_output,
> +	.set_value		= as3722_gpio_set_value,
> +};
> +
> +U_BOOT_DRIVER(gpio_as3722) = {
> +	.name	= "gpio_as3722",
> +	.id	= UCLASS_GPIO,
> +	.ops	= &gpio_as3722_ops,
> +	.probe	= as3722_gpio_probe,
> +};
> diff --git a/include/power/as3722.h b/include/power/as3722.h
> index 14afa0c81a..713e79840f 100644
> --- a/include/power/as3722.h
> +++ b/include/power/as3722.h
> @@ -20,6 +20,11 @@
>  #define AS3722_ASIC_ID1 0x90
>  #define AS3722_ASIC_ID2 0x91
>  
> +#define AS3722_GPIO_CONTROL(n) (0x08 + (n))
> +#define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
> +#define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
> +#define AS3722_GPIO_CONTROL_INVERT (1 << 7)
> +
>  struct udevice;
>  
>  int as3722_init(struct udevice **devp);




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

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

* [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model
  2017-05-19 14:31 ` [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model Simon Glass
@ 2017-05-20 23:41   ` Lukasz Majewski
  0 siblings, 0 replies; 38+ messages in thread
From: Lukasz Majewski @ 2017-05-20 23:41 UTC (permalink / raw)
  To: u-boot

On Fri, 19 May 2017 08:31:03 -0600
Simon Glass <sjg@chromium.org> wrote:

> Convert this PMIC driver to driver model and fix up other users. The
> regulator and GPIO functions are now handled by separate drivers.
> 
> Note that this currently breaks apalis-tk1, jetson-tk1 and
> cei-tk1-som. I have the middle one so will tidy that up in the next
> version, at least.


Reviewed-by: Lukasz Majewski <lukma@denx.de>

> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  arch/arm/mach-tegra/board2.c     |   6 -
>  board/nvidia/nyan-big/nyan-big.c |  22 +--
>  configs/nyan-big_defconfig       |   1 +
>  drivers/power/pmic/Makefile      |   2 +-
>  drivers/power/pmic/as3722.c      | 292
> +++++++++++++--------------------------
> include/power/as3722.h           |  18 +-- 6 files changed, 114
> insertions(+), 227 deletions(-)
> 
> diff --git a/arch/arm/mach-tegra/board2.c
> b/arch/arm/mach-tegra/board2.c index 5aedd3ef9d..0291c7fb33 100644
> --- a/arch/arm/mach-tegra/board2.c
> +++ b/arch/arm/mach-tegra/board2.c
> @@ -29,7 +29,6 @@
>  #ifdef CONFIG_TEGRA_CLOCK_SCALING
>  #include <asm/arch/emc.h>
>  #endif
> -#include <power/as3722.h>
>  #include "emc.h"
>  
>  DECLARE_GLOBAL_DATA_PTR;
> @@ -142,11 +141,6 @@ int board_init(void)
>  		debug("Memory controller init failed: %d\n", err);
>  #  endif
>  # endif /* CONFIG_TEGRA_PMU */
> -#ifdef CONFIG_PMIC_AS3722
> -	err = as3722_init(NULL);
> -	if (err && err != -ENODEV)
> -		return err;
> -#endif
>  #endif /* CONFIG_SYS_I2C_TEGRA */
>  
>  #ifdef CONFIG_USB_EHCI_TEGRA
> diff --git a/board/nvidia/nyan-big/nyan-big.c
> b/board/nvidia/nyan-big/nyan-big.c index 8f68ae9fbe..54acf5418d 100644
> --- a/board/nvidia/nyan-big/nyan-big.c
> +++ b/board/nvidia/nyan-big/nyan-big.c
> @@ -6,6 +6,7 @@
>   */
>  
>  #include <common.h>
> +#include <dm.h>
>  #include <errno.h>
>  #include <asm/gpio.h>
>  #include <asm/io.h>
> @@ -46,20 +47,23 @@ int tegra_board_id(void)
>  
>  int tegra_lcd_pmic_init(int board_id)
>  {
> -	struct udevice *pmic;
> +	struct udevice *dev;
>  	int ret;
>  
> -	ret = as3722_get(&pmic);
> -	if (ret)
> -		return -ENOENT;
> +	ret = uclass_get_device_by_driver(UCLASS_PMIC,
> +
> DM_GET_DRIVER(pmic_as3722), &dev);
> +	if (ret) {
> +		debug("%s: Failed to find PMIC\n", __func__);
> +		return ret;
> +	}
>  
>  	if (board_id == 0)
> -		as3722_write(pmic, 0x00, 0x3c);
> +		pmic_reg_write(dev, 0x00, 0x3c);
>  	else
> -		as3722_write(pmic, 0x00, 0x50);
> -	as3722_write(pmic, 0x12, 0x10);
> -	as3722_write(pmic, 0x0c, 0x07);
> -	as3722_write(pmic, 0x20, 0x10);
> +		pmic_reg_write(dev, 0x00, 0x50);
> +	pmic_reg_write(dev, 0x12, 0x10);
> +	pmic_reg_write(dev, 0x0c, 0x07);
> +	pmic_reg_write(dev, 0x20, 0x10);
>  
>  	return 0;
>  }
> diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
> index 22769bdc93..a152ff6915 100644
> --- a/configs/nyan-big_defconfig
> +++ b/configs/nyan-big_defconfig
> @@ -47,6 +47,7 @@ CONFIG_SPI_FLASH_WINBOND=y
>  CONFIG_DM_PMIC=y
>  CONFIG_PMIC_AS3722=y
>  CONFIG_DM_REGULATOR=y
> +CONFIG_REGULATOR_AS3722=y
>  CONFIG_DM_REGULATOR_FIXED=y
>  CONFIG_PWM_TEGRA=y
>  CONFIG_SYS_NS16550=y
> diff --git a/drivers/power/pmic/Makefile b/drivers/power/pmic/Makefile
> index f409e3a0b3..76dda2a070 100644
> --- a/drivers/power/pmic/Makefile
> +++ b/drivers/power/pmic/Makefile
> @@ -12,7 +12,7 @@ obj-$(CONFIG_DM_PMIC_PFUZE100) += pfuze100.o
>  obj-$(CONFIG_PMIC_S2MPS11) += s2mps11.o
>  obj-$(CONFIG_DM_PMIC_SANDBOX) += sandbox.o i2c_pmic_emul.o
>  obj-$(CONFIG_PMIC_ACT8846) += act8846.o
> -obj-$(CONFIG_PMIC_AS3722) += as3722.o
> +obj-$(CONFIG_PMIC_AS3722) += as3722.o as3722_gpio.o
>  obj-$(CONFIG_PMIC_MAX8997) += max8997.o
>  obj-$(CONFIG_PMIC_PM8916) += pm8916.o
>  obj-$(CONFIG_PMIC_RK8XX) += rk8xx.o
> diff --git a/drivers/power/pmic/as3722.c b/drivers/power/pmic/as3722.c
> index c09e1de06f..4efe8ee183 100644
> --- a/drivers/power/pmic/as3722.c
> +++ b/drivers/power/pmic/as3722.c
> @@ -11,264 +11,168 @@
>  #include <errno.h>
>  #include <fdtdec.h>
>  #include <i2c.h>
> -
> +#include <dm/lists.h>
>  #include <power/as3722.h>
> +#include <power/pmic.h>
>  
> -#define AS3722_SD_VOLTAGE(n) (0x00 + (n))
> -#define AS3722_GPIO_CONTROL(n) (0x08 + (n))
> -#define  AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
> -#define  AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
> -#define  AS3722_GPIO_CONTROL_INVERT (1 << 7)
> -#define AS3722_LDO_VOLTAGE(n) (0x10 + (n))
> -#define AS3722_GPIO_SIGNAL_OUT 0x20
> -#define AS3722_SD_CONTROL 0x4d
> -#define AS3722_LDO_CONTROL 0x4e
> -#define AS3722_ASIC_ID1 0x90
> -#define  AS3722_DEVICE_ID 0x0c
> -#define AS3722_ASIC_ID2 0x91
> -
> -int as3722_read(struct udevice *pmic, u8 reg, u8 *value)
> -{
> -	int err;
> -
> -	err = dm_i2c_read(pmic, reg, value, 1);
> -	if (err < 0)
> -		return err;
> -
> -	return 0;
> -}
> +#define AS3722_NUM_OF_REGS	0x92
>  
> -int as3722_write(struct udevice *pmic, u8 reg, u8 value)
> +static int as3722_read(struct udevice *dev, uint reg, uint8_t *buff,
> int len) {
> -	int err;
> +	int ret;
>  
> -	err = dm_i2c_write(pmic, reg, &value, 1);
> -	if (err < 0)
> -		return err;
> +	ret = dm_i2c_read(dev, reg, buff, len);
> +	if (ret < 0)
> +		return ret;
>  
>  	return 0;
>  }
>  
> -static int as3722_read_id(struct udevice *pmic, u8 *id, u8 *revision)
> +static int as3722_write(struct udevice *dev, uint reg, const uint8_t
> *buff,
> +			int len)
>  {
> -	int err;
> +	int ret;
>  
> -	err = as3722_read(pmic, AS3722_ASIC_ID1, id);
> -	if (err) {
> -		error("failed to read ID1 register: %d", err);
> -		return err;
> -	}
> -
> -	err = as3722_read(pmic, AS3722_ASIC_ID2, revision);
> -	if (err) {
> -		error("failed to read ID2 register: %d", err);
> -		return err;
> -	}
> +	ret = dm_i2c_write(dev, reg, buff, len);
> +	if (ret < 0)
> +		return ret;
>  
>  	return 0;
>  }
>  
> -int as3722_sd_enable(struct udevice *pmic, unsigned int sd)
> +static int as3722_read_id(struct udevice *dev, uint *idp, uint
> *revisionp) {
> -	u8 value;
> -	int err;
> -
> -	if (sd > 6)
> -		return -EINVAL;
> +	int ret;
>  
> -	err = as3722_read(pmic, AS3722_SD_CONTROL, &value);
> -	if (err) {
> -		error("failed to read SD control register: %d", err);
> -		return err;
> +	ret = pmic_reg_read(dev, AS3722_ASIC_ID1);
> +	if (ret < 0) {
> +		error("failed to read ID1 register: %d", ret);
> +		return ret;
>  	}
> +	*idp = ret;
>  
> -	value |= 1 << sd;
> -
> -	err = as3722_write(pmic, AS3722_SD_CONTROL, value);
> -	if (err < 0) {
> -		error("failed to write SD control register: %d",
> err);
> -		return err;
> +	ret = pmic_reg_read(dev, AS3722_ASIC_ID2);
> +	if (ret < 0) {
> +		error("failed to read ID2 register: %d", ret);
> +		return ret;
>  	}
> +	*revisionp = ret;
>  
>  	return 0;
>  }
>  
> -int as3722_sd_set_voltage(struct udevice *pmic, unsigned int sd, u8
> value) +/* TODO(treding at nvidia.com): Add proper regulator support to
> avoid this */ +int as3722_sd_set_voltage(struct udevice *dev,
> unsigned int sd, u8 value) {
> -	int err;
> +	int ret;
>  
>  	if (sd > 6)
>  		return -EINVAL;
>  
> -	err = as3722_write(pmic, AS3722_SD_VOLTAGE(sd), value);
> -	if (err < 0) {
> -		error("failed to write SD%u voltage register: %d",
> sd, err);
> -		return err;
> +	ret = pmic_reg_write(dev, AS3722_SD_VOLTAGE(sd), value);
> +	if (ret < 0) {
> +		error("failed to write SD%u voltage register: %d",
> sd, ret);
> +		return ret;
>  	}
>  
>  	return 0;
>  }
>  
> -int as3722_ldo_enable(struct udevice *pmic, unsigned int ldo)
> +int as3722_ldo_set_voltage(struct udevice *dev, unsigned int ldo, u8
> value) {
> -	u8 value;
> -	int err;
> +	int ret;
>  
>  	if (ldo > 11)
>  		return -EINVAL;
>  
> -	err = as3722_read(pmic, AS3722_LDO_CONTROL, &value);
> -	if (err) {
> -		error("failed to read LDO control register: %d",
> err);
> -		return err;
> -	}
> -
> -	value |= 1 << ldo;
> -
> -	err = as3722_write(pmic, AS3722_LDO_CONTROL, value);
> -	if (err < 0) {
> -		error("failed to write LDO control register: %d",
> err);
> -		return err;
> -	}
> -
> -	return 0;
> -}
> -
> -int as3722_ldo_set_voltage(struct udevice *pmic, unsigned int ldo,
> u8 value) -{
> -	int err;
> -
> -	if (ldo > 11)
> -		return -EINVAL;
> -
> -	err = as3722_write(pmic, AS3722_LDO_VOLTAGE(ldo), value);
> -	if (err < 0) {
> +	ret = pmic_reg_write(dev, AS3722_LDO_VOLTAGE(ldo), value);
> +	if (ret < 0) {
>  		error("failed to write LDO%u voltage register: %d",
> ldo,
> -		      err);
> -		return err;
> +		      ret);
> +		return ret;
>  	}
>  
>  	return 0;
>  }
>  
> -int as3722_gpio_configure(struct udevice *pmic, unsigned int gpio,
> -			  unsigned long flags)
> +static int as3722_probe(struct udevice *dev)
>  {
> -	u8 value = 0;
> -	int err;
> +	uint id, revision;
> +	int ret;
>  
> -	if (flags & AS3722_GPIO_OUTPUT_VDDH)
> -		value |= AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
> -
> -	if (flags & AS3722_GPIO_INVERT)
> -		value |= AS3722_GPIO_CONTROL_INVERT;
> -
> -	err = as3722_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
> -	if (err) {
> -		error("failed to configure GPIO#%u: %d", gpio, err);
> -		return err;
> +	ret = as3722_read_id(dev, &id, &revision);
> +	if (ret < 0) {
> +		error("failed to read ID: %d", ret);
> +		return ret;
>  	}
>  
> -	return 0;
> -}
> -
> -static int as3722_gpio_set(struct udevice *pmic, unsigned int gpio,
> -			   unsigned int level)
> -{
> -	const char *l;
> -	u8 value;
> -	int err;
> -
> -	if (gpio > 7)
> -		return -EINVAL;
> -
> -	err = as3722_read(pmic, AS3722_GPIO_SIGNAL_OUT, &value);
> -	if (err < 0) {
> -		error("failed to read GPIO signal out register: %d",
> err);
> -		return err;
> -	}
> -
> -	if (level == 0) {
> -		value &= ~(1 << gpio);
> -		l = "low";
> -	} else {
> -		value |= 1 << gpio;
> -		l = "high";
> +	if (id != AS3722_DEVICE_ID) {
> +		error("unknown device");
> +		return -ENOENT;
>  	}
>  
> -	err = as3722_write(pmic, AS3722_GPIO_SIGNAL_OUT, value);
> -	if (err) {
> -		error("failed to set GPIO#%u %s: %d", gpio, l, err);
> -		return err;
> -	}
> +	debug("AS3722 revision %#x found on I2C bus %s\n", revision,
> dev->name); 
>  	return 0;
>  }
>  
> -int as3722_gpio_direction_output(struct udevice *pmic, unsigned int
> gpio,
> -				 unsigned int level)
> -{
> -	u8 value;
> -	int err;
> -
> -	if (gpio > 7)
> -		return -EINVAL;
> +#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
> +static const struct pmic_child_info pmic_children_info[] = {
> +	{ .prefix = "sd", .driver = "as3722_stepdown"},
> +	{ .prefix = "ldo", .driver = "as3722_ldo"},
> +	{ },
> +};
>  
> -	if (level == 0)
> -		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL;
> -	else
> -		value = AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH;
> +static int as3722_bind(struct udevice *dev)
> +{
> +	struct udevice *gpio_dev;
> +	ofnode regulators_node;
> +	int children;
> +	int ret;
>  
> -	err = as3722_write(pmic, AS3722_GPIO_CONTROL(gpio), value);
> -	if (err) {
> -		error("failed to configure GPIO#%u as output: %d",
> gpio, err);
> -		return err;
> +	regulators_node = dev_read_subnode(dev, "regulators");
> +	if (!ofnode_valid(regulators_node)) {
> +		debug("%s: %s regulators subnode not found\n",
> __func__,
> +		      dev->name);
> +		return -ENXIO;
>  	}
>  
> -	err = as3722_gpio_set(pmic, gpio, level);
> -	if (err < 0) {
> -		error("failed to set GPIO#%u high: %d", gpio, err);
> -		return err;
> +	children = pmic_bind_children(dev, regulators_node,
> pmic_children_info);
> +	if (!children)
> +		debug("%s: %s - no child found\n", __func__,
> dev->name);
> +	ret = device_bind_driver(dev, "gpio_as3722", "gpio_as3722",
> &gpio_dev);
> +	if (ret) {
> +		debug("%s: Cannot bind GPIOs (ret=%d)\n", __func__,
> ret);
> +		return ret;
>  	}
>  
>  	return 0;
>  }
> +#endif
>  
> -/* Temporary function until we get the pmic framework */
> -int as3722_get(struct udevice **devp)
> +static int as3722_reg_count(struct udevice *dev)
>  {
> -	int bus = 0;
> -	int address = 0x40;
> -
> -	return i2c_get_chip_for_busnum(bus, address, 1, devp);
> +	return AS3722_NUM_OF_REGS;
>  }
>  
> -int as3722_init(struct udevice **devp)
> -{
> -	struct udevice *pmic;
> -	u8 id, revision;
> -	const unsigned int bus = 0;
> -	const unsigned int address = 0x40;
> -	int err;
> -
> -	err = i2c_get_chip_for_busnum(bus, address, 1, &pmic);
> -	if (err)
> -		return err;
> -	err = as3722_read_id(pmic, &id, &revision);
> -	if (err < 0) {
> -		error("failed to read ID: %d", err);
> -		return err;
> -	}
> -
> -	if (id != AS3722_DEVICE_ID) {
> -		error("unknown device");
> -		return -ENOENT;
> -	}
> -
> -	debug("AS3722 revision %#x found on I2C bus %u, address
> %#x\n",
> -	      revision, bus, address);
> -	if (devp)
> -		*devp = pmic;
> -
> -	return 0;
> -}
> +static struct dm_pmic_ops as3722_ops = {
> +	.reg_count = as3722_reg_count,
> +	.read = as3722_read,
> +	.write = as3722_write,
> +};
> +
> +static const struct udevice_id as3722_ids[] = {
> +	{ .compatible = "ams,as3722" },
> +	{ }
> +};
> +
> +U_BOOT_DRIVER(pmic_as3722) = {
> +	.name = "as3722_pmic",
> +	.id = UCLASS_PMIC,
> +	.of_match = as3722_ids,
> +#if CONFIG_IS_ENABLED(PMIC_CHILDREN)
> +	.bind = as3722_bind,
> +#endif
> +	.probe = as3722_probe,
> +	.ops = &as3722_ops,
> +};
> diff --git a/include/power/as3722.h b/include/power/as3722.h
> index 713e79840f..491f1b7ea7 100644
> --- a/include/power/as3722.h
> +++ b/include/power/as3722.h
> @@ -7,8 +7,6 @@
>  #ifndef __POWER_AS3722_H__
>  #define __POWER_AS3722_H__
>  
> -#include <asm/types.h>
> -
>  #define AS3722_GPIO_OUTPUT_VDDH (1 << 0)
>  #define AS3722_GPIO_INVERT (1 << 1)
>  
> @@ -21,23 +19,9 @@
>  #define AS3722_ASIC_ID2 0x91
>  
>  #define AS3722_GPIO_CONTROL(n) (0x08 + (n))
> +#define AS3722_GPIO_SIGNAL_OUT 0x20
>  #define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDH (1 << 0)
>  #define AS3722_GPIO_CONTROL_MODE_OUTPUT_VDDL (7 << 0)
>  #define AS3722_GPIO_CONTROL_INVERT (1 << 7)
>  
> -struct udevice;
> -
> -int as3722_init(struct udevice **devp);
> -int as3722_sd_enable(struct udevice *pmic, unsigned int sd);
> -int as3722_sd_set_voltage(struct udevice *pmic, unsigned int sd, u8
> value); -int as3722_ldo_enable(struct udevice *pmic, unsigned int
> ldo); -int as3722_ldo_set_voltage(struct udevice *pmic, unsigned int
> ldo, u8 value); -int as3722_gpio_configure(struct udevice *pmic,
> unsigned int gpio,
> -			  unsigned long flags);
> -int as3722_gpio_direction_output(struct udevice *pmic, unsigned int
> gpio,
> -				 unsigned int level);
> -int as3722_read(struct udevice *pmic, u8 reg, u8 *value);
> -int as3722_write(struct udevice *pmic, u8 reg, u8 value);
> -int as3722_get(struct udevice **devp);
> -
>  #endif /* __POWER_AS3722_H__ */




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de

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

* [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree
  2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
                   ` (25 preceding siblings ...)
  2017-05-19 14:31 ` [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree Simon Glass
@ 2017-05-22 22:15 ` Tom Rini
  2017-05-24  0:44   ` Simon Glass
  26 siblings, 1 reply; 38+ messages in thread
From: Tom Rini @ 2017-05-22 22:15 UTC (permalink / raw)
  To: u-boot

On Fri, May 19, 2017 at 08:30:43AM -0600, Simon Glass wrote:
> This moves an entire board to use a live device tree as an example of the
> impact.
> 
> Nyan-big was chosen because I can easily and boot U-Boot without any
> media swapping, etc.
> 
> Total code size impact on this board is approximately 9KB on U-Boot and
> 64 bytes on SPL:
> 
> 27: dm: tegra: nyan-big: Move to livetree
>        arm: (for 1/1 boards) all +9264.0 bss -16.0 data +44.0 rodata +92.0
>           spl/u-boot-spl:all +326.0 spl/u-boot-spl:rodata +262.0
>           spl/u-boot-spl:text +64.0 text +9144.0
> 
> Tegra does not use Thumb2, which would likely reduce the code size by about
> 25%, indicating a code-size impact of perhaps 7KB.

So, did your buildman output get messed up in the copy/paste?  I see
both of the numbers you're saying, but it's all vs u-boot-spl.  The 64
bytes in SPL sounds good.

> I have not yet collected reliable detailed timing information. I will do
> that with the next version of this series, after comments are received.
> I expect that building the live tree will take a little time, and that
> using it will be very slightly faster.

I assume that you're in the process of rectifying this with the
bootstage patches you posted but FWIW I still use
http://elinux.org/Grabserial as my first weapon-of-choice in these kinds
of things.

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170522/8dbfeaaf/attachment.sig>

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

* [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree
  2017-05-22 22:15 ` [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big " Tom Rini
@ 2017-05-24  0:44   ` Simon Glass
  0 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-05-24  0:44 UTC (permalink / raw)
  To: u-boot

Hi Tom,

On 22 May 2017 at 16:15, Tom Rini <trini@konsulko.com> wrote:
> On Fri, May 19, 2017 at 08:30:43AM -0600, Simon Glass wrote:
>> This moves an entire board to use a live device tree as an example of the
>> impact.
>>
>> Nyan-big was chosen because I can easily and boot U-Boot without any
>> media swapping, etc.
>>
>> Total code size impact on this board is approximately 9KB on U-Boot and
>> 64 bytes on SPL:
>>
>> 27: dm: tegra: nyan-big: Move to livetree
>>        arm: (for 1/1 boards) all +9264.0 bss -16.0 data +44.0 rodata +92.0
>>           spl/u-boot-spl:all +326.0 spl/u-boot-spl:rodata +262.0
>>           spl/u-boot-spl:text +64.0 text +9144.0
>>
>> Tegra does not use Thumb2, which would likely reduce the code size by about
>> 25%, indicating a code-size impact of perhaps 7KB.
>
> So, did your buildman output get messed up in the copy/paste?  I see
> both of the numbers you're saying, but it's all vs u-boot-spl.  The 64
> bytes in SPL sounds good.

I think this is right. See 'text +9144.0' which means 9KB of extra in
ARM (not Thumb).

>
>> I have not yet collected reliable detailed timing information. I will do
>> that with the next version of this series, after comments are received.
>> I expect that building the live tree will take a little time, and that
>> using it will be very slightly faster.
>
> I assume that you're in the process of rectifying this with the
> bootstage patches you posted but FWIW I still use
> http://elinux.org/Grabserial as my first weapon-of-choice in these kinds
> of things.

Fair enough, but it's hard to measure down to milliseconds isn't it?
Also, outputting text affects the timing.

Yes I have completed the timing. Sneak preview...the times above are
times to start up driver model at each stage, in microseconds:

    Boot time is affected slightly. For nyan-big the times with flat tree are:

                     2,108  dm_r
                     7,924  dm_spl
                   120,724  dm_f
                   171,816  lcd

    With the livetree:

                       721  dm_r
                     3,764  of_live
                     7,990  dm_spl
                   120,736  dm_f
                   168,215  lcd

    As expected the spl and pre-relocation times are not affected. In the
    post-relocation case, the live tree must be built, which here takes about
    3.8ms. Driver-model device creation takes a bit of 1ms less time with the
    livetree, so all up the cost is about 2.4ms. After DM init there appears
    to be a slight reduction in the time taken to set up devices (from 327ms
    to 319ms) so overall the live tree does not appear to be any slower. This
    is because pre-parsing the device tree makes reading it later faster.

Regards,
Simon

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

* [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree
  2017-05-19 14:31 ` [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree Simon Glass
@ 2017-05-29 15:08   ` Marcel Ziswiler
  2017-06-01  3:11     ` Simon Glass
  0 siblings, 1 reply; 38+ messages in thread
From: Marcel Ziswiler @ 2017-05-29 15:08 UTC (permalink / raw)
  To: u-boot

Hi Simon

On Fri, 2017-05-19 at 08:31 -0600, Simon Glass wrote:
> Change this board to use a live device tree after relocation.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  configs/nyan-big_defconfig | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
> index a152ff6915..82be85a834 100644
> --- a/configs/nyan-big_defconfig
> +++ b/configs/nyan-big_defconfig
> @@ -33,6 +33,7 @@ CONFIG_CMD_EXT4_WRITE=y
>  # CONFIG_SPL_DOS_PARTITION is not set
>  # CONFIG_SPL_ISO_PARTITION is not set
>  # CONFIG_SPL_EFI_PARTITION is not set
> +CONFIG_OF_LIVE=y
>  CONFIG_SPL_DM=y
>  CONFIG_REGMAP=y
>  CONFIG_SYSCON=y

Doing the same on dm/master for Apalis TK1 gives me the following:

U-Boot 2017.05-00795-g40fcab4-dirty (May 29 2017 - 16:52:17 +0200)

TEGRA124
DRAM:  2 GiB
Error binding driver 'gpio_tegra': -22
Some drivers failed to bind
initcall sequence fffad294 failed at call 80124360 (err=-22)
### ERROR ### Please RESET the board ###

Do you happen to know what may go wrong here?

I do actually even own a nyan-big but so far never run any mainline
stuff on it as I am missing Servo and/or Yoshi et. al.

Is there any particular reason you did not do this on a more accessible
platform like e.g. Jetson TK1?

BTW: The same happens on Jetson TK1 once I enable live tree:

U-Boot SPL 2017.05-00795-g40fcab4-dirty (May 29 2017 - 17:03:18)
Trying to boot from RAM

U-Boot 2017.05-00795-g40fcab4-dirty (May 29 2017 - 17:03:18 +0200)

TEGRA124
Model: NVIDIA Jetson TK1
Board: NVIDIA Jetson TK1
DRAM:  2 GiB
Error binding driver 'gpio_tegra': -22
Some drivers failed to bind
initcall sequence fffa8ba4 failed at call 801235b8 (err=-22)
### ERROR ### Please RESET the board ###

Cheers

Marcel

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

* [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree
  2017-05-29 15:08   ` Marcel Ziswiler
@ 2017-06-01  3:11     ` Simon Glass
  0 siblings, 0 replies; 38+ messages in thread
From: Simon Glass @ 2017-06-01  3:11 UTC (permalink / raw)
  To: u-boot

Hi Marcel,

On 29 May 2017 at 09:08, Marcel Ziswiler <marcel.ziswiler@toradex.com> wrote:
> Hi Simon
>
> On Fri, 2017-05-19 at 08:31 -0600, Simon Glass wrote:
>> Change this board to use a live device tree after relocation.
>>
>> Signed-off-by: Simon Glass <sjg@chromium.org>
>> ---
>>
>>  configs/nyan-big_defconfig | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/configs/nyan-big_defconfig b/configs/nyan-big_defconfig
>> index a152ff6915..82be85a834 100644
>> --- a/configs/nyan-big_defconfig
>> +++ b/configs/nyan-big_defconfig
>> @@ -33,6 +33,7 @@ CONFIG_CMD_EXT4_WRITE=y
>>  # CONFIG_SPL_DOS_PARTITION is not set
>>  # CONFIG_SPL_ISO_PARTITION is not set
>>  # CONFIG_SPL_EFI_PARTITION is not set
>> +CONFIG_OF_LIVE=y
>>  CONFIG_SPL_DM=y
>>  CONFIG_REGMAP=y
>>  CONFIG_SYSCON=y
>
> Doing the same on dm/master for Apalis TK1 gives me the following:
>
> U-Boot 2017.05-00795-g40fcab4-dirty (May 29 2017 - 16:52:17 +0200)
>
> TEGRA124
> DRAM:  2 GiB
> Error binding driver 'gpio_tegra': -22
> Some drivers failed to bind
> initcall sequence fffad294 failed at call 80124360 (err=-22)
> ### ERROR ### Please RESET the board ###
>
> Do you happen to know what may go wrong here?

Not really. Can you diagnose it? I suspect it is in gpio_tegra_bind().

>
> I do actually even own a nyan-big but so far never run any mainline
> stuff on it as I am missing Servo and/or Yoshi et. al.

Sure. I did send a chain series (u-boot-dm/chain-working) which allows
it to run without those.

>
> Is there any particular reason you did not do this on a more accessible
> platform like e.g. Jetson TK1?

I do have one of those boards, but unfortunately I cannot find it. I'm
hoping to track it down in the next month or so.

>
> BTW: The same happens on Jetson TK1 once I enable live tree:
>
> U-Boot SPL 2017.05-00795-g40fcab4-dirty (May 29 2017 - 17:03:18)
> Trying to boot from RAM
>
> U-Boot 2017.05-00795-g40fcab4-dirty (May 29 2017 - 17:03:18 +0200)
>
> TEGRA124
> Model: NVIDIA Jetson TK1
> Board: NVIDIA Jetson TK1
> DRAM:  2 GiB
> Error binding driver 'gpio_tegra': -22
> Some drivers failed to bind
> initcall sequence fffa8ba4 failed at call 801235b8 (err=-22)
> ### ERROR ### Please RESET the board ###
>
> Cheers
>
> Marcel

Thank you for testing. I do have a beaver as well so may be able to
repeat it on that.

Regards,
Simon

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

end of thread, other threads:[~2017-06-01  3:11 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-05-19 14:30 [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big to livetree Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 01/26] dm: video: Sync display on backspace Simon Glass
2017-05-19 14:53   ` Anatolij Gustschin
2017-05-19 14:30 ` [U-Boot] [PATCH 02/26] dm: video: Update pwm_backlight to support livetree Simon Glass
2017-05-19 14:55   ` Anatolij Gustschin
2017-05-19 14:30 ` [U-Boot] [PATCH 03/26] video: simple-panel: Add a little more debugging Simon Glass
2017-05-19 14:56   ` Anatolij Gustschin
2017-05-19 14:30 ` [U-Boot] [PATCH 04/26] tegra: Fix up include file ordering Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 05/26] tegra: spl: Enable debug UART Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 06/26] tegra: nyan: Add a PMC syscon driver Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 07/26] dm: tegra: Convert USB setup to livetree Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 08/26] dm: tegra: Convert clock_decode_periph_id() to support livetree Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 09/26] dm: video: tegra124: Convert to livetree Simon Glass
2017-05-19 15:02   ` Anatolij Gustschin
2017-05-19 14:30 ` [U-Boot] [PATCH 10/26] tegra: dts: Move stdout-path to /chosen Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 11/26] tegra: Don't set up the UART clocks again in U-Boot Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 12/26] dm: tegra: gpio: Convert to support livetree Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 13/26] dm: tegra: usb: Convert to livetree Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 14/26] dm: tegra: spi: " Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 15/26] dm: tegra: i2c: " Simon Glass
2017-05-19 14:30 ` [U-Boot] [PATCH 16/26] dm: tegra: pwm: " Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 17/26] dm: tegra: mmc: " Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 18/26] power: Add a regulator driver for the as3722 PMIC Simon Glass
2017-05-20 23:40   ` Lukasz Majewski
2017-05-19 14:31 ` [U-Boot] [PATCH 19/26] power: Add a GPIO " Simon Glass
2017-05-20 23:40   ` Lukasz Majewski
2017-05-19 14:31 ` [U-Boot] [PATCH 20/26] dm: power: Convert as3722 to driver model Simon Glass
2017-05-20 23:41   ` Lukasz Majewski
2017-05-19 14:31 ` [U-Boot] [PATCH 21/26] dm: serial: ns16550: Convert to livetree Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 22/26] dm: serial: Separate out the core serial-device finding code Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 23/26] dm: serial: Add livetree support Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 24/26] tegra: Show a debug message if the LCD PMIC fails to start Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 25/26] fdtdec: Drop old compatible values Simon Glass
2017-05-19 14:31 ` [U-Boot] [PATCH 26/26] dm: tegra: nyan-big: Move to livetree Simon Glass
2017-05-29 15:08   ` Marcel Ziswiler
2017-06-01  3:11     ` Simon Glass
2017-05-22 22:15 ` [U-Boot] [PATCH 00/26] dm: tegra: Move nyan-big " Tom Rini
2017-05-24  0:44   ` Simon Glass

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox