diff options
Diffstat (limited to 'drivers/misc/m4sensorhub_pedometer.c')
| -rw-r--r-- | drivers/misc/m4sensorhub_pedometer.c | 31 | 
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:  |