160 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * Copyright 2021 Google LLC.4 *5 * Code shared between most Semtech SAR sensor driver.6 */7 8#ifndef IIO_SX_COMMON_H9#define IIO_SX_COMMON_H10 11#include <linux/acpi.h>12#include <linux/iio/iio.h>13#include <linux/iio/types.h>14#include <linux/regulator/consumer.h>15#include <linux/types.h>16 17struct device;18struct i2c_client;19struct regmap_config;20struct sx_common_data;21 22#define SX_COMMON_REG_IRQ_SRC 0x0023 24#define SX_COMMON_MAX_NUM_CHANNELS 425static_assert(SX_COMMON_MAX_NUM_CHANNELS < BITS_PER_LONG);26 27struct sx_common_reg_default {28 u8 reg;29 u8 def;30 const char *property;31};32 33/**34 * struct sx_common_ops: function pointers needed by common code35 *36 * List functions needed by common code to gather information or configure37 * the sensor.38 *39 * @read_prox_data: Function to read raw proximity data.40 * @check_whoami: Set device name based on whoami register.41 * @init_compensation: Function to set initial compensation.42 * @wait_for_sample: When there are no physical IRQ, function to wait for a43 * sample to be ready.44 * @get_default_reg: Populate the initial value for a given register.45 */46struct sx_common_ops {47 int (*read_prox_data)(struct sx_common_data *data,48 const struct iio_chan_spec *chan, __be16 *val);49 int (*check_whoami)(struct device *dev, struct iio_dev *indio_dev);50 int (*init_compensation)(struct iio_dev *indio_dev);51 int (*wait_for_sample)(struct sx_common_data *data);52 const struct sx_common_reg_default *53 (*get_default_reg)(struct device *dev, int idx,54 struct sx_common_reg_default *reg_def);55};56 57/**58 * struct sx_common_chip_info: Semtech Sensor private chip information59 *60 * @reg_stat: Main status register address.61 * @reg_irq_msk: IRQ mask register address.62 * @reg_enable_chan: Address to enable/disable channels.63 * Each phase presented by the sensor is an IIO channel..64 * @reg_reset: Reset register address.65 * @mask_enable_chan: Mask over the channels bits in the enable channel66 * register.67 * @stat_offset: Offset to check phase status.68 * @irq_msk_offset: Offset to enable interrupt in the IRQ mask69 * register.70 * @num_channels: Number of channels.71 * @num_default_regs: Number of internal registers that can be configured.72 *73 * @ops: Private functions pointers.74 * @iio_channels: Description of exposed iio channels.75 * @num_iio_channels: Number of iio_channels.76 * @iio_info: iio_info structure for this driver.77 */78struct sx_common_chip_info {79 unsigned int reg_stat;80 unsigned int reg_irq_msk;81 unsigned int reg_enable_chan;82 unsigned int reg_reset;83 84 unsigned int mask_enable_chan;85 unsigned int stat_offset;86 unsigned int irq_msk_offset;87 unsigned int num_channels;88 int num_default_regs;89 90 struct sx_common_ops ops;91 92 const struct iio_chan_spec *iio_channels;93 int num_iio_channels;94 struct iio_info iio_info;95};96 97/**98 * struct sx_common_data: Semtech Sensor private data structure.99 *100 * @chip_info: Structure defining sensor internals.101 * @mutex: Serialize access to registers and channel configuration.102 * @completion: completion object to wait for data acquisition.103 * @client: I2C client structure.104 * @trig: IIO trigger object.105 * @regmap: Register map.106 * @chan_prox_stat: Last reading of the proximity status for each channel.107 * We only send an event to user space when this changes.108 * @trigger_enabled: True when the device trigger is enabled.109 * @buffer: Buffer to store raw samples.110 * @suspend_ctrl: Remember enabled channels and sample rate during suspend.111 * @chan_read: Bit field for each raw channel enabled.112 * @chan_event: Bit field for each event enabled.113 */114struct sx_common_data {115 const struct sx_common_chip_info *chip_info;116 117 struct mutex mutex;118 struct completion completion;119 struct i2c_client *client;120 struct iio_trigger *trig;121 struct regmap *regmap;122 123 unsigned long chan_prox_stat;124 bool trigger_enabled;125 126 /* Ensure correct alignment of timestamp when present. */127 struct {128 __be16 channels[SX_COMMON_MAX_NUM_CHANNELS];129 s64 ts __aligned(8);130 } buffer;131 132 unsigned int suspend_ctrl;133 unsigned long chan_read;134 unsigned long chan_event;135};136 137int sx_common_read_proximity(struct sx_common_data *data,138 const struct iio_chan_spec *chan, int *val);139 140int sx_common_read_event_config(struct iio_dev *indio_dev,141 const struct iio_chan_spec *chan,142 enum iio_event_type type,143 enum iio_event_direction dir);144int sx_common_write_event_config(struct iio_dev *indio_dev,145 const struct iio_chan_spec *chan,146 enum iio_event_type type,147 enum iio_event_direction dir, int state);148 149int sx_common_probe(struct i2c_client *client,150 const struct sx_common_chip_info *chip_info,151 const struct regmap_config *regmap_config);152 153void sx_common_get_raw_register_config(struct device *dev,154 struct sx_common_reg_default *reg_def);155 156/* 3 is the number of events defined by a single phase. */157extern const struct iio_event_spec sx_common_events[3];158 159#endif /* IIO_SX_COMMON_H */160