diff options
| -rw-r--r-- | drivers/mfd/m4sensorhub-panic.c | 1 | ||||
| -rw-r--r-- | drivers/misc/m4sensorhub_pedometer.c | 31 | ||||
| -rw-r--r-- | include/linux/m4sensorhub.h | 1 | 
3 files changed, 33 insertions, 0 deletions
diff --git a/drivers/mfd/m4sensorhub-panic.c b/drivers/mfd/m4sensorhub-panic.c index 0f8693e71eb..5609492a485 100644 --- a/drivers/mfd/m4sensorhub-panic.c +++ b/drivers/mfd/m4sensorhub-panic.c @@ -39,6 +39,7 @@ static const char *callback_name[PANICHDL_MAX] = {  	[PANICHDL_ALS_RESTORE] = "als_restore",  	[PANICHDL_FUSION_RESTORE] = "fusion_restore",  	[PANICHDL_MPU9150_RESTORE] = "mpu9150_restore", +	[PANICHDL_PEDOMETER_RESTORE] = "pedometer_restore",  };  struct m4sensorhub_panic_callback { 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: diff --git a/include/linux/m4sensorhub.h b/include/linux/m4sensorhub.h index c78c0914770..ff41f8dc33f 100644 --- a/include/linux/m4sensorhub.h +++ b/include/linux/m4sensorhub.h @@ -72,6 +72,7 @@ enum m4sensorhub_panichdl_index {  	PANICHDL_FUSION_RESTORE,  	PANICHDL_ALS_RESTORE,  	PANICHDL_MPU9150_RESTORE, +	PANICHDL_PEDOMETER_RESTORE,  	/*  	 * Please add enum before PANICHDL_IRQ_RESTORE  	 * to make sure IRQ restore will be called last.  |