Hi Jean-Jacques, On Tue, 5 Nov 2019 at 04:50, Jean-Jacques Hiblot <jjhib...@ti.com> wrote: > > Provide tests to check the behavior of the multiplexer framework. > The test uses a mmio-based multiplexer. > > Signed-off-by: Jean-Jacques Hiblot <jjhib...@ti.com> > > --- > > Changes in v2: > - Call sandbox_set_enable_memio(true) before running the test > > arch/sandbox/dts/test.dts | 26 +++++++ > configs/sandbox_defconfig | 2 + > test/dm/Makefile | 1 + > test/dm/mux-mmio.c | 147 ++++++++++++++++++++++++++++++++++++++ > 4 files changed, 176 insertions(+) > create mode 100644 test/dm/mux-mmio.c
Reviewed-by: Simon Glass <s...@chromium.org> nits below > > diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts > index aa9eaec338..3224a8389c 100644 > --- a/arch/sandbox/dts/test.dts > +++ b/arch/sandbox/dts/test.dts > @@ -1,3 +1,5 @@ > +#include <dt-bindings/mux/mux.h> > + > /dts-v1/; > > / { > @@ -93,6 +95,11 @@ > <&gpio_b 9 0xc 3 2 1>; > int-value = <1234>; > uint-value = <(-1234)>; > + > + mux-controls = <&muxcontroller0 0>, <&muxcontroller0 1>, > + <&muxcontroller0 2>, <&muxcontroller0 3>; > + mux-control-names = "mux0", "mux1", "mux2", "mux3"; > + mux-syscon = <&syscon3>; > }; > > junk { > @@ -129,6 +136,9 @@ > compatible = "denx,u-boot-fdt-test"; > ping-expect = <3>; > ping-add = <3>; > + > + mux-controls = <&muxcontroller0 0>; > + mux-control-names = "mux0"; > }; > > phy_provider0: gen_phy@0 { > @@ -665,6 +675,22 @@ > 0x58 8>; > }; > > + syscon3: syscon@3 { > + compatible = "simple-mfd", "syscon"; > + reg = <0x000100 0x10>; > + > + muxcontroller0: a-mux-controller { > + compatible = "mmio-mux"; > + #mux-control-cells = <1>; > + > + mux-reg-masks = <0x0 0x30>, /* 0: reg 0x0, bits 5:4 */ > + <0x3 0x1E>, /* 1: reg 0x3, bits 4:1 */ > + <0x1 0xFF>; /* 2: reg 0x1, bits 7:0 */ > + idle-states = <MUX_IDLE_AS_IS>, <0x02>, <0x73>; > + u-boot,mux-autoprobe; > + }; > + }; > + > timer { > compatible = "sandbox,timer"; > clock-frequency = <1000000>; > diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig > index 20ebc68997..2822dd9c74 100644 > --- a/configs/sandbox_defconfig > +++ b/configs/sandbox_defconfig > @@ -144,6 +144,8 @@ CONFIG_SPI_FLASH_SPANSION=y > CONFIG_SPI_FLASH_STMICRO=y > CONFIG_SPI_FLASH_SST=y > CONFIG_SPI_FLASH_WINBOND=y > +CONFIG_MULTIPLEXER=y > +CONFIG_MUX_MMIO=y > CONFIG_DM_ETH=y > CONFIG_NVME=y > CONFIG_PCI=y > diff --git a/test/dm/Makefile b/test/dm/Makefile > index 0c2fd5cb5e..a3fc23e527 100644 > --- a/test/dm/Makefile > +++ b/test/dm/Makefile > @@ -47,6 +47,7 @@ obj-$(CONFIG_DM_SPI_FLASH) += sf.o > obj-$(CONFIG_SMEM) += smem.o > obj-$(CONFIG_DM_SPI) += spi.o > obj-y += syscon.o > +obj-$(CONFIG_MUX_MMIO) += mux-mmio.o > obj-$(CONFIG_DM_USB) += usb.o > obj-$(CONFIG_DM_PMIC) += pmic.o > obj-$(CONFIG_DM_REGULATOR) += regulator.o > diff --git a/test/dm/mux-mmio.c b/test/dm/mux-mmio.c > new file mode 100644 > index 0000000000..a3dfd34120 > --- /dev/null > +++ b/test/dm/mux-mmio.c > @@ -0,0 +1,147 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2017-2018 Texas Instruments Incorporated - > http://www.ti.com/ > + * Jean-Jacques Hiblot <jjhib...@ti.com> > + */ > + > +#include <common.h> > +#include <fdtdec.h> > +#include <dm.h> > +#include <mux.h> > +#include <regmap.h> > +#include <syscon.h> > +#include <asm/test.h> > +#include <dm/root.h> > +#include <dm/test.h> > +#include <dm/util.h> > +#include <test/ut.h> Missing header file for device_remove() here. > + > +/* Test that mmio mux work correctly */ > +static int dm_test_mux_mmio(struct unit_test_state *uts) > +{ > + struct udevice *dev, *dev_b; > + struct regmap *map; > + struct mux_control *ctl0_a, *ctl0_b; > + struct mux_control *ctl1; > + struct mux_control *ctl_err; > + u32 val; > + int i; > + > + sandbox_set_enable_memio(true); > + > + ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev)); > + ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 1, &dev_b)); > + ut_asserteq_str("a-test", dev->name); > + ut_asserteq_str("b-test", dev_b->name); > + map = syscon_regmap_lookup_by_phandle(dev, "mux-syscon"); > + ut_assert(!IS_ERR(map)); > + ut_assert(map); > + > + /* check default states */ > + ut_assertok(regmap_read(map, 3, &val)); > + ut_asserteq(0x02, (val & 0x1E) >> 1); > + ut_assertok(regmap_read(map, 1, &val)); > + ut_asserteq(0x73, (val & 0xFF) >> 0); > + > + ut_assertok(mux_control_get(dev, "mux0", &ctl0_a)); > + ut_assertok(mux_control_get(dev, "mux1", &ctl1)); > + ut_asserteq(-ERANGE, mux_control_get(dev, "mux3", &ctl_err)); > + ut_asserteq(-ENODATA, mux_control_get(dev, "dummy", &ctl_err)); > + ut_assertok(mux_control_get(dev_b, "mux0", &ctl0_b)); > + > + for (i = 0; i < mux_control_states(ctl0_a); i++) { > + /* select a new state and verify the value in the regmap */ > + ut_assertok(mux_control_select(ctl0_a, i)); > + ut_assertok(regmap_read(map, 0, &val)); > + ut_asserteq(i, (val & 0x30) >> 4); > + /* > + * deselect the mux and verify that the value in the regmap > + * reflects the idle state (fixed to MUX_IDLE_AS_IS) > + */ > + ut_assertok(mux_control_deselect(ctl0_a)); > + ut_assertok(regmap_read(map, 0, &val)); > + ut_asserteq(i, (val & 0x30) >> 4); > + } Tests should be short and targeted. Could this test be split up a bit> > + > + for (i = 0; i < mux_control_states(ctl1); i++) { > + /* select a new state and verify the value in the regmap */ > + ut_assertok(mux_control_select(ctl1, i)); > + ut_assertok(regmap_read(map, 3, &val)); > + ut_asserteq(i, (val & 0x1E) >> 1); > + /* > + * deselect the mux and verify that the value in the regmap > + * reflects the idle state (fixed to 2) > + */ > + ut_assertok(mux_control_deselect(ctl1)); > + ut_assertok(regmap_read(map, 3, &val)); > + ut_asserteq(2, (val & 0x1E) >> 1); > + } > + > + // try unbalanced selection/deselection > + ut_assertok(mux_control_select(ctl0_a, 0)); > + ut_asserteq(-EBUSY, mux_control_select(ctl0_a, 1)); > + ut_asserteq(-EBUSY, mux_control_select(ctl0_a, 0)); > + ut_assertok(mux_control_deselect(ctl0_a)); > + > + // try concurent selection concurrent Please use C comment style. > + ut_assertok(mux_control_select(ctl0_a, 0)); > + ut_assert(mux_control_select(ctl0_b, 0)); > + ut_assertok(mux_control_deselect(ctl0_a)); > + ut_assertok(mux_control_select(ctl0_b, 0)); > + ut_assert(mux_control_select(ctl0_a, 0)); > + ut_assertok(mux_control_deselect(ctl0_b)); > + ut_assertok(mux_control_select(ctl0_a, 0)); > + ut_assertok(mux_control_deselect(ctl0_a)); > + > + return 0; > +} > +DM_TEST(dm_test_mux_mmio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); > + > +/* Test that managed API for mux work correctly */ > +static int dm_test_devm_mux_mmio(struct unit_test_state *uts) > +{ > + struct udevice *dev, *dev_b; > + struct mux_control *ctl0_a, *ctl0_b; > + struct mux_control *ctl1; > + struct mux_control *ctl_err; > + > + sandbox_set_enable_memio(true); > + > + ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 0, &dev)); > + ut_assertok(uclass_get_device(UCLASS_TEST_FDT, 1, &dev_b)); > + ut_asserteq_str("a-test", dev->name); > + ut_asserteq_str("b-test", dev_b->name); > + > + ctl0_a = devm_mux_control_get(dev, "mux0"); > + ut_assertok(IS_ERR(ctl0_a)); Probably need to define ut_assert_not_err() or similar. > + ut_assert(ctl0_a); > + ctl1 = devm_mux_control_get(dev, "mux1"); > + ut_assertok(IS_ERR(ctl1)); > + ut_assert(ctl1); > + ctl_err = devm_mux_control_get(dev, "mux3"); > + ut_asserteq(-ERANGE, PTR_ERR(ctl_err)); > + ctl_err = devm_mux_control_get(dev, "dummy"); > + ut_asserteq(-ENODATA, PTR_ERR(ctl_err)); > + > + ctl0_b = devm_mux_control_get(dev_b, "mux0"); > + ut_assertok(IS_ERR(ctl0_b)); > + ut_assert(ctl0_b); > + > + /* try concurent selection */ spelling again > + ut_assertok(mux_control_select(ctl0_a, 0)); > + ut_assert(mux_control_select(ctl0_b, 0)); > + ut_assertok(mux_control_deselect(ctl0_a)); > + ut_assertok(mux_control_select(ctl0_b, 0)); > + ut_assert(mux_control_select(ctl0_a, 0)); > + ut_assertok(mux_control_deselect(ctl0_b)); > + > + /* removed one device and check that the mux is released */ > + ut_assertok(mux_control_select(ctl0_a, 0)); > + ut_assert(mux_control_select(ctl0_b, 0)); > + device_remove(dev, DM_REMOVE_NORMAL); > + ut_assertok(mux_control_select(ctl0_b, 0)); > + > + device_remove(dev_b, DM_REMOVE_NORMAL); > + return 0; > +} > +DM_TEST(dm_test_devm_mux_mmio, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); > -- > 2.17.1 > Regards, Simon