diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c
index b6aae3718a19f81baaa4a7616ec1231d67c3e80e..02c4cd366d13c0444eb28f11c35074a06d608413 100644
--- a/arch/sandbox/cpu/cpu.c
+++ b/arch/sandbox/cpu/cpu.c
@@ -22,6 +22,8 @@ unsigned long map_len;
 
 void reset_cpu(ulong ignored)
 {
+	/* Do this here while it still has an effect */
+	os_fd_restore();
 	if (state_uninit())
 		os_exit(2);
 
diff --git a/arch/sandbox/cpu/os.c b/arch/sandbox/cpu/os.c
index e6dd17e9efc7c62777bc6e4210c367abb2471435..8a4d719835ccb88c00b5aa6fd1e37cfdc049e8e8 100644
--- a/arch/sandbox/cpu/os.c
+++ b/arch/sandbox/cpu/os.c
@@ -107,10 +107,12 @@ void os_exit(int exit_code)
 static struct termios orig_term;
 static bool term_setup;
 
-static void os_fd_restore(void)
+void os_fd_restore(void)
 {
-	if (term_setup)
+	if (term_setup) {
 		tcsetattr(0, TCSANOW, &orig_term);
+		term_setup = false;
+	}
 }
 
 /* Put tty into raw mode so <tab> and <ctrl+c> work */
@@ -120,7 +122,6 @@ void os_tty_raw(int fd, bool allow_sigs)
 
 	if (term_setup)
 		return;
-	term_setup = true;
 
 	/* If not a tty, don't complain */
 	if (tcgetattr(fd, &orig_term))
@@ -134,6 +135,7 @@ void os_tty_raw(int fd, bool allow_sigs)
 	if (tcsetattr(fd, TCSANOW, &term))
 		return;
 
+	term_setup = true;
 	atexit(os_fd_restore);
 }
 
diff --git a/arch/sandbox/dts/Makefile b/arch/sandbox/dts/Makefile
index 562a078c4b4085653f496f8c6be26e73cd98f619..517b5554756fa417814995ea56f26b48a9654cb7 100644
--- a/arch/sandbox/dts/Makefile
+++ b/arch/sandbox/dts/Makefile
@@ -1,5 +1,5 @@
 dtb-$(CONFIG_SANDBOX) += sandbox.dtb
-dtb-$(CONFIG_DM_TEST) += test.dtb
+dtb-$(CONFIG_UT_DM) += test.dtb
 
 targets += $(dtb-y)
 
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index a3ebd80dd8ce8fda45fe20c4add79c48f5f23667..89275271413095e2d4d6242ee523e4206070ac8c 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -17,30 +17,6 @@
 		stdout-path = "/serial";
 	};
 
-	/* Needs to be available prior to relocation */
-	uart0: serial {
-		compatible = "sandbox,serial";
-		sandbox,text-colour = "cyan";
-	};
-
-	triangle {
-		compatible = "demo-shape";
-		colour = "cyan";
-		sides = <3>;
-		character = <83>;
-		light-gpios = <&gpio_a 2>, <&gpio_b 6 0>;
-	};
-	square {
-		compatible = "demo-shape";
-		colour = "blue";
-		sides = <4>;
-	};
-	hexagon {
-		compatible = "demo-simple";
-		colour = "white";
-		sides = <6>;
-	};
-
 	cros_ec: cros-ec@0 {
 		reg = <0 0>;
 		compatible = "google,cros-ec-sandbox";
@@ -70,10 +46,22 @@
 		};
 	};
 
-	lcd {
-		compatible = "sandbox,lcd-sdl";
-		xres = <1366>;
-		yres = <768>;
+	eth@10002000 {
+		compatible = "sandbox,eth";
+		reg = <0x10002000 0x1000>;
+		fake-host-hwaddr = [00 00 66 44 22 00];
+	};
+
+	eth@80000000 {
+		compatible = "sandbox,eth-raw";
+		reg = <0x80000000 0x1000>;
+		host-raw-interface = "eth0";
+	};
+
+	eth@90000000 {
+		compatible = "sandbox,eth-raw";
+		reg = <0x90000000 0x1000>;
+		host-raw-interface = "lo";
 	};
 
 	gpio_a: gpios@0 {
@@ -92,6 +80,12 @@
 		num-gpios = <10>;
 	};
 
+	hexagon {
+		compatible = "demo-simple";
+		colour = "white";
+		sides = <6>;
+	};
+
 	i2c_0: i2c@0 {
 		#address-cells = <1>;
 		#size-cells = <0>;
@@ -120,18 +114,10 @@
 		};
 	};
 
-	spi@0 {
-		#address-cells = <1>;
-		#size-cells = <0>;
-		reg = <0 0>;
-		compatible = "sandbox,spi";
-		cs-gpios = <0>, <&gpio_a 0>;
-		firmware_storage_spi: flash@0 {
-			reg = <0>;
-			compatible = "spansion,m25p16", "sandbox,spi-flash";
-			spi-max-frequency = <40000000>;
-			sandbox,filename = "spi.bin";
-		};
+	lcd {
+		compatible = "sandbox,lcd-sdl";
+		xres = <1366>;
+		yres = <768>;
 	};
 
 	pci: pci-controller {
@@ -150,22 +136,38 @@
 		};
 	};
 
-	eth@10002000 {
-		compatible = "sandbox,eth";
-		reg = <0x10002000 0x1000>;
-		fake-host-hwaddr = [00 00 66 44 22 00];
+	spi@0 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		reg = <0 0>;
+		compatible = "sandbox,spi";
+		cs-gpios = <0>, <&gpio_a 0>;
+		firmware_storage_spi: flash@0 {
+			reg = <0>;
+			compatible = "spansion,m25p16", "sandbox,spi-flash";
+			spi-max-frequency = <40000000>;
+			sandbox,filename = "spi.bin";
+		};
 	};
 
-	eth@80000000 {
-		compatible = "sandbox,eth-raw";
-		reg = <0x80000000 0x1000>;
-		host-raw-interface = "eth0";
+	square {
+		compatible = "demo-shape";
+		colour = "blue";
+		sides = <4>;
 	};
 
-	eth@90000000 {
-		compatible = "sandbox,eth-raw";
-		reg = <0x90000000 0x1000>;
-		host-raw-interface = "lo";
+	triangle {
+		compatible = "demo-shape";
+		colour = "cyan";
+		sides = <3>;
+		character = <83>;
+		light-gpios = <&gpio_a 2>, <&gpio_b 6 0>;
+	};
+
+	/* Needs to be available prior to relocation */
+	uart0: serial {
+		compatible = "sandbox,serial";
+		sandbox,text-colour = "cyan";
 	};
 
 	usb@0 {
diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts
index 1bc3ca0770c5ac1c6784c1621e4200f92b359e95..c25614ab8806aef6b908a5f616d2dd47492fe528 100644
--- a/arch/sandbox/dts/test.dts
+++ b/arch/sandbox/dts/test.dts
@@ -8,9 +8,13 @@
 
 	aliases {
 		console = &uart0;
+		eth0 = "/eth@10002000";
+		eth5 = &eth_5;
 		i2c0 = "/i2c@0";
-		spi0 = "/spi@0";
 		pci0 = &pci;
+		rtc0 = &rtc_0;
+		rtc1 = &rtc_1;
+		spi0 = "/spi@0";
 		testfdt6 = "/e-test";
 		testbus3 = "/some-bus";
 		testfdt0 = "/some-bus/c-test@0";
@@ -18,18 +22,11 @@
 		testfdt3 = "/b-test";
 		testfdt5 = "/some-bus/c-test@5";
 		testfdt8 = "/a-test";
-		eth0 = "/eth@10002000";
-		eth5 = &eth_5;
 		usb0 = &usb_0;
 		usb1 = &usb_1;
 		usb2 = &usb_2;
 	};
 
-	uart0: serial {
-		compatible = "sandbox,serial";
-		u-boot,dm-pre-reloc;
-	};
-
 	a-test {
 		reg = <0>;
 		compatible = "denx,u-boot-fdt-test";
@@ -108,6 +105,24 @@
 		compatible = "denx,u-boot-fdt-test";
 	};
 
+	eth@10002000 {
+		compatible = "sandbox,eth";
+		reg = <0x10002000 0x1000>;
+		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x00>;
+	};
+
+	eth_5: eth@10003000 {
+		compatible = "sandbox,eth";
+		reg = <0x10003000 0x1000>;
+		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x11>;
+	};
+
+	eth@10004000 {
+		compatible = "sandbox,eth";
+		reg = <0x10004000 0x1000>;
+		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x22>;
+	};
+
 	gpio_a: base-gpios {
 		compatible = "sandbox,gpio";
 		gpio-controller;
@@ -140,6 +155,22 @@
 			};
 		};
 
+		rtc_0: rtc@43 {
+			reg = <0x43>;
+			compatible = "sandbox-rtc";
+			emul {
+				compatible = "sandbox,i2c-rtc";
+			};
+		};
+
+		rtc_1: rtc@61 {
+			reg = <0x61>;
+			compatible = "sandbox-rtc";
+			emul {
+				compatible = "sandbox,i2c-rtc";
+			};
+		};
+
 		sandbox_pmic: sandbox_pmic {
 			reg = <0x40>;
 		};
@@ -175,22 +206,9 @@
 		};
 	};
 
-	eth@10002000 {
-		compatible = "sandbox,eth";
-		reg = <0x10002000 0x1000>;
-		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x00>;
-	};
-
-	eth_5: eth@10003000 {
-		compatible = "sandbox,eth";
-		reg = <0x10003000 0x1000>;
-		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x11>;
-	};
-
-	eth@10004000 {
-		compatible = "sandbox,eth";
-		reg = <0x10004000 0x1000>;
-		fake-host-hwaddr = <0x00 0x00 0x66 0x44 0x22 0x22>;
+	uart0: serial {
+		compatible = "sandbox,serial";
+		u-boot,dm-pre-reloc;
 	};
 
 	usb_0: usb@0 {
diff --git a/drivers/pci/pci-uclass.c b/drivers/pci/pci-uclass.c
index d48d865bac13ef0728afd08647063b44cb778242..de8750546699e0a66a5d70d9652184d1c5ba448b 100644
--- a/drivers/pci/pci-uclass.c
+++ b/drivers/pci/pci-uclass.c
@@ -596,6 +596,7 @@ int pci_bridge_write_config(struct udevice *bus, pci_dev_t devfn, uint offset,
 UCLASS_DRIVER(pci) = {
 	.id		= UCLASS_PCI,
 	.name		= "pci",
+	.flags		= DM_UC_FLAG_SEQ_ALIAS,
 	.post_bind	= pci_uclass_post_bind,
 	.pre_probe	= pci_uclass_pre_probe,
 	.post_probe	= pci_uclass_post_probe,
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index 519bb0be27acbfb3b0fb9d580bd5f72a406b5e7f..de91e57efcd672a4e61e06434a6d0c042a3c0b07 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -42,7 +42,7 @@
  * Note: With driver model, the label is allocated so there is no need for
  * the caller to preserve it.
  *
- * @param gp	GPIO number
+ * @param gpio	GPIO number
  * @param label	User label for this GPIO
  * @return 0 if ok, -1 on error
  */
@@ -127,7 +127,7 @@ struct gpio_desc {
 };
 
 /**
- * dm_gpio_is_valid() - Check if a GPIO is gpio_is_valie
+ * dm_gpio_is_valid() - Check if a GPIO is valid
  *
  * @desc:	GPIO description containing device, offset and flags,
  *		previously returned by gpio_request_by_name()
@@ -167,7 +167,7 @@ int gpio_get_status(struct udevice *dev, int offset, char *buf, int buffsize);
  *
  * @dev:	Device to check
  * @offset:	Offset of device GPIO to check
- * @namep:	If non-NULL, this is set to the nane given when the GPIO
+ * @namep:	If non-NULL, this is set to the name given when the GPIO
  *		was requested, or -1 if it has not been requested
  * @return  -ENODATA if the driver returned an unknown function,
  * -ENODEV if the device is not active, -EINVAL if the offset is invalid.
@@ -186,7 +186,7 @@ int gpio_get_function(struct udevice *dev, int offset, const char **namep);
  *
  * @dev:	Device to check
  * @offset:	Offset of device GPIO to check
- * @namep:	If non-NULL, this is set to the nane given when the GPIO
+ * @namep:	If non-NULL, this is set to the name given when the GPIO
  *		was requested, or -1 if it has not been requested
  * @return  -ENODATA if the driver returned an unknown function,
  * -ENODEV if the device is not active, -EINVAL if the offset is invalid.
@@ -219,7 +219,7 @@ struct fdtdec_phandle_args;
  * Also it would be useful to standardise additional functions like
  * pullup, slew rate and drive strength.
  *
- * gpio_request)( and gpio_free() are optional - if NULL then they will
+ * gpio_request() and gpio_free() are optional - if NULL then they will
  * not be called.
  *
  * Note that @offset is the offset from the base GPIO of the device. So
@@ -271,7 +271,7 @@ struct dm_gpio_ops {
 	 *
 	 * @dev:	GPIO device
 	 * @desc:	Place to put GPIO description
-	 * @args:	Arguments provided in descripion
+	 * @args:	Arguments provided in description
 	 * @return 0 if OK, -ve on error
 	 */
 	int (*xlate)(struct udevice *dev, struct gpio_desc *desc,
@@ -398,7 +398,7 @@ int gpio_request_by_name(struct udevice *dev, const char *list_name,
 /**
  * gpio_request_list_by_name() - Request a list of GPIOs
  *
- * Reads all the GPIOs from a list and requetss them. See
+ * Reads all the GPIOs from a list and requests them. See
  * gpio_request_by_name() for additional details. Lists should not be
  * misused to hold unrelated or optional GPIOs. They should only be used
  * for things like parallel data lines. A zero phandle terminates the list
@@ -533,7 +533,7 @@ int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags);
 /**
  * gpio_get_number() - Get the global GPIO number of a GPIO
  *
- * This should only be used for debugging or interest. It returns the nummber
+ * This should only be used for debugging or interest. It returns the number
  * that should be used for gpio_get_value() etc. to access this GPIO.
  *
  * @desc:	GPIO description containing device, offset and flags,
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index 4d737f46c5b8894fb0d58fb9460cba8d5a9685c7..c7310d7ca04f23300385fe7e025ebe719ee6bb16 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -39,20 +39,18 @@ enum uclass_id {
 	UCLASS_PCH,		/* x86 platform controller hub */
 	UCLASS_PCI,		/* PCI bus */
 	UCLASS_PCI_GENERIC,	/* Generic PCI bus device */
+	UCLASS_PMIC,		/* PMIC I/O device */
+	UCLASS_REGULATOR,	/* Regulator device */
 	UCLASS_RTC,		/* Real time clock device */
 	UCLASS_SERIAL,		/* Serial UART */
 	UCLASS_SPI,		/* SPI bus */
-	UCLASS_SPI_GENERIC,	/* Generic SPI flash target */
 	UCLASS_SPI_FLASH,	/* SPI flash */
+	UCLASS_SPI_GENERIC,	/* Generic SPI flash target */
 	UCLASS_THERMAL,		/* Thermal sensor */
 	UCLASS_USB,		/* USB bus */
 	UCLASS_USB_DEV_GENERIC,	/* USB generic device */
 	UCLASS_USB_HUB,		/* USB hub */
 
-	/* Power Management */
-	UCLASS_PMIC,		/* PMIC I/O device */
-	UCLASS_REGULATOR,	/* REGULATOR device */
-
 	UCLASS_COUNT,
 	UCLASS_INVALID = -1,
 };
diff --git a/include/os.h b/include/os.h
index ffbdce84643e0f593f8d6d684753b1b32af13447..954a48c9919e78a9259b615d6be12aa01c1ef4b3 100644
--- a/include/os.h
+++ b/include/os.h
@@ -111,6 +111,14 @@ void os_exit(int exit_code) __attribute__((noreturn));
  */
 void os_tty_raw(int fd, bool allow_sigs);
 
+/**
+ * Restore the tty to its original mode
+ *
+ * Call this to restore the original terminal mode, after it has been changed
+ * by os_tty_raw(). This is an internal function.
+ */
+void os_fd_restore(void);
+
 /**
  * Acquires some memory from the underlying os.
  *
diff --git a/test/dm/pci.c b/test/dm/pci.c
index 2f3ae7941b1b405bf1e298beace53dfcb1b6b881..3ab4ba811cf4280462cd3bacd2897fe08bc3a094 100644
--- a/test/dm/pci.c
+++ b/test/dm/pci.c
@@ -21,6 +21,17 @@ static int dm_test_pci_base(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_pci_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 
+/* Test that sandbox PCI bus numbering works correctly */
+static int dm_test_pci_busnum(struct unit_test_state *uts)
+{
+	struct udevice *bus;
+
+	ut_assertok(uclass_get_device_by_seq(UCLASS_PCI, 0, &bus));
+
+	return 0;
+}
+DM_TEST(dm_test_pci_busnum, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
 /* Test that we can use the swapcase device correctly */
 static int dm_test_pci_swapcase(struct unit_test_state *uts)
 {