
This patch adds a simple transmitter uclass meant for DVI or DisplayPort transmitters. The only driver functionality implemented are power_on and power_off methods for powering the transmitter device on and off, respectively.
Signed-off-by: Mario Six mario.six@gdsys.cc ---
arch/sandbox/dts/sandbox.dts | 4 ++ arch/sandbox/dts/test.dts | 4 ++ configs/sandbox_defconfig | 2 + drivers/Kconfig | 2 + drivers/Makefile | 1 + drivers/transmitter/Kconfig | 16 +++++++ drivers/transmitter/Makefile | 9 ++++ drivers/transmitter/sandbox_transmitter.c | 74 +++++++++++++++++++++++++++++++ drivers/transmitter/transmitter-uclass.c | 36 +++++++++++++++ include/dm/uclass-id.h | 1 + include/transmitter.h | 49 ++++++++++++++++++++ test/dm/Makefile | 1 + test/dm/transmitter.c | 31 +++++++++++++ 13 files changed, 230 insertions(+) create mode 100644 drivers/transmitter/Kconfig create mode 100644 drivers/transmitter/Makefile create mode 100644 drivers/transmitter/sandbox_transmitter.c create mode 100644 drivers/transmitter/transmitter-uclass.c create mode 100644 include/transmitter.h create mode 100644 test/dm/transmitter.c
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts index 0aba6c9a6d..0e84b840e7 100644 --- a/arch/sandbox/dts/sandbox.dts +++ b/arch/sandbox/dts/sandbox.dts @@ -238,6 +238,10 @@ compatible = "google,sandbox-tpm"; };
+ transmitter { + compatible = "sandbox,transmitter"; + }; + triangle { compatible = "demo-shape"; colour = "cyan"; diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 65b2f8ecda..36255809d3 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -392,6 +392,10 @@ clock-frequency = <1000000>; };
+ transmitter { + compatible = "sandbox,transmitter"; + }; + uart0: serial { compatible = "sandbox,serial"; u-boot,dm-pre-reloc; diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index 7a1b9ef052..7e1eebee67 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -167,6 +167,8 @@ CONFIG_TIMER=y CONFIG_TIMER_EARLY=y CONFIG_SANDBOX_TIMER=y CONFIG_TPM_TIS_SANDBOX=y +CONFIG_TRANSMITTER=y +CONFIG_SANDBOX_TRANSMITTER=y CONFIG_USB=y CONFIG_DM_USB=y CONFIG_USB_EMUL=y diff --git a/drivers/Kconfig b/drivers/Kconfig index 2e03133c43..2d15e4ea09 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -90,6 +90,8 @@ source "drivers/timer/Kconfig"
source "drivers/tpm/Kconfig"
+source "drivers/transmitter/Kconfig" + source "drivers/usb/Kconfig"
source "drivers/video/Kconfig" diff --git a/drivers/Makefile b/drivers/Makefile index 8624bd86f1..37cd6396fa 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -87,6 +87,7 @@ obj-y += sound/ obj-y += spmi/ obj-y += sysreset/ obj-y += timer/ +obj-y += transmitter/ obj-y += tpm/ obj-y += video/ obj-y += watchdog/ diff --git a/drivers/transmitter/Kconfig b/drivers/transmitter/Kconfig new file mode 100644 index 0000000000..64ca08f8b8 --- /dev/null +++ b/drivers/transmitter/Kconfig @@ -0,0 +1,16 @@ +# +# Transmitter drivers configuration +# + +menuconfig TRANSMITTER + bool "DVI/DP Transmitters" + +if TRANSMITTER + +config SANDBOX_TRANSMITTER + bool "Enable sandbox transmitter driver" + depends on DM + help + Enable the dummy transmitter for the sandbox. + +endif diff --git a/drivers/transmitter/Makefile b/drivers/transmitter/Makefile new file mode 100644 index 0000000000..b873e63e28 --- /dev/null +++ b/drivers/transmitter/Makefile @@ -0,0 +1,9 @@ +# +# (C) Copyright 2017 +# Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc +# +# SPDX-License-Identifier: GPL-2.0+ +# + +obj-y += transmitter-uclass.o +obj-$(CONFIG_SANDBOX_TRANSMITTER) += sandbox_transmitter.o diff --git a/drivers/transmitter/sandbox_transmitter.c b/drivers/transmitter/sandbox_transmitter.c new file mode 100644 index 0000000000..cb4c1e81e8 --- /dev/null +++ b/drivers/transmitter/sandbox_transmitter.c @@ -0,0 +1,74 @@ +/* + * (C) Copyright 2017 + * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <transmitter.h> + +struct sandbox_transmitter_priv { + int power_state; +}; + +void sandbox_transmitter_set_state(struct udevice *dev, int power_state) +{ + struct sandbox_transmitter_priv *priv = dev_get_priv(dev); + + priv->power_state = power_state; +} + +int sandbox_transmitter_get_state(struct udevice *dev) +{ + struct sandbox_transmitter_priv *priv = dev_get_priv(dev); + + return priv->power_state; +} + +int sandbox_transmitter_power_on(struct udevice *dev, void *data) +{ + struct sandbox_transmitter_priv *priv = dev_get_priv(dev); + + priv->power_state = 1; + + return 0; +} + +int sandbox_transmitter_power_off(struct udevice *dev) +{ + struct sandbox_transmitter_priv *priv = dev_get_priv(dev); + + priv->power_state = 0; + + return 0; +} + +int sandbox_transmitter_probe(struct udevice *dev) +{ + struct sandbox_transmitter_priv *priv = dev_get_priv(dev); + + priv->power_state = 0; + + return 0; +} + +struct transmitter_ops sandbox_transmitter_ops = { + .power_on = sandbox_transmitter_power_on, + .power_off = sandbox_transmitter_power_off, +}; + +static const struct udevice_id sandbox_transmitter_ids[] = { + { .compatible = "sandbox,transmitter" }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(sandbox_transmitter) = { + .name = "sandbox_transmitter", + .id = UCLASS_TRANSMITTER, + .of_match = sandbox_transmitter_ids, + .probe = sandbox_transmitter_probe, + .priv_auto_alloc_size = sizeof(struct sandbox_transmitter_priv), + .ops = &sandbox_transmitter_ops, +}; diff --git a/drivers/transmitter/transmitter-uclass.c b/drivers/transmitter/transmitter-uclass.c new file mode 100644 index 0000000000..cfcb8ed178 --- /dev/null +++ b/drivers/transmitter/transmitter-uclass.c @@ -0,0 +1,36 @@ +/* + * (C) Copyright 2017 + * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <errno.h> +#include <transmitter.h> + +int transmitter_power_on(struct udevice *dev, void *data) +{ + const struct transmitter_ops *ops = device_get_ops(dev); + + if (!ops->power_on) + return -ENOSYS; + + return ops->power_on(dev, data); +} + +int transmitter_power_off(struct udevice *dev) +{ + const struct transmitter_ops *ops = device_get_ops(dev); + + if (!ops->power_off) + return -ENOSYS; + + return ops->power_off(dev); +} + +UCLASS_DRIVER(transmitter) = { + .id = UCLASS_TRANSMITTER, + .name = "transmitter", +}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 56fbedaa9d..8eee8534ab 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -82,6 +82,7 @@ enum uclass_id { UCLASS_THERMAL, /* Thermal sensor */ UCLASS_TIMER, /* Timer device */ UCLASS_TPM, /* Trusted Platform Module TIS interface */ + UCLASS_TRANSMITTER, /* DVI and DP transmitters*/ UCLASS_USB, /* USB bus */ UCLASS_USB_DEV_GENERIC, /* USB generic device */ UCLASS_USB_HUB, /* USB hub */ diff --git a/include/transmitter.h b/include/transmitter.h new file mode 100644 index 0000000000..4765c1f17e --- /dev/null +++ b/include/transmitter.h @@ -0,0 +1,49 @@ +/* + * (C) Copyright 2017 + * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef _TRANSMITTER_H_ +#define _TRANSMITTER_H_ + +struct transmitter_ops { + /* + * Power on the transmitter device. + * + * This function is optional. + * + * @dev: The transmitter device to power on. + * @return: 0 if OK, -ve on error + */ + int (*power_on)(struct udevice *dev, void *data); + + /* + * Power off the transmitter device. + * + * This function is optional. + * + * @dev: The transmitter device to power off. + * @return: 0 if OK, -ve on error + */ + int (*power_off)(struct udevice *dev); +}; + +/* + * Power on a transmitter device. + * + * @dev: The transmitter device to power on. + * @return: 0 if OK, -ve on error + */ +int transmitter_power_on(struct udevice *dev, void *data); + +/* + * Power off a transmitter device. + * + * @dev: The transmitter device to power off. + * @return: 0 if OK, -ve on error + */ +int transmitter_power_off(struct udevice *dev); + +#endif /* _TRANSMITTER_H_ */ diff --git a/test/dm/Makefile b/test/dm/Makefile index 513c4561ad..fcc9432c26 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -44,4 +44,5 @@ obj-$(CONFIG_DM_VIDEO) += video.o obj-$(CONFIG_ADC) += adc.o obj-$(CONFIG_SPMI) += spmi.o obj-$(CONFIG_WDT) += wdt.o +obj-$(CONFIG_TRANSMITTER) += transmitter.o endif diff --git a/test/dm/transmitter.c b/test/dm/transmitter.c new file mode 100644 index 0000000000..6ea74a06b7 --- /dev/null +++ b/test/dm/transmitter.c @@ -0,0 +1,31 @@ +/* + * (C) Copyright 2017 + * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <dm/test.h> +#include <test/ut.h> + +static int dm_test_transmitter(struct unit_test_state *uts) +{ + struct udevice *dev; + + ut_assertok(uclass_get_device_by_name(UCLASS_TRANSMITTER, "transmitter", + &dev)); + + sandbox_transmitter_set_state(dev, 0); + ut_asserteq(0, sandbox_transmitter_get_state(dev)); + + ut_assertok(sandbox_transmitter_power_on(dev)); + ut_asserteq(1, sandbox_transmitter_get_state(dev)); + + ut_assertok(sandbox_transmitter_power_off(dev)); + ut_asserteq(0, sandbox_transmitter_get_state(dev)); + + return 0; +} +DM_TEST(dm_test_transmitter, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);