blob: ecb9b9415e8ad8f8a1a47b2f4c75dce7b0a7f340 [file] [log] [blame]
Alexandra Chin669d27c2012-12-24 15:42:30 +08001/*
2 * Synaptics RMI4 touchscreen driver
3 *
4 * Copyright (C) 2012 Synaptics Incorporated
5 *
6 * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
7 * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 */
19
20#ifndef _SYNAPTICS_DSX_RMI4_H_
21#define _SYNAPTICS_DSX_RMI4_H_
22
Alexandra Chind5591a62013-02-07 12:59:15 -080023#define SYNAPTICS_RMI4_DS4 0x0001
24#define SYNAPTICS_RMI4_DS5 0x0002
25#define SYNAPTICS_RMI4_DRIVER_PRODUCT SYNAPTICS_RMI4_DS4
26#define SYNAPTICS_RMI4_DRIVER_VERSION 0x1001
Alexandra Chin669d27c2012-12-24 15:42:30 +080027
28#include <linux/version.h>
29#ifdef CONFIG_HAS_EARLYSUSPEND
30#include <linux/earlysuspend.h>
31#endif
32
33#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38))
34#define KERNEL_ABOVE_2_6_38
35#endif
36
37#ifdef KERNEL_ABOVE_2_6_38
38#define sstrtoul(...) kstrtoul(__VA_ARGS__)
39#else
40#define sstrtoul(...) strict_strtoul(__VA_ARGS__)
41#endif
42
43#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 7, 0))
44#define KERNEL_ABOVE_3_7
45#endif
46
47#define PDT_PROPS (0x00EF)
48#define PDT_START (0x00E9)
49#define PDT_END (0x000A)
50#define PDT_ENTRY_SIZE (0x0006)
51#define PAGES_TO_SERVICE (10)
52#define PAGE_SELECT_LEN (2)
53
54#define SYNAPTICS_RMI4_F01 (0x01)
55#define SYNAPTICS_RMI4_F11 (0x11)
56#define SYNAPTICS_RMI4_F1A (0x1a)
57#define SYNAPTICS_RMI4_F34 (0x34)
58#define SYNAPTICS_RMI4_F54 (0x54)
59#define SYNAPTICS_RMI4_F55 (0x55)
60
61#define SYNAPTICS_RMI4_PRODUCT_INFO_SIZE 2
62#define SYNAPTICS_RMI4_DATE_CODE_SIZE 3
63#define SYNAPTICS_RMI4_PRODUCT_ID_SIZE 10
64#define SYNAPTICS_RMI4_BUILD_ID_SIZE 3
65
66#define MAX_NUMBER_OF_FINGERS 10
67#define MAX_NUMBER_OF_BUTTONS 4
68#define MAX_INTR_REGISTERS 4
69
70#define MASK_16BIT 0xFFFF
71#define MASK_8BIT 0xFF
72#define MASK_7BIT 0x7F
73#define MASK_6BIT 0x3F
74#define MASK_5BIT 0x1F
75#define MASK_4BIT 0x0F
76#define MASK_3BIT 0x07
77#define MASK_2BIT 0x03
78#define MASK_1BIT 0x01
79
80/*
81 * struct synaptics_rmi4_fn_desc - function descriptor fields in PDT
82 * @query_base_addr: base address for query registers
83 * @cmd_base_addr: base address for command registers
84 * @ctrl_base_addr: base address for control registers
85 * @data_base_addr: base address for data registers
86 * @intr_src_count: number of interrupt sources
87 * @fn_number: function number
88 */
89struct synaptics_rmi4_fn_desc {
90 unsigned char query_base_addr;
91 unsigned char cmd_base_addr;
92 unsigned char ctrl_base_addr;
93 unsigned char data_base_addr;
94 unsigned char intr_src_count;
95 unsigned char fn_number;
96};
97
98/*
99 * synaptics_rmi4_fn_full_addr - full 16-bit base addresses
100 * @query_base: 16-bit base address for query registers
101 * @cmd_base: 16-bit base address for data registers
102 * @ctrl_base: 16-bit base address for command registers
103 * @data_base: 16-bit base address for control registers
104 */
105struct synaptics_rmi4_fn_full_addr {
106 unsigned short query_base;
107 unsigned short cmd_base;
108 unsigned short ctrl_base;
109 unsigned short data_base;
110};
111
112/*
113 * struct synaptics_rmi4_fn - function handler data structure
114 * @fn_number: function number
115 * @num_of_data_sources: number of data sources
116 * @num_of_data_points: maximum number of fingers supported
117 * @size_of_data_register_block: data register block size
118 * @data1_offset: offset to data1 register from data base address
119 * @intr_reg_num: index to associated interrupt register
120 * @intr_mask: interrupt mask
121 * @full_addr: full 16-bit base addresses of function registers
122 * @link: linked list for function handlers
123 * @data_size: size of private data
124 * @data: pointer to private data
125 */
126struct synaptics_rmi4_fn {
127 unsigned char fn_number;
128 unsigned char num_of_data_sources;
129 unsigned char num_of_data_points;
130 unsigned char size_of_data_register_block;
131 unsigned char data1_offset;
132 unsigned char intr_reg_num;
133 unsigned char intr_mask;
134 struct synaptics_rmi4_fn_full_addr full_addr;
135 struct list_head link;
136 int data_size;
137 void *data;
138};
139
140/*
141 * struct synaptics_rmi4_device_info - device information
142 * @version_major: rmi protocol major version number
143 * @version_minor: rmi protocol minor version number
144 * @manufacturer_id: manufacturer id
145 * @product_props: product properties information
146 * @product_info: product info array
147 * @date_code: device manufacture date
148 * @tester_id: tester id array
149 * @serial_number: device serial number
150 * @product_id_string: device product id
151 * @support_fn_list: linked list for function handlers
152 */
153struct synaptics_rmi4_device_info {
154 unsigned int version_major;
155 unsigned int version_minor;
156 unsigned char manufacturer_id;
157 unsigned char product_props;
158 unsigned char product_info[SYNAPTICS_RMI4_PRODUCT_INFO_SIZE];
159 unsigned char date_code[SYNAPTICS_RMI4_DATE_CODE_SIZE];
160 unsigned short tester_id;
161 unsigned short serial_number;
162 unsigned char product_id_string[SYNAPTICS_RMI4_PRODUCT_ID_SIZE + 1];
163 unsigned char build_id[SYNAPTICS_RMI4_BUILD_ID_SIZE];
Alexandra Chind5591a62013-02-07 12:59:15 -0800164 unsigned char config_id[3];
Alexandra Chin669d27c2012-12-24 15:42:30 +0800165 struct list_head support_fn_list;
166};
167
168/*
169 * struct synaptics_rmi4_data - rmi4 device instance data
170 * @i2c_client: pointer to associated i2c client
171 * @input_dev: pointer to associated input device
172 * @board: constant pointer to platform data
173 * @rmi4_mod_info: device information
174 * @regulator: pointer to associated regulator
175 * @rmi4_io_ctrl_mutex: mutex for i2c i/o control
176 * @det_work: work thread instance for expansion function detection
177 * @det_workqueue: pointer to work queue for work thread instance
178 * @early_suspend: instance to support early suspend power management
179 * @current_page: current page in sensor to acess
180 * @button_0d_enabled: flag for 0d button support
181 * @full_pm_cycle: flag for full power management cycle in early suspend stage
182 * @num_of_intr_regs: number of interrupt registers
183 * @f01_query_base_addr: query base address for f01
184 * @f01_cmd_base_addr: command base address for f01
185 * @f01_ctrl_base_addr: control base address for f01
186 * @f01_data_base_addr: data base address for f01
187 * @irq: attention interrupt
188 * @sensor_max_x: sensor maximum x value
189 * @sensor_max_y: sensor maximum y value
190 * @irq_enabled: flag for indicating interrupt enable status
191 * @touch_stopped: flag to stop interrupt thread processing
192 * @fingers_on_2d: flag to indicate presence of fingers in 2d area
193 * @sensor_sleep: flag to indicate sleep state of sensor
194 * @wait: wait queue for touch data polling in interrupt thread
195 * @i2c_read: pointer to i2c read function
196 * @i2c_write: pointer to i2c write function
197 * @irq_enable: pointer to irq enable function
198 */
199struct synaptics_rmi4_data {
200 struct i2c_client *i2c_client;
201 struct input_dev *input_dev;
202 const struct synaptics_rmi4_platform_data *board;
203 struct synaptics_rmi4_device_info rmi4_mod_info;
204 struct regulator *regulator;
205 struct mutex rmi4_io_ctrl_mutex;
206 struct delayed_work det_work;
207 struct workqueue_struct *det_workqueue;
208 struct early_suspend early_suspend;
209 unsigned char current_page;
210 unsigned char button_0d_enabled;
211 unsigned char full_pm_cycle;
212 unsigned char num_of_rx;
213 unsigned char num_of_tx;
214 unsigned char num_of_fingers;
215 unsigned char intr_mask[MAX_INTR_REGISTERS];
216 unsigned short num_of_intr_regs;
217 unsigned short f01_query_base_addr;
218 unsigned short f01_cmd_base_addr;
219 unsigned short f01_ctrl_base_addr;
220 unsigned short f01_data_base_addr;
221 int irq;
222 int sensor_max_x;
223 int sensor_max_y;
224 bool irq_enabled;
225 bool touch_stopped;
226 bool fingers_on_2d;
227 bool sensor_sleep;
228 wait_queue_head_t wait;
229 int (*i2c_read)(struct synaptics_rmi4_data *pdata, unsigned short addr,
230 unsigned char *data, unsigned short length);
231 int (*i2c_write)(struct synaptics_rmi4_data *pdata, unsigned short addr,
232 unsigned char *data, unsigned short length);
233 int (*irq_enable)(struct synaptics_rmi4_data *rmi4_data, bool enable);
234 int (*reset_device)(struct synaptics_rmi4_data *rmi4_data);
235};
236
237enum exp_fn {
238 RMI_DEV = 0,
239 RMI_F34,
240 RMI_F54,
241 RMI_FW_UPDATER,
242 RMI_LAST,
243};
244
245struct synaptics_rmi4_exp_fn_ptr {
246 int (*read)(struct synaptics_rmi4_data *rmi4_data, unsigned short addr,
247 unsigned char *data, unsigned short length);
248 int (*write)(struct synaptics_rmi4_data *rmi4_data, unsigned short addr,
249 unsigned char *data, unsigned short length);
250 int (*enable)(struct synaptics_rmi4_data *rmi4_data, bool enable);
251};
252
253void synaptics_rmi4_new_function(enum exp_fn fn_type, bool insert,
254 int (*func_init)(struct synaptics_rmi4_data *rmi4_data),
255 void (*func_remove)(struct synaptics_rmi4_data *rmi4_data),
256 void (*func_attn)(struct synaptics_rmi4_data *rmi4_data,
257 unsigned char intr_mask));
258
259static inline ssize_t synaptics_rmi4_show_error(struct device *dev,
260 struct device_attribute *attr, char *buf)
261{
262 dev_warn(dev, "%s Attempted to read from write-only attribute %s\n",
263 __func__, attr->attr.name);
264 return -EPERM;
265}
266
267static inline ssize_t synaptics_rmi4_store_error(struct device *dev,
268 struct device_attribute *attr, const char *buf, size_t count)
269{
270 dev_warn(dev, "%s Attempted to write to read-only attribute %s\n",
271 __func__, attr->attr.name);
272 return -EPERM;
273}
274
275static inline void batohs(unsigned short *dest, unsigned char *src)
276{
277 *dest = src[1] * 0x100 + src[0];
278}
279
280static inline void hstoba(unsigned char *dest, unsigned short src)
281{
282 dest[0] = src % 0x100;
283 dest[1] = src / 0x100;
284}
285
286#endif