Skip to contentSkip to conversation

add omap34xx temperature monitoring support

PATCH In review Pavel Machek 7 participants 34 messages Dec 26, 2014 – Jan 18, 2015

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 add omap34xx temperature monitoring support

drivers/hwmon/Kconfig +4 -0
index 6529c09..9007ca9 100644
@@ -28,6 +28,10 @@ config HWMON_VID
 	tristate
 	default n
 
+config SENSORS_OMAP34XX
+	bool "TI OMAP34xx internal temperature sensor"
+	depends on ARCH_OMAP3 && HIGH_RES_TIMERS
+
 config HWMON_DEBUG_CHIP
 	bool "Hardware Monitoring Chip debugging messages"
 	default n
drivers/hwmon/Makefile +1 -0
index 6728064..5c3b5d1 100644
@@ -120,6 +120,7 @@ obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
 obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
 obj-$(CONFIG_SENSORS_NCT7802)	+= nct7802.o
 obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
+obj-$(CONFIG_SENSORS_OMAP34XX)  += omap34xx_temp.o
 obj-$(CONFIG_SENSORS_PC87360)	+= pc87360.o
 obj-$(CONFIG_SENSORS_PC87427)	+= pc87427.o
 obj-$(CONFIG_SENSORS_PCF8591)	+= pcf8591.o
drivers/hwmon/omap34xx_temp.c new file +263 -0

263 lines not on this page · raw message

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#1 lore raw

cover OMAP3 temperature sensor

Hi,

I've prepared an updated variant of the omap34xx temperature monitor driver. It's based on the N9 driver instead of the N900 driver (and thus has omap36xx support).

The differences compared to the original driver are:

* DT based
* No includes from arch, instead uses syscon DT node + regmap
* Removed support for raw temperature reading
- I assume this was used for debugging and regmap can be used instead with newer kernels.
* Introduction of managed resources where possible
* Usage of module_platform_driver() macro
* Added some comments referencing the TRM

So far the patchset is _compile-tested only_. I will test it on my N900 in the next days.

-- Sebastian

Sebastian Reichel (3):
DT Binding for omap3 temperature sensor
hwmon: Driver for OMAP3 temperature sensor
ARM: dts: OMAP34xx/36xx: Add temperature sensor

 .../bindings/hwmon/omap3-temperature.txt           |  25 ++
 arch/arm/boot/dts/omap34xx.dtsi                    |   7 +
 arch/arm/boot/dts/omap36xx.dtsi                    |   7 +
 drivers/hwmon/Kconfig                              |   8 +
 drivers/hwmon/Makefile                             |   1 +
 drivers/hwmon/omap3-temp.c                         | 307 +++++++++++++++++++++
 6 files changed, 355 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/omap3-temperature.txt
 create mode 100644 drivers/hwmon/omap3-temp.c
Signature · 1 line
2.1.3
#2 lore raw

PATCH 1/3 DT Binding for omap3 temperature sensor

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This provides a DT binding specification for the temperature monitor.

---
 .../bindings/hwmon/omap3-temperature.txt           | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/omap3-temperature.txt
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +25 -0
new file mode 100644
index 0000000..99631ad
@@ -0,0 +1,25 @@
+* OMAP3 temperature sensor
+
+The OMAP34xx and OMAP36xx processors contain a register in the syscon area,
+which can be used to determine the SoCs temperature.
+
+Requires node properties:
+- compatible :	should contain one of
+	- "ti,omap34xx-temperature-sensor" for OMAP34xx
+	- "ti,omap36xx-temperature-sensor" for OMAP36xx
+- syscon :	Should be a phandle to system configuration node which
+		encompases the temperature register
+- clocks :	Should contain 32KHz fclk clock specifier
+- clock-names :	Should contain clock names
+	- "fck" for the 32KHz fclk clock specifier
+
+Example for omap34xx:
+
+/ {
+	temperature-sensor {
+		compatible = "ti,omap34xx-temperature-sensor";
+		syscon = <&omap3_scm_general>;
+		clocks = <&ts_fck>;
+		clock-names = "fck";
+	};
+};
Signature · 1 line
2.1.3
#3 lore raw

Re: [PATCH 1/3] DT Binding for omap3 temperature sensor

Quoted 20 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This provides a DT binding specification for the temperature monitor.

---
 .../bindings/hwmon/omap3-temperature.txt           | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/omap3-temperature.txt
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +4 -0
new file mode 100644
index 0000000..99631ad
@@ -0,0 +1,25 @@
+* OMAP3 temperature sensor
+
+The OMAP34xx and OMAP36xx processors contain a register in the syscon area,
+which can be used to determine the SoCs temperature.

Documentation/devicetree/bindings/hwmon/omap3-temperature.txt line 14

Quoted 10 lines
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +10 -0
+
+Requires node properties:
+- compatible :	should contain one of
+	- "ti,omap34xx-temperature-sensor" for OMAP34xx
+	- "ti,omap36xx-temperature-sensor" for OMAP36xx
+- syscon :	Should be a phandle to system configuration node which
+		encompases the temperature register
+- clocks :	Should contain 32KHz fclk clock specifier
+- clock-names :	Should contain clock names
+	- "fck" for the 32KHz fclk clock specifier

I don't quite get it. The temperature sensor is internal on the CPU, right? Why do we need device tree to describe it? As soon as we have CPU that is compatible to ti,omap3430, we know everything we need to know, no?

Documentation/devicetree/bindings/hwmon/omap3-temperature.txt line 25

Quoted 10 lines
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +10 -0
+Example for omap34xx:
+
+/ {
+	temperature-sensor {
+		compatible = "ti,omap34xx-temperature-sensor";
+		syscon = <&omap3_scm_general>;
+		clocks = <&ts_fck>;
+		clock-names = "fck";
+	};
+};

Or is there something that depends on the board there? Or do we want to do it like this to be consistent with existing bindings?

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#4 lore raw

Re: [PATCH 1/3] DT Binding for omap3 temperature sensor

Hi Pavel,

Quoted 28 lines · Pavel Machek
Quoted 27 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This provides a DT binding specification for the temperature monitor.

---
 .../bindings/hwmon/omap3-temperature.txt           | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/hwmon/omap3-temperature.txt
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +11 -0
new file mode 100644
index 0000000..99631ad
@@ -0,0 +1,25 @@
+* OMAP3 temperature sensor
+
+The OMAP34xx and OMAP36xx processors contain a register in the syscon area,
+which can be used to determine the SoCs temperature.
+
+Requires node properties:
+- compatible :	should contain one of
+	- "ti,omap34xx-temperature-sensor" for OMAP34xx
+	- "ti,omap36xx-temperature-sensor" for OMAP36xx
+- syscon :	Should be a phandle to system configuration node which
+		encompases the temperature register
Quoted 8 lines

Documentation/devicetree/bindings/hwmon/omap3-temperature.txt line 14

Quoted 3 lines
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +3 -0
+- clocks :	Should contain 32KHz fclk clock specifier
+- clock-names :	Should contain clock names
+	- "fck" for the 32KHz fclk clock specifier

I don't quite get it. The temperature sensor is internal on the CPU, right? Why do we need device tree to describe it? As soon as we have CPU that is compatible to ti,omap3430, we know everything we need to know, no?

Lots of stuff is SoC internal and described in the DT (e.g. serial controllers). Just have a look in omap3.dtsi or omap34xx.dtsi.

I put the temperature sensor into its own node for the following reasons:

* syscon reference
* clock reference

I first thought about loading the driver from the syscon driver, but omap uses a generic one, so that's not an option. Apart from that one would still need the clock reference.

Quoted 5 lines
Quoted 5 lines
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +5 -0
+Example for omap34xx:
+
+/ {
+	temperature-sensor {
+		compatible = "ti,omap34xx-temperature-sensor";
Quoted 8 lines

Documentation/devicetree/bindings/hwmon/omap3-temperature.txt line 25

Quoted 5 lines
Documentation/devicetree/bindings/hwmon/omap3-temperature.txt new file +5 -0
+		syscon = <&omap3_scm_general>;
+		clocks = <&ts_fck>;
+		clock-names = "fck";
+	};
+};

Or is there something that depends on the board there? Or do we want to do it like this to be consistent with existing bindings?

This is SoC specific and should go into the omap34xx.dtsi and omap36xx.dtsi files. See also PATCH 3/3.

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141227/2b205907/attachment.sig>

author Acked-by on v1 1/3
#5 lore raw

Re: [PATCH 1/3] DT Binding for omap3 temperature sensor

In reply to Sebastian Reichel
Quoted 5 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This provides a DT binding specification for the temperature monitor.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#6 lore raw

PATCH 2/3 hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

---
 drivers/hwmon/Kconfig      |   8 ++
 drivers/hwmon/Makefile     |   1 +
 drivers/hwmon/omap3-temp.c | 307 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 316 insertions(+)
 create mode 100644 drivers/hwmon/omap3-temp.c
drivers/hwmon/Kconfig +8 -0
index 6529c09..749748d 100644
@@ -1135,6 +1135,14 @@ config SENSORS_NCT7802
 	  This driver can also be built as a module.  If so, the module
 	  will be called nct7802.
 
+config SENSORS_OMAP3_TEMP
+	tristate "OMAP3 Temperature Sensor"
+	depends on OF && (ARCH_OMAP3 || COMPILE_TEST)
+	select MFD_SYSCON
+	help
+	  If you say yes here you get support for the temperature sensor
+	  built into OMAP3 processors.
+
 config SENSORS_PCF8591
 	tristate "Philips PCF8591 ADC/DAC"
 	depends on I2C
drivers/hwmon/Makefile +1 -0
index 6728064..5a69773 100644
@@ -120,6 +120,7 @@ obj-$(CONFIG_SENSORS_NCT6683)	+= nct6683.o
 obj-$(CONFIG_SENSORS_NCT6775)	+= nct6775.o
 obj-$(CONFIG_SENSORS_NCT7802)	+= nct7802.o
 obj-$(CONFIG_SENSORS_NTC_THERMISTOR)	+= ntc_thermistor.o
+obj-$(CONFIG_SENSORS_OMAP3_TEMP)	+= omap3-temp.o
 obj-$(CONFIG_SENSORS_PC87360)	+= pc87360.o
 obj-$(CONFIG_SENSORS_PC87427)	+= pc87427.o
 obj-$(CONFIG_SENSORS_PCF8591)	+= pcf8591.o
drivers/hwmon/omap3-temp.c new file +307 -0

307 lines not on this page · raw message

Signature · 1 line
2.1.3
#7 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

drivers/hwmon/omap3-temp.c line 151

Quoted 9 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

drivers/hwmon/omap3-temp.c new file +2 -0
+	if (!data->valid || time_after(jiffies, data->last_updated + HZ)) {
+		clk_enable(data->clk_32k);

This needs to be clk_prepare_enable()

Quoted 14 lines
drivers/hwmon/omap3-temp.c new file +14 -0
+		regmap_update_bits(data->syscon, SYSCON_TEMP_REG,
+				   soc_mask, soc_mask);
+
+		if (!wait_for_eocz(EOCZ_MIN_RISING_DELAY,
+		    EOCZ_MAX_RISING_DELAY, 1, data)) {
+			e = -EIO;
+			goto err;
+		}
+
+		regmap_update_bits(data->syscon, SYSCON_TEMP_REG, soc_mask, 0);
+
+		if (!wait_for_eocz(EOCZ_MIN_FALLING_DELAY,
+		    EOCZ_MAX_FALLING_DELAY, 0, data)) {
+			e = -EIO;

drivers/hwmon/omap3-temp.c line 176

Quoted 10 lines
drivers/hwmon/omap3-temp.c new file +10 -0
+			goto err;
+		}
+
+		regmap_read(data->syscon, SYSCON_TEMP_REG, &temp_sensor_reg);
+		data->temperature = temp_sensor_reg & ((1<<7) - 1);
+		data->last_updated = jiffies;
+		data->valid = true;
+
+err:
+		clk_disable(data->clk_32k);

And this clk_disable_unprepare().

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#8 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel

Hi!

Quoted 6 lines

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

I did clk_enable -> clk_prepare_enable conversion, as described in another email.

I got occasional error reading:

root at n900:~# cat /sys/class/hwmon/hwmon0/device/temp_input 20.0
root at n900:~# cat /sys/class/hwmon/hwmon0/device/temp_input
cat: /sys/class/hwmon/hwmon0/device/temp_input: Input/output error root at n900:~# cat /sys/class/hwmon/hwmon0/device/temp_input 20.0

Nothing in dmesg. It takes few tries to reproduce..

On other attempt, it hung hard:

root at n900:~# cat /sys/class/hwmon/hwmon0/device/temp_input ; cat /sys/class/hwmon/hwmon0/device/temp_input ;cat /sys/class/hwmon/hwmon0/device/temp_input ; cat /sys/class/hwmon/hwmon0/device/temp_input
17.0
17.0
^[[A

^Z

^C^C^C

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#9 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel
Quoted 6 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

I'd suggest these cleanups... But I don't see why it would fail. (Aha, and sorry for trailing whitespace, you'll probably need to delete it.)

drivers/hwmon/omap3-temp.c +24 -16
index afe1b5a..8a69604 100644
@@ -35,21 +35,29 @@
 /* 32.768Khz clock speed in nano seconds */
 #define CLOCK_32K_SPEED_NS 30518
 
-/* minimum delay for EOCZ rise after SOC rise is
- * 11 cycles of the 32.768Khz clock */
+/*
+ * minimum delay for EOCZ rise after SOC rise is
+ * 11 cycles of the 32.768Khz clock
+ */
 #define EOCZ_MIN_RISING_DELAY (11 * CLOCK_32K_SPEED_NS)
 
-/* From docs, maximum delay for EOCZ rise after SOC rise is
+/*
+ * From docs, maximum delay for EOCZ rise after SOC rise is
  * 14 cycles of the 32.768Khz clock. But after some experiments,
- * 24 cycles as maximum is safer. */
+ * 24 cycles as maximum is safer.
+ */
 #define EOCZ_MAX_RISING_DELAY (24 * CLOCK_32K_SPEED_NS)
 
-/* minimum delay for EOCZ falling is
- * 36 cycles of the 32.768Khz clock */
+/*
+ * minimum delay for EOCZ falling is
+ * 36 cycles of the 32.768Khz clock 
+ */
 #define EOCZ_MIN_FALLING_DELAY (36 * CLOCK_32K_SPEED_NS)
 
-/* maximum delay for EOCZ falling is
- * 40 cycles of the 32.768Khz clock */
+/*
+ * maximum delay for EOCZ falling is
+ * 40 cycles of the 32.768Khz clock 
+ */
 #define EOCZ_MAX_FALLING_DELAY (40 * CLOCK_32K_SPEED_NS)
 
 /* temperature register offset in the syscon register area */
@@ -116,8 +124,8 @@ struct omap3_temp_data {
 	bool valid;
 };
 
-static inline u32 wait_for_eocz(int min_delay, int max_delay, u32 level,
-				struct omap3_temp_data *data)
+static inline bool wait_for_eocz(struct omap3_temp_data *data,
+				 int min_delay, int max_delay, u32 level)
 {
 	ktime_t timeout, expire;
 	u32 temp_sensor_reg, eocz_mask;
@@ -133,10 +141,10 @@ static inline u32 wait_for_eocz(int min_delay, int max_delay, u32 level,
 	do {
 		regmap_read(data->syscon, SYSCON_TEMP_REG, &temp_sensor_reg);
 		if ((temp_sensor_reg & eocz_mask) == level)
-			break;
+			return true;
 	} while (ktime_us_delta(expire, ktime_get()) > 0);
 
-	return (temp_sensor_reg & eocz_mask) == level;
+	return false;
 }
 
 static int omap3_temp_update(struct omap3_temp_data *data)
@@ -153,16 +161,16 @@ static int omap3_temp_update(struct omap3_temp_data *data)
 		regmap_update_bits(data->syscon, SYSCON_TEMP_REG,
 				   soc_mask, soc_mask);
 
-		if (!wait_for_eocz(EOCZ_MIN_RISING_DELAY,
-		    EOCZ_MAX_RISING_DELAY, 1, data)) {
+		if (!wait_for_eocz(data, EOCZ_MIN_RISING_DELAY,
+		    EOCZ_MAX_RISING_DELAY, 1)) {
 			e = -EIO;
 			goto err;
 		}
 
 		regmap_update_bits(data->syscon, SYSCON_TEMP_REG, soc_mask, 0);
 
-		if (!wait_for_eocz(EOCZ_MIN_FALLING_DELAY,
-		    EOCZ_MAX_FALLING_DELAY, 0, data)) {
+		if (!wait_for_eocz(data, EOCZ_MIN_FALLING_DELAY,
+		    EOCZ_MAX_FALLING_DELAY, 0)) {
 			e = -EIO;
 			goto err;
 		}
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#10 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel
Quoted 6 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

When it hangs, it seems to hang here:

     	if (!wait_for_eocz(data, EOCZ_MIN_RISING_DELAY,
	                    EOCZ_MAX_RISING_DELAY, 1)) {
			                            e = -EIO;
								goto
	                    err;
			                    }

...so wait does not seem to reliably wait.
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#11 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel
Quoted 5 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

Quoted 7 lines
---
 drivers/hwmon/Kconfig      |   8 ++
 drivers/hwmon/Makefile     |   1 +
 drivers/hwmon/omap3-temp.c | 307 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 316 insertions(+)
 create mode 100644 drivers/hwmon/omap3-temp.c

When it hangs, it loops here:

do {
regmap_read(data->syscon, SYSCON_TEMP_REG,&temp_sensor_reg); if ((temp_sensor_reg & eocz_mask) == level)
return true;
printk("=");
}
while (ktime_us_delta(expire, ktime_get()) > 0);

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#12 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 16 lines · Pavel Machek
Quoted 5 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

Quoted 7 lines
---
 drivers/hwmon/Kconfig      |   8 ++
 drivers/hwmon/Makefile     |   1 +
 drivers/hwmon/omap3-temp.c | 307 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 316 insertions(+)
 create mode 100644 drivers/hwmon/omap3-temp.c

When it hangs, it loops here:

Quoted 7 lines

do {
regmap_read(data->syscon, SYSCON_TEMP_REG,&temp_sensor_reg); if ((temp_sensor_reg & eocz_mask) == level)
return true;
printk("=");
}
while (ktime_us_delta(expire, ktime_get()) > 0);

And this fixes the hang, and makes level handling more readable.

Fix the timeout code, now it actually works. Driver still fails after a while.

drivers/hwmon/omap3-temp.c +2 -4
index 8a69604..1b8c768 100644
@@ -130,9 +130,7 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	ktime_t timeout, expire;
 	u32 temp_sensor_reg, eocz_mask;
 
 	eocz_mask = BIT(data->hwdata->eocz_bit);
-	level &= 1;
-	level *= eocz_mask;
 
 	expire = ktime_add_ns(ktime_get(), max_delay);
 	timeout = ktime_set(0, min_delay);
@@ -140,9 +141,9 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	schedule_hrtimeout(&timeout, HRTIMER_MODE_REL);
 	do {
 		regmap_read(data->syscon, SYSCON_TEMP_REG, &temp_sensor_reg);
-		if ((temp_sensor_reg & eocz_mask) == level)
+		if (!!(temp_sensor_reg & eocz_mask) == level)
 			return true;
-	} while (ktime_us_delta(expire, ktime_get()) > 0);
+	} while (ktime_after(expire, ktime_get()));
 
 	return false;
 }
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#13 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 47 lines · Pavel Machek
Quoted 16 lines · Pavel Machek
Quoted 5 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

Quoted 7 lines
---
 drivers/hwmon/Kconfig      |   8 ++
 drivers/hwmon/Makefile     |   1 +
 drivers/hwmon/omap3-temp.c | 307 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 316 insertions(+)
 create mode 100644 drivers/hwmon/omap3-temp.c

When it hangs, it loops here:

Quoted 7 lines

do {
regmap_read(data->syscon, SYSCON_TEMP_REG,&temp_sensor_reg); if ((temp_sensor_reg & eocz_mask) == level)
return true;
printk("=");
}
while (ktime_us_delta(expire, ktime_get()) > 0);

And this fixes the hang, and makes level handling more readable.

Fix the timeout code, now it actually works. Driver still fails after a while.

drivers/hwmon/omap3-temp.c +0 -2
index 8a69604..1b8c768 100644
@@ -130,9 +130,7 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	ktime_t timeout, expire;
 	u32 temp_sensor_reg, eocz_mask;
 
 	eocz_mask = BIT(data->hwdata->eocz_bit);
-	level &= 1;
-	level *= eocz_mask;
 
 	expire = ktime_add_ns(ktime_get(), max_delay);
 	timeout = ktime_set(0, min_delay);

drivers/hwmon/omap3-temp.c static inline bool wait_for_eocz(struct omap3_temp_data *data, · line 147

Quoted 9 lines
drivers/hwmon/omap3-temp.c +2 -2
@@ -140,9 +141,9 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	schedule_hrtimeout(&timeout, HRTIMER_MODE_REL);
 	do {
 		regmap_read(data->syscon, SYSCON_TEMP_REG, &temp_sensor_reg);
-		if ((temp_sensor_reg & eocz_mask) == level)
+		if (!!(temp_sensor_reg & eocz_mask) == level)
 			return true;
-	} while (ktime_us_delta(expire, ktime_get()) > 0);
+	} while (ktime_after(expire, ktime_get()));
 

Does this have to be a hard loop, without sleep ? I am a bit concerned that it may loop for more than a ms.

Other than that, I assume we'll see an updated version with the coding style issues and hang-up problems fixed.

Thanks,
Guenter

#14 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 60 lines · Guenter Roeck
Quoted 47 lines · Pavel Machek
Quoted 16 lines · Pavel Machek
Quoted 5 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

Quoted 7 lines
---
 drivers/hwmon/Kconfig      |   8 ++
 drivers/hwmon/Makefile     |   1 +
 drivers/hwmon/omap3-temp.c | 307 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 316 insertions(+)
 create mode 100644 drivers/hwmon/omap3-temp.c

When it hangs, it loops here:

Quoted 7 lines

do {
regmap_read(data->syscon, SYSCON_TEMP_REG,&temp_sensor_reg); if ((temp_sensor_reg & eocz_mask) == level)
return true;
printk("=");
}
while (ktime_us_delta(expire, ktime_get()) > 0);

And this fixes the hang, and makes level handling more readable.

Fix the timeout code, now it actually works. Driver still fails after a while.

drivers/hwmon/omap3-temp.c +0 -2
index 8a69604..1b8c768 100644
@@ -130,9 +130,7 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	ktime_t timeout, expire;
 	u32 temp_sensor_reg, eocz_mask;
 
 	eocz_mask = BIT(data->hwdata->eocz_bit);
-	level &= 1;
-	level *= eocz_mask;
 
 	expire = ktime_add_ns(ktime_get(), max_delay);
 	timeout = ktime_set(0, min_delay);

drivers/hwmon/omap3-temp.c static inline bool wait_for_eocz(struct omap3_temp_data *data, · line 147

Quoted 9 lines
drivers/hwmon/omap3-temp.c +2 -2
@@ -140,9 +141,9 @@ static inline bool wait_for_eocz(struct omap3_temp_data *data,
 	schedule_hrtimeout(&timeout, HRTIMER_MODE_REL);
 	do {
 		regmap_read(data->syscon, SYSCON_TEMP_REG, &temp_sensor_reg);
-		if ((temp_sensor_reg & eocz_mask) == level)
+		if (!!(temp_sensor_reg & eocz_mask) == level)
 			return true;
-	} while (ktime_us_delta(expire, ktime_get()) > 0);
+	} while (ktime_after(expire, ktime_get()));
 

Does this have to be a hard loop, without sleep ? I am a bit concerned that it may loop for more than a ms.

Quoted 2 lines

Other than that, I assume we'll see an updated version with the coding style issues and hang-up problems fixed.

I will send a v2 patchset with Pavels change requests. It may take a few days though, since I'm currently at a conference (31C3).

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141228/f8bac595/attachment.sig>

#15 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel
Quoted 6 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

As I mentioned before, this version stops working after a while. Version I originally posted seems to work ok under same load.

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#16 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Sebastian Reichel
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

--
Grazvydas

#17 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

---
Regards,
Nishanth Menon

#18 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 7 lines · Nishanth Menon
Quoted 6 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

Quoted 7 lines
Quoted 4 lines

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#19 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 13 lines · Pavel Machek
Quoted 12 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Quoted 6 lines
Quoted 2 lines

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

Thanks,
Guenter

#20 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 17 lines · Guenter Roeck
Quoted 16 lines · Pavel Machek
Quoted 14 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

Quoted 6 lines
Quoted 3 lines

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

The hardware registers are named the same way...

Unfortunately, TI moves registers around with each release, and OMAP4 stuff is _way_ more complex and maze of ifdefs, too.

static struct temp_sensor_data omap4430_mpu_temp_sensor_data = {
        .min_freq = OMAP4430_MIN_FREQ,
 	.max_freq = OMAP4430_MAX_FREQ,
 	.max_temp = OMAP4430_MAX_TEMP,
	.min_temp = OMAP4430_MIN_TEMP,
 	.hyst_val = OMAP4430_HYST_VAL,
	};

and each define used just once. Would be easier to read and modify if the ifdefs were removed...

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#21 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Guenter Roeck
Quoted 17 lines · Guenter Roeck
Quoted 16 lines · Pavel Machek
Quoted 14 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

Quoted 6 lines
Quoted 3 lines

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

The hardware seems similar, but omap4 has a lot more features... Here's a test patch. It compiles and boots, but I'm too far away from my working userland at this moment.

Best regards,
Pavel

commit 116612364f93b165b22166f0043117059eb3118f

Author: Pavel <[email protected]>
Date:   Wed Dec 31 00:36:40 2014 +0100

Configure ti-soc-thermal to handle n900's thermal sensor.

.config +17 -1
index b031e7f..4a79672 100644
@@ -1671,7 +1671,23 @@ CONFIG_SENSORS_TWL4030_MADC=y
 # CONFIG_SENSORS_W83L786NG is not set
 # CONFIG_SENSORS_W83627HF is not set
 # CONFIG_SENSORS_W83627EHF is not set
-# CONFIG_THERMAL is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_THERMAL_OF=y
+CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
+# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
+# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
+# CONFIG_THERMAL_GOV_FAIR_SHARE is not set
+CONFIG_THERMAL_GOV_STEP_WISE=y
+# CONFIG_THERMAL_GOV_BANG_BANG is not set
+# CONFIG_THERMAL_GOV_USER_SPACE is not set
+# CONFIG_CLOCK_THERMAL is not set
+# CONFIG_THERMAL_EMULATION is not set
+
+#
+# Texas Instruments thermal drivers
+#
+CONFIG_TI_SOC_THERMAL=y
 CONFIG_WATCHDOG=y
 CONFIG_WATCHDOG_CORE=y
 # CONFIG_WATCHDOG_NOWAYOUT is not set
arch/arm/boot/dts/omap3-n900.dts +7 -0
index 55e4928..dcbcaa9 100644
@@ -29,6 +29,13 @@
 		};
 	};
 
+	bandgap: bandgap {
+			reg = <0x4a002524 0x4>;
+			compatible = "ti,omap34xx-bandgap";
+
+			#thermal-sensor-cells = <0>;
+	};
+
 	leds {
 		compatible = "gpio-leds";
 		heartbeat {
drivers/thermal/ti-soc-thermal/Makefile +1 -0
index 1226b24..27ff2ed 100644
@@ -2,5 +2,6 @@ obj-$(CONFIG_TI_SOC_THERMAL)		+= ti-soc-thermal.o
 ti-soc-thermal-y			:= ti-bandgap.o
 ti-soc-thermal-$(CONFIG_TI_THERMAL)	+= ti-thermal-common.o
 ti-soc-thermal-$(CONFIG_DRA752_THERMAL)	+= dra752-thermal-data.o
+ti-soc-thermal-y			+= omap3-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP4_THERMAL)	+= omap4-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP5_THERMAL)	+= omap5-thermal-data.o
drivers/thermal/ti-soc-thermal/omap3-thermal-data.c new file +94 -0

94 lines not on this page · raw message

drivers/thermal/ti-soc-thermal/ti-bandgap.c +5 -1
index 634b6ce..2a72adc 100644
@@ -856,7 +856,7 @@ int ti_bandgap_read_temperature(struct ti_bandgap *bgp, int id,
 	temp = ti_bandgap_read_temp(bgp, id);
 	spin_unlock(&bgp->lock);
 
-	ret |= ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
+	ret = ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
 	if (ret)
 		return -EIO;
 
@@ -1509,6 +1509,10 @@ static SIMPLE_DEV_PM_OPS(ti_bandgap_dev_pm_ops, ti_bandgap_suspend,
 #endif
 
 static const struct of_device_id of_ti_bandgap_match[] = {
+	{
+		.compatible = "ti,omap34xx-bandgap",
+		.data = (void *)&omap34xx_data,
+	},
 #ifdef CONFIG_OMAP4_THERMAL
 	{
 		.compatible = "ti,omap4430-bandgap",
drivers/thermal/ti-soc-thermal/ti-bandgap.h +2 -0
index b3adf72..3f05386 100644
@@ -384,6 +384,8 @@ int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data);
 void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id);
 int ti_bandgap_get_trend(struct ti_bandgap *bgp, int id, int *trend);
 
+extern const struct ti_bandgap_data omap34xx_data;
+
 #ifdef CONFIG_OMAP4_THERMAL
 extern const struct ti_bandgap_data omap4430_data;
 extern const struct ti_bandgap_data omap4460_data;
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#22 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Guenter Roeck
Quoted 17 lines · Guenter Roeck
Quoted 16 lines · Pavel Machek
Quoted 14 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

Quoted 6 lines
Quoted 3 lines

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

After some fixes... yes, it seems to be same hardware.

drivers/thermal/ti-soc-thermal/Kconfig +9 -0
index bd4c7be..a49495f 100644
@@ -21,6 +21,15 @@ config TI_THERMAL
 	  This includes trip points definitions, extrapolation rules and
 	  CPU cooling device bindings.
 
+config OMAP3_THERMAL
+	bool "Texas Instruments OMAP3 thermal support"
+	depends on TI_SOC_THERMAL
+	depends on ARCH_OMAP3
+	help
+	  If you say yes here you get thermal support for the Texas Instruments
+	  OMAP3 SoC family. The current chip supported are:
+	   - OMAP3430
+
 config OMAP4_THERMAL
 	bool "Texas Instruments OMAP4 thermal support"
 	depends on TI_SOC_THERMAL
drivers/thermal/ti-soc-thermal/Makefile +1 -0
index 1226b24..2b5b220 100644
@@ -2,5 +2,6 @@ obj-$(CONFIG_TI_SOC_THERMAL)		+= ti-soc-thermal.o
 ti-soc-thermal-y			:= ti-bandgap.o
 ti-soc-thermal-$(CONFIG_TI_THERMAL)	+= ti-thermal-common.o
 ti-soc-thermal-$(CONFIG_DRA752_THERMAL)	+= dra752-thermal-data.o
+ti-soc-thermal-$(CONFIG_OMAP3_THERMAL)  += omap3-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP4_THERMAL)	+= omap4-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP5_THERMAL)	+= omap5-thermal-data.o
drivers/thermal/ti-soc-thermal/omap3-thermal-data.c new file +99 -0

99 lines not on this page · raw message

drivers/thermal/ti-soc-thermal/ti-bandgap.c +73 -54

297 lines not on this page · raw message

drivers/thermal/ti-soc-thermal/ti-bandgap.h +2 -0
index b3adf72..3f05386 100644
@@ -384,6 +384,8 @@ int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data);
 void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id);
 int ti_bandgap_get_trend(struct ti_bandgap *bgp, int id, int *trend);
 
+extern const struct ti_bandgap_data omap34xx_data;
+
 #ifdef CONFIG_OMAP4_THERMAL
 extern const struct ti_bandgap_data omap4430_data;
 extern const struct ti_bandgap_data omap4460_data;
drivers/thermal/ti-soc-thermal/ti-thermal-common.c +6 -1
index 5fd0386..f91655f 100644
@@ -328,18 +328,23 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id,
 {
 	struct ti_thermal_data *data;
 
+	printk("expose_sensor\n");
+
 	data = ti_bandgap_get_sensor_data(bgp, id);
 
 	if (!data || IS_ERR(data))
 		data = ti_thermal_build_data(bgp, id);
 
-	if (!data)
+	if (!data) {
+		printk("no data\n");	
 		return -EINVAL;
+	}
 
 	/* in case this is specified by DT */
 	data->ti_thermal = thermal_zone_of_sensor_register(bgp->dev, id,
 					data, &ti_of_thermal_ops);
 	if (IS_ERR(data->ti_thermal)) {
+		printk("of_sensor_register failed\n");
 		/* Create thermal zone */
 		data->ti_thermal = thermal_zone_device_register(domain,
 				OMAP_TRIP_NUMBER, 0, data, &ti_thermal_ops,
Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#23 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 18 lines · Pavel Machek
Quoted 17 lines · Guenter Roeck
Quoted 16 lines · Pavel Machek
Quoted 14 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

After some fixes... yes, it seems to be same hardware.

So this should be the way to go, but then we have others claim that it should not be done because the OMAP3 sensors are too unreliable to use for thermal decisions. Not really sure where that leaves us. I am kind of opposed to have similar drivers for similar chips in two different subsystems.

Is it possible to add the patch below to the omap thermal driver and not use it for thermal decisions ?

Guenter

Quoted 506 lines
drivers/thermal/ti-soc-thermal/Kconfig +9 -0
index bd4c7be..a49495f 100644
@@ -21,6 +21,15 @@ config TI_THERMAL
 	  This includes trip points definitions, extrapolation rules and
 	  CPU cooling device bindings.
 
+config OMAP3_THERMAL
+	bool "Texas Instruments OMAP3 thermal support"
+	depends on TI_SOC_THERMAL
+	depends on ARCH_OMAP3
+	help
+	  If you say yes here you get thermal support for the Texas Instruments
+	  OMAP3 SoC family. The current chip supported are:
+	   - OMAP3430
+
 config OMAP4_THERMAL
 	bool "Texas Instruments OMAP4 thermal support"
 	depends on TI_SOC_THERMAL
drivers/thermal/ti-soc-thermal/Makefile +1 -0
index 1226b24..2b5b220 100644
@@ -2,5 +2,6 @@ obj-$(CONFIG_TI_SOC_THERMAL)		+= ti-soc-thermal.o
 ti-soc-thermal-y			:= ti-bandgap.o
 ti-soc-thermal-$(CONFIG_TI_THERMAL)	+= ti-thermal-common.o
 ti-soc-thermal-$(CONFIG_DRA752_THERMAL)	+= dra752-thermal-data.o
+ti-soc-thermal-$(CONFIG_OMAP3_THERMAL)  += omap3-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP4_THERMAL)	+= omap4-thermal-data.o
 ti-soc-thermal-$(CONFIG_OMAP5_THERMAL)	+= omap5-thermal-data.o
drivers/thermal/ti-soc-thermal/omap3-thermal-data.c new file +99 -0
new file mode 100644
index 0000000..a79ebf2
@@ -0,0 +1,99 @@
+/*
+ * OMAP3 thermal driver.
+ *
+ * Copyright (C) 2011-2012 Texas Instruments Inc.
+ * Copyright (C) 2014 Pavel Machek <[email protected]>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include "ti-thermal.h"
+#include "ti-bandgap.h"
+
+/*
+ * OMAP34XX has one instance of thermal sensor for MPU
+ * need to describe the individual bit fields
+ */
+static struct temp_sensor_registers
+omap34xx_mpu_temp_sensor_registers = {
+	.temp_sensor_ctrl = 0,
+	.bgap_tempsoff_mask = 0, /* Unused, we don't have POWER_SWITCH */
+	.bgap_soc_mask = BIT(8),
+	.bgap_eocz_mask = BIT(7),
+	.bgap_dtemp_mask = 0x7f,
+
+	.bgap_mode_ctrl = 0,
+	.mode_ctrl_mask = 0,	/* Unused, no MODE_CONFIG */
+
+	.bgap_efuse = 0,
+};
+
+/* Thresholds and limits for OMAP34XX MPU temperature sensor */
+static struct temp_sensor_data omap34xx_mpu_temp_sensor_data = {
+	.min_freq = 32768,
+	.max_freq = 32768,
+	.max_temp = -99000,
+	.min_temp = 99000,
+	.hyst_val = 5000,
+};
+
+/*
+ * Temperature values in milli degree celsius
+ * ADC code values from 530 to 923
+ */
+static const int
+omap34xx_adc_to_temp[] = {
+	-40000, -40000, -40000, -40000, -40000, -39000, -38000, -36000,
+	-34000, -32000, -31000,	-29000, -28000, -26000, -25000, -24000,
+	-22000, -21000, -19000, -18000, -17000, -15000,	-14000, -12000,
+	-11000, -9000, -8000, -7000, -5000, -4000, -2000, -1000, 0000,
+	1000, 3000, 4000, 5000, 7000, 8000, 10000, 11000, 13000, 14000,
+	15000, 17000, 18000, 20000, 21000, 22000, 24000, 25000, 27000,
+	28000, 30000, 31000, 32000, 34000, 35000, 37000, 38000, 39000,
+	41000, 42000, 44000, 45000, 47000, 48000, 49000, 51000, 52000,
+	53000, 55000, 56000, 58000, 59000, 60000, 62000, 63000, 65000,
+	66000, 67000, 69000, 70000, 72000, 73000, 74000, 76000, 77000,
+	79000, 80000, 81000, 83000, 84000, 85000, 87000, 88000, 89000,
+	91000, 92000, 94000, 95000, 96000, 98000, 99000, 100000,
+	102000, 103000, 105000, 106000, 107000, 109000, 110000, 111000,
+	113000, 114000, 116000, 117000, 118000, 120000, 121000, 122000,
+	124000, 124000, 125000, 125000, 125000, 125000,	125000
+};
+
+/* OMAP34XX data */
+const struct ti_bandgap_data omap34xx_data = {
+	.features = TI_BANDGAP_FEATURE_CLK_CTRL,
+	.fclock_name = "ts_fck",
+	.div_ck_name = "ts_fck",
+	.conv_table = omap34xx_adc_to_temp,
+	.adc_start_val = 0,
+	.adc_end_val = 127,
+	.expose_sensor = ti_thermal_expose_sensor,
+	.remove_sensor = ti_thermal_remove_sensor,
+
+	.sensors = {
+		{
+		.registers = &omap34xx_mpu_temp_sensor_registers,
+		.ts_data = &omap34xx_mpu_temp_sensor_data,
+		.domain = "cpu",
+		.slope = 0,
+		.constant = 20000,
+		.slope_pcb = 0,
+		.constant_pcb = 20000,
+		.register_cooling = NULL,
+		.unregister_cooling = NULL,
+		},
+	},
+	.sensor_count = 1,
+
+//	.sensor_count = 0,
+};
+
drivers/thermal/ti-soc-thermal/ti-bandgap.c +73 -54
index 634b6ce..a4180a5 100644
@@ -40,6 +40,7 @@
 #include <linux/of_irq.h>
 #include <linux/of_gpio.h>
 #include <linux/io.h>
+#include <linux/delay.h>
 
 #include "ti-bandgap.h"
 
@@ -103,19 +104,15 @@ do {								\
  */
 static int ti_bandgap_power(struct ti_bandgap *bgp, bool on)
 {
-	int i, ret = 0;
+	int i;
 
-	if (!TI_BANDGAP_HAS(bgp, POWER_SWITCH)) {
-		ret = -ENOTSUPP;
-		goto exit;
-	}
+	if (!TI_BANDGAP_HAS(bgp, POWER_SWITCH))
+		return -ENOTSUPP;
 
 	for (i = 0; i < bgp->conf->sensor_count; i++)
 		/* active on 0 */
 		RMW_BITS(bgp, i, temp_sensor_ctrl, bgap_tempsoff_mask, !on);
-
-exit:
-	return ret;
+	return 0;
 }
 
 /**
@@ -154,6 +151,7 @@ static u32 ti_bandgap_read_temp(struct ti_bandgap *bgp, int id)
 	if (TI_BANDGAP_HAS(bgp, FREEZE_BIT))
 		RMW_BITS(bgp, id, bgap_mask_ctrl, mask_freeze_mask, 0);
 
+	printk("Bandgap: ADC is %d\n", temp);
 	return temp;
 }
 
@@ -263,18 +261,13 @@ static
 int ti_bandgap_adc_to_mcelsius(struct ti_bandgap *bgp, int adc_val, int *t)
 {
 	const struct ti_bandgap_data *conf = bgp->conf;
-	int ret = 0;
 
 	/* look up for temperature in the table and return the temperature */
-	if (adc_val < conf->adc_start_val || adc_val > conf->adc_end_val) {
-		ret = -ERANGE;
-		goto exit;
-	}
+	if (adc_val < conf->adc_start_val || adc_val > conf->adc_end_val)
+		return -ERANGE;
 
 	*t = bgp->conf->conv_table[adc_val - conf->adc_start_val];
-
-exit:
-	return ret;
+	return 0;
 }
 
 /**
@@ -295,16 +288,14 @@ int ti_bandgap_mcelsius_to_adc(struct ti_bandgap *bgp, long temp, int *adc)
 {
 	const struct ti_bandgap_data *conf = bgp->conf;
 	const int *conv_table = bgp->conf->conv_table;
-	int high, low, mid, ret = 0;
+	int high, low, mid;
 
 	low = 0;
 	high = conf->adc_end_val - conf->adc_start_val;
 	mid = (high + low) / 2;
 
-	if (temp < conv_table[low] || temp > conv_table[high]) {
-		ret = -ERANGE;
-		goto exit;
-	}
+	if (temp < conv_table[low] || temp > conv_table[high])
+		return -ERANGE;
 
 	while (low < high) {
 		if (temp < conv_table[mid])
@@ -315,9 +306,7 @@ int ti_bandgap_mcelsius_to_adc(struct ti_bandgap *bgp, long temp, int *adc)
 	}
 
 	*adc = conf->adc_start_val + low;
-
-exit:
-	return ret;
+	return 0;
 }
 
 /**
@@ -343,13 +332,11 @@ int ti_bandgap_add_hyst(struct ti_bandgap *bgp, int adc_val, int hyst_val,
 	 */
 	ret = ti_bandgap_adc_to_mcelsius(bgp, adc_val, &temp);
 	if (ret < 0)
-		goto exit;
+		return ret;
 
 	temp += hyst_val;
 
 	ret = ti_bandgap_mcelsius_to_adc(bgp, temp, sum);
-
-exit:
 	return ret;
 }
 
@@ -468,22 +455,18 @@ exit:
  */
 static inline int ti_bandgap_validate(struct ti_bandgap *bgp, int id)
 {
-	int ret = 0;
-
 	if (!bgp || IS_ERR(bgp)) {
 		pr_err("%s: invalid bandgap pointer\n", __func__);
-		ret = -EINVAL;
-		goto exit;
+		return -EINVAL;
 	}
 
 	if ((id < 0) || (id >= bgp->conf->sensor_count)) {
 		dev_err(bgp->dev, "%s: sensor id out of range (%d)\n",
 			__func__, id);
-		ret = -ERANGE;
+		return -ERANGE;
 	}
 
-exit:
-	return ret;
+	return 0;
 }
 
 /**
@@ -511,12 +494,10 @@ static int _ti_bandgap_write_threshold(struct ti_bandgap *bgp, int id, int val,
 
 	ret = ti_bandgap_validate(bgp, id);
 	if (ret)
-		goto exit;
+		return ret;
 
-	if (!TI_BANDGAP_HAS(bgp, TALERT)) {
-		ret = -ENOTSUPP;
-		goto exit;
-	}
+	if (!TI_BANDGAP_HAS(bgp, TALERT))
+		return -ENOTSUPP;
 
 	ts_data = bgp->conf->sensors[id].ts_data;
 	tsr = bgp->conf->sensors[id].registers;
@@ -529,17 +510,15 @@ static int _ti_bandgap_write_threshold(struct ti_bandgap *bgp, int id, int val,
 	}
 
 	if (ret)
-		goto exit;
-
+		return ret;
+	
 	ret = ti_bandgap_mcelsius_to_adc(bgp, val, &adc_val);
 	if (ret < 0)
-		goto exit;
+		return ret;		
 
 	spin_lock(&bgp->lock);
 	ret = ti_bandgap_update_alert_threshold(bgp, id, adc_val, hot);
 	spin_unlock(&bgp->lock);
-
-exit:
 	return ret;
 }
 
@@ -582,7 +561,7 @@ static int _ti_bandgap_read_threshold(struct ti_bandgap *bgp, int id,
 
 	temp = ti_bandgap_readl(bgp, tsr->bgap_threshold);
 	temp = (temp & mask) >> __ffs(mask);
-	ret |= ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
+	ret = ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
 	if (ret) {
 		dev_err(bgp->dev, "failed to read thot\n");
 		ret = -EIO;
@@ -856,10 +835,11 @@ int ti_bandgap_read_temperature(struct ti_bandgap *bgp, int id,
 	temp = ti_bandgap_read_temp(bgp, id);
 	spin_unlock(&bgp->lock);
 
-	ret |= ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
+	ret = ti_bandgap_adc_to_mcelsius(bgp, temp, &temp);
 	if (ret)
 		return -EIO;
 
+	printk("Bandgap: temperature is %d\n", temp);
 	*temperature = temp;
 
 	return 0;
@@ -918,6 +898,7 @@ static int
 ti_bandgap_force_single_read(struct ti_bandgap *bgp, int id)
 {
 	u32 temp = 0, counter = 1000;
+	struct temp_sensor_registers *tsr;
 
 	/* Select single conversion mode */
 	if (TI_BANDGAP_HAS(bgp, MODE_CONFIG))
@@ -925,16 +906,26 @@ ti_bandgap_force_single_read(struct ti_bandgap *bgp, int id)
 
 	/* Start of Conversion = 1 */
 	RMW_BITS(bgp, id, temp_sensor_ctrl, bgap_soc_mask, 1);
-	/* Wait until DTEMP is updated */
-	temp = ti_bandgap_read_temp(bgp, id);
 
-	while ((temp == 0) && --counter)
-		temp = ti_bandgap_read_temp(bgp, id);
-	/* REVISIT: Check correct condition for end of conversion */
+	/* Wait for EOCZ going up */
+	tsr = bgp->conf->sensors[id].registers;
+	
+	while (--counter) {
+		if (ti_bandgap_readl(bgp, tsr->temp_sensor_ctrl) & tsr->bgap_eocz_mask)
+			break;
+		printk("@");
+	}
 
 	/* Start of Conversion = 0 */
 	RMW_BITS(bgp, id, temp_sensor_ctrl, bgap_soc_mask, 0);
 
+	counter = 1000;
+	while (--counter) {
+		if (!(ti_bandgap_readl(bgp, tsr->temp_sensor_ctrl) & tsr->bgap_eocz_mask))
+			break;
+		printk("#");
+	}
+
 	return 0;
 }
 
@@ -1196,6 +1187,8 @@ int ti_bandgap_probe(struct platform_device *pdev)
 	struct ti_bandgap *bgp;
 	int clk_rate, ret = 0, i;
 
+	printk("ti_bandgap: probe\n");
+
 	bgp = ti_bandgap_build(pdev);
 	if (IS_ERR(bgp)) {
 		dev_err(&pdev->dev, "failed to fetch platform data\n");
@@ -1220,11 +1213,10 @@ int ti_bandgap_probe(struct platform_device *pdev)
 		goto free_irqs;
 	}
 
-	bgp->div_clk = clk_get(NULL,  bgp->conf->div_ck_name);
+	bgp->div_clk = clk_get(NULL, bgp->conf->div_ck_name);
 	ret = IS_ERR(bgp->div_clk);
 	if (ret) {
-		dev_err(&pdev->dev,
-			"failed to request div_ts_ck clock ref\n");
+		dev_err(&pdev->dev, "failed to request div_ts_ck clock ref\n");
 		ret = PTR_ERR(bgp->div_clk);
 		goto free_irqs;
 	}
@@ -1312,6 +1304,8 @@ int ti_bandgap_probe(struct platform_device *pdev)
 	/* Every thing is good? Then expose the sensors */
 	for (i = 0; i < bgp->conf->sensor_count; i++) {
 		char *domain;
+		extern int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id,
+					     char *domain);
 
 		if (bgp->conf->sensors[i].register_cooling) {
 			ret = bgp->conf->sensors[i].register_cooling(bgp, i);
@@ -1319,12 +1313,29 @@ int ti_bandgap_probe(struct platform_device *pdev)
 				goto remove_sensors;
 		}
 
+		printk("bandgap: exposing sensor: %p\n", bgp->conf->expose_sensor);
+		
 		if (bgp->conf->expose_sensor) {
+			printk("bandgap: calling %p %p\n", bgp->conf->expose_sensor, ti_thermal_expose_sensor);
 			domain = bgp->conf->sensors[i].domain;
 			ret = bgp->conf->expose_sensor(bgp, i, domain);
+			printk("bandgap: done\n");
 			if (ret)
 				goto remove_last_cooling;
 		}
+
+		printk("bandgap: exposing sensor\n");
+		{
+			int t;
+
+			ti_bandgap_force_single_read(bgp, 0);
+
+			t = ti_bandgap_read_temp(bgp, 0);
+			printk("Temperature ADC: %d\n", t);			
+			ti_bandgap_read_temperature(bgp, 0, &t);
+			printk("Temperature: %d\n", t);
+			mdelay(1000);
+		}
 	}
 
 	/*
@@ -1365,6 +1376,8 @@ free_irqs:
 		free_irq(gpio_to_irq(bgp->tshut_gpio), NULL);
 		gpio_free(bgp->tshut_gpio);
 	}
+	printk("ti_bandgap: probe: something failed\n");
+	mdelay(10000);
 
 	return ret;
 }
@@ -1509,6 +1522,12 @@ static SIMPLE_DEV_PM_OPS(ti_bandgap_dev_pm_ops, ti_bandgap_suspend,
 #endif
 
 static const struct of_device_id of_ti_bandgap_match[] = {
+#ifdef CONFIG_OMAP3_THERMAL
+	{
+		.compatible = "ti,omap34xx-bandgap",
+		.data = (void *)&omap34xx_data,
+	},
+#endif
 #ifdef CONFIG_OMAP4_THERMAL
 	{
 		.compatible = "ti,omap4430-bandgap",
drivers/thermal/ti-soc-thermal/ti-bandgap.h +2 -0
index b3adf72..3f05386 100644
@@ -384,6 +384,8 @@ int ti_bandgap_set_sensor_data(struct ti_bandgap *bgp, int id, void *data);
 void *ti_bandgap_get_sensor_data(struct ti_bandgap *bgp, int id);
 int ti_bandgap_get_trend(struct ti_bandgap *bgp, int id, int *trend);
 
+extern const struct ti_bandgap_data omap34xx_data;
+
 #ifdef CONFIG_OMAP4_THERMAL
 extern const struct ti_bandgap_data omap4430_data;
 extern const struct ti_bandgap_data omap4460_data;
drivers/thermal/ti-soc-thermal/ti-thermal-common.c +6 -1
index 5fd0386..f91655f 100644
@@ -328,18 +328,23 @@ int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id,
 {
 	struct ti_thermal_data *data;
 
+	printk("expose_sensor\n");
+
 	data = ti_bandgap_get_sensor_data(bgp, id);
 
 	if (!data || IS_ERR(data))
 		data = ti_thermal_build_data(bgp, id);
 
-	if (!data)
+	if (!data) {
+		printk("no data\n");	
 		return -EINVAL;
+	}
 
 	/* in case this is specified by DT */
 	data->ti_thermal = thermal_zone_of_sensor_register(bgp->dev, id,
 					data, &ti_of_thermal_ops);
 	if (IS_ERR(data->ti_thermal)) {
+		printk("of_sensor_register failed\n");
 		/* Create thermal zone */
 		data->ti_thermal = thermal_zone_device_register(domain,
 				OMAP_TRIP_NUMBER, 0, data, &ti_thermal_ops,
Signature · 3 lines
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#24 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 28 lines · Guenter Roeck
Quoted 18 lines · Pavel Machek
Quoted 17 lines · Guenter Roeck
Quoted 16 lines · Pavel Machek
Quoted 14 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

Quoted 9 lines
Quoted 6 lines
Quoted 3 lines

When testing initial version of the patch, they seem to work very well in the omap3 case.

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

After some fixes... yes, it seems to be same hardware.

Quoted 8 lines

So this should be the way to go, but then we have others claim that it should not be done because the OMAP3 sensors are too unreliable to use for thermal decisions. Not really sure where that leaves us. I am kind of opposed to have similar drivers for similar chips in two different subsystems.

Is it possible to add the patch below to the omap thermal driver and not use it for thermal decisions ?

Well... noone forces you to enable the driver, and I don't think it will do any thermal decisions on N900 as it is ... so we should be ok.

Plus, it seems to work reasonably well (say +- 5 C), so situation does not seem to be as bad as TI claims.

Nokia was actually using it in production.

Best regards,
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
maintainer
#25 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 15 lines · Pavel Machek
Quoted 6 lines
Quoted 6 lines
Quoted 3 lines

Pavel,

can you look into the omap4 thermal driver to see if it can be used ?

After some fixes... yes, it seems to be same hardware.

Quoted 8 lines

So this should be the way to go, but then we have others claim that it should not be done because the OMAP3 sensors are too unreliable to use for thermal decisions. Not really sure where that leaves us. I am kind of opposed to have similar drivers for similar chips in two different subsystems.

Is it possible to add the patch below to the omap thermal driver and not use it for thermal decisions ?

Quoted 8 lines

Well... noone forces you to enable the driver, and I don't think it will do any thermal decisions on N900 as it is ... so we should be ok.

Plus, it seems to work reasonably well (say +- 5 C), so situation does not seem to be as bad as TI claims.

Nokia was actually using it in production.

Ok, I'll assume that omap3 support will be added to the omap thermal driver.

Thanks,
Guenter

#26 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

In reply to Pavel Machek
Quoted 13 lines · Pavel Machek
Quoted 12 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Quoted 5 lines
Quoted 2 lines

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

When testing initial version of the patch, they seem to work very well in the omap3 case.

Just be careful when you try to make thermal policy like decisions based on this sensor. Placement of the sensor w.r.t the actual logic generating heat has to be a factor as well. If you are just looking for an approximation temperature (thermometerish kind), you might be ok with this. I am not sure we'd find any TI data around this.. just a heads up.

Also notice http://www.ti.com/lit/er/sprz278f/sprz278f.pdf "Advisory 3.1.1.186 MMC OCP Clock Not Gated When Thermal Sensor Is Used" I think there were accuracy issues at certain values etc.. So remember to do a off mode type PM tests as well before you consider requesting these to be merged.

Signature · 2 lines
Regards,
Nishanth Menon
#27 lore raw

Re: [PATCH 2/3] hwmon: Driver for OMAP3 temperature sensor

Quoted 14 lines · Nishanth Menon
Quoted 13 lines · Pavel Machek
Quoted 12 lines · Nishanth Menon
Quoted 10 lines · Grazvydas Ignotas
Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature. This patch provides a DT based driver for the temperature sensor based on an older driver written by Peter De Schrijver for the Nokia N900 and N9.

The sensor looks like an earlier iteration of sensors used in newer OMAPs, which are already supported by maybe drivers/thermal/ti-soc-thermal/ , maybe it would make sense to update that driver instead?

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Just to be clear - OMAP4 is the first time that the sensors were reliable enough to be used.

When testing initial version of the patch, they seem to work very well in the omap3 case.

Just be careful when you try to make thermal policy like decisions based on this sensor. Placement of the sensor w.r.t the actual logic

I guess we won't do that, certainly not anytime soon.

Quoted 5 lines

Also notice http://www.ti.com/lit/er/sprz278f/sprz278f.pdf "Advisory 3.1.1.186 MMC OCP Clock Not Gated When Thermal Sensor Is Used" I think there were accuracy issues at certain values etc.. So remember to do a off mode type PM tests as well before you consider requesting these to be merged.

Thanks a lot for a pointer. 3x 100uA power draw when you enable temperature sensor, because it also errorneously enables MMC. I wonder how the solution would look in the device tree...
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#28 lore raw

PATCH 3/3 ARM: dts: OMAP34xx/36xx: Add temperature sensor

In reply to Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature.

---
 arch/arm/boot/dts/omap34xx.dtsi | 7 +++++++
 arch/arm/boot/dts/omap36xx.dtsi | 7 +++++++
 2 files changed, 14 insertions(+)
arch/arm/boot/dts/omap34xx.dtsi +7 -0
index 3819c1e..64679ee 100644
@@ -38,6 +38,13 @@
 			pinctrl-single,function-mask = <0xff1f>;
 		};
 	};
+
+	omap3_temperature_sensor: temperature-sensor {
+		compatible = "ti,omap34xx-temperature-sensor";
+		syscon = <&omap3_scm_general>;
+		clocks = <&ts_fck>;
+		clock-names = "fck";
+	};
 };
 
 &ssi {
arch/arm/boot/dts/omap36xx.dtsi +7 -0
index 541704a..be9ee1d 100644
@@ -70,6 +70,13 @@
 			pinctrl-single,function-mask = <0xff1f>;
 		};
 	};
+
+	omap3_temperature_sensor: temperature-sensor {
+		compatible = "ti,omap36xx-temperature-sensor";
+		syscon = <&omap3_scm_general>;
+		clocks = <&ts_fck>;
+		clock-names = "fck";
+	};
 };
 
 /* OMAP3630 needs dss_96m_fck for VENC */
Signature · 1 line
2.1.3
author Acked-by Tested-by on v1 3/3
#29 lore raw

Re: [PATCH 3/3] ARM: dts: OMAP34xx/36xx: Add temperature sensor

Quoted 4 lines · Sebastian Reichel

OMAP34xx and OMAP36xx processors contain a register in the syscon area, which can be used to determine the SoCs temperature.

Driver binds and does something, so binding works ok.
Pavel

Signature · 2 lines
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
#30 lore raw
In reply to Pavel Machek
Quoted 23 lines · Pavel Machek
drivers/hwmon/omap34xx_temp.c new file +20 -0
@@ -0,0 +1,263 @@
+/*
+ * omap34xx_temp.c - Linux kernel module for OMAP34xx hardware monitoring
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Written by Peter De Schrijver <[email protected]>
+ *
+ * Inspired by k8temp.c
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>

drivers/hwmon/omap34xx_temp.c line 30

Quoted 10 lines
drivers/hwmon/omap34xx_temp.c new file +10 -0
+#include <linux/hrtimer.h>
+#include <linux/module.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+
+#include "../../arch/arm/mach-omap2/control.h"

No need to do this, you can use syscon here like pbias-regulator.c is doing.

Regards,

Tony

#31 lore raw
Quoted 29 lines · Tony Lindgren
Quoted 28 lines · Pavel Machek
drivers/hwmon/omap34xx_temp.c new file +25 -0
@@ -0,0 +1,263 @@
+/*
+ * omap34xx_temp.c - Linux kernel module for OMAP34xx hardware monitoring
+ *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Written by Peter De Schrijver <[email protected]>
+ *
+ * Inspired by k8temp.c
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of this
+ * archive for more details.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/clk.h>
+#include <linux/hrtimer.h>
+#include <linux/module.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
Quoted 8 lines

drivers/hwmon/omap34xx_temp.c line 30

Quoted 5 lines
drivers/hwmon/omap34xx_temp.c new file +5 -0
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+
+#include "../../arch/arm/mach-omap2/control.h"

No need to do this, you can use syscon here like pbias-regulator.c is doing.

Oh looks like you're already using syscon, nice. What defines do you need from control.h?

Those should be in the driver if private to the driver, or else we should have some minimal header in include/linux somewhere if some control.h defines really need to be exposed.

Regards,

Tony

#32 lore raw
Quoted 44 lines · On Friday 26 December 2014 17:17:57 Tony Lindgren wrote:
Quoted 31 lines · Tony Lindgren
Quoted 30 lines · Pavel Machek
drivers/hwmon/omap34xx_temp.c new file +2 -0
@@ -0,0 +1,263 @@
+/*
+ * omap34xx_temp.c - Linux kernel module for OMAP34xx

hardware monitoring + *
+ * Copyright (C) 2008 Nokia Corporation
+ *
+ * Written by Peter De Schrijver <[email protected]> + *
+ * Inspired by k8temp.c
+ *
+ * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details.
+ *
+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details.
+ */

drivers/hwmon/omap34xx_temp.c new file +7 -0
+
+#include <linux/clk.h>
+#include <linux/hrtimer.h>
+#include <linux/module.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
Quoted 8 lines

drivers/hwmon/omap34xx_temp.c line 30

Quoted 5 lines
drivers/hwmon/omap34xx_temp.c new file +5 -0
+#include <linux/platform_device.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+
+#include "../../arch/arm/mach-omap2/control.h"

No need to do this, you can use syscon here like
pbias-regulator.c is doing.

Oh looks like you're already using syscon, nice. What defines do you need from control.h?

Quoted 8 lines

Those should be in the driver if private to the driver, or else we should have some minimal header in include/linux somewhere if some control.h defines really need to be exposed.

Regards,

Tony

Hi Tony,

Sebastian Reichel has already sent new version of temperature driver. See email thread with subject:

[PATCH 0/3] OMAP3 temperature sensor

Signature · 9 lines
Pali Roh?r
pali.rohar at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20141226/daf8e6ad/attachment-0001.sig>
#33 lore raw
Quoted 17 lines · Pali Roh?r
Quoted 16 lines · On Friday 26 December 2014 17:17:57 Tony Lindgren wrote:
Quoted 5 lines

Review

Quoted 2 lines
(quoted diff) +2 -0
+
+#include "../../arch/arm/mach-omap2/control.h"

No need to do this, you can use syscon here like
pbias-regulator.c is doing.

Oh looks like you're already using syscon, nice. What defines do you need from control.h?

Those should be in the driver if private to the driver, or else we should have some minimal header in include/linux somewhere if some control.h defines really need to be exposed.

Regards,

Quoted 8 lines
Quoted 1 line

Tony

Hi Tony,

Sebastian Reichel has already sent new version of temperature driver. See email thread with subject:

[PATCH 0/3] OMAP3 temperature sensor

Yeah great, looks like I was also reading Sebastian's patch with the syscon comments above :)

Regards,

Tony