We are going to modify this variable, move it to the device state.
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
include/hw/misc/bcm2835_thermal.h | 1 +
hw/misc/bcm2835_thermal.c | 18 +++++++++++++-----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/include/hw/misc/bcm2835_thermal.h b/include/hw/misc/bcm2835_thermal.h
index c3651b27ec..df6a7b86c3 100644
--- a/include/hw/misc/bcm2835_thermal.h
+++ b/include/hw/misc/bcm2835_thermal.h
@@ -22,6 +22,7 @@ typedef struct {
/*< public >*/
MemoryRegion iomem;
uint32_t ctl;
+ float64 temp;
} Bcm2835ThermalState;
#endif
diff --git a/hw/misc/bcm2835_thermal.c b/hw/misc/bcm2835_thermal.c
index c6f3b1ad60..6ee149de20 100644
--- a/hw/misc/bcm2835_thermal.c
+++ b/hw/misc/bcm2835_thermal.c
@@ -32,7 +32,7 @@ FIELD(STAT, INTERRUPT, 11, 1)
#define THERMAL_OFFSET_C 412
#define THERMAL_COEFF (-0.538f)
-static uint16_t bcm2835_thermal_temp2adc(int temp_C)
+static uint16_t bcm2835_thermal_temp2adc(float64 temp_C)
{
return (temp_C - THERMAL_OFFSET_C) / THERMAL_COEFF;
}
@@ -47,8 +47,7 @@ static uint64_t bcm2835_thermal_read(void *opaque, hwaddr addr, unsigned size)
val = s->ctl;
break;
case A_STAT:
- /* Temperature is constantly 25°C. */
- val = FIELD_DP32(bcm2835_thermal_temp2adc(25), STAT, VALID, true);
+ val = FIELD_DP32(bcm2835_thermal_temp2adc(s->temp), STAT, VALID, true);
break;
default:
/* MemoryRegionOps are aligned, so this can not happen. */
@@ -85,6 +84,13 @@ static const MemoryRegionOps bcm2835_thermal_ops = {
.endianness = DEVICE_NATIVE_ENDIAN,
};
+static void bcm2835_thermal_init(Object *obj)
+{
+ Bcm2835ThermalState *s = BCM2835_THERMAL(obj);
+
+ s->temp = 25.0;
+}
+
static void bcm2835_thermal_reset(DeviceState *dev)
{
Bcm2835ThermalState *s = BCM2835_THERMAL(dev);
@@ -103,10 +109,11 @@ static void bcm2835_thermal_realize(DeviceState *dev, Error **errp)
static const VMStateDescription bcm2835_thermal_vmstate = {
.name = "bcm2835_thermal",
- .version_id = 1,
- .minimum_version_id = 1,
+ .version_id = 2,
+ .minimum_version_id = 2,
.fields = (VMStateField[]) {
VMSTATE_UINT32(ctl, Bcm2835ThermalState),
+ VMSTATE_FLOAT64(temp, Bcm2835ThermalState),
VMSTATE_END_OF_LIST()
}
};
@@ -124,6 +131,7 @@ static const TypeInfo bcm2835_thermal_info = {
.name = TYPE_BCM2835_THERMAL,
.parent = TYPE_SYS_BUS_DEVICE,
.instance_size = sizeof(Bcm2835ThermalState),
+ .instance_init = bcm2835_thermal_init,
.class_init = bcm2835_thermal_class_init,
};
--
2.21.1