diff --git a/arch/sandbox/cpu/cpu.c b/arch/sandbox/cpu/cpu.c index b6aae3718a1..02c4cd366d1 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 e6dd17e9efc..8a4d719835c 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 and 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 562a078c4b4..517b5554756 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 a3ebd80dd8c..89275271413 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 1bc3ca0770c..c25614ab880 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -8,9 +8,13 @@ aliases { console = &uart0; + eth0 = "/eth@10002000"; + eth5 = ð_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 = ð_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 d48d865bac1..de875054669 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 519bb0be27a..de91e57efcd 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 4d737f46c5b..c7310d7ca04 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 ffbdce84643..954a48c9919 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 2f3ae7941b1..3ab4ba811cf 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) {