linux-stable/drivers/iio/proximity/sx_common.h
Gwendal Grignou e522a6f7cb iio: proximity: sx_common: Add old register mapping
Older firmwares still send sensor configuration using a list of
registers with opaque values defined during sensor tuning.
sx9234 and sx9360 sensor on ACPI based devices are concerned.
More schema to configure the sensors will be needed to support devices
designed for windows, like Samsung Galaxy Book2.

Support schema is: "<_HID>.<register_name>". For instance
"STH9324,reg_adv_ctrl2" in:

    Scope (\_SB.PCI0.I2C2)
    {
        Device (SX28)
        {
            Name (_HID, "STH9324")  // _HID: Hardware ID
...
            Name (_DSD, Package (0x02)  // _DSD: Device-Specific Data
            {
                ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /*
Device Properties for _DSD */,
                Package (0x3F)
                {
...
                    Package (0x02)
                    {
                        "STH9324,reg_adv_ctrl2",
                        Zero
                    },`

Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Link: https://lore.kernel.org/r/20230211002421.3447060-1-gwendal@chromium.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
2023-03-11 12:18:28 +00:00

159 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 */