summaryrefslogtreecommitdiff
path: root/drivers/misc/m4sensorhub_pedometer.c
diff options
context:
space:
mode:
authorViditha Hanumanthareddy <ngjq36@motorola.com>2014-04-11 08:34:57 -0500
committerViditha H <ngjq36@motorola.com>2014-04-14 13:38:15 +0000
commit8c6cdb25387a334f305608bf6799a23e10fd3de9 (patch)
treee660f7bfaf20046831b3aef9a78b5c475037e799 /drivers/misc/m4sensorhub_pedometer.c
parent91870978c303ee260ee5fafac7912df3b9ff48b6 (diff)
downloadolio-linux-3.10-8c6cdb25387a334f305608bf6799a23e10fd3de9.tar.xz
olio-linux-3.10-8c6cdb25387a334f305608bf6799a23e10fd3de9.zip
IKXCLOCK-760: Push a pedometer event on pedometer enable
Change-Id: I455c4e51f9645184f70968442a2431a6b907d847
Diffstat (limited to 'drivers/misc/m4sensorhub_pedometer.c')
-rw-r--r--drivers/misc/m4sensorhub_pedometer.c64
1 files changed, 43 insertions, 21 deletions
diff --git a/drivers/misc/m4sensorhub_pedometer.c b/drivers/misc/m4sensorhub_pedometer.c
index ce4d161c4d8..ad05e8dba8c 100644
--- a/drivers/misc/m4sensorhub_pedometer.c
+++ b/drivers/misc/m4sensorhub_pedometer.c
@@ -49,27 +49,28 @@ struct m4ped_driver_data {
uint16_t status;
};
-
-static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
+static int m4ped_read_report_data(struct iio_dev *iio,
+ struct m4ped_driver_data *dd)
{
- int err = 0;
- struct iio_dev *iio = handle;
- struct m4ped_driver_data *dd = iio_priv(iio);
- int size = 0;
+ int err = 0, size = 0;
- mutex_lock(&(dd->mutex));
+ /*input validations */
+ if ((iio == NULL) || (dd == NULL)) {
+ m4ped_err("%s: invalid inputs passed in\n", __func__);
+ return -EINVAL;
+ }
size = m4sensorhub_reg_getsize(dd->m4, M4SH_REG_PEDOMETER_ACTIVITY);
err = m4sensorhub_reg_read(dd->m4, M4SH_REG_PEDOMETER_ACTIVITY,
(char *)&(dd->iiodat.ped_activity));
if (err < 0) {
m4ped_err("%s: Failed to read ped_activity data.\n", __func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "ped_activity");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
size = m4sensorhub_reg_getsize(dd->m4,
@@ -79,12 +80,12 @@ static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
if (err < 0) {
m4ped_err("%s: Failed to read total_distance data.\n",
__func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "total_distance");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
size = m4sensorhub_reg_getsize(dd->m4, M4SH_REG_PEDOMETER_TOTALSTEPS);
@@ -92,12 +93,12 @@ static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
(char *)&(dd->iiodat.total_steps));
if (err < 0) {
m4ped_err("%s: Failed to read total_steps data.\n", __func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "total_steps");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
size = m4sensorhub_reg_getsize(dd->m4,
@@ -106,12 +107,12 @@ static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
(char *)&(dd->iiodat.current_speed));
if (err < 0) {
m4ped_err("%s: Failed to read current_speed data.\n", __func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "current_speed");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
size = m4sensorhub_reg_getsize(dd->m4,
@@ -121,12 +122,12 @@ static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
if (err < 0) {
m4ped_err("%s: Failed to read floors_climbed data.\n",
__func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "floors_climbed");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
size = m4sensorhub_reg_getsize(dd->m4, M4SH_REG_METS_CALORIES);
@@ -134,23 +135,34 @@ static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
(char *)&(dd->iiodat.calories));
if (err < 0) {
m4ped_err("%s: Failed to read calories data.\n", __func__);
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
} else if (err != size) {
m4ped_err("%s: Read %d bytes instead of %d for %s.\n",
__func__, err, size, "calories");
err = -EBADE;
- goto m4ped_isr_fail;
+ goto m4ped_read_fail;
}
dd->iiodat.timestamp = iio_get_time_ns();
iio_push_to_buffers(iio, (unsigned char *)&(dd->iiodat));
-m4ped_isr_fail:
+m4ped_read_fail:
if (err < 0)
m4ped_err("%s: Failed with error code %d.\n", __func__, err);
- mutex_unlock(&(dd->mutex));
+ return err;
+}
+static void m4ped_isr(enum m4sensorhub_irqs int_event, void *handle)
+{
+ int err = 0;
+ struct iio_dev *iio = handle;
+ struct m4ped_driver_data *dd = iio_priv(iio);
+ mutex_lock(&(dd->mutex));
+ err = m4ped_read_report_data(iio, dd);
+ if (err < 0)
+ m4ped_err("%s: Failed with error code %d.\n", __func__, err);
+ mutex_unlock(&(dd->mutex));
return;
}
@@ -185,6 +197,16 @@ static int m4ped_set_samplerate(struct iio_dev *iio, int16_t rate)
}
dd->status = dd->status | (1 << M4PED_IRQ_ENABLED_BIT);
+ /* When an app registers, there is no data reported
+ unless the user starts walking. But the application
+ would like to have atleast one set of data sent
+ immediately following the register */
+ err = m4ped_read_report_data(iio, dd);
+ if (err < 0) {
+ m4ped_err("%s: Failed to report pedo data\n",
+ __func__);
+ goto m4ped_set_samplerate_fail;
+ }
}
} else {
/* Disable the IRQ if necessary */