160 lines
4.8 KiB
C
160 lines
4.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright 2021 Google LLC.
|
|
*
|
|
* Code shared between most Semtech SAR sensor driver.
|
|
*/
|
|
|
|
#ifndef IIO_SX_COMMON_H
|
|
#define IIO_SX_COMMON_H
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/iio/iio.h>
|
|
#include <linux/iio/types.h>
|
|
#include <linux/regulator/consumer.h>
|
|
#include <linux/types.h>
|
|
|
|
struct device;
|
|
struct i2c_client;
|
|
struct regmap_config;
|
|
struct sx_common_data;
|
|
|
|
#define SX_COMMON_REG_IRQ_SRC 0x00
|
|
|
|
#define SX_COMMON_MAX_NUM_CHANNELS 4
|
|
static_assert(SX_COMMON_MAX_NUM_CHANNELS < BITS_PER_LONG);
|
|
|
|
struct sx_common_reg_default {
|
|
u8 reg;
|
|
u8 def;
|
|
const char *property;
|
|
};
|
|
|
|
/**
|
|
* struct sx_common_ops: function pointers needed by common code
|
|
*
|
|
* List functions needed by common code to gather information or configure
|
|
* the sensor.
|
|
*
|
|
* @read_prox_data: Function to read raw proximity data.
|
|
* @check_whoami: Set device name based on whoami register.
|
|
* @init_compensation: Function to set initial compensation.
|
|
* @wait_for_sample: When there are no physical IRQ, function to wait for a
|
|
* sample to be ready.
|
|
* @get_default_reg: Populate the initial value for a given register.
|
|
*/
|
|
struct sx_common_ops {
|
|
int (*read_prox_data)(struct sx_common_data *data,
|
|
const struct iio_chan_spec *chan, __be16 *val);
|
|
int (*check_whoami)(struct device *dev, struct iio_dev *indio_dev);
|
|
int (*init_compensation)(struct iio_dev *indio_dev);
|
|
int (*wait_for_sample)(struct sx_common_data *data);
|
|
const struct sx_common_reg_default *
|
|
(*get_default_reg)(struct device *dev, int idx,
|
|
struct sx_common_reg_default *reg_def);
|
|
};
|
|
|
|
/**
|
|
* struct sx_common_chip_info: Semtech Sensor private chip information
|
|
*
|
|
* @reg_stat: Main status register address.
|
|
* @reg_irq_msk: IRQ mask register address.
|
|
* @reg_enable_chan: Address to enable/disable channels.
|
|
* Each phase presented by the sensor is an IIO channel..
|
|
* @reg_reset: Reset register address.
|
|
* @mask_enable_chan: Mask over the channels bits in the enable channel
|
|
* register.
|
|
* @stat_offset: Offset to check phase status.
|
|
* @irq_msk_offset: Offset to enable interrupt in the IRQ mask
|
|
* register.
|
|
* @num_channels: Number of channels.
|
|
* @num_default_regs: Number of internal registers that can be configured.
|
|
*
|
|
* @ops: Private functions pointers.
|
|
* @iio_channels: Description of exposed iio channels.
|
|
* @num_iio_channels: Number of iio_channels.
|
|
* @iio_info: iio_info structure for this driver.
|
|
*/
|
|
struct sx_common_chip_info {
|
|
unsigned int reg_stat;
|
|
unsigned int reg_irq_msk;
|
|
unsigned int reg_enable_chan;
|
|
unsigned int reg_reset;
|
|
|
|
unsigned int mask_enable_chan;
|
|
unsigned int stat_offset;
|
|
unsigned int irq_msk_offset;
|
|
unsigned int num_channels;
|
|
int num_default_regs;
|
|
|
|
struct sx_common_ops ops;
|
|
|
|
const struct iio_chan_spec *iio_channels;
|
|
int num_iio_channels;
|
|
struct iio_info iio_info;
|
|
};
|
|
|
|
/**
|
|
* struct sx_common_data: Semtech Sensor private data structure.
|
|
*
|
|
* @chip_info: Structure defining sensor internals.
|
|
* @mutex: Serialize access to registers and channel configuration.
|
|
* @completion: completion object to wait for data acquisition.
|
|
* @client: I2C client structure.
|
|
* @trig: IIO trigger object.
|
|
* @regmap: Register map.
|
|
* @chan_prox_stat: Last reading of the proximity status for each channel.
|
|
* We only send an event to user space when this changes.
|
|
* @trigger_enabled: True when the device trigger is enabled.
|
|
* @buffer: Buffer to store raw samples.
|
|
* @suspend_ctrl: Remember enabled channels and sample rate during suspend.
|
|
* @chan_read: Bit field for each raw channel enabled.
|
|
* @chan_event: Bit field for each event enabled.
|
|
*/
|
|
struct sx_common_data {
|
|
const struct sx_common_chip_info *chip_info;
|
|
|
|
struct mutex mutex;
|
|
struct completion completion;
|
|
struct i2c_client *client;
|
|
struct iio_trigger *trig;
|
|
struct regmap *regmap;
|
|
|
|
unsigned long chan_prox_stat;
|
|
bool trigger_enabled;
|
|
|
|
/* Ensure correct alignment of timestamp when present. */
|
|
struct {
|
|
__be16 channels[SX_COMMON_MAX_NUM_CHANNELS];
|
|
s64 ts __aligned(8);
|
|
} buffer;
|
|
|
|
unsigned int suspend_ctrl;
|
|
unsigned long chan_read;
|
|
unsigned long chan_event;
|
|
};
|
|
|
|
int sx_common_read_proximity(struct sx_common_data *data,
|
|
const struct iio_chan_spec *chan, int *val);
|
|
|
|
int sx_common_read_event_config(struct iio_dev *indio_dev,
|
|
const struct iio_chan_spec *chan,
|
|
enum iio_event_type type,
|
|
enum iio_event_direction dir);
|
|
int sx_common_write_event_config(struct iio_dev *indio_dev,
|
|
const struct iio_chan_spec *chan,
|
|
enum iio_event_type type,
|
|
enum iio_event_direction dir, int state);
|
|
|
|
int sx_common_probe(struct i2c_client *client,
|
|
const struct sx_common_chip_info *chip_info,
|
|
const struct regmap_config *regmap_config);
|
|
|
|
void sx_common_get_raw_register_config(struct device *dev,
|
|
struct sx_common_reg_default *reg_def);
|
|
|
|
/* 3 is the number of events defined by a single phase. */
|
|
extern const struct iio_event_spec sx_common_events[3];
|
|
|
|
#endif /* IIO_SX_COMMON_H */
|