iio: imu: st_lsm6dsx: add read_fifo callback to fifo_ops
Remove static qualifier from st_lsm6dsx_read_fifo definition and introduce read_fifo function pointer in fifo_ops data structure in order to run the proper read_fifo routine since other compliant devices will use a different FIFO queueing scheme. Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
ff50593026
commit
50ff457d1b
|
@ -41,13 +41,17 @@ struct st_lsm6dsx_reg {
|
||||||
u8 mask;
|
u8 mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct st_lsm6dsx_hw;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct st_lsm6dsx_fifo_ops - ST IMU FIFO settings
|
* struct st_lsm6dsx_fifo_ops - ST IMU FIFO settings
|
||||||
|
* @read_fifo: Read FIFO callback.
|
||||||
* @fifo_th: FIFO threshold register info (addr + mask).
|
* @fifo_th: FIFO threshold register info (addr + mask).
|
||||||
* @fifo_diff: FIFO diff status register info (addr + mask).
|
* @fifo_diff: FIFO diff status register info (addr + mask).
|
||||||
* @th_wl: FIFO threshold word length.
|
* @th_wl: FIFO threshold word length.
|
||||||
*/
|
*/
|
||||||
struct st_lsm6dsx_fifo_ops {
|
struct st_lsm6dsx_fifo_ops {
|
||||||
|
int (*read_fifo)(struct st_lsm6dsx_hw *hw);
|
||||||
struct {
|
struct {
|
||||||
u8 addr;
|
u8 addr;
|
||||||
u16 mask;
|
u16 mask;
|
||||||
|
@ -175,5 +179,6 @@ int st_lsm6dsx_update_watermark(struct st_lsm6dsx_sensor *sensor,
|
||||||
int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw *hw);
|
int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw *hw);
|
||||||
int st_lsm6dsx_set_fifo_mode(struct st_lsm6dsx_hw *hw,
|
int st_lsm6dsx_set_fifo_mode(struct st_lsm6dsx_hw *hw,
|
||||||
enum st_lsm6dsx_fifo_mode fifo_mode);
|
enum st_lsm6dsx_fifo_mode fifo_mode);
|
||||||
|
int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw);
|
||||||
|
|
||||||
#endif /* ST_LSM6DSX_H */
|
#endif /* ST_LSM6DSX_H */
|
||||||
|
|
|
@ -283,7 +283,7 @@ static inline int st_lsm6dsx_read_block(struct st_lsm6dsx_hw *hw, u8 *data,
|
||||||
*
|
*
|
||||||
* Return: Number of bytes read from the FIFO
|
* Return: Number of bytes read from the FIFO
|
||||||
*/
|
*/
|
||||||
static int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw)
|
int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw)
|
||||||
{
|
{
|
||||||
u16 fifo_len, pattern_len = hw->sip * ST_LSM6DSX_SAMPLE_SIZE;
|
u16 fifo_len, pattern_len = hw->sip * ST_LSM6DSX_SAMPLE_SIZE;
|
||||||
u16 fifo_diff_mask = hw->settings->fifo_ops.fifo_diff.mask;
|
u16 fifo_diff_mask = hw->settings->fifo_ops.fifo_diff.mask;
|
||||||
|
@ -407,7 +407,7 @@ int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw *hw)
|
||||||
|
|
||||||
mutex_lock(&hw->fifo_lock);
|
mutex_lock(&hw->fifo_lock);
|
||||||
|
|
||||||
st_lsm6dsx_read_fifo(hw);
|
hw->settings->fifo_ops.read_fifo(hw);
|
||||||
err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_BYPASS);
|
err = st_lsm6dsx_set_fifo_mode(hw, ST_LSM6DSX_FIFO_BYPASS);
|
||||||
|
|
||||||
mutex_unlock(&hw->fifo_lock);
|
mutex_unlock(&hw->fifo_lock);
|
||||||
|
@ -479,7 +479,7 @@ static irqreturn_t st_lsm6dsx_handler_thread(int irq, void *private)
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
mutex_lock(&hw->fifo_lock);
|
mutex_lock(&hw->fifo_lock);
|
||||||
count = st_lsm6dsx_read_fifo(hw);
|
count = hw->settings->fifo_ops.read_fifo(hw);
|
||||||
mutex_unlock(&hw->fifo_lock);
|
mutex_unlock(&hw->fifo_lock);
|
||||||
|
|
||||||
return !count ? IRQ_NONE : IRQ_HANDLED;
|
return !count ? IRQ_NONE : IRQ_HANDLED;
|
||||||
|
|
|
@ -171,6 +171,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.fifo_ops = {
|
.fifo_ops = {
|
||||||
|
.read_fifo = st_lsm6dsx_read_fifo,
|
||||||
.fifo_th = {
|
.fifo_th = {
|
||||||
.addr = 0x06,
|
.addr = 0x06,
|
||||||
.mask = GENMASK(11, 0),
|
.mask = GENMASK(11, 0),
|
||||||
|
@ -217,6 +218,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.fifo_ops = {
|
.fifo_ops = {
|
||||||
|
.read_fifo = st_lsm6dsx_read_fifo,
|
||||||
.fifo_th = {
|
.fifo_th = {
|
||||||
.addr = 0x06,
|
.addr = 0x06,
|
||||||
.mask = GENMASK(11, 0),
|
.mask = GENMASK(11, 0),
|
||||||
|
@ -265,6 +267,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.fifo_ops = {
|
.fifo_ops = {
|
||||||
|
.read_fifo = st_lsm6dsx_read_fifo,
|
||||||
.fifo_th = {
|
.fifo_th = {
|
||||||
.addr = 0x06,
|
.addr = 0x06,
|
||||||
.mask = GENMASK(10, 0),
|
.mask = GENMASK(10, 0),
|
||||||
|
|
Loading…
Reference in New Issue