xref: /linux-6.15/include/linux/rmi.h (revision 261bfb33)
1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
22b6a321dSAndrew Duggan /*
32b6a321dSAndrew Duggan  * Copyright (c) 2011-2016 Synaptics Incorporated
42b6a321dSAndrew Duggan  * Copyright (c) 2011 Unixphere
52b6a321dSAndrew Duggan  */
62b6a321dSAndrew Duggan 
72b6a321dSAndrew Duggan #ifndef _RMI_H
82b6a321dSAndrew Duggan #define _RMI_H
92b6a321dSAndrew Duggan #include <linux/kernel.h>
102b6a321dSAndrew Duggan #include <linux/device.h>
112b6a321dSAndrew Duggan #include <linux/interrupt.h>
122b6a321dSAndrew Duggan #include <linux/input.h>
13b908d3cdSBenjamin Tissoires #include <linux/kfifo.h>
142b6a321dSAndrew Duggan #include <linux/list.h>
152b6a321dSAndrew Duggan #include <linux/module.h>
162b6a321dSAndrew Duggan #include <linux/types.h>
172b6a321dSAndrew Duggan 
182b6a321dSAndrew Duggan #define NAME_BUFFER_SIZE 256
192b6a321dSAndrew Duggan 
202b6a321dSAndrew Duggan /**
21ff8f8370SAndrew Duggan  * struct rmi_2d_axis_alignment - target axis alignment
22ff8f8370SAndrew Duggan  * @swap_axes: set to TRUE if desired to swap x- and y-axis
23ff8f8370SAndrew Duggan  * @flip_x: set to TRUE if desired to flip direction on x-axis
24ff8f8370SAndrew Duggan  * @flip_y: set to TRUE if desired to flip direction on y-axis
25ff8f8370SAndrew Duggan  * @clip_x_low - reported X coordinates below this setting will be clipped to
26ff8f8370SAndrew Duggan  *               the specified value
27ff8f8370SAndrew Duggan  * @clip_x_high - reported X coordinates above this setting will be clipped to
28ff8f8370SAndrew Duggan  *               the specified value
29ff8f8370SAndrew Duggan  * @clip_y_low - reported Y coordinates below this setting will be clipped to
30ff8f8370SAndrew Duggan  *               the specified value
31ff8f8370SAndrew Duggan  * @clip_y_high - reported Y coordinates above this setting will be clipped to
32ff8f8370SAndrew Duggan  *               the specified value
33ff8f8370SAndrew Duggan  * @offset_x - this value will be added to all reported X coordinates
34ff8f8370SAndrew Duggan  * @offset_y - this value will be added to all reported Y coordinates
35ff8f8370SAndrew Duggan  * @rel_report_enabled - if set to true, the relative reporting will be
36ff8f8370SAndrew Duggan  *               automatically enabled for this sensor.
37ff8f8370SAndrew Duggan  */
38ff8f8370SAndrew Duggan struct rmi_2d_axis_alignment {
39ff8f8370SAndrew Duggan 	bool swap_axes;
40ff8f8370SAndrew Duggan 	bool flip_x;
41ff8f8370SAndrew Duggan 	bool flip_y;
42ff8f8370SAndrew Duggan 	u16 clip_x_low;
43ff8f8370SAndrew Duggan 	u16 clip_y_low;
44ff8f8370SAndrew Duggan 	u16 clip_x_high;
45ff8f8370SAndrew Duggan 	u16 clip_y_high;
46ff8f8370SAndrew Duggan 	u16 offset_x;
47ff8f8370SAndrew Duggan 	u16 offset_y;
48ff8f8370SAndrew Duggan 	u8 delta_x_threshold;
49ff8f8370SAndrew Duggan 	u8 delta_y_threshold;
50ff8f8370SAndrew Duggan };
51ff8f8370SAndrew Duggan 
52ff8f8370SAndrew Duggan /** This is used to override any hints an F11 2D sensor might have provided
53ff8f8370SAndrew Duggan  * as to what type of sensor it is.
54ff8f8370SAndrew Duggan  *
55ff8f8370SAndrew Duggan  * @rmi_f11_sensor_default - do not override, determine from F11_2D_QUERY14 if
56ff8f8370SAndrew Duggan  * available.
57ff8f8370SAndrew Duggan  * @rmi_f11_sensor_touchscreen - treat the sensor as a touchscreen (direct
58ff8f8370SAndrew Duggan  * pointing).
59ff8f8370SAndrew Duggan  * @rmi_f11_sensor_touchpad - thread the sensor as a touchpad (indirect
60ff8f8370SAndrew Duggan  * pointing).
61ff8f8370SAndrew Duggan  */
62ff8f8370SAndrew Duggan enum rmi_sensor_type {
63ff8f8370SAndrew Duggan 	rmi_sensor_default = 0,
64ff8f8370SAndrew Duggan 	rmi_sensor_touchscreen,
65ff8f8370SAndrew Duggan 	rmi_sensor_touchpad
66ff8f8370SAndrew Duggan };
67ff8f8370SAndrew Duggan 
68ff8f8370SAndrew Duggan #define RMI_F11_DISABLE_ABS_REPORT      BIT(0)
69ff8f8370SAndrew Duggan 
70ff8f8370SAndrew Duggan /**
71ff8f8370SAndrew Duggan  * struct rmi_2d_sensor_data - overrides defaults for a 2D sensor.
72ff8f8370SAndrew Duggan  * @axis_align - provides axis alignment overrides (see above).
73ff8f8370SAndrew Duggan  * @sensor_type - Forces the driver to treat the sensor as an indirect
74ff8f8370SAndrew Duggan  * pointing device (touchpad) rather than a direct pointing device
75ff8f8370SAndrew Duggan  * (touchscreen).  This is useful when F11_2D_QUERY14 register is not
76ff8f8370SAndrew Duggan  * available.
77ff8f8370SAndrew Duggan  * @disable_report_mask - Force data to not be reported even if it is supported
78ff8f8370SAndrew Duggan  * by the firware.
79ff8f8370SAndrew Duggan  * @topbuttonpad - Used with the "5 buttons touchpads" found on the Lenovo 40
80ff8f8370SAndrew Duggan  * series
81ff8f8370SAndrew Duggan  * @kernel_tracking - most moderns RMI f11 firmwares implement Multifinger
82ff8f8370SAndrew Duggan  * Type B protocol. However, there are some corner cases where the user
83ff8f8370SAndrew Duggan  * triggers some jumps by tapping with two fingers on the touchpad.
84ff8f8370SAndrew Duggan  * Use this setting and dmax to filter out these jumps.
85ff8f8370SAndrew Duggan  * Also, when using an old sensor using MF Type A behavior, set to true to
86ff8f8370SAndrew Duggan  * report an actual MT protocol B.
87ff8f8370SAndrew Duggan  * @dmax - the maximum distance (in sensor units) the kernel tracking allows two
88ff8f8370SAndrew Duggan  * distincts fingers to be considered the same.
89ff8f8370SAndrew Duggan  */
90ff8f8370SAndrew Duggan struct rmi_2d_sensor_platform_data {
91ff8f8370SAndrew Duggan 	struct rmi_2d_axis_alignment axis_align;
92ff8f8370SAndrew Duggan 	enum rmi_sensor_type sensor_type;
93ff8f8370SAndrew Duggan 	int x_mm;
94ff8f8370SAndrew Duggan 	int y_mm;
95ff8f8370SAndrew Duggan 	int disable_report_mask;
96ff8f8370SAndrew Duggan 	u16 rezero_wait;
97ff8f8370SAndrew Duggan 	bool topbuttonpad;
98ff8f8370SAndrew Duggan 	bool kernel_tracking;
99ff8f8370SAndrew Duggan 	int dmax;
1002775e523SAndrew Duggan 	int dribble;
1012775e523SAndrew Duggan 	int palm_detect;
102ff8f8370SAndrew Duggan };
103ff8f8370SAndrew Duggan 
104ff8f8370SAndrew Duggan /**
105*261bfb33SVincent Huang  * struct rmi_gpio_data - overrides defaults for a single F30/F3A GPIOs/LED
106*261bfb33SVincent Huang  * chip.
107562b42d3SAndrew Duggan  * @buttonpad - the touchpad is a buttonpad, so enable only the first actual
108562b42d3SAndrew Duggan  * button that is found.
109*261bfb33SVincent Huang  * @trackstick_buttons - Set when the function 30 or 3a is handling the physical
1109e421b7cSBenjamin Tissoires  * buttons of the trackstick (as a PS/2 passthrough device).
111*261bfb33SVincent Huang  * @disable - the touchpad incorrectly reports F30/F3A and it should be ignored.
112562b42d3SAndrew Duggan  * This is a special case which is due to misconfigured firmware.
113562b42d3SAndrew Duggan  */
114*261bfb33SVincent Huang struct rmi_gpio_data {
115562b42d3SAndrew Duggan 	bool buttonpad;
116562b42d3SAndrew Duggan 	bool trackstick_buttons;
117562b42d3SAndrew Duggan 	bool disable;
118562b42d3SAndrew Duggan };
119562b42d3SAndrew Duggan 
1202775e523SAndrew Duggan 
1212775e523SAndrew Duggan /*
1222775e523SAndrew Duggan  * Set the state of a register
1232775e523SAndrew Duggan  *	DEFAULT - use the default value set by the firmware config
1242775e523SAndrew Duggan  *	OFF - explicitly disable the register
1252775e523SAndrew Duggan  *	ON - explicitly enable the register
1262b6a321dSAndrew Duggan  */
1272775e523SAndrew Duggan enum rmi_reg_state {
1282775e523SAndrew Duggan 	RMI_REG_STATE_DEFAULT = 0,
1292775e523SAndrew Duggan 	RMI_REG_STATE_OFF = 1,
1302775e523SAndrew Duggan 	RMI_REG_STATE_ON = 2
1312b6a321dSAndrew Duggan };
1322b6a321dSAndrew Duggan 
1332b6a321dSAndrew Duggan /**
1342b6a321dSAndrew Duggan  * struct rmi_f01_power_management -When non-zero, these values will be written
1352b6a321dSAndrew Duggan  * to the touch sensor to override the default firmware settigns.  For a
1362b6a321dSAndrew Duggan  * detailed explanation of what each field does, see the corresponding
1372b6a321dSAndrew Duggan  * documention in the RMI4 specification.
1382b6a321dSAndrew Duggan  *
1392b6a321dSAndrew Duggan  * @nosleep - specifies whether the device is permitted to sleep or doze (that
1402b6a321dSAndrew Duggan  * is, enter a temporary low power state) when no fingers are touching the
1412b6a321dSAndrew Duggan  * sensor.
1422b6a321dSAndrew Duggan  * @wakeup_threshold - controls the capacitance threshold at which the touch
1432b6a321dSAndrew Duggan  * sensor will decide to wake up from that low power state.
1442b6a321dSAndrew Duggan  * @doze_holdoff - controls how long the touch sensor waits after the last
1452b6a321dSAndrew Duggan  * finger lifts before entering the doze state, in units of 100ms.
1462b6a321dSAndrew Duggan  * @doze_interval - controls the interval between checks for finger presence
1472b6a321dSAndrew Duggan  * when the touch sensor is in doze mode, in units of 10ms.
1482b6a321dSAndrew Duggan  */
1492b6a321dSAndrew Duggan struct rmi_f01_power_management {
1502775e523SAndrew Duggan 	enum rmi_reg_state nosleep;
1512b6a321dSAndrew Duggan 	u8 wakeup_threshold;
1522b6a321dSAndrew Duggan 	u8 doze_holdoff;
1532b6a321dSAndrew Duggan 	u8 doze_interval;
1542b6a321dSAndrew Duggan };
1552b6a321dSAndrew Duggan 
1562b6a321dSAndrew Duggan /**
1578d99758dSAndrew Duggan  * struct rmi_device_platform_data_spi - provides parameters used in SPI
1588d99758dSAndrew Duggan  * communications.  All Synaptics SPI products support a standard SPI
1598d99758dSAndrew Duggan  * interface; some also support what is called SPI V2 mode, depending on
1608d99758dSAndrew Duggan  * firmware and/or ASIC limitations.  In V2 mode, the touch sensor can
1618d99758dSAndrew Duggan  * support shorter delays during certain operations, and these are specified
1628d99758dSAndrew Duggan  * separately from the standard mode delays.
1638d99758dSAndrew Duggan  *
1648d99758dSAndrew Duggan  * @block_delay - for standard SPI transactions consisting of both a read and
1658d99758dSAndrew Duggan  * write operation, the delay (in microseconds) between the read and write
1668d99758dSAndrew Duggan  * operations.
1678d99758dSAndrew Duggan  * @split_read_block_delay_us - for V2 SPI transactions consisting of both a
1688d99758dSAndrew Duggan  * read and write operation, the delay (in microseconds) between the read and
1698d99758dSAndrew Duggan  * write operations.
1708d99758dSAndrew Duggan  * @read_delay_us - the delay between each byte of a read operation in normal
1718d99758dSAndrew Duggan  * SPI mode.
1728d99758dSAndrew Duggan  * @write_delay_us - the delay between each byte of a write operation in normal
1738d99758dSAndrew Duggan  * SPI mode.
1748d99758dSAndrew Duggan  * @split_read_byte_delay_us - the delay between each byte of a read operation
1758d99758dSAndrew Duggan  * in V2 mode.
1768d99758dSAndrew Duggan  * @pre_delay_us - the delay before the start of a SPI transaction.  This is
1778d99758dSAndrew Duggan  * typically useful in conjunction with custom chip select assertions (see
1788d99758dSAndrew Duggan  * below).
1798d99758dSAndrew Duggan  * @post_delay_us - the delay after the completion of an SPI transaction.  This
1808d99758dSAndrew Duggan  * is typically useful in conjunction with custom chip select assertions (see
1818d99758dSAndrew Duggan  * below).
1828d99758dSAndrew Duggan  * @cs_assert - For systems where the SPI subsystem does not control the CS/SSB
1838d99758dSAndrew Duggan  * line, or where such control is broken, you can provide a custom routine to
1848d99758dSAndrew Duggan  * handle a GPIO as CS/SSB.  This routine will be called at the beginning and
1858d99758dSAndrew Duggan  * end of each SPI transaction.  The RMI SPI implementation will wait
1868d99758dSAndrew Duggan  * pre_delay_us after this routine returns before starting the SPI transfer;
1878d99758dSAndrew Duggan  * and post_delay_us after completion of the SPI transfer(s) before calling it
1888d99758dSAndrew Duggan  * with assert==FALSE.
1898d99758dSAndrew Duggan  */
1908d99758dSAndrew Duggan struct rmi_device_platform_data_spi {
1918d99758dSAndrew Duggan 	u32 block_delay_us;
1928d99758dSAndrew Duggan 	u32 split_read_block_delay_us;
1938d99758dSAndrew Duggan 	u32 read_delay_us;
1948d99758dSAndrew Duggan 	u32 write_delay_us;
1958d99758dSAndrew Duggan 	u32 split_read_byte_delay_us;
1968d99758dSAndrew Duggan 	u32 pre_delay_us;
1978d99758dSAndrew Duggan 	u32 post_delay_us;
1988d99758dSAndrew Duggan 	u8 bits_per_word;
1998d99758dSAndrew Duggan 	u16 mode;
2008d99758dSAndrew Duggan 
2018d99758dSAndrew Duggan 	void *cs_assert_data;
2028d99758dSAndrew Duggan 	int (*cs_assert)(const void *cs_assert_data, const bool assert);
2038d99758dSAndrew Duggan };
2048d99758dSAndrew Duggan 
2058d99758dSAndrew Duggan /**
2062b6a321dSAndrew Duggan  * struct rmi_device_platform_data - system specific configuration info.
2072b6a321dSAndrew Duggan  *
2082b6a321dSAndrew Duggan  * @reset_delay_ms - after issuing a reset command to the touch sensor, the
2092b6a321dSAndrew Duggan  * driver waits a few milliseconds to give the firmware a chance to
21053aab92dSRandy Dunlap  * re-initialize.  You can override the default wait period here.
2113aeed5b5SBjorn Andersson  * @irq: irq associated with the attn gpio line, or negative
2122b6a321dSAndrew Duggan  */
2132b6a321dSAndrew Duggan struct rmi_device_platform_data {
2142b6a321dSAndrew Duggan 	int reset_delay_ms;
2153aeed5b5SBjorn Andersson 	int irq;
2162b6a321dSAndrew Duggan 
2178d99758dSAndrew Duggan 	struct rmi_device_platform_data_spi spi_data;
2188d99758dSAndrew Duggan 
2192b6a321dSAndrew Duggan 	/* function handler pdata */
2200a135b88SBenjamin Tissoires 	struct rmi_2d_sensor_platform_data sensor_pdata;
2212b6a321dSAndrew Duggan 	struct rmi_f01_power_management power_management;
222*261bfb33SVincent Huang 	struct rmi_gpio_data gpio_data;
2232b6a321dSAndrew Duggan };
2242b6a321dSAndrew Duggan 
2252b6a321dSAndrew Duggan /**
2262b6a321dSAndrew Duggan  * struct rmi_function_descriptor - RMI function base addresses
2272b6a321dSAndrew Duggan  *
2282b6a321dSAndrew Duggan  * @query_base_addr: The RMI Query base address
2292b6a321dSAndrew Duggan  * @command_base_addr: The RMI Command base address
2302b6a321dSAndrew Duggan  * @control_base_addr: The RMI Control base address
2312b6a321dSAndrew Duggan  * @data_base_addr: The RMI Data base address
2322b6a321dSAndrew Duggan  * @interrupt_source_count: The number of irqs this RMI function needs
2332b6a321dSAndrew Duggan  * @function_number: The RMI function number
2342b6a321dSAndrew Duggan  *
2352b6a321dSAndrew Duggan  * This struct is used when iterating the Page Description Table. The addresses
2362b6a321dSAndrew Duggan  * are 16-bit values to include the current page address.
2372b6a321dSAndrew Duggan  *
2382b6a321dSAndrew Duggan  */
2392b6a321dSAndrew Duggan struct rmi_function_descriptor {
2402b6a321dSAndrew Duggan 	u16 query_base_addr;
2412b6a321dSAndrew Duggan 	u16 command_base_addr;
2422b6a321dSAndrew Duggan 	u16 control_base_addr;
2432b6a321dSAndrew Duggan 	u16 data_base_addr;
2442b6a321dSAndrew Duggan 	u8 interrupt_source_count;
2452b6a321dSAndrew Duggan 	u8 function_number;
2462b6a321dSAndrew Duggan 	u8 function_version;
2472b6a321dSAndrew Duggan };
2482b6a321dSAndrew Duggan 
2492b6a321dSAndrew Duggan struct rmi_device;
2502b6a321dSAndrew Duggan 
2512b6a321dSAndrew Duggan /**
2522b6a321dSAndrew Duggan  * struct rmi_transport_dev - represent an RMI transport device
2532b6a321dSAndrew Duggan  *
2542b6a321dSAndrew Duggan  * @dev: Pointer to the communication device, e.g. i2c or spi
2552b6a321dSAndrew Duggan  * @rmi_dev: Pointer to the RMI device
2562b6a321dSAndrew Duggan  * @proto_name: name of the transport protocol (SPI, i2c, etc)
2572b6a321dSAndrew Duggan  * @ops: pointer to transport operations implementation
2582b6a321dSAndrew Duggan  *
2592b6a321dSAndrew Duggan  * The RMI transport device implements the glue between different communication
2602b6a321dSAndrew Duggan  * buses such as I2C and SPI.
2612b6a321dSAndrew Duggan  *
2622b6a321dSAndrew Duggan  */
2632b6a321dSAndrew Duggan struct rmi_transport_dev {
2642b6a321dSAndrew Duggan 	struct device *dev;
2652b6a321dSAndrew Duggan 	struct rmi_device *rmi_dev;
2662b6a321dSAndrew Duggan 
2672b6a321dSAndrew Duggan 	const char *proto_name;
2682b6a321dSAndrew Duggan 	const struct rmi_transport_ops *ops;
2692b6a321dSAndrew Duggan 
2702b6a321dSAndrew Duggan 	struct rmi_device_platform_data pdata;
2712b6a321dSAndrew Duggan 
2722b6a321dSAndrew Duggan 	struct input_dev *input;
2732b6a321dSAndrew Duggan };
2742b6a321dSAndrew Duggan 
2752b6a321dSAndrew Duggan /**
2762b6a321dSAndrew Duggan  * struct rmi_transport_ops - defines transport protocol operations.
2772b6a321dSAndrew Duggan  *
2782b6a321dSAndrew Duggan  * @write_block: Writing a block of data to the specified address
2792b6a321dSAndrew Duggan  * @read_block: Read a block of data from the specified address.
2802b6a321dSAndrew Duggan  */
2812b6a321dSAndrew Duggan struct rmi_transport_ops {
2822b6a321dSAndrew Duggan 	int (*write_block)(struct rmi_transport_dev *xport, u16 addr,
2832b6a321dSAndrew Duggan 			   const void *buf, size_t len);
2842b6a321dSAndrew Duggan 	int (*read_block)(struct rmi_transport_dev *xport, u16 addr,
2852b6a321dSAndrew Duggan 			  void *buf, size_t len);
2862b6a321dSAndrew Duggan 	int (*reset)(struct rmi_transport_dev *xport, u16 reset_addr);
2872b6a321dSAndrew Duggan };
2882b6a321dSAndrew Duggan 
2892b6a321dSAndrew Duggan /**
2902b6a321dSAndrew Duggan  * struct rmi_driver - driver for an RMI4 sensor on the RMI bus.
2912b6a321dSAndrew Duggan  *
2922b6a321dSAndrew Duggan  * @driver: Device driver model driver
2932b6a321dSAndrew Duggan  * @reset_handler: Called when a reset is detected.
2942b6a321dSAndrew Duggan  * @clear_irq_bits: Clear the specified bits in the current interrupt mask.
2952b6a321dSAndrew Duggan  * @set_irq_bist: Set the specified bits in the current interrupt mask.
2962b6a321dSAndrew Duggan  * @store_productid: Callback for cache product id from function 01
2972b6a321dSAndrew Duggan  * @data: Private data pointer
2982b6a321dSAndrew Duggan  *
2992b6a321dSAndrew Duggan  */
3002b6a321dSAndrew Duggan struct rmi_driver {
3012b6a321dSAndrew Duggan 	struct device_driver driver;
3022b6a321dSAndrew Duggan 
3032b6a321dSAndrew Duggan 	int (*reset_handler)(struct rmi_device *rmi_dev);
3042b6a321dSAndrew Duggan 	int (*clear_irq_bits)(struct rmi_device *rmi_dev, unsigned long *mask);
3052b6a321dSAndrew Duggan 	int (*set_irq_bits)(struct rmi_device *rmi_dev, unsigned long *mask);
3062b6a321dSAndrew Duggan 	int (*store_productid)(struct rmi_device *rmi_dev);
3072b6a321dSAndrew Duggan 	int (*set_input_params)(struct rmi_device *rmi_dev,
3082b6a321dSAndrew Duggan 			struct input_dev *input);
3092b6a321dSAndrew Duggan 	void *data;
3102b6a321dSAndrew Duggan };
3112b6a321dSAndrew Duggan 
3122b6a321dSAndrew Duggan /**
3132b6a321dSAndrew Duggan  * struct rmi_device - represents an RMI4 sensor device on the RMI bus.
3142b6a321dSAndrew Duggan  *
3152b6a321dSAndrew Duggan  * @dev: The device created for the RMI bus
3162b6a321dSAndrew Duggan  * @number: Unique number for the device on the bus.
3172b6a321dSAndrew Duggan  * @driver: Pointer to associated driver
3182b6a321dSAndrew Duggan  * @xport: Pointer to the transport interface
3192b6a321dSAndrew Duggan  *
3202b6a321dSAndrew Duggan  */
3212b6a321dSAndrew Duggan struct rmi_device {
3222b6a321dSAndrew Duggan 	struct device dev;
3232b6a321dSAndrew Duggan 	int number;
3242b6a321dSAndrew Duggan 
3252b6a321dSAndrew Duggan 	struct rmi_driver *driver;
3262b6a321dSAndrew Duggan 	struct rmi_transport_dev *xport;
3272b6a321dSAndrew Duggan 
3282b6a321dSAndrew Duggan };
3292b6a321dSAndrew Duggan 
330b908d3cdSBenjamin Tissoires struct rmi4_attn_data {
331b908d3cdSBenjamin Tissoires 	unsigned long irq_status;
332b908d3cdSBenjamin Tissoires 	size_t size;
333b908d3cdSBenjamin Tissoires 	void *data;
334b908d3cdSBenjamin Tissoires };
335b908d3cdSBenjamin Tissoires 
3362b6a321dSAndrew Duggan struct rmi_driver_data {
3372b6a321dSAndrew Duggan 	struct list_head function_list;
3382b6a321dSAndrew Duggan 
3392b6a321dSAndrew Duggan 	struct rmi_device *rmi_dev;
3402b6a321dSAndrew Duggan 
3412b6a321dSAndrew Duggan 	struct rmi_function *f01_container;
34229fd0ec2SNick Dyer 	struct rmi_function *f34_container;
3435191d88aSNick Dyer 	bool bootloader_mode;
3442b6a321dSAndrew Duggan 
3452b6a321dSAndrew Duggan 	int num_of_irq_regs;
3462b6a321dSAndrew Duggan 	int irq_count;
34729fd0ec2SNick Dyer 	void *irq_memory;
3482b6a321dSAndrew Duggan 	unsigned long *irq_status;
3492b6a321dSAndrew Duggan 	unsigned long *fn_irq_bits;
3502b6a321dSAndrew Duggan 	unsigned long *current_irq_mask;
3512b6a321dSAndrew Duggan 	unsigned long *new_irq_mask;
3522b6a321dSAndrew Duggan 	struct mutex irq_mutex;
3532b6a321dSAndrew Duggan 	struct input_dev *input;
3542b6a321dSAndrew Duggan 
35524d28e4fSNick Dyer 	struct irq_domain *irqdomain;
35624d28e4fSNick Dyer 
3572b6a321dSAndrew Duggan 	u8 pdt_props;
3582b6a321dSAndrew Duggan 
359c762cc68SGuenter Roeck 	u8 num_rx_electrodes;
360c762cc68SGuenter Roeck 	u8 num_tx_electrodes;
361c762cc68SGuenter Roeck 
3622b6a321dSAndrew Duggan 	bool enabled;
363a64ea311SBenjamin Tissoires 	struct mutex enabled_mutex;
364ae9979c3SBenjamin Tissoires 
365ae9979c3SBenjamin Tissoires 	struct rmi4_attn_data attn_data;
366b908d3cdSBenjamin Tissoires 	DECLARE_KFIFO(attn_fifo, struct rmi4_attn_data, 16);
3672b6a321dSAndrew Duggan };
3682b6a321dSAndrew Duggan 
3692b6a321dSAndrew Duggan int rmi_register_transport_device(struct rmi_transport_dev *xport);
3702b6a321dSAndrew Duggan void rmi_unregister_transport_device(struct rmi_transport_dev *xport);
3712b6a321dSAndrew Duggan 
372b908d3cdSBenjamin Tissoires void rmi_set_attn_data(struct rmi_device *rmi_dev, unsigned long irq_status,
373b908d3cdSBenjamin Tissoires 		       void *data, size_t size);
374b908d3cdSBenjamin Tissoires 
3753aeed5b5SBjorn Andersson int rmi_driver_suspend(struct rmi_device *rmi_dev, bool enable_wake);
3763aeed5b5SBjorn Andersson int rmi_driver_resume(struct rmi_device *rmi_dev, bool clear_wake);
3772b6a321dSAndrew Duggan #endif
378