summaryrefslogtreecommitdiff
path: root/drivers/iio/proximity/sx_common.h
blob: 49d4517103b0f49b064c58b5b4fe69e6a643c171 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* 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/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;
};

/**
 * 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.
 * @num_default_regs:	Number of default registers to set at init.
 * @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);

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