summaryrefslogtreecommitdiff
path: root/drivers/misc/m4sensorhub_pedometer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/m4sensorhub_pedometer.c')
-rw-r--r--drivers/misc/m4sensorhub_pedometer.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/misc/m4sensorhub_pedometer.c b/drivers/misc/m4sensorhub_pedometer.c
index 4f80122c7e1..85c1c2f9c9e 100644
--- a/drivers/misc/m4sensorhub_pedometer.c
+++ b/drivers/misc/m4sensorhub_pedometer.c
@@ -47,6 +47,8 @@ struct m4ped_driver_data {
struct m4sensorhub_pedometer_iio_data iiodat;
int16_t samplerate;
uint16_t status;
+ struct m4sensorhub_pedometer_iio_data base_dat;
+
};
static int m4ped_read_report_data(struct iio_dev *iio,
@@ -143,6 +145,12 @@ static int m4ped_read_report_data(struct iio_dev *iio,
}
dd->iiodat.timestamp = iio_get_time_ns();
+
+ dd->iiodat.total_distance += dd->base_dat.total_distance;
+ dd->iiodat.total_steps += dd->base_dat.total_steps;
+ dd->iiodat.healthy_minutes += dd->base_dat.healthy_minutes;
+ dd->iiodat.calories += dd->base_dat.calories;
+
iio_push_to_buffers(iio, (unsigned char *)&(dd->iiodat));
m4ped_read_fail:
@@ -530,6 +538,24 @@ m4ped_create_iiodev_exit:
return err;
}
+static void m4ped_panic_restore(struct m4sensorhub_data *m4sensorhub,
+ void *data)
+{
+ struct m4ped_driver_data *dd = (struct m4ped_driver_data *)data;
+ if (dd == NULL) {
+ m4ped_err("%s: Driver data is null, unable to restore\n",
+ __func__);
+ return;
+ }
+ dd->base_dat.total_distance = dd->iiodat.total_distance;
+ dd->base_dat.total_steps = dd->iiodat.total_steps;
+ dd->base_dat.healthy_minutes = dd->iiodat.healthy_minutes;
+ dd->base_dat.calories = dd->iiodat.calories;
+ m4ped_err("%s: Pedometer bases after panic = %d %d %d %d", __func__,
+ dd->base_dat.total_distance, dd->base_dat.total_steps,
+ dd->base_dat.healthy_minutes, dd->base_dat.calories);
+}
+
static int m4ped_driver_init(struct init_calldata *p_arg)
{
struct iio_dev *iio = p_arg->p_data;
@@ -559,6 +585,11 @@ static int m4ped_driver_init(struct init_calldata *p_arg)
goto m4ped_driver_init_irq_act_fail;
}
+ err = m4sensorhub_panic_register(dd->m4, PANICHDL_PEDOMETER_RESTORE,
+ m4ped_panic_restore, dd);
+ if (err < 0)
+ m4ped_err("Pedometer panic callbk register failed\n");
+
goto m4ped_driver_init_exit;
m4ped_driver_init_irq_act_fail: