Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6-block.git] / drivers / input / rmi4 / rmi_f01.c
1 /*
2  * Copyright (c) 2011-2016 Synaptics Incorporated
3  * Copyright (c) 2011 Unixphere
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published by
7  * the Free Software Foundation.
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/rmi.h>
12 #include <linux/slab.h>
13 #include <linux/uaccess.h>
14 #include <linux/of.h>
15 #include "rmi_driver.h"
16
17 #define RMI_PRODUCT_ID_LENGTH    10
18 #define RMI_PRODUCT_INFO_LENGTH   2
19
20 #define RMI_DATE_CODE_LENGTH      3
21
22 #define PRODUCT_ID_OFFSET 0x10
23 #define PRODUCT_INFO_OFFSET 0x1E
24
25
26 /* Force a firmware reset of the sensor */
27 #define RMI_F01_CMD_DEVICE_RESET        1
28
29 /* Various F01_RMI_QueryX bits */
30
31 #define RMI_F01_QRY1_CUSTOM_MAP         BIT(0)
32 #define RMI_F01_QRY1_NON_COMPLIANT      BIT(1)
33 #define RMI_F01_QRY1_HAS_LTS            BIT(2)
34 #define RMI_F01_QRY1_HAS_SENSOR_ID      BIT(3)
35 #define RMI_F01_QRY1_HAS_CHARGER_INP    BIT(4)
36 #define RMI_F01_QRY1_HAS_ADJ_DOZE       BIT(5)
37 #define RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF  BIT(6)
38 #define RMI_F01_QRY1_HAS_QUERY42        BIT(7)
39
40 #define RMI_F01_QRY5_YEAR_MASK          0x1f
41 #define RMI_F01_QRY6_MONTH_MASK         0x0f
42 #define RMI_F01_QRY7_DAY_MASK           0x1f
43
44 #define RMI_F01_QRY2_PRODINFO_MASK      0x7f
45
46 #define RMI_F01_BASIC_QUERY_LEN         21 /* From Query 00 through 20 */
47
48 struct f01_basic_properties {
49         u8 manufacturer_id;
50         bool has_lts;
51         bool has_adjustable_doze;
52         bool has_adjustable_doze_holdoff;
53         char dom[11]; /* YYYY/MM/DD + '\0' */
54         u8 product_id[RMI_PRODUCT_ID_LENGTH + 1];
55         u16 productinfo;
56         u32 firmware_id;
57 };
58
59 /* F01 device status bits */
60
61 /* Most recent device status event */
62 #define RMI_F01_STATUS_CODE(status)             ((status) & 0x0f)
63 /* The device has lost its configuration for some reason. */
64 #define RMI_F01_STATUS_UNCONFIGURED(status)     (!!((status) & 0x80))
65 /* The device is in bootloader mode */
66 #define RMI_F01_STATUS_BOOTLOADER(status)       ((status) & 0x40)
67
68 /* Control register bits */
69
70 /*
71  * Sleep mode controls power management on the device and affects all
72  * functions of the device.
73  */
74 #define RMI_F01_CTRL0_SLEEP_MODE_MASK   0x03
75
76 #define RMI_SLEEP_MODE_NORMAL           0x00
77 #define RMI_SLEEP_MODE_SENSOR_SLEEP     0x01
78 #define RMI_SLEEP_MODE_RESERVED0        0x02
79 #define RMI_SLEEP_MODE_RESERVED1        0x03
80
81 /*
82  * This bit disables whatever sleep mode may be selected by the sleep_mode
83  * field and forces the device to run at full power without sleeping.
84  */
85 #define RMI_F01_CTRL0_NOSLEEP_BIT       BIT(2)
86
87 /*
88  * When this bit is set, the touch controller employs a noise-filtering
89  * algorithm designed for use with a connected battery charger.
90  */
91 #define RMI_F01_CTRL0_CHARGER_BIT       BIT(5)
92
93 /*
94  * Sets the report rate for the device. The effect of this setting is
95  * highly product dependent. Check the spec sheet for your particular
96  * touch sensor.
97  */
98 #define RMI_F01_CTRL0_REPORTRATE_BIT    BIT(6)
99
100 /*
101  * Written by the host as an indicator that the device has been
102  * successfully configured.
103  */
104 #define RMI_F01_CTRL0_CONFIGURED_BIT    BIT(7)
105
106 /**
107  * @ctrl0 - see the bit definitions above.
108  * @doze_interval - controls the interval between checks for finger presence
109  * when the touch sensor is in doze mode, in units of 10ms.
110  * @wakeup_threshold - controls the capacitance threshold at which the touch
111  * sensor will decide to wake up from that low power state.
112  * @doze_holdoff - controls how long the touch sensor waits after the last
113  * finger lifts before entering the doze state, in units of 100ms.
114  */
115 struct f01_device_control {
116         u8 ctrl0;
117         u8 doze_interval;
118         u8 wakeup_threshold;
119         u8 doze_holdoff;
120 };
121
122 struct f01_data {
123         struct f01_basic_properties properties;
124         struct f01_device_control device_control;
125
126         u16 doze_interval_addr;
127         u16 wakeup_threshold_addr;
128         u16 doze_holdoff_addr;
129
130         bool suspended;
131         bool old_nosleep;
132
133         unsigned int num_of_irq_regs;
134 };
135
136 static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
137                                    u16 query_base_addr,
138                                    struct f01_basic_properties *props)
139 {
140         u8 queries[RMI_F01_BASIC_QUERY_LEN];
141         int ret;
142         int query_offset = query_base_addr;
143         bool has_ds4_queries = false;
144         bool has_query42 = false;
145         bool has_sensor_id = false;
146         bool has_package_id_query = false;
147         bool has_build_id_query = false;
148         u16 prod_info_addr;
149         u8 ds4_query_len;
150
151         ret = rmi_read_block(rmi_dev, query_offset,
152                                queries, RMI_F01_BASIC_QUERY_LEN);
153         if (ret) {
154                 dev_err(&rmi_dev->dev,
155                         "Failed to read device query registers: %d\n", ret);
156                 return ret;
157         }
158
159         prod_info_addr = query_offset + 17;
160         query_offset += RMI_F01_BASIC_QUERY_LEN;
161
162         /* Now parse what we got */
163         props->manufacturer_id = queries[0];
164
165         props->has_lts = queries[1] & RMI_F01_QRY1_HAS_LTS;
166         props->has_adjustable_doze =
167                         queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE;
168         props->has_adjustable_doze_holdoff =
169                         queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF;
170         has_query42 = queries[1] & RMI_F01_QRY1_HAS_QUERY42;
171         has_sensor_id = queries[1] & RMI_F01_QRY1_HAS_SENSOR_ID;
172
173         snprintf(props->dom, sizeof(props->dom), "20%02d/%02d/%02d",
174                  queries[5] & RMI_F01_QRY5_YEAR_MASK,
175                  queries[6] & RMI_F01_QRY6_MONTH_MASK,
176                  queries[7] & RMI_F01_QRY7_DAY_MASK);
177
178         memcpy(props->product_id, &queries[11],
179                 RMI_PRODUCT_ID_LENGTH);
180         props->product_id[RMI_PRODUCT_ID_LENGTH] = '\0';
181
182         props->productinfo =
183                         ((queries[2] & RMI_F01_QRY2_PRODINFO_MASK) << 7) |
184                         (queries[3] & RMI_F01_QRY2_PRODINFO_MASK);
185
186         if (has_sensor_id)
187                 query_offset++;
188
189         if (has_query42) {
190                 ret = rmi_read(rmi_dev, query_offset, queries);
191                 if (ret) {
192                         dev_err(&rmi_dev->dev,
193                                 "Failed to read query 42 register: %d\n", ret);
194                         return ret;
195                 }
196
197                 has_ds4_queries = !!(queries[0] & BIT(0));
198                 query_offset++;
199         }
200
201         if (has_ds4_queries) {
202                 ret = rmi_read(rmi_dev, query_offset, &ds4_query_len);
203                 if (ret) {
204                         dev_err(&rmi_dev->dev,
205                                 "Failed to read DS4 queries length: %d\n", ret);
206                         return ret;
207                 }
208                 query_offset++;
209
210                 if (ds4_query_len > 0) {
211                         ret = rmi_read(rmi_dev, query_offset, queries);
212                         if (ret) {
213                                 dev_err(&rmi_dev->dev,
214                                         "Failed to read DS4 queries: %d\n",
215                                         ret);
216                                 return ret;
217                         }
218
219                         has_package_id_query = !!(queries[0] & BIT(0));
220                         has_build_id_query = !!(queries[0] & BIT(1));
221                 }
222
223                 if (has_package_id_query)
224                         prod_info_addr++;
225
226                 if (has_build_id_query) {
227                         ret = rmi_read_block(rmi_dev, prod_info_addr, queries,
228                                             3);
229                         if (ret) {
230                                 dev_err(&rmi_dev->dev,
231                                         "Failed to read product info: %d\n",
232                                         ret);
233                                 return ret;
234                         }
235
236                         props->firmware_id = queries[1] << 8 | queries[0];
237                         props->firmware_id += queries[2] * 65536;
238                 }
239         }
240
241         return 0;
242 }
243
244 char *rmi_f01_get_product_ID(struct rmi_function *fn)
245 {
246         struct f01_data *f01 = dev_get_drvdata(&fn->dev);
247
248         return f01->properties.product_id;
249 }
250
251 #ifdef CONFIG_OF
252 static int rmi_f01_of_probe(struct device *dev,
253                                 struct rmi_device_platform_data *pdata)
254 {
255         int retval;
256         u32 val;
257
258         retval = rmi_of_property_read_u32(dev,
259                         (u32 *)&pdata->power_management.nosleep,
260                         "syna,nosleep-mode", 1);
261         if (retval)
262                 return retval;
263
264         retval = rmi_of_property_read_u32(dev, &val,
265                         "syna,wakeup-threshold", 1);
266         if (retval)
267                 return retval;
268
269         pdata->power_management.wakeup_threshold = val;
270
271         retval = rmi_of_property_read_u32(dev, &val,
272                         "syna,doze-holdoff-ms", 1);
273         if (retval)
274                 return retval;
275
276         pdata->power_management.doze_holdoff = val * 100;
277
278         retval = rmi_of_property_read_u32(dev, &val,
279                         "syna,doze-interval-ms", 1);
280         if (retval)
281                 return retval;
282
283         pdata->power_management.doze_interval = val / 10;
284
285         return 0;
286 }
287 #else
288 static inline int rmi_f01_of_probe(struct device *dev,
289                                         struct rmi_device_platform_data *pdata)
290 {
291         return -ENODEV;
292 }
293 #endif
294
295 static int rmi_f01_probe(struct rmi_function *fn)
296 {
297         struct rmi_device *rmi_dev = fn->rmi_dev;
298         struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev);
299         struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
300         struct f01_data *f01;
301         int error;
302         u16 ctrl_base_addr = fn->fd.control_base_addr;
303         u8 device_status;
304         u8 temp;
305
306         if (fn->dev.of_node) {
307                 error = rmi_f01_of_probe(&fn->dev, pdata);
308                 if (error)
309                         return error;
310         }
311
312         f01 = devm_kzalloc(&fn->dev, sizeof(struct f01_data), GFP_KERNEL);
313         if (!f01)
314                 return -ENOMEM;
315
316         f01->num_of_irq_regs = driver_data->num_of_irq_regs;
317
318         /*
319          * Set the configured bit and (optionally) other important stuff
320          * in the device control register.
321          */
322
323         error = rmi_read(rmi_dev, fn->fd.control_base_addr,
324                          &f01->device_control.ctrl0);
325         if (error) {
326                 dev_err(&fn->dev, "Failed to read F01 control: %d\n", error);
327                 return error;
328         }
329
330         switch (pdata->power_management.nosleep) {
331         case RMI_REG_STATE_DEFAULT:
332                 break;
333         case RMI_REG_STATE_OFF:
334                 f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
335                 break;
336         case RMI_REG_STATE_ON:
337                 f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
338                 break;
339         }
340
341         /*
342          * Sleep mode might be set as a hangover from a system crash or
343          * reboot without power cycle.  If so, clear it so the sensor
344          * is certain to function.
345          */
346         if ((f01->device_control.ctrl0 & RMI_F01_CTRL0_SLEEP_MODE_MASK) !=
347                         RMI_SLEEP_MODE_NORMAL) {
348                 dev_warn(&fn->dev,
349                          "WARNING: Non-zero sleep mode found. Clearing...\n");
350                 f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
351         }
352
353         f01->device_control.ctrl0 |= RMI_F01_CTRL0_CONFIGURED_BIT;
354
355         error = rmi_write(rmi_dev, fn->fd.control_base_addr,
356                           f01->device_control.ctrl0);
357         if (error) {
358                 dev_err(&fn->dev, "Failed to write F01 control: %d\n", error);
359                 return error;
360         }
361
362         /* Dummy read in order to clear irqs */
363         error = rmi_read(rmi_dev, fn->fd.data_base_addr + 1, &temp);
364         if (error < 0) {
365                 dev_err(&fn->dev, "Failed to read Interrupt Status.\n");
366                 return error;
367         }
368
369         error = rmi_f01_read_properties(rmi_dev, fn->fd.query_base_addr,
370                                         &f01->properties);
371         if (error < 0) {
372                 dev_err(&fn->dev, "Failed to read F01 properties.\n");
373                 return error;
374         }
375
376         dev_info(&fn->dev, "found RMI device, manufacturer: %s, product: %s, fw id: %d\n",
377                  f01->properties.manufacturer_id == 1 ? "Synaptics" : "unknown",
378                  f01->properties.product_id, f01->properties.firmware_id);
379
380         /* Advance to interrupt control registers, then skip over them. */
381         ctrl_base_addr++;
382         ctrl_base_addr += f01->num_of_irq_regs;
383
384         /* read control register */
385         if (f01->properties.has_adjustable_doze) {
386                 f01->doze_interval_addr = ctrl_base_addr;
387                 ctrl_base_addr++;
388
389                 if (pdata->power_management.doze_interval) {
390                         f01->device_control.doze_interval =
391                                 pdata->power_management.doze_interval;
392                         error = rmi_write(rmi_dev, f01->doze_interval_addr,
393                                           f01->device_control.doze_interval);
394                         if (error) {
395                                 dev_err(&fn->dev,
396                                         "Failed to configure F01 doze interval register: %d\n",
397                                         error);
398                                 return error;
399                         }
400                 } else {
401                         error = rmi_read(rmi_dev, f01->doze_interval_addr,
402                                          &f01->device_control.doze_interval);
403                         if (error) {
404                                 dev_err(&fn->dev,
405                                         "Failed to read F01 doze interval register: %d\n",
406                                         error);
407                                 return error;
408                         }
409                 }
410
411                 f01->wakeup_threshold_addr = ctrl_base_addr;
412                 ctrl_base_addr++;
413
414                 if (pdata->power_management.wakeup_threshold) {
415                         f01->device_control.wakeup_threshold =
416                                 pdata->power_management.wakeup_threshold;
417                         error = rmi_write(rmi_dev, f01->wakeup_threshold_addr,
418                                           f01->device_control.wakeup_threshold);
419                         if (error) {
420                                 dev_err(&fn->dev,
421                                         "Failed to configure F01 wakeup threshold register: %d\n",
422                                         error);
423                                 return error;
424                         }
425                 } else {
426                         error = rmi_read(rmi_dev, f01->wakeup_threshold_addr,
427                                          &f01->device_control.wakeup_threshold);
428                         if (error < 0) {
429                                 dev_err(&fn->dev,
430                                         "Failed to read F01 wakeup threshold register: %d\n",
431                                         error);
432                                 return error;
433                         }
434                 }
435         }
436
437         if (f01->properties.has_lts)
438                 ctrl_base_addr++;
439
440         if (f01->properties.has_adjustable_doze_holdoff) {
441                 f01->doze_holdoff_addr = ctrl_base_addr;
442                 ctrl_base_addr++;
443
444                 if (pdata->power_management.doze_holdoff) {
445                         f01->device_control.doze_holdoff =
446                                 pdata->power_management.doze_holdoff;
447                         error = rmi_write(rmi_dev, f01->doze_holdoff_addr,
448                                           f01->device_control.doze_holdoff);
449                         if (error) {
450                                 dev_err(&fn->dev,
451                                         "Failed to configure F01 doze holdoff register: %d\n",
452                                         error);
453                                 return error;
454                         }
455                 } else {
456                         error = rmi_read(rmi_dev, f01->doze_holdoff_addr,
457                                          &f01->device_control.doze_holdoff);
458                         if (error) {
459                                 dev_err(&fn->dev,
460                                         "Failed to read F01 doze holdoff register: %d\n",
461                                         error);
462                                 return error;
463                         }
464                 }
465         }
466
467         error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
468         if (error < 0) {
469                 dev_err(&fn->dev,
470                         "Failed to read device status: %d\n", error);
471                 return error;
472         }
473
474         if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
475                 dev_err(&fn->dev,
476                         "Device was reset during configuration process, status: %#02x!\n",
477                         RMI_F01_STATUS_CODE(device_status));
478                 return -EINVAL;
479         }
480
481         dev_set_drvdata(&fn->dev, f01);
482
483         return 0;
484 }
485
486 static int rmi_f01_config(struct rmi_function *fn)
487 {
488         struct f01_data *f01 = dev_get_drvdata(&fn->dev);
489         int error;
490
491         error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
492                           f01->device_control.ctrl0);
493         if (error) {
494                 dev_err(&fn->dev,
495                         "Failed to write device_control register: %d\n", error);
496                 return error;
497         }
498
499         if (f01->properties.has_adjustable_doze) {
500                 error = rmi_write(fn->rmi_dev, f01->doze_interval_addr,
501                                   f01->device_control.doze_interval);
502                 if (error) {
503                         dev_err(&fn->dev,
504                                 "Failed to write doze interval: %d\n", error);
505                         return error;
506                 }
507
508                 error = rmi_write_block(fn->rmi_dev,
509                                          f01->wakeup_threshold_addr,
510                                          &f01->device_control.wakeup_threshold,
511                                          sizeof(u8));
512                 if (error) {
513                         dev_err(&fn->dev,
514                                 "Failed to write wakeup threshold: %d\n",
515                                 error);
516                         return error;
517                 }
518         }
519
520         if (f01->properties.has_adjustable_doze_holdoff) {
521                 error = rmi_write(fn->rmi_dev, f01->doze_holdoff_addr,
522                                   f01->device_control.doze_holdoff);
523                 if (error) {
524                         dev_err(&fn->dev,
525                                 "Failed to write doze holdoff: %d\n", error);
526                         return error;
527                 }
528         }
529
530         return 0;
531 }
532
533 static int rmi_f01_suspend(struct rmi_function *fn)
534 {
535         struct f01_data *f01 = dev_get_drvdata(&fn->dev);
536         int error;
537
538         f01->old_nosleep =
539                 f01->device_control.ctrl0 & RMI_F01_CTRL0_NOSLEEP_BIT;
540         f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
541
542         f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
543         if (device_may_wakeup(fn->rmi_dev->xport->dev))
544                 f01->device_control.ctrl0 |= RMI_SLEEP_MODE_RESERVED1;
545         else
546                 f01->device_control.ctrl0 |= RMI_SLEEP_MODE_SENSOR_SLEEP;
547
548         error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
549                           f01->device_control.ctrl0);
550         if (error) {
551                 dev_err(&fn->dev, "Failed to write sleep mode: %d.\n", error);
552                 if (f01->old_nosleep)
553                         f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
554                 f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
555                 f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
556                 return error;
557         }
558
559         return 0;
560 }
561
562 static int rmi_f01_resume(struct rmi_function *fn)
563 {
564         struct f01_data *f01 = dev_get_drvdata(&fn->dev);
565         int error;
566
567         if (f01->old_nosleep)
568                 f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
569
570         f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
571         f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
572
573         error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
574                           f01->device_control.ctrl0);
575         if (error) {
576                 dev_err(&fn->dev,
577                         "Failed to restore normal operation: %d.\n", error);
578                 return error;
579         }
580
581         return 0;
582 }
583
584 static int rmi_f01_attention(struct rmi_function *fn,
585                              unsigned long *irq_bits)
586 {
587         struct rmi_device *rmi_dev = fn->rmi_dev;
588         int error;
589         u8 device_status;
590
591         error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
592         if (error) {
593                 dev_err(&fn->dev,
594                         "Failed to read device status: %d.\n", error);
595                 return error;
596         }
597
598         if (RMI_F01_STATUS_BOOTLOADER(device_status))
599                 dev_warn(&fn->dev,
600                          "Device in bootloader mode, please update firmware\n");
601
602         if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
603                 dev_warn(&fn->dev, "Device reset detected.\n");
604                 error = rmi_dev->driver->reset_handler(rmi_dev);
605                 if (error) {
606                         dev_err(&fn->dev, "Device reset failed: %d\n", error);
607                         return error;
608                 }
609         }
610
611         return 0;
612 }
613
614 struct rmi_function_handler rmi_f01_handler = {
615         .driver = {
616                 .name   = "rmi4_f01",
617                 /*
618                  * Do not allow user unbinding F01 as it is critical
619                  * function.
620                  */
621                 .suppress_bind_attrs = true,
622         },
623         .func           = 0x01,
624         .probe          = rmi_f01_probe,
625         .config         = rmi_f01_config,
626         .attention      = rmi_f01_attention,
627         .suspend        = rmi_f01_suspend,
628         .resume         = rmi_f01_resume,
629 };