From: Simon Glass Date: Mon, 17 Apr 2017 03:01:11 +0000 (-0600) Subject: dm: sandbox: pwm: Add a basic pwm test X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fu-boot.git;a=commitdiff_plain;h=43b41566f72c3ff1074fe686f37227ebe33e11f9 dm: sandbox: pwm: Add a basic pwm test Unfortunately a test for the PWM uclass was not included when it was submitted. This was noticed when trying to add more functionality: http://patchwork.ozlabs.org/patch/748172/ Add a simple test to get us started. Signed-off-by: Simon Glass --- diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index fff175d1b7..50bcdebf74 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -272,6 +272,14 @@ power-domains = <&pwrdom 2>; }; + pwm { + compatible = "sandbox,pwm"; + }; + + pwm2 { + compatible = "sandbox,pwm"; + }; + ram { compatible = "sandbox,ram"; }; diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index 9814ea3b81..cdaf3bb743 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -173,3 +173,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_DM_PWM=y +CONFIG_PWM_SANDBOX=y diff --git a/configs/sandbox_noblk_defconfig b/configs/sandbox_noblk_defconfig index bba744332c..087c7a84fc 100644 --- a/configs/sandbox_noblk_defconfig +++ b/configs/sandbox_noblk_defconfig @@ -175,3 +175,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_DM_PWM=y +CONFIG_PWM_SANDBOX=y diff --git a/configs/sandbox_spl_defconfig b/configs/sandbox_spl_defconfig index 6fe21254fd..ffdd15b6b5 100644 --- a/configs/sandbox_spl_defconfig +++ b/configs/sandbox_spl_defconfig @@ -179,3 +179,5 @@ CONFIG_UNIT_TEST=y CONFIG_UT_TIME=y CONFIG_UT_DM=y CONFIG_UT_ENV=y +CONFIG_DM_PWM=y +CONFIG_PWM_SANDBOX=y diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 37ea2b88ea..e827558052 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -27,6 +27,14 @@ config PWM_ROCKCHIP Various options provided in the hardware (such as capture mode and continuous/single-shot) are not supported by the driver. +config PWM_SANDBOX + bool "Enable support for the sandbox PWM" + help + This is a sandbox PWM used for testing. It provides 3 channels and + records the settings passed into it, but otherwise does nothing + useful. The PWM can be enabled but is not connected to any outputs + so this is not very useful. + config PWM_TEGRA bool "Enable support for the Tegra PWM" depends on DM_PWM diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index b037130385..29d59916cb 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -15,4 +15,5 @@ obj-$(CONFIG_DM_PWM) += pwm-uclass.o obj-$(CONFIG_PWM_EXYNOS) += exynos_pwm.o obj-$(CONFIG_PWM_IMX) += pwm-imx.o pwm-imx-util.o obj-$(CONFIG_PWM_ROCKCHIP) += rk_pwm.o +obj-$(CONFIG_PWM_SANDBOX) += sandbox_pwm.o obj-$(CONFIG_PWM_TEGRA) += tegra_pwm.o diff --git a/drivers/pwm/sandbox_pwm.c b/drivers/pwm/sandbox_pwm.c new file mode 100644 index 0000000000..c2ce974dde --- /dev/null +++ b/drivers/pwm/sandbox_pwm.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015 Google, Inc + * Written by Simon Glass + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +enum { + NUM_CHANNELS = 3, +}; + +struct sandbox_pwm_chan { + uint period_ns; + uint duty_ns; + bool enable; +}; + +struct sandbox_pwm_priv { + struct sandbox_pwm_chan chan[NUM_CHANNELS]; +}; + +static int sandbox_pwm_set_config(struct udevice *dev, uint channel, + uint period_ns, uint duty_ns) +{ + struct sandbox_pwm_priv *priv = dev_get_priv(dev); + struct sandbox_pwm_chan *chan; + + if (channel >= NUM_CHANNELS) + return -ENOSPC; + chan = &priv->chan[channel]; + chan->period_ns = period_ns; + chan->duty_ns = duty_ns; + + return 0; +} + +static int sandbox_pwm_set_enable(struct udevice *dev, uint channel, + bool enable) +{ + struct sandbox_pwm_priv *priv = dev_get_priv(dev); + struct sandbox_pwm_chan *chan; + + if (channel >= NUM_CHANNELS) + return -ENOSPC; + chan = &priv->chan[channel]; + chan->enable = enable; + + return 0; +} + +static const struct pwm_ops sandbox_pwm_ops = { + .set_config = sandbox_pwm_set_config, + .set_enable = sandbox_pwm_set_enable, +}; + +static const struct udevice_id sandbox_pwm_ids[] = { + { .compatible = "sandbox,pwm" }, + { } +}; + +U_BOOT_DRIVER(warm_pwm_sandbox) = { + .name = "pwm_sandbox", + .id = UCLASS_PWM, + .of_match = sandbox_pwm_ids, + .ops = &sandbox_pwm_ops, + .priv_auto_alloc_size = sizeof(struct sandbox_pwm_priv), +}; diff --git a/test/dm/Makefile b/test/dm/Makefile index 1885e17c38..e956915bc3 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -25,6 +25,7 @@ obj-$(CONFIG_DM_MAILBOX) += mailbox.o obj-$(CONFIG_DM_MMC) += mmc.o obj-$(CONFIG_DM_PCI) += pci.o obj-$(CONFIG_POWER_DOMAIN) += power-domain.o +obj-$(CONFIG_DM_PWM) += pwm.o obj-$(CONFIG_RAM) += ram.o obj-y += regmap.o obj-$(CONFIG_REMOTEPROC) += remoteproc.o diff --git a/test/dm/pwm.c b/test/dm/pwm.c new file mode 100644 index 0000000000..7bdc75af09 --- /dev/null +++ b/test/dm/pwm.c @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2017 Google, Inc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +/* Basic test of the pwm uclass */ +static int dm_test_pwm_base(struct unit_test_state *uts) +{ + struct udevice *dev; + + ut_assertok(uclass_get_device(UCLASS_PWM, 0, &dev)); + ut_assertok(pwm_set_config(dev, 0, 100, 50)); + ut_assertok(pwm_set_enable(dev, 0, true)); + ut_assertok(pwm_set_enable(dev, 1, true)); + ut_assertok(pwm_set_enable(dev, 2, true)); + ut_asserteq(-ENOSPC, pwm_set_enable(dev, 3, true)); + + ut_assertok(uclass_get_device(UCLASS_PWM, 1, &dev)); + ut_asserteq(-ENODEV, uclass_get_device(UCLASS_PWM, 2, &dev)); + + return 0; +} +DM_TEST(dm_test_pwm_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);