mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH v2] test: self: add basic regulator selftest
@ 2023-06-12 12:55 Ahmad Fatoum
  2023-06-13  7:56 ` Sascha Hauer
  0 siblings, 1 reply; 2+ messages in thread
From: Ahmad Fatoum @ 2023-06-12 12:55 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

This simple test verifies registration and always-on enabling and disabling
work as they should. It may be extended in future to support more
complex cases.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
  - add select on OF_OVERLAY (Sascha)
  - reorder regulators, so test succeeds
---
 test/self/Kconfig             |   7 +-
 test/self/Makefile            |   1 +
 test/self/regulator.c         | 188 ++++++++++++++++++++++++++++++++++
 test/self/test_regulator.dtso |  43 ++++++++
 4 files changed, 238 insertions(+), 1 deletion(-)
 create mode 100644 test/self/regulator.c
 create mode 100644 test/self/test_regulator.dtso

diff --git a/test/self/Kconfig b/test/self/Kconfig
index dcbfa85896f7..a4176ab8ffd6 100644
--- a/test/self/Kconfig
+++ b/test/self/Kconfig
@@ -38,9 +38,9 @@ config SELFTEST_ENABLE_ALL
 	imply SELFTEST_JSON
 	imply SELFTEST_DIGEST
 	imply SELFTEST_MMU
-	imply SELFTEST_REGULATOR
 	imply SELFTEST_STRING
 	imply SELFTEST_SETJMP
+	imply SELFTEST_REGULATOR
 	help
 	  Selects all self-tests compatible with current configuration
 
@@ -92,4 +92,9 @@ config SELFTEST_SETJMP
 	bool "setjmp/longjmp library selftest"
 	depends on ARCH_HAS_SJLJ
 
+config SELFTEST_REGULATOR
+	bool "Regulator selftest"
+	depends on REGULATOR && OFDEVICE
+	select OF_OVERLAY
+
 endif
diff --git a/test/self/Makefile b/test/self/Makefile
index b6f4395147dd..080ef303cc35 100644
--- a/test/self/Makefile
+++ b/test/self/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_SELFTEST_DIGEST) += digest.o
 obj-$(CONFIG_SELFTEST_MMU) += mmu.o
 obj-$(CONFIG_SELFTEST_STRING) += string.o
 obj-$(CONFIG_SELFTEST_SETJMP) += setjmp.o
+obj-$(CONFIG_SELFTEST_REGULATOR) += regulator.o test_regulator.dtbo.o
 
 clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.z
 clean-files += *.dtbo *.dtbo.S .*.dtso
diff --git a/test/self/regulator.c b/test/self/regulator.c
new file mode 100644
index 000000000000..e89164700ef1
--- /dev/null
+++ b/test/self/regulator.c
@@ -0,0 +1,188 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <common.h>
+#include <bselftest.h>
+#include <driver.h>
+#include <of.h>
+#include <regulator.h>
+#include <linux/regulator/of_regulator.h>
+
+struct test_regulator {
+	struct device *dev;
+};
+
+struct test_regulator_cfg {
+	struct regulator_desc desc;
+	struct regulator_dev rdev;
+};
+
+BSELFTEST_GLOBALS();
+
+static bool __ok(bool cond, const char *func, int line)
+{
+	total_tests++;
+	if (!cond) {
+		failed_tests++;
+		printf("%s:%d: assertion failure\n", func, line);
+		return false;
+	}
+
+	return true;
+}
+
+#define ok(cond) \
+	__ok(cond, __func__, __LINE__)
+
+static void test_regulator_selfref_always_on(struct device *dev)
+{
+	ok(1 == 1);
+}
+
+static int test_regulator_enable_noop(struct regulator_dev *rdev)
+{
+	dev_dbg(rdev->dev, "enabling %s-supply\n", rdev->desc->supply_name);
+	failed_tests--;
+	return 0;
+}
+
+static int test_regulator_disable_noop(struct regulator_dev *rdev)
+{
+	dev_dbg(rdev->dev, "disabling %s-supply\n", rdev->desc->supply_name);
+	failed_tests--;
+	return 0;
+}
+
+static const struct regulator_ops test_regulator_ops_range = {
+	.enable		= test_regulator_enable_noop,
+	.disable	= test_regulator_disable_noop,
+};
+
+enum {
+	/*
+	 * Ordering LDO1 before TEST_BUCK currently fails. This needs to be fixed
+	 */
+	TEST_BUCK,
+	TEST_LDO1,
+	TEST_LDO2,
+	TEST_REGULATORS_NUM
+};
+
+static struct test_regulator_cfg test_pmic_reg[] = {
+	[TEST_BUCK] = {{
+		 .supply_name = "buck",
+		 .ops = &test_regulator_ops_range,
+	}},
+	[TEST_LDO1] = {{
+		 .supply_name = "ldo1",
+		 .ops = &test_regulator_ops_range,
+	}},
+	[TEST_LDO2] = {{
+		.supply_name = "ldo2",
+		.ops = &test_regulator_ops_range,
+	}},
+};
+
+static struct of_regulator_match test_reg_matches[] = {
+	[TEST_BUCK] = { .name = "BUCK", .desc = &test_pmic_reg[TEST_BUCK].desc },
+	[TEST_LDO1] = { .name = "LDO1", .desc = &test_pmic_reg[TEST_LDO1].desc },
+	[TEST_LDO2] = { .name = "LDO2", .desc = &test_pmic_reg[TEST_LDO2].desc },
+};
+
+static int test_regulator_register(struct test_regulator *priv, int id,
+				    struct of_regulator_match *match,
+				    struct test_regulator_cfg *cfg)
+{
+	struct device *dev = priv->dev;
+	int ret;
+
+	if (!match->of_node) {
+		dev_warn(dev, "Skip missing DTB regulator %s\n", match->name);
+		return 0;
+	}
+
+	cfg->rdev.desc = &cfg->desc;
+	cfg->rdev.dev = dev;
+
+	dev_dbg(dev, "registering %s\n", match->name);
+
+	ret = of_regulator_register(&cfg->rdev, match->of_node);
+	if (ret)
+		return dev_err_probe(dev, ret, "failed to register %s regulator\n",
+				     match->name);
+
+	return 0;
+}
+
+static int regulator_probe(struct device *dev)
+{
+	size_t nregulators = ARRAY_SIZE(test_pmic_reg);
+	struct device_node *np = dev->of_node;
+	struct test_regulator *priv;
+	int ret, i;
+
+	priv = xzalloc(sizeof(*priv));
+	priv->dev = dev;
+
+	total_tests += 2;
+	failed_tests += 2;
+
+	np = of_get_child_by_name(np, "regulators");
+	if (!np)
+		return -ENOENT;
+
+	ret = of_regulator_match(dev, np, test_reg_matches, nregulators);
+	if (ret < 0)
+		return ret;
+
+	ok(ret == TEST_REGULATORS_NUM);
+
+	for (i = 0; i < nregulators; i++) {
+		ret = test_regulator_register(priv, i, &test_reg_matches[i],
+					      &test_pmic_reg[i]);
+		ok(ret == 0);
+		if (ret < 0)
+			return ret;
+	}
+
+	return 0;
+}
+
+static const struct of_device_id test_regulator_of_match[] = {
+	{ .compatible = "barebox,regulator-self-test" },
+	{ /* sentintel */ },
+};
+MODULE_DEVICE_TABLE(of, test_regulator_of_match);
+
+static struct driver regulator_test_driver = {
+	.name = "regulator-test",
+	.probe = regulator_probe,
+	.of_match_table = test_regulator_of_match,
+};
+
+static struct device_d *dev;
+
+static void test_regulator(void)
+{
+	extern char __dtbo_test_regulator_start[];
+	struct device_node *overlay;
+	int ret;
+
+	if (!dev) {
+		ret = platform_driver_register(&regulator_test_driver);
+		if (ret)
+			return;
+
+		overlay = of_unflatten_dtb(__dtbo_test_regulator_start, INT_MAX);
+		of_overlay_apply_tree(of_get_root_node(), overlay);
+		of_probe();
+
+		dev = of_find_device_by_node_path("/regulator-self-test-pmic");
+
+		ok(dev->driver != NULL);
+	}
+
+	test_regulator_selfref_always_on(dev);
+}
+bselftest(core, test_regulator);
diff --git a/test/self/test_regulator.dtso b/test/self/test_regulator.dtso
new file mode 100644
index 000000000000..65d2b130988d
--- /dev/null
+++ b/test/self/test_regulator.dtso
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+/dts-v1/;
+/plugin/;
+
+&{/} {
+	regulator_test_fixed: regulator-self-test-fixed {
+		compatible = "regulator-fixed";
+		regulator-name = "test_fixed";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+	};
+
+	regulator-self-test-pmic {
+		compatible = "barebox,regulator-self-test";
+
+		buck-supply = <&regulator_test_fixed>;
+		ldo1-supply = <&test_pmic_buck>;
+		ldo2-supply = <&test_pmic_buck>;
+
+		regulators {
+			test_pmic_buck: BUCK {
+				regulator-name = "buck";
+				regulator-min-microvolt = <330000>;
+				regulator-max-microvolt = <330000>;
+			};
+
+			test_pmic_ldo1: LDO1 {
+				regulator-name = "ldo1";
+				regulator-always-on;
+				regulator-boot-on;
+				regulator-min-microvolt = <180000>;
+				regulator-max-microvolt = <180000>;
+			};
+
+			test_pmic_ldo2: LDO2 {
+				regulator-name = "ldo2";
+				regulator-min-microvolt = <180000>;
+				regulator-max-microvolt = <180000>;
+			};
+		};
+	};
+};
-- 
2.39.2




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

* Re: [PATCH v2] test: self: add basic regulator selftest
  2023-06-12 12:55 [PATCH v2] test: self: add basic regulator selftest Ahmad Fatoum
@ 2023-06-13  7:56 ` Sascha Hauer
  0 siblings, 0 replies; 2+ messages in thread
From: Sascha Hauer @ 2023-06-13  7:56 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

On Mon, Jun 12, 2023 at 02:55:44PM +0200, Ahmad Fatoum wrote:
> This simple test verifies registration and always-on enabling and disabling
> work as they should. It may be extended in future to support more
> complex cases.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
> v1 -> v2:
>   - add select on OF_OVERLAY (Sascha)
>   - reorder regulators, so test succeeds
> ---
>  test/self/Kconfig             |   7 +-
>  test/self/Makefile            |   1 +
>  test/self/regulator.c         | 188 ++++++++++++++++++++++++++++++++++
>  test/self/test_regulator.dtso |  43 ++++++++
>  4 files changed, 238 insertions(+), 1 deletion(-)
>  create mode 100644 test/self/regulator.c
>  create mode 100644 test/self/test_regulator.dtso

Applied, thanks

Sascha

> 
> diff --git a/test/self/Kconfig b/test/self/Kconfig
> index dcbfa85896f7..a4176ab8ffd6 100644
> --- a/test/self/Kconfig
> +++ b/test/self/Kconfig
> @@ -38,9 +38,9 @@ config SELFTEST_ENABLE_ALL
>  	imply SELFTEST_JSON
>  	imply SELFTEST_DIGEST
>  	imply SELFTEST_MMU
> -	imply SELFTEST_REGULATOR
>  	imply SELFTEST_STRING
>  	imply SELFTEST_SETJMP
> +	imply SELFTEST_REGULATOR
>  	help
>  	  Selects all self-tests compatible with current configuration
>  
> @@ -92,4 +92,9 @@ config SELFTEST_SETJMP
>  	bool "setjmp/longjmp library selftest"
>  	depends on ARCH_HAS_SJLJ
>  
> +config SELFTEST_REGULATOR
> +	bool "Regulator selftest"
> +	depends on REGULATOR && OFDEVICE
> +	select OF_OVERLAY
> +
>  endif
> diff --git a/test/self/Makefile b/test/self/Makefile
> index b6f4395147dd..080ef303cc35 100644
> --- a/test/self/Makefile
> +++ b/test/self/Makefile
> @@ -13,6 +13,7 @@ obj-$(CONFIG_SELFTEST_DIGEST) += digest.o
>  obj-$(CONFIG_SELFTEST_MMU) += mmu.o
>  obj-$(CONFIG_SELFTEST_STRING) += string.o
>  obj-$(CONFIG_SELFTEST_SETJMP) += setjmp.o
> +obj-$(CONFIG_SELFTEST_REGULATOR) += regulator.o test_regulator.dtbo.o
>  
>  clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts *.dtb.z
>  clean-files += *.dtbo *.dtbo.S .*.dtso
> diff --git a/test/self/regulator.c b/test/self/regulator.c
> new file mode 100644
> index 000000000000..e89164700ef1
> --- /dev/null
> +++ b/test/self/regulator.c
> @@ -0,0 +1,188 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +
> +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
> +
> +#include <common.h>
> +#include <bselftest.h>
> +#include <driver.h>
> +#include <of.h>
> +#include <regulator.h>
> +#include <linux/regulator/of_regulator.h>
> +
> +struct test_regulator {
> +	struct device *dev;
> +};
> +
> +struct test_regulator_cfg {
> +	struct regulator_desc desc;
> +	struct regulator_dev rdev;
> +};
> +
> +BSELFTEST_GLOBALS();
> +
> +static bool __ok(bool cond, const char *func, int line)
> +{
> +	total_tests++;
> +	if (!cond) {
> +		failed_tests++;
> +		printf("%s:%d: assertion failure\n", func, line);
> +		return false;
> +	}
> +
> +	return true;
> +}
> +
> +#define ok(cond) \
> +	__ok(cond, __func__, __LINE__)
> +
> +static void test_regulator_selfref_always_on(struct device *dev)
> +{
> +	ok(1 == 1);
> +}
> +
> +static int test_regulator_enable_noop(struct regulator_dev *rdev)
> +{
> +	dev_dbg(rdev->dev, "enabling %s-supply\n", rdev->desc->supply_name);
> +	failed_tests--;
> +	return 0;
> +}
> +
> +static int test_regulator_disable_noop(struct regulator_dev *rdev)
> +{
> +	dev_dbg(rdev->dev, "disabling %s-supply\n", rdev->desc->supply_name);
> +	failed_tests--;
> +	return 0;
> +}
> +
> +static const struct regulator_ops test_regulator_ops_range = {
> +	.enable		= test_regulator_enable_noop,
> +	.disable	= test_regulator_disable_noop,
> +};
> +
> +enum {
> +	/*
> +	 * Ordering LDO1 before TEST_BUCK currently fails. This needs to be fixed
> +	 */
> +	TEST_BUCK,
> +	TEST_LDO1,
> +	TEST_LDO2,
> +	TEST_REGULATORS_NUM
> +};
> +
> +static struct test_regulator_cfg test_pmic_reg[] = {
> +	[TEST_BUCK] = {{
> +		 .supply_name = "buck",
> +		 .ops = &test_regulator_ops_range,
> +	}},
> +	[TEST_LDO1] = {{
> +		 .supply_name = "ldo1",
> +		 .ops = &test_regulator_ops_range,
> +	}},
> +	[TEST_LDO2] = {{
> +		.supply_name = "ldo2",
> +		.ops = &test_regulator_ops_range,
> +	}},
> +};
> +
> +static struct of_regulator_match test_reg_matches[] = {
> +	[TEST_BUCK] = { .name = "BUCK", .desc = &test_pmic_reg[TEST_BUCK].desc },
> +	[TEST_LDO1] = { .name = "LDO1", .desc = &test_pmic_reg[TEST_LDO1].desc },
> +	[TEST_LDO2] = { .name = "LDO2", .desc = &test_pmic_reg[TEST_LDO2].desc },
> +};
> +
> +static int test_regulator_register(struct test_regulator *priv, int id,
> +				    struct of_regulator_match *match,
> +				    struct test_regulator_cfg *cfg)
> +{
> +	struct device *dev = priv->dev;
> +	int ret;
> +
> +	if (!match->of_node) {
> +		dev_warn(dev, "Skip missing DTB regulator %s\n", match->name);
> +		return 0;
> +	}
> +
> +	cfg->rdev.desc = &cfg->desc;
> +	cfg->rdev.dev = dev;
> +
> +	dev_dbg(dev, "registering %s\n", match->name);
> +
> +	ret = of_regulator_register(&cfg->rdev, match->of_node);
> +	if (ret)
> +		return dev_err_probe(dev, ret, "failed to register %s regulator\n",
> +				     match->name);
> +
> +	return 0;
> +}
> +
> +static int regulator_probe(struct device *dev)
> +{
> +	size_t nregulators = ARRAY_SIZE(test_pmic_reg);
> +	struct device_node *np = dev->of_node;
> +	struct test_regulator *priv;
> +	int ret, i;
> +
> +	priv = xzalloc(sizeof(*priv));
> +	priv->dev = dev;
> +
> +	total_tests += 2;
> +	failed_tests += 2;
> +
> +	np = of_get_child_by_name(np, "regulators");
> +	if (!np)
> +		return -ENOENT;
> +
> +	ret = of_regulator_match(dev, np, test_reg_matches, nregulators);
> +	if (ret < 0)
> +		return ret;
> +
> +	ok(ret == TEST_REGULATORS_NUM);
> +
> +	for (i = 0; i < nregulators; i++) {
> +		ret = test_regulator_register(priv, i, &test_reg_matches[i],
> +					      &test_pmic_reg[i]);
> +		ok(ret == 0);
> +		if (ret < 0)
> +			return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static const struct of_device_id test_regulator_of_match[] = {
> +	{ .compatible = "barebox,regulator-self-test" },
> +	{ /* sentintel */ },
> +};
> +MODULE_DEVICE_TABLE(of, test_regulator_of_match);
> +
> +static struct driver regulator_test_driver = {
> +	.name = "regulator-test",
> +	.probe = regulator_probe,
> +	.of_match_table = test_regulator_of_match,
> +};
> +
> +static struct device_d *dev;
> +
> +static void test_regulator(void)
> +{
> +	extern char __dtbo_test_regulator_start[];
> +	struct device_node *overlay;
> +	int ret;
> +
> +	if (!dev) {
> +		ret = platform_driver_register(&regulator_test_driver);
> +		if (ret)
> +			return;
> +
> +		overlay = of_unflatten_dtb(__dtbo_test_regulator_start, INT_MAX);
> +		of_overlay_apply_tree(of_get_root_node(), overlay);
> +		of_probe();
> +
> +		dev = of_find_device_by_node_path("/regulator-self-test-pmic");
> +
> +		ok(dev->driver != NULL);
> +	}
> +
> +	test_regulator_selfref_always_on(dev);
> +}
> +bselftest(core, test_regulator);
> diff --git a/test/self/test_regulator.dtso b/test/self/test_regulator.dtso
> new file mode 100644
> index 000000000000..65d2b130988d
> --- /dev/null
> +++ b/test/self/test_regulator.dtso
> @@ -0,0 +1,43 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +
> +/dts-v1/;
> +/plugin/;
> +
> +&{/} {
> +	regulator_test_fixed: regulator-self-test-fixed {
> +		compatible = "regulator-fixed";
> +		regulator-name = "test_fixed";
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +	};
> +
> +	regulator-self-test-pmic {
> +		compatible = "barebox,regulator-self-test";
> +
> +		buck-supply = <&regulator_test_fixed>;
> +		ldo1-supply = <&test_pmic_buck>;
> +		ldo2-supply = <&test_pmic_buck>;
> +
> +		regulators {
> +			test_pmic_buck: BUCK {
> +				regulator-name = "buck";
> +				regulator-min-microvolt = <330000>;
> +				regulator-max-microvolt = <330000>;
> +			};
> +
> +			test_pmic_ldo1: LDO1 {
> +				regulator-name = "ldo1";
> +				regulator-always-on;
> +				regulator-boot-on;
> +				regulator-min-microvolt = <180000>;
> +				regulator-max-microvolt = <180000>;
> +			};
> +
> +			test_pmic_ldo2: LDO2 {
> +				regulator-name = "ldo2";
> +				regulator-min-microvolt = <180000>;
> +				regulator-max-microvolt = <180000>;
> +			};
> +		};
> +	};
> +};
> -- 
> 2.39.2
> 
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



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

end of thread, other threads:[~2023-06-13  7:57 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-12 12:55 [PATCH v2] test: self: add basic regulator selftest Ahmad Fatoum
2023-06-13  7:56 ` Sascha Hauer

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