These patches adds the stingray thermal driver and its
corresponding DT nodes with documentation.
Pramod Kumar (3):
dt-bindings: thermal: Add binding document for SR thermal
arm64: dts: stingray: Add Stingray Thermal DT support.
thermal: broadcom: Add Stingray thermal driver
.../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++
.../arm64/boot/dts/broadcom/stingray/stingray.dtsi | 37 +++++
drivers/thermal/Kconfig | 3 +-
drivers/thermal/broadcom/Kconfig | 9 ++
drivers/thermal/broadcom/Makefile | 1 +
drivers/thermal/broadcom/sr-thermal.c | 151 +++++++++++++++++++++
6 files changed, 245 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
create mode 100644 drivers/thermal/broadcom/sr-thermal.c
--
2.7.4
From: Pramod Kumar <[email protected]>
Adds stingray thermal driver to monitor six
thermal zones temperature and trips at critical temperature.
Signed-off-by: Pramod Kumar <[email protected]>
Signed-off-by: Srinath Mannam <[email protected]>
Reviewed-by: Ray Jui <[email protected]>
Reviewed-by: Scott Branden <[email protected]>
Reviewed-by: Vikram Prakash <[email protected]>
---
drivers/thermal/Kconfig | 3 +-
drivers/thermal/broadcom/Kconfig | 9 ++
drivers/thermal/broadcom/Makefile | 1 +
drivers/thermal/broadcom/sr-thermal.c | 151 ++++++++++++++++++++++++++++++++++
4 files changed, 163 insertions(+), 1 deletion(-)
create mode 100644 drivers/thermal/broadcom/sr-thermal.c
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig
index 8297988..26d39d4 100644
--- a/drivers/thermal/Kconfig
+++ b/drivers/thermal/Kconfig
@@ -416,7 +416,8 @@ config MTK_THERMAL
controller present in Mediatek SoCs
menu "Broadcom thermal drivers"
-depends on ARCH_BCM || ARCH_BRCMSTB || ARCH_BCM2835 || COMPILE_TEST
+depends on ARCH_BCM || ARCH_BRCMSTB || ARCH_BCM2835 || ARCH_BCM_IPROC || \
+ COMPILE_TEST
source "drivers/thermal/broadcom/Kconfig"
endmenu
diff --git a/drivers/thermal/broadcom/Kconfig b/drivers/thermal/broadcom/Kconfig
index c106a15..dc9a9bd 100644
--- a/drivers/thermal/broadcom/Kconfig
+++ b/drivers/thermal/broadcom/Kconfig
@@ -22,3 +22,12 @@ config BCM_NS_THERMAL
BCM4708, BCM4709, BCM5301x, BCM95852X, etc). It contains DMU (Device
Management Unit) block with a thermal sensor that allows checking CPU
temperature.
+
+config BCM_SR_THERMAL
+ tristate "Stingray thermal driver"
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
+ default ARCH_BCM_IPROC
+ help
+ Support for the Stingray family of SoCs. Its different blocks like
+ iHost, CRMU and NITRO has thermal sensor that allows checking its
+ temperature.
diff --git a/drivers/thermal/broadcom/Makefile b/drivers/thermal/broadcom/Makefile
index fae10ec..79df69e 100644
--- a/drivers/thermal/broadcom/Makefile
+++ b/drivers/thermal/broadcom/Makefile
@@ -1,3 +1,4 @@
obj-$(CONFIG_BCM2835_THERMAL) += bcm2835_thermal.o
obj-$(CONFIG_BRCMSTB_THERMAL) += brcmstb_thermal.o
obj-$(CONFIG_BCM_NS_THERMAL) += ns-thermal.o
+obj-$(CONFIG_BCM_SR_THERMAL) += sr-thermal.o
diff --git a/drivers/thermal/broadcom/sr-thermal.c b/drivers/thermal/broadcom/sr-thermal.c
new file mode 100644
index 0000000..362dcda
--- /dev/null
+++ b/drivers/thermal/broadcom/sr-thermal.c
@@ -0,0 +1,151 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2018 Broadcom
+ */
+
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/thermal.h>
+
+#define TMON_CRIT_TEMP 105000 /* temp in millidegree C */
+
+struct sr_thermal {
+ struct thermal_zone_device *tz;
+ struct device *dev;
+ void __iomem *regs;
+ unsigned int crit_temp;
+};
+
+static int sr_get_temp(struct thermal_zone_device *tz, int *temp)
+{
+ struct sr_thermal *sr_thermal = tz->devdata;
+
+ *temp = readl(sr_thermal->regs);
+
+ return 0;
+}
+
+static int sr_get_trip_type(struct thermal_zone_device *tz, int trip,
+ enum thermal_trip_type *type)
+{
+ struct sr_thermal *sr_thermal = tz->devdata;
+
+ switch (trip) {
+ case 0:
+ *type = THERMAL_TRIP_CRITICAL;
+ break;
+ default:
+ dev_dbg(sr_thermal->dev,
+ "Driver does not support more than 1 trip point\n");
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int sr_get_trip_temp(struct thermal_zone_device *tz, int trip, int *temp)
+{
+ struct sr_thermal *sr_thermal = tz->devdata;
+
+ switch (trip) {
+ case 0:
+ *temp = sr_thermal->crit_temp;
+ break;
+ default:
+ dev_dbg(sr_thermal->dev,
+ "Driver does not support more than 1 trip point\n");
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static int sr_set_trip_temp(struct thermal_zone_device *tz, int trip, int temp)
+{
+ struct sr_thermal *sr_thermal = tz->devdata;
+
+ switch (trip) {
+ case 0:
+ /*
+ * Allow the user to change critical temperature
+ * as per their requirement, could be for debug
+ * purpose, even if it's more than the recommended
+ * critical temperature.
+ */
+ sr_thermal->crit_temp = temp;
+ break;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+static struct thermal_zone_device_ops sr_thermal_ops = {
+ .get_temp = sr_get_temp,
+ .get_trip_type = sr_get_trip_type,
+ .get_trip_temp = sr_get_trip_temp,
+ .set_trip_temp = sr_set_trip_temp,
+};
+
+static int sr_thermal_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct sr_thermal *sr_thermal;
+ struct resource *res;
+
+ sr_thermal = devm_kzalloc(dev, sizeof(*sr_thermal), GFP_KERNEL);
+ if (!sr_thermal)
+ return -ENOMEM;
+ sr_thermal->dev = dev;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ sr_thermal->regs = (void __iomem *)devm_memremap(&pdev->dev, res->start,
+ resource_size(res), MEMREMAP_WB);
+ if (IS_ERR(sr_thermal->regs)) {
+ dev_err(dev, "failed to get io address\n");
+ return PTR_ERR(sr_thermal->regs);
+ }
+
+ /* initialize tmon value to 0 */
+ writel(0, sr_thermal->regs);
+ sr_thermal->crit_temp = TMON_CRIT_TEMP;
+
+ sr_thermal->tz = thermal_zone_device_register(dev_name(dev), 1, 1,
+ sr_thermal,
+ &sr_thermal_ops,
+ NULL, 1000, 1000);
+ if (IS_ERR(sr_thermal->tz))
+ return PTR_ERR(sr_thermal->tz);
+
+ platform_set_drvdata(pdev, sr_thermal);
+
+ return 0;
+}
+
+static int sr_thermal_remove(struct platform_device *pdev)
+{
+ struct sr_thermal *sr_thermal = platform_get_drvdata(pdev);
+
+ thermal_zone_device_unregister(sr_thermal->tz);
+
+ return 0;
+}
+
+static const struct of_device_id sr_thermal_of_match[] = {
+ { .compatible = "brcm,sr-thermal", },
+ {},
+};
+MODULE_DEVICE_TABLE(of, sr_thermal_of_match);
+
+static struct platform_driver sr_thermal_driver = {
+ .probe = sr_thermal_probe,
+ .remove = sr_thermal_remove,
+ .driver = {
+ .name = "sr-thermal",
+ .of_match_table = sr_thermal_of_match,
+ },
+};
+module_platform_driver(sr_thermal_driver);
+
+MODULE_AUTHOR("Pramod Kumar <[email protected]>");
+MODULE_DESCRIPTION("Stingray thermal driver");
+MODULE_LICENSE("GPL v2");
--
2.7.4
From: Pramod Kumar <[email protected]>
Add DT nodes for thermal zones memory base address
to read temperature.
Signed-off-by: Pramod Kumar <[email protected]>
Reviewed-by: Ray Jui <[email protected]>
Reviewed-by: Scott Branden <[email protected]>
Reviewed-by: Srinath Mannam <[email protected]>
---
.../arm64/boot/dts/broadcom/stingray/stingray.dtsi | 37 ++++++++++++++++++++++
1 file changed, 37 insertions(+)
diff --git a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
index 99aaff0..db1cc67 100644
--- a/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
+++ b/arch/arm64/boot/dts/broadcom/stingray/stingray.dtsi
@@ -593,4 +593,41 @@
status = "disabled";
};
};
+
+ tmons {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x0 0x8f100000 0x100>;
+
+ tmon_ihost0: thermal@0 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x0 0x4>;
+ };
+
+ tmon_ihost1: thermal@4 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x4 0x4>;
+ };
+
+ tmon_ihost2: thermal@8 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8 0x4>;
+ };
+
+ tmon_ihost3: thermal@c {
+ compatible = "brcm,sr-thermal";
+ reg = <0xc 0x4>;
+ };
+
+ tmon_crmu: thermal@10 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x10 0x4>;
+ };
+
+ tmon_nitro: thermal@14 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x14 0x4>;
+ };
+ };
};
--
2.7.4
From: Pramod Kumar <[email protected]>
Add binding document for supported thermal implementation
in Stingray.
Signed-off-by: Pramod Kumar <[email protected]>
Reviewed-by: Ray Jui <[email protected]>
Reviewed-by: Scott Branden <[email protected]>
Reviewed-by: Srinath Mannam <[email protected]>
---
.../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++++++++++++++++++
1 file changed, 45 insertions(+)
create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
diff --git a/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
new file mode 100644
index 0000000..33f9e11
--- /dev/null
+++ b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
@@ -0,0 +1,45 @@
+* Broadcom Stingray Thermal
+
+This binding describes thermal sensors that is part of Stingray SoCs.
+
+Required properties:
+- compatible : Must be "brcm,sr-thermal"
+- reg : memory where tmon data will be available.
+
+Example:
+ tmons {
+ compatible = "simple-bus";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+
+ tmon_ihost0: thermal@8f100000 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f100000 0x4>;
+ };
+
+ tmon_ihost1: thermal@8f100004 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f100004 0x4>;
+ };
+
+ tmon_ihost2: thermal@8f100008 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f100008 0x4>;
+ };
+
+ tmon_ihost3: thermal@8f10000c {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f10000c 0x4>;
+ };
+
+ tmon_crmu: thermal@8f100010 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f100010 0x4>;
+ };
+
+ tmon_nitro: thermal@8f100014 {
+ compatible = "brcm,sr-thermal";
+ reg = <0x8f100014 0x4>;
+ };
+ };
--
2.7.4
On Mon, Jun 18, 2018 at 02:01:17PM +0530, Srinath Mannam wrote:
> From: Pramod Kumar <[email protected]>
>
> Add binding document for supported thermal implementation
> in Stingray.
>
> Signed-off-by: Pramod Kumar <[email protected]>
> Reviewed-by: Ray Jui <[email protected]>
> Reviewed-by: Scott Branden <[email protected]>
> Reviewed-by: Srinath Mannam <[email protected]>
> ---
> .../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++++++++++++++++++
> 1 file changed, 45 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>
> diff --git a/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
> new file mode 100644
> index 0000000..33f9e11
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
> @@ -0,0 +1,45 @@
> +* Broadcom Stingray Thermal
> +
> +This binding describes thermal sensors that is part of Stingray SoCs.
> +
> +Required properties:
> +- compatible : Must be "brcm,sr-thermal"
> +- reg : memory where tmon data will be available.
> +
> +Example:
> + tmons {
> + compatible = "simple-bus";
> + #address-cells = <1>;
> + #size-cells = <1>;
> + ranges;
> +
> + tmon_ihost0: thermal@8f100000 {
> + compatible = "brcm,sr-thermal";
> + reg = <0x8f100000 0x4>;
> + };
You still haven't given me a compelling reason why you need a node per
register.
You have a single range of registers. Make this 1 node.
Rob
Hi Rob,
Please find my comments for the reason to have multiple DT nodes.
On Thu, Jun 21, 2018 at 1:22 AM, Rob Herring <[email protected]> wrote:
> On Mon, Jun 18, 2018 at 02:01:17PM +0530, Srinath Mannam wrote:
>> From: Pramod Kumar <[email protected]>
>>
>> Add binding document for supported thermal implementation
>> in Stingray.
>>
>> Signed-off-by: Pramod Kumar <[email protected]>
>> Reviewed-by: Ray Jui <[email protected]>
>> Reviewed-by: Scott Branden <[email protected]>
>> Reviewed-by: Srinath Mannam <[email protected]>
>> ---
>> .../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++++++++++++++++++
>> 1 file changed, 45 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>
>> diff --git a/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>> new file mode 100644
>> index 0000000..33f9e11
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>> @@ -0,0 +1,45 @@
>> +* Broadcom Stingray Thermal
>> +
>> +This binding describes thermal sensors that is part of Stingray SoCs.
>> +
>> +Required properties:
>> +- compatible : Must be "brcm,sr-thermal"
>> +- reg : memory where tmon data will be available.
>> +
>> +Example:
>> + tmons {
>> + compatible = "simple-bus";
>> + #address-cells = <1>;
>> + #size-cells = <1>;
>> + ranges;
>> +
>> + tmon_ihost0: thermal@8f100000 {
>> + compatible = "brcm,sr-thermal";
>> + reg = <0x8f100000 0x4>;
>> + };
>
> You still haven't given me a compelling reason why you need a node per
> register.
>
> You have a single range of registers. Make this 1 node.
>
We Have two reasons to have multiple nodes..
1. Our chip has multiple functional blocks. Each functional block has
its own thermal zone.
Functional blocks and their thermal zones enabled/disabled based on end product.
Few functional blocks need to disabled for few products so thermal
zones also need to disable.
In that case, nodes of specific thermal zones are removed from DTS
file of corresponding product.
2. Thermal framework provides sysfs interface to configure thermal
zones and read temperature of thermal zone.
To configure individual thermal zone, we need to have separate DT node.
Same to read temperature of individual thermal zone.
Ex: To read temperature of thermal zone 0.
cat /sys/class/thermal/thermal_zone0/temp
To configure trip temperature of thermal zone 0.
echo 110000 > /sys/class/thermal/thermal_zone0/trip_point_0_temp
Also to avoid driver source change for the multiple products it is
clean to have multiple DT nodes.
> Rob
Hi Rob,
Kindly provide your feedback.
Regards,
Srinath.
On Fri, Jun 22, 2018 at 11:21 AM, Srinath Mannam
<[email protected]> wrote:
> Hi Rob,
>
> Please find my comments for the reason to have multiple DT nodes.
>
> On Thu, Jun 21, 2018 at 1:22 AM, Rob Herring <[email protected]> wrote:
>> On Mon, Jun 18, 2018 at 02:01:17PM +0530, Srinath Mannam wrote:
>>> From: Pramod Kumar <[email protected]>
>>>
>>> Add binding document for supported thermal implementation
>>> in Stingray.
>>>
>>> Signed-off-by: Pramod Kumar <[email protected]>
>>> Reviewed-by: Ray Jui <[email protected]>
>>> Reviewed-by: Scott Branden <[email protected]>
>>> Reviewed-by: Srinath Mannam <[email protected]>
>>> ---
>>> .../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++++++++++++++++++
>>> 1 file changed, 45 insertions(+)
>>> create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>>
>>> diff --git a/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>> new file mode 100644
>>> index 0000000..33f9e11
>>> --- /dev/null
>>> +++ b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>> @@ -0,0 +1,45 @@
>>> +* Broadcom Stingray Thermal
>>> +
>>> +This binding describes thermal sensors that is part of Stingray SoCs.
>>> +
>>> +Required properties:
>>> +- compatible : Must be "brcm,sr-thermal"
>>> +- reg : memory where tmon data will be available.
>>> +
>>> +Example:
>>> + tmons {
>>> + compatible = "simple-bus";
>>> + #address-cells = <1>;
>>> + #size-cells = <1>;
>>> + ranges;
>>> +
>>> + tmon_ihost0: thermal@8f100000 {
>>> + compatible = "brcm,sr-thermal";
>>> + reg = <0x8f100000 0x4>;
>>> + };
>>
>> You still haven't given me a compelling reason why you need a node per
>> register.
>>
>> You have a single range of registers. Make this 1 node.
>>
>
> We Have two reasons to have multiple nodes..
> 1. Our chip has multiple functional blocks. Each functional block has
> its own thermal zone.
> Functional blocks and their thermal zones enabled/disabled based on end product.
> Few functional blocks need to disabled for few products so thermal
> zones also need to disable.
> In that case, nodes of specific thermal zones are removed from DTS
> file of corresponding product.
>
> 2. Thermal framework provides sysfs interface to configure thermal
> zones and read temperature of thermal zone.
> To configure individual thermal zone, we need to have separate DT node.
> Same to read temperature of individual thermal zone.
> Ex: To read temperature of thermal zone 0.
> cat /sys/class/thermal/thermal_zone0/temp
> To configure trip temperature of thermal zone 0.
> echo 110000 > /sys/class/thermal/thermal_zone0/trip_point_0_temp
>
> Also to avoid driver source change for the multiple products it is
> clean to have multiple DT nodes.
>
>> Rob
Hi Rob,
I have provided my inputs for the purpose of having multiple nodes.
Please get back if you have any comments or suggestions.
Regards,
Srinath.
On Tue, Jul 3, 2018 at 4:15 PM, Srinath Mannam
<[email protected]> wrote:
> Hi Rob,
>
> Kindly provide your feedback.
>
> Regards,
> Srinath.
>
> On Fri, Jun 22, 2018 at 11:21 AM, Srinath Mannam
> <[email protected]> wrote:
>> Hi Rob,
>>
>> Please find my comments for the reason to have multiple DT nodes.
>>
>> On Thu, Jun 21, 2018 at 1:22 AM, Rob Herring <[email protected]> wrote:
>>> On Mon, Jun 18, 2018 at 02:01:17PM +0530, Srinath Mannam wrote:
>>>> From: Pramod Kumar <[email protected]>
>>>>
>>>> Add binding document for supported thermal implementation
>>>> in Stingray.
>>>>
>>>> Signed-off-by: Pramod Kumar <[email protected]>
>>>> Reviewed-by: Ray Jui <[email protected]>
>>>> Reviewed-by: Scott Branden <[email protected]>
>>>> Reviewed-by: Srinath Mannam <[email protected]>
>>>> ---
>>>> .../bindings/thermal/brcm,sr-thermal.txt | 45 ++++++++++++++++++++++
>>>> 1 file changed, 45 insertions(+)
>>>> create mode 100644 Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>>>
>>>> diff --git a/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>>> new file mode 100644
>>>> index 0000000..33f9e11
>>>> --- /dev/null
>>>> +++ b/Documentation/devicetree/bindings/thermal/brcm,sr-thermal.txt
>>>> @@ -0,0 +1,45 @@
>>>> +* Broadcom Stingray Thermal
>>>> +
>>>> +This binding describes thermal sensors that is part of Stingray SoCs.
>>>> +
>>>> +Required properties:
>>>> +- compatible : Must be "brcm,sr-thermal"
>>>> +- reg : memory where tmon data will be available.
>>>> +
>>>> +Example:
>>>> + tmons {
>>>> + compatible = "simple-bus";
>>>> + #address-cells = <1>;
>>>> + #size-cells = <1>;
>>>> + ranges;
>>>> +
>>>> + tmon_ihost0: thermal@8f100000 {
>>>> + compatible = "brcm,sr-thermal";
>>>> + reg = <0x8f100000 0x4>;
>>>> + };
>>>
>>> You still haven't given me a compelling reason why you need a node per
>>> register.
>>>
>>> You have a single range of registers. Make this 1 node.
>>>
>>
>> We Have two reasons to have multiple nodes..
>> 1. Our chip has multiple functional blocks. Each functional block has
>> its own thermal zone.
>> Functional blocks and their thermal zones enabled/disabled based on end product.
>> Few functional blocks need to disabled for few products so thermal
>> zones also need to disable.
>> In that case, nodes of specific thermal zones are removed from DTS
>> file of corresponding product.
>>
>> 2. Thermal framework provides sysfs interface to configure thermal
>> zones and read temperature of thermal zone.
>> To configure individual thermal zone, we need to have separate DT node.
>> Same to read temperature of individual thermal zone.
>> Ex: To read temperature of thermal zone 0.
>> cat /sys/class/thermal/thermal_zone0/temp
>> To configure trip temperature of thermal zone 0.
>> echo 110000 > /sys/class/thermal/thermal_zone0/trip_point_0_temp
>>
>> Also to avoid driver source change for the multiple products it is
>> clean to have multiple DT nodes.
>>
>>> Rob