drivers: sensor: fxos8700: Store sensor trigger as a pointer
Fixes the fxos8700 sensor driver to store the user-supplied sensor trigger as a pointer rather than a copy. This enables the trigger handler to use CONTAINER_OF to retrieve a context pointer when the trigger is embedded in a larger struct. Signed-off-by: Maureen Helm <maureen.helm@intel.com>
This commit is contained in:
parent
2a72e0eaf3
commit
e20357e7ac
|
@ -193,16 +193,21 @@ struct fxos8700_data {
|
|||
const struct device *dev;
|
||||
struct gpio_callback gpio_cb;
|
||||
sensor_trigger_handler_t drdy_handler;
|
||||
const struct sensor_trigger *drdy_trig;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_PULSE
|
||||
sensor_trigger_handler_t tap_handler;
|
||||
const struct sensor_trigger *tap_trig;
|
||||
sensor_trigger_handler_t double_tap_handler;
|
||||
const struct sensor_trigger *double_tap_trig;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_MOTION
|
||||
sensor_trigger_handler_t motion_handler;
|
||||
const struct sensor_trigger *motion_trig;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_MAG_VECM
|
||||
sensor_trigger_handler_t m_vecm_handler;
|
||||
const struct sensor_trigger *m_vecm_trig;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_TRIGGER_OWN_THREAD
|
||||
K_KERNEL_STACK_MEMBER(thread_stack, CONFIG_FXOS8700_THREAD_STACK_SIZE);
|
||||
|
|
|
@ -37,13 +37,8 @@ static int fxos8700_handle_drdy_int(const struct device *dev)
|
|||
{
|
||||
struct fxos8700_data *data = dev->data;
|
||||
|
||||
struct sensor_trigger drdy_trig = {
|
||||
.type = SENSOR_TRIG_DATA_READY,
|
||||
.chan = SENSOR_CHAN_ALL,
|
||||
};
|
||||
|
||||
if (data->drdy_handler) {
|
||||
data->drdy_handler(dev, &drdy_trig);
|
||||
data->drdy_handler(dev, data->drdy_trig);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -55,12 +50,9 @@ static int fxos8700_handle_pulse_int(const struct device *dev)
|
|||
const struct fxos8700_config *config = dev->config;
|
||||
struct fxos8700_data *data = dev->data;
|
||||
sensor_trigger_handler_t handler = NULL;
|
||||
const struct sensor_trigger *trig = NULL;
|
||||
uint8_t pulse_source;
|
||||
|
||||
struct sensor_trigger pulse_trig = {
|
||||
.chan = SENSOR_CHAN_ALL,
|
||||
};
|
||||
|
||||
k_sem_take(&data->sem, K_FOREVER);
|
||||
|
||||
if (config->ops->byte_read(dev, FXOS8700_REG_PULSE_SRC,
|
||||
|
@ -71,15 +63,15 @@ static int fxos8700_handle_pulse_int(const struct device *dev)
|
|||
k_sem_give(&data->sem);
|
||||
|
||||
if (pulse_source & FXOS8700_PULSE_SRC_DPE) {
|
||||
pulse_trig.type = SENSOR_TRIG_DOUBLE_TAP;
|
||||
handler = data->double_tap_handler;
|
||||
trig = data->double_tap_trig;
|
||||
} else {
|
||||
pulse_trig.type = SENSOR_TRIG_TAP;
|
||||
handler = data->tap_handler;
|
||||
trig = data->tap_trig;
|
||||
}
|
||||
|
||||
if (handler) {
|
||||
handler(dev, &pulse_trig);
|
||||
handler(dev, trig);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -94,10 +86,6 @@ static int fxos8700_handle_motion_int(const struct device *dev)
|
|||
sensor_trigger_handler_t handler = data->motion_handler;
|
||||
uint8_t motion_source;
|
||||
|
||||
struct sensor_trigger motion_trig = {
|
||||
.chan = SENSOR_CHAN_ALL,
|
||||
};
|
||||
|
||||
k_sem_take(&data->sem, K_FOREVER);
|
||||
|
||||
if (config->ops->byte_read(dev, FXOS8700_REG_FF_MT_SRC,
|
||||
|
@ -109,7 +97,7 @@ static int fxos8700_handle_motion_int(const struct device *dev)
|
|||
|
||||
if (handler) {
|
||||
LOG_DBG("FF_MT_SRC 0x%x", motion_source);
|
||||
handler(dev, &motion_trig);
|
||||
handler(dev, data->motion_trig);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -121,13 +109,8 @@ static int fxos8700_handle_m_vecm_int(const struct device *dev)
|
|||
{
|
||||
struct fxos8700_data *data = dev->data;
|
||||
|
||||
struct sensor_trigger m_vecm_trig = {
|
||||
.type = FXOS8700_TRIG_M_VECM,
|
||||
.chan = SENSOR_CHAN_MAGN_XYZ,
|
||||
};
|
||||
|
||||
if (data->m_vecm_handler) {
|
||||
data->m_vecm_handler(dev, &m_vecm_trig);
|
||||
data->m_vecm_handler(dev, data->m_vecm_trig);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -220,27 +203,32 @@ int fxos8700_trigger_set(const struct device *dev,
|
|||
case SENSOR_TRIG_DATA_READY:
|
||||
mask = FXOS8700_DRDY_MASK;
|
||||
data->drdy_handler = handler;
|
||||
data->drdy_trig = trig;
|
||||
break;
|
||||
#ifdef CONFIG_FXOS8700_PULSE
|
||||
case SENSOR_TRIG_TAP:
|
||||
mask = FXOS8700_PULSE_MASK;
|
||||
data->tap_handler = handler;
|
||||
data->tap_trig = trig;
|
||||
break;
|
||||
case SENSOR_TRIG_DOUBLE_TAP:
|
||||
mask = FXOS8700_PULSE_MASK;
|
||||
data->double_tap_handler = handler;
|
||||
data->double_tap_trig = trig;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_MOTION
|
||||
case SENSOR_TRIG_DELTA:
|
||||
mask = FXOS8700_MOTION_MASK;
|
||||
data->motion_handler = handler;
|
||||
data->motion_trig = trig;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_FXOS8700_MAG_VECM
|
||||
case FXOS8700_TRIG_M_VECM:
|
||||
mask = FXOS8700_VECM_MASK;
|
||||
data->m_vecm_handler = handler;
|
||||
data->m_vecm_trig = trig;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
|
Loading…
Reference in a new issue