[U-Boot] [PATCH 1/3] thermal: Add multiple instance support

Keerthy j-keerthy at ti.com
Mon Mar 11 06:12:57 UTC 2019


Currently single instance temperature read out is supported.
Enhance the same to support multiple instances.

Signed-off-by: Keerthy <j-keerthy at ti.com>
---
 arch/arm/mach-imx/cpu.c          |  2 +-
 drivers/mmc/omap_hsmmc.c         |  2 +-
 drivers/thermal/imx_thermal.c    |  2 +-
 drivers/thermal/thermal-uclass.c |  4 ++--
 drivers/thermal/ti-bandgap.c     | 13 ++++++++++---
 include/thermal.h                |  6 ++++--
 6 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/arch/arm/mach-imx/cpu.c b/arch/arm/mach-imx/cpu.c
index 6b83f92662..27d12b410e 100644
--- a/arch/arm/mach-imx/cpu.c
+++ b/arch/arm/mach-imx/cpu.c
@@ -231,7 +231,7 @@ int print_cpuinfo(void)
 	printf("(%dC to %dC)", minc, maxc);
 	ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev);
 	if (!ret) {
-		ret = thermal_get_temp(thermal_dev, &cpu_tmp);
+		ret = thermal_get_temp(thermal_dev, 0, &cpu_tmp);
 
 		if (!ret)
 			printf(" at %dC\n", cpu_tmp);
diff --git a/drivers/mmc/omap_hsmmc.c b/drivers/mmc/omap_hsmmc.c
index 826a39fad7..1872273dd9 100644
--- a/drivers/mmc/omap_hsmmc.c
+++ b/drivers/mmc/omap_hsmmc.c
@@ -642,7 +642,7 @@ static int omap_hsmmc_execute_tuning(struct udevice *dev, uint opcode)
 		printf("Couldn't get thermal device for tuning\n");
 		return ret;
 	}
-	ret = thermal_get_temp(thermal_dev, &temperature);
+	ret = thermal_get_temp(thermal_dev, 0, &temperature);
 	if (ret) {
 		printf("Couldn't get temperature for tuning\n");
 		return ret;
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c
index e50b85bd59..271a61356c 100644
--- a/drivers/thermal/imx_thermal.c
+++ b/drivers/thermal/imx_thermal.c
@@ -207,7 +207,7 @@ static int read_cpu_temperature(struct udevice *dev)
 }
 #endif
 
-int imx_thermal_get_temp(struct udevice *dev, int *temp)
+int imx_thermal_get_temp(struct udevice *dev, int instance, int *temp)
 {
 	struct thermal_data *priv = dev_get_priv(dev);
 	int cpu_tmp = 0;
diff --git a/drivers/thermal/thermal-uclass.c b/drivers/thermal/thermal-uclass.c
index a4ea1e2914..b4a31280cb 100644
--- a/drivers/thermal/thermal-uclass.c
+++ b/drivers/thermal/thermal-uclass.c
@@ -13,14 +13,14 @@
 #include <linux/list.h>
 
 
-int thermal_get_temp(struct udevice *dev, int *temp)
+int thermal_get_temp(struct udevice *dev, u8 instance, int *temp)
 {
 	const struct dm_thermal_ops *ops = device_get_ops(dev);
 
 	if (!ops->get_temp)
 		return -ENOSYS;
 
-	return ops->get_temp(dev, temp);
+	return ops->get_temp(dev, instance, temp);
 }
 
 UCLASS_DRIVER(thermal) = {
diff --git a/drivers/thermal/ti-bandgap.c b/drivers/thermal/ti-bandgap.c
index b490391e96..6d3606b0fc 100644
--- a/drivers/thermal/ti-bandgap.c
+++ b/drivers/thermal/ti-bandgap.c
@@ -27,6 +27,7 @@
 struct ti_bandgap {
 	ulong			base;
 	int			temperature;	/* in mili degree celsius */
+	int			sens_cnt;
 };
 
 /*
@@ -158,11 +159,16 @@ static int dra752_adc_to_temp[] = {
 	123800, 124200, 124600, 124900, 125000, 125000,
 };
 
-static int ti_bandgap_get_temp(struct udevice *dev,  int *temp)
+static int ti_bandgap_get_temp(struct udevice *dev, u8 instance, int *temp)
 {
 	struct ti_bandgap *bgp = dev_get_priv(dev);
 
-	bgp->temperature = 0x3ff & readl(bgp->base + CTRL_CORE_TEMP_SENSOR_MPU);
+	if (instance >= bgp->sens_cnt) {
+		printf("Only %d insatnces are supported\n", bgp->sens_cnt);
+		return -EINVAL;
+	}
+
+	bgp->temperature = 0x3ff & readl(bgp->base + instance * 4);
 	*temp = dra752_adc_to_temp[bgp->temperature - DRA752_ADC_START_VALUE];
 
 	return 0;
@@ -177,13 +183,14 @@ static int ti_bandgap_probe(struct udevice *dev)
 	struct ti_bandgap *bgp = dev_get_priv(dev);
 
 	bgp->base = devfdt_get_addr_index(dev, 1);
+	bgp->sens_cnt = dev_get_driver_data(dev);
 
 	return 0;
 }
 
 static const struct udevice_id of_ti_bandgap_match[] = {
 	{
-		.compatible = "ti,dra752-bandgap",
+		.compatible = "ti,dra752-bandgap", .data = 3,
 	},
 	{},
 };
diff --git a/include/thermal.h b/include/thermal.h
index 11d75256e0..82d80f3ded 100644
--- a/include/thermal.h
+++ b/include/thermal.h
@@ -9,7 +9,7 @@
 
 #include <dm.h>
 
-int thermal_get_temp(struct udevice *dev, int *temp);
+int thermal_get_temp(struct udevice *dev, u8 instance, int *temp);
 
 /**
  * struct dm_thermal_ops - Driver model Thermal operations
@@ -25,9 +25,11 @@ struct dm_thermal_ops {
 	 * It will enable and initialize any Thermal hardware as necessary.
 	 *
 	 * @dev:	The Thermal device
+	 * @instance:	The instance of sensor in case multiple sensors are
+	 *		present if single sensor then this should be 0
 	 * @temp:	pointer that returns the measured temperature
 	 */
-	int (*get_temp)(struct udevice *dev, int *temp);
+	int (*get_temp)(struct udevice *dev, u8 instance, int *temp);
 };
 
 #endif	/* _THERMAL_H_ */
-- 
2.17.1



More information about the U-Boot mailing list