2 * Synaptics DSX touchscreen driver
4 * Copyright (C) 2012 Synaptics Incorporated
6 * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
7 * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
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.
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.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <linux/kernel.h>
24 #include <linux/module.h>
25 #include <linux/slab.h>
26 #include <linux/i2c.h>
27 #include <linux/interrupt.h>
28 #include <linux/delay.h>
29 #include <linux/input.h>
30 #include <linux/firmware.h>
31 #include <cust_eint.h>
32 //#include <linux/input/synaptics_dsx.h>
33 #include "synaptics_dsx_rmi4_i2c.h"
35 //#include "SynaImage.h"
40 #define DEBUG_FW_UPDATE
42 #define FW_IMAGE_NAME "SynaImage.h"
44 #define CHECKSUM_OFFSET 0x00
45 #define BOOTLOADER_VERSION_OFFSET 0x07
46 #define IMAGE_SIZE_OFFSET 0x08
47 #define CONFIG_SIZE_OFFSET 0x0C
48 #define PRODUCT_ID_OFFSET 0x10
49 #define PRODUCT_INFO_OFFSET 0x1E
50 #define FW_IMAGE_OFFSET 0x100
51 #define PRODUCT_ID_SIZE 10
53 #define BOOTLOADER_ID_OFFSET 0
54 #define FLASH_PROPERTIES_OFFSET 2
55 #define BLOCK_SIZE_OFFSET 3
56 #define FW_BLOCK_COUNT_OFFSET 5
58 #define SYN_I2C_RETRY_TIMES 10
59 #define F01_STD_QUERY_LEN 21
62 #define REG_MAP (1 << 0)
63 #define UNLOCKED (1 << 1)
64 #define HAS_CONFIG_ID (1 << 2)
65 #define HAS_PERM_CONFIG (1 << 3)
66 #define HAS_BL_CONFIG (1 << 4)
67 #define HAS_DISP_CONFIG (1 << 5)
68 #define HAS_CTRL1 (1 << 6)
70 #define BLOCK_NUMBER_OFFSET 0
71 #define BLOCK_DATA_OFFSET 2
73 #define UI_CONFIG_AREA 0x00
74 #define PERM_CONFIG_AREA 0x01
75 #define BL_CONFIG_AREA 0x02
76 #define DISP_CONFIG_AREA 0x03
80 CMD_WRITE_FW_BLOCK
= 0x2,
82 CMD_READ_CONFIG_BLOCK
= 0x5,
83 CMD_WRITE_CONFIG_BLOCK
= 0x6,
84 CMD_ERASE_CONFIG
= 0x7,
85 CMD_ERASE_BL_CONFIG
= 0x9,
86 CMD_ERASE_DISP_CONFIG
= 0xA,
87 CMD_ENABLE_FLASH_PROG
= 0xF,
90 #define SLEEP_MODE_NORMAL (0x00)
91 #define SLEEP_MODE_SENSOR_SLEEP (0x01)
92 #define SLEEP_MODE_RESERVED0 (0x02)
93 #define SLEEP_MODE_RESERVED1 (0x03)
95 #define ENABLE_WAIT_MS (1 * 1000)
96 #define WRITE_WAIT_MS (3 * 1000)
97 #define ERASE_WAIT_MS (5 * 1000)
99 #define MIN_SLEEP_TIME_US 50
100 #define MAX_SLEEP_TIME_US 100
102 extern void mt65xx_eint_unmask(unsigned int line
);
103 extern void mt65xx_eint_mask(unsigned int line
);
106 extern struct tpd_device
*tpd
;
108 extern struct kobject
*properties_kobj_synap
;
109 struct kobject
*properties_kobj_fwupdate
;
112 static ssize_t
fwu_sysfs_show_image(struct file
*data_file
,
113 struct kobject
*kobj
, struct bin_attribute
*attributes
,
114 char *buf
, loff_t pos
, size_t count
);
116 static ssize_t
fwu_sysfs_store_image(struct file
*data_file
,
117 struct kobject
*kobj
, struct bin_attribute
*attributes
,
118 char *buf
, loff_t pos
, size_t count
);
120 static ssize_t
fwu_sysfs_do_reflash_store(struct device
*dev
,
121 struct device_attribute
*attr
, const char *buf
, size_t count
);
123 static ssize_t
fwu_sysfs_write_config_store(struct device
*dev
,
124 struct device_attribute
*attr
, const char *buf
, size_t count
);
126 static ssize_t
fwu_sysfs_read_config_store(struct device
*dev
,
127 struct device_attribute
*attr
, const char *buf
, size_t count
);
129 static ssize_t
fwu_sysfs_config_area_store(struct device
*dev
,
130 struct device_attribute
*attr
, const char *buf
, size_t count
);
132 static ssize_t
fwu_sysfs_image_size_store(struct device
*dev
,
133 struct device_attribute
*attr
, const char *buf
, size_t count
);
135 static ssize_t
fwu_sysfs_block_size_show(struct device
*dev
,
136 struct device_attribute
*attr
, char *buf
);
138 static ssize_t
fwu_sysfs_firmware_block_count_show(struct device
*dev
,
139 struct device_attribute
*attr
, char *buf
);
141 static ssize_t
fwu_sysfs_configuration_block_count_show(struct device
*dev
,
142 struct device_attribute
*attr
, char *buf
);
144 static ssize_t
fwu_sysfs_perm_config_block_count_show(struct device
*dev
,
145 struct device_attribute
*attr
, char *buf
);
147 static ssize_t
fwu_sysfs_bl_config_block_count_show(struct device
*dev
,
148 struct device_attribute
*attr
, char *buf
);
150 static ssize_t
fwu_sysfs_disp_config_block_count_show(struct device
*dev
,
151 struct device_attribute
*attr
, char *buf
);
153 static int fwu_wait_for_idle(int timeout_ms
);
155 extern int tpd_i2c_read_data(struct i2c_client
*client
, unsigned short addr
, unsigned char *data
, unsigned short length
);
157 extern int tpd_i2c_write_data(struct i2c_client
*client
, unsigned short addr
, unsigned char *data
, unsigned short length
);
160 struct image_header
{
161 unsigned int checksum
;
162 unsigned int image_size
;
163 unsigned int config_size
;
164 unsigned char options
;
165 unsigned char bootloader_version
;
166 unsigned char product_id
[SYNAPTICS_RMI4_PRODUCT_ID_LENGTH
+ 1];
167 unsigned char product_info
[SYNAPTICS_RMI4_PRODUCT_INFO_SIZE
];
170 struct pdt_properties
{
173 unsigned char reserved_1
:6;
174 unsigned char has_bsr
:1;
175 unsigned char reserved_2
:1;
177 unsigned char data
[1];
181 struct f01_device_status
{
184 unsigned char status_code
:4;
185 unsigned char reserved
:2;
186 unsigned char flash_prog
:1;
187 unsigned char unconfigured
:1;
189 unsigned char data
[1];
193 struct f01_device_control
{
196 unsigned char sleep_mode
:2;
197 unsigned char nosleep
:1;
198 unsigned char reserved
:2;
199 unsigned char charger_connected
:1;
200 unsigned char report_rate
:1;
201 unsigned char configured
:1;
203 unsigned char data
[1];
207 struct f34_flash_control
{
210 unsigned char command
:4;
211 unsigned char status
:3;
212 unsigned char program_enabled
:1;
214 unsigned char data
[1];
218 struct f34_flash_properties
{
221 unsigned char regmap
:1;
222 unsigned char unlocked
:1;
223 unsigned char has_configid
:1;
224 unsigned char has_perm_config
:1;
225 unsigned char has_bl_config
:1;
226 unsigned char has_display_config
:1;
227 unsigned char has_blob_config
:1;
228 unsigned char reserved
:1;
230 unsigned char data
[1];
234 struct synaptics_rmi4_fwu_handle
{
236 char product_id
[SYNAPTICS_RMI4_PRODUCT_ID_LENGTH
+ 1];
237 unsigned int image_size
;
238 unsigned int data_pos
;
239 unsigned char intr_mask
;
240 unsigned char bootloader_id
[2];
241 unsigned char productinfo1
;
242 unsigned char productinfo2
;
243 unsigned char *ext_data_source
;
244 unsigned char *read_config_buf
;
245 const unsigned char *firmware_data
;
246 const unsigned char *config_data
;
247 unsigned short block_size
;
248 unsigned short fw_block_count
;
249 unsigned short config_block_count
;
250 unsigned short perm_config_block_count
;
251 unsigned short bl_config_block_count
;
252 unsigned short disp_config_block_count
;
253 unsigned short config_size
;
254 unsigned short config_area
;
255 unsigned short addr_f34_flash_control
;
256 unsigned short addr_f01_interrupt_register
;
257 struct synaptics_rmi4_fn_desc f01_fd
;
258 struct synaptics_rmi4_fn_desc f34_fd
;
259 struct synaptics_rmi4_exp_fn_ptr
*fn_ptr
;
260 struct synaptics_rmi4_data
*rmi4_data
;
261 struct f34_flash_control flash_control
;
262 struct f34_flash_properties flash_properties
;
265 static struct bin_attribute dev_attr_data
= {
268 .mode
= (S_IRUGO
| S_IWUSR
),
271 .read
= fwu_sysfs_show_image
,
272 .write
= fwu_sysfs_store_image
,
275 static struct device_attribute attrs
[] = {
276 __ATTR(doreflash
, (S_IRUGO
| S_IWUSR
),
277 synaptics_rmi4_show_error
,
278 fwu_sysfs_do_reflash_store
),
279 __ATTR(writeconfig
, (S_IRUGO
| S_IWUSR
),
280 synaptics_rmi4_show_error
,
281 fwu_sysfs_write_config_store
),
282 __ATTR(readconfig
, (S_IRUGO
| S_IWUSR
),
283 synaptics_rmi4_show_error
,
284 fwu_sysfs_read_config_store
),
286 __ATTR(configarea
, S_IWUGO
,
287 synaptics_rmi4_show_error
,
288 fwu_sysfs_config_area_store
),
289 __ATTR(imagesize
, S_IWUGO
,
290 synaptics_rmi4_show_error
,
291 fwu_sysfs_image_size_store
),
293 __ATTR(blocksize
, S_IRUGO
,
294 fwu_sysfs_block_size_show
,
295 synaptics_rmi4_store_error
),
296 __ATTR(fwblockcount
, S_IRUGO
,
297 fwu_sysfs_firmware_block_count_show
,
298 synaptics_rmi4_store_error
),
299 __ATTR(configblockcount
, S_IRUGO
,
300 fwu_sysfs_configuration_block_count_show
,
301 synaptics_rmi4_store_error
),
302 __ATTR(permconfigblockcount
, S_IRUGO
,
303 fwu_sysfs_perm_config_block_count_show
,
304 synaptics_rmi4_store_error
),
305 __ATTR(blconfigblockcount
, S_IRUGO
,
306 fwu_sysfs_bl_config_block_count_show
,
307 synaptics_rmi4_store_error
),
308 __ATTR(dispconfigblockcount
, S_IRUGO
,
309 fwu_sysfs_disp_config_block_count_show
,
310 synaptics_rmi4_store_error
),
313 static struct kobj_attribute synaptics_flashprog_attr = {
316 .mode = (S_IRUGO | S_IWUGO),
318 .show = &synaptics_rmi4_f01_flashprog_show,
319 .store = &synaptics_rmi4_store_error,
322 static struct kobj_attribute synaptics_0dbutton_attr = {
325 .mode = (S_IRUGO | S_IWUGO),
327 .show = &synaptics_rmi4_0dbutton_show,
328 .store = &synaptics_rmi4_0dbutton_store,
331 static struct attribute *syna_attrs[] = {
333 &synaptics_pm_cycle_attr.attr,
334 &synaptics_f51_enables_attr.attr,
335 &synaptics_show_error_attr.attr,
336 &synaptics_productinfo_attr.attr,
337 &synaptics_0dbutton_attr.attr,
338 &synaptics_flashprog_attr.attr,
342 static struct attribute_group syna_attr_group = {
347 static struct synaptics_rmi4_fwu_handle
*fwu
;
349 static struct completion remove_complete
;
351 static unsigned int extract_uint(const unsigned char *ptr
)
353 return (unsigned int)ptr
[0] +
354 (unsigned int)ptr
[1] * 0x100 +
355 (unsigned int)ptr
[2] * 0x10000 +
356 (unsigned int)ptr
[3] * 0x1000000;
359 static void parse_header(struct image_header
*header
,
360 const unsigned char *fw_image
)
362 header
->checksum
= extract_uint(&fw_image
[CHECKSUM_OFFSET
]);
363 header
->bootloader_version
= fw_image
[BOOTLOADER_VERSION_OFFSET
];
364 header
->image_size
= extract_uint(&fw_image
[IMAGE_SIZE_OFFSET
]);
365 header
->config_size
= extract_uint(&fw_image
[CONFIG_SIZE_OFFSET
]);
366 memcpy(header
->product_id
, &fw_image
[PRODUCT_ID_OFFSET
],
367 SYNAPTICS_RMI4_PRODUCT_ID_LENGTH
);
368 header
->product_id
[SYNAPTICS_RMI4_PRODUCT_ID_LENGTH
] = 0;
369 memcpy(header
->product_info
, &fw_image
[PRODUCT_INFO_OFFSET
],
370 SYNAPTICS_RMI4_PRODUCT_INFO_SIZE
);
372 #ifdef DEBUG_FW_UPDATE
373 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
,
374 "Firwmare size %d, config size %d\n",
376 header
->config_size
);
381 static int fwu_check_version(void)
384 unsigned char firmware_id
[4];
385 unsigned char config_id
[4];
386 struct i2c_client
*i2c_client
= fwu
->rmi4_data
->i2c_client
;
389 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
390 fwu
->f01_fd
.query_base_addr
+ 18,
392 sizeof(firmware_id
));
394 TPD_DMESG("Failed to read firmware ID (code %d).\n", retval
);
399 TPD_DMESG("Device firmware ID%d\n",
400 extract_uint(firmware_id
));
403 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
404 fwu
->f34_fd
.ctrl_base_addr
,
408 dev_err(&i2c_client
->dev
,
409 "Failed to read config ID (code %d).\n", retval
);
413 TPD_DMESG("Device config ID 0x%02X, 0x%02X, 0x%02X, 0x%02X\n",
414 config_id
[0], config_id
[1], config_id
[2], config_id
[3]);
417 TPD_DMESG(".img config ID 0x%02X, 0x%02X, 0x%02X, 0x%02X\n",
421 fwu
->config_data
[3]);
423 if(config_id
[0]==fwu
->config_data
[0]&&
424 config_id
[1]==fwu
->config_data
[1]&&
425 config_id
[2]==fwu
->config_data
[2]&&
426 config_id
[3]==fwu
->config_data
[3]){
427 TPD_DMESG("Both the device and .img is the same version, no need to update!\n");
433 static int fwu_read_f01_device_status(struct f01_device_status
*status
)
437 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
438 fwu
->f01_fd
.data_base_addr
,
440 sizeof(status
->data
));
443 "%s: Failed to read F01 device status\n",
451 static int fwu_read_f34_queries(void)
454 unsigned char count
= 4;
455 unsigned char buf
[10];
456 struct i2c_client
*i2c_client
= fwu
->rmi4_data
->i2c_client
;
458 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
459 fwu
->f34_fd
.query_base_addr
+ BOOTLOADER_ID_OFFSET
,
461 sizeof(fwu
->bootloader_id
));
464 "%s: Failed to read bootloader ID\n",
469 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
470 fwu
->f34_fd
.query_base_addr
+ FLASH_PROPERTIES_OFFSET
,
471 fwu
->flash_properties
.data
,
472 sizeof(fwu
->flash_properties
.data
));
474 dev_err(&i2c_client
->dev
,
475 "%s: Failed to read flash properties\n",
480 dev_info(&i2c_client
->dev
, "%s perm:%d, bl%d, display:%d\n",
482 fwu
->flash_properties
.has_perm_config
,
483 fwu
->flash_properties
.has_bl_config
,
484 fwu
->flash_properties
.has_display_config
);
486 if (fwu
->flash_properties
.has_perm_config
)
489 if (fwu
->flash_properties
.has_bl_config
)
492 if (fwu
->flash_properties
.has_display_config
)
495 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
496 fwu
->f34_fd
.query_base_addr
+ BLOCK_SIZE_OFFSET
,
500 dev_err(&i2c_client
->dev
,
501 "%s: Failed to read block size info\n",
506 batohs(&fwu
->block_size
, &(buf
[0]));
508 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
509 fwu
->f34_fd
.query_base_addr
+ FW_BLOCK_COUNT_OFFSET
,
513 dev_err(&i2c_client
->dev
,
514 "%s: Failed to read block count info\n",
519 batohs(&fwu
->fw_block_count
, &(buf
[0]));
520 batohs(&fwu
->config_block_count
, &(buf
[2]));
524 if (fwu
->flash_properties
.has_perm_config
) {
525 batohs(&fwu
->perm_config_block_count
, &(buf
[count
]));
529 if (fwu
->flash_properties
.has_bl_config
) {
530 batohs(&fwu
->bl_config_block_count
, &(buf
[count
]));
534 if (fwu
->flash_properties
.has_display_config
)
535 batohs(&fwu
->disp_config_block_count
, &(buf
[count
]));
537 fwu
->addr_f34_flash_control
= fwu
->f34_fd
.data_base_addr
+
543 static int fwu_read_interrupt_status(void)
546 unsigned char interrupt_status
;
547 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
548 fwu
->addr_f01_interrupt_register
,
550 sizeof(interrupt_status
));
553 "%s: Failed to read flash status\n",
557 return interrupt_status
;
560 static int fwu_read_f34_flash_status(void)
563 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
564 fwu
->addr_f34_flash_control
,
565 fwu
->flash_control
.data
,
566 sizeof(fwu
->flash_control
.data
));
568 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
569 "%s: Failed to read flash status\n",
574 //TPD_DMESG("fwu_read_f34_flash_status = 0x%x\n", fwu->flash_control.data[0]);
575 return fwu
->flash_control
.data
[0];
579 static int fwu_reset_device(void)
582 unsigned char reset
= 0x01;
584 #ifdef DEBUG_FW_UPDATE
585 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Reset device\n");
588 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
589 fwu
->f01_fd
.cmd_base_addr
,
593 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
594 "%s: Failed to reset device (addr : 0x%02x)\n",
595 __func__
, fwu
->f01_fd
.cmd_base_addr
);
599 fwu_wait_for_idle(WRITE_WAIT_MS
);
601 retval
= fwu
->rmi4_data
->reset_device(fwu
->rmi4_data
);
603 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
604 "%s: Failed to reset core driver after reflash\n",
611 static int fwu_write_f34_command(unsigned char cmd
)
615 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
616 fwu
->addr_f34_flash_control
,
621 "%s: Failed to write command 0x%02x\n",
628 static unsigned char fwu_check_flash_status(void)
630 fwu_read_f34_flash_status();
631 return fwu
->flash_control
.status
;
635 static int fwu_wait_for_idle(int timeout_ms
)
638 int timeout_count
= ((timeout_ms
* 1000) / MAX_SLEEP_TIME_US
) + 1;
641 if (fwu_read_interrupt_status() > 0)
642 // if( (fwu_read_f34_flash_status())&0x7f==0x00)
645 usleep_range(MIN_SLEEP_TIME_US
, MAX_SLEEP_TIME_US
);
647 } while (count
< timeout_count
);
650 "%s: Timed out waiting for idle status\n",
656 static int fwu_scan_pdt(void)
660 unsigned char intr_count
= 0;
661 unsigned char intr_off
;
662 unsigned char intr_src
;
664 bool f01found
= false;
665 bool f34found
= false;
666 struct synaptics_rmi4_fn_desc rmi_fd
;
668 #ifdef DEBUG_FW_UPDATE
669 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Scan PDT\n");
672 for (addr
= PDT_START
; addr
> PDT_END
; addr
-= PDT_ENTRY_SIZE
) {
673 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
675 (unsigned char *)&rmi_fd
,
680 if (rmi_fd
.fn_number
) {
683 __func__
, rmi_fd
.fn_number
);
684 switch (rmi_fd
.fn_number
) {
685 case SYNAPTICS_RMI4_F01
:
687 fwu
->f01_fd
= rmi_fd
;
688 fwu
->addr_f01_interrupt_register
=
689 fwu
->f01_fd
.data_base_addr
+ 1;
691 case SYNAPTICS_RMI4_F34
:
693 fwu
->f34_fd
= rmi_fd
;
695 intr_src
= rmi_fd
.intr_src_count
;
696 intr_off
= intr_count
% 8;
698 ii
< ((intr_src
& MASK_3BIT
) +
701 fwu
->intr_mask
|= 1 << ii
;
707 intr_count
+= (rmi_fd
.intr_src_count
& MASK_3BIT
);
710 if (!f01found
|| !f34found
) {
711 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
712 "%s: Failed to find both F01 and F34\n",
717 fwu_read_interrupt_status();
721 static int fwu_write_blocks(unsigned char *block_ptr
, unsigned short block_cnt
,
722 unsigned char command
)
725 unsigned char block_offset
[] = {0, 0};
726 unsigned short block_num
;
728 unsigned int progress
= (command
== CMD_WRITE_CONFIG_BLOCK
) ?
731 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
732 fwu
->f34_fd
.data_base_addr
+ BLOCK_NUMBER_OFFSET
,
734 sizeof(block_offset
));
735 // TPD_DMESG("write block number");
737 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
738 "%s: Failed to write to block number registers\n",
743 for (block_num
= 0; block_num
< block_cnt
; block_num
++) {
745 if (block_num
% progress
== 0){
747 "%s: update %s %3d / %3d \n",
749 command
== CMD_WRITE_CONFIG_BLOCK
?
750 "config" : "firmware",
751 block_num
, block_cnt
);
754 // TPD_DMESG("before write BLOCK_DATA_OFFSET");
755 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
756 fwu
->f34_fd
.data_base_addr
+ BLOCK_DATA_OFFSET
,
760 TPD_DMESG("%s: Failed to write block data (block %d)\n",
761 __func__
, block_num
);
765 retval
= fwu_write_f34_command(command
);
767 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
768 "%s: Failed to write command for block %d\n",
769 __func__
, block_num
);
773 retval
= fwu_wait_for_idle(WRITE_WAIT_MS
);
775 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
776 "%s: Failed to wait for idle status (block %d)\n",
777 __func__
, block_num
);
781 retval
= fwu_check_flash_status();
783 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
784 "%s: Flash block %d status %d\n",
785 __func__
, block_num
, retval
);
788 block_ptr
+= fwu
->block_size
;
791 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
,
792 "%s: update %s %3d / %3d \n",
794 command
== CMD_WRITE_CONFIG_BLOCK
?
795 "config" : "firmware",
796 block_cnt
, block_cnt
);
801 static int fwu_write_firmware(void)
803 return fwu_write_blocks((unsigned char *)fwu
->firmware_data
,
804 fwu
->fw_block_count
, CMD_WRITE_FW_BLOCK
);
807 static int fwu_write_configuration(void)
809 return fwu_write_blocks((unsigned char *)fwu
->config_data
,
810 fwu
->config_block_count
, CMD_WRITE_CONFIG_BLOCK
);
813 static int fwu_write_bootloader_id(void)
817 #ifdef DEBUG_FW_UPDATE
818 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Write bootloader ID\n");
820 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
821 fwu
->f34_fd
.data_base_addr
+ BLOCK_DATA_OFFSET
,
823 sizeof(fwu
->bootloader_id
));
824 TPD_DMESG("bootloader ID=%s\n",fwu
->bootloader_id
);
825 TPD_DMESG("f34_data_addr=%x\n",fwu
->f34_fd
.data_base_addr
+ BLOCK_DATA_OFFSET
);
829 "%s: Failed to write bootloader ID\n",
837 static int fwu_enter_flash_prog(void)
840 struct f01_device_status f01_device_status
;
841 struct f01_device_control f01_device_control
;
843 #ifdef DEBUG_FW_UPDATE
844 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Enter bootloader mode\n");
846 retval
= fwu_read_f01_device_status(&f01_device_status
);
850 if (f01_device_status
.flash_prog
) {
852 "%s: Already in flash prog mode\n",
857 retval
= fwu_write_bootloader_id();
861 retval
= fwu_write_f34_command(CMD_ENABLE_FLASH_PROG
);
865 retval
= fwu_wait_for_idle(ENABLE_WAIT_MS
);
869 retval
= fwu_read_f01_device_status(&f01_device_status
);
873 if (!f01_device_status
.flash_prog
) {
874 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
875 "%s: Program enabled bit not set\n",
880 retval
= fwu_scan_pdt();
884 retval
= fwu_read_f01_device_status(&f01_device_status
);
888 if (!f01_device_status
.flash_prog
) {
889 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
890 "%s: Not in flash prog mode\n",
895 retval
= fwu_read_f34_queries();
899 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
900 fwu
->f01_fd
.ctrl_base_addr
,
901 f01_device_control
.data
,
902 sizeof(f01_device_control
.data
));
905 "%s: Failed to read F01 device control\n",
910 f01_device_control
.nosleep
= true;
911 f01_device_control
.sleep_mode
= SLEEP_MODE_NORMAL
;
913 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
914 fwu
->f01_fd
.ctrl_base_addr
,
915 f01_device_control
.data
,
916 sizeof(f01_device_control
.data
));
919 "%s: Failed to write F01 device control\n",
927 static int fwu_do_reflash(void)
931 retval
= fwu_enter_flash_prog();
936 "%s: Entered flash prog mode\n",
939 retval
= fwu_write_bootloader_id();
944 "%s: Bootloader ID written\n",
947 retval
= fwu_write_f34_command(CMD_ERASE_ALL
);
951 TPD_DMESG("%s: Erase all command written\n",
957 retval
= fwu_wait_for_idle(ERASE_WAIT_MS
);
962 "%s: Idle status detected\n",
965 if (fwu
->firmware_data
) {
966 retval
= fwu_write_firmware();
970 pr_notice("%s: Firmware programmed\n", __func__
);
973 if (fwu
->config_data
) {
974 retval
= fwu_write_configuration();
977 pr_notice("%s: Configuration programmed\n", __func__
);
987 static int fwu_start_reflash(void)
990 struct image_header header
;
991 const unsigned char *fw_image
;
992 const struct firmware
*fw_entry
= NULL
;
993 struct f01_device_status f01_device_status
;
995 TPD_DMESG("%s: Start of reflash process\n", __func__
);
996 //mt65xx_eint_mask(CUST_EINT_TOUCH_PANEL_NUM);
998 if (fwu
->ext_data_source
)
999 fw_image
= fwu
->ext_data_source
;
1002 "%s: Requesting firmware image %s\n",
1003 __func__
, FW_IMAGE_NAME
);
1005 retval
= request_firmware(&fw_entry
, FW_IMAGE_NAME
,
1006 &fwu
->rmi4_data
->i2c_client
->dev
);
1009 "%s: Firmware image %s not available\n",
1010 __func__
, FW_IMAGE_NAME
);
1016 "%s: Firmware image size = %d\n",
1017 __func__
, fw_entry
->size
);
1019 fw_image
= fw_entry
->data
;
1022 parse_header(&header
, fw_image
);
1024 if (header
.image_size
)
1025 fwu
->firmware_data
= fw_image
+ FW_IMAGE_OFFSET
;
1026 if (header
.config_size
) {
1027 fwu
->config_data
= fw_image
+ FW_IMAGE_OFFSET
+
1031 fwu
->fn_ptr
->enable(fwu
->rmi4_data
, false);
1033 retval
= fwu_check_version();
1039 retval
= fwu_do_reflash();
1042 "%s: Failed to do reflash\n",
1049 //check device status
1050 retval
= fwu_read_f01_device_status(&f01_device_status
);
1054 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Device is in %s mode\n",
1055 f01_device_status
.flash_prog
== 1 ? "bootloader" : "UI");
1056 if (f01_device_status
.flash_prog
)
1057 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
, "Flash status %d\n",
1058 f01_device_status
.status_code
);
1060 if (f01_device_status
.flash_prog
) {
1061 dev_info(&fwu
->rmi4_data
->i2c_client
->dev
,
1062 "%s: Device is in flash prog mode 0x%02X\n",
1063 __func__
, f01_device_status
.status_code
);
1067 fwu
->fn_ptr
->enable(fwu
->rmi4_data
, true);
1069 release_firmware(fw_entry
);
1071 pr_notice("%s: End of reflash process\n", __func__
);
1073 //mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);
1077 static int fwu_do_write_config(void)
1081 retval
= fwu_enter_flash_prog();
1086 "%s: Entered flash prog mode\n",
1089 if (fwu
->config_area
== PERM_CONFIG_AREA
) {
1090 fwu
->config_block_count
= fwu
->perm_config_block_count
;
1094 retval
= fwu_write_bootloader_id();
1099 "%s: Bootloader ID written\n",
1102 switch (fwu
->config_area
) {
1103 case UI_CONFIG_AREA
:
1104 retval
= fwu_write_f34_command(CMD_ERASE_CONFIG
);
1106 case BL_CONFIG_AREA
:
1107 retval
= fwu_write_f34_command(CMD_ERASE_BL_CONFIG
);
1108 fwu
->config_block_count
= fwu
->bl_config_block_count
;
1110 case DISP_CONFIG_AREA
:
1111 retval
= fwu_write_f34_command(CMD_ERASE_DISP_CONFIG
);
1112 fwu
->config_block_count
= fwu
->disp_config_block_count
;
1119 "%s: Erase command written\n",
1122 retval
= fwu_wait_for_idle(ERASE_WAIT_MS
);
1127 "%s: Idle status detected\n",
1131 retval
= fwu_write_configuration();
1135 pr_notice("%s: Config written\n", __func__
);
1140 static int fwu_start_write_config(void)
1143 struct image_header header
;
1145 switch (fwu
->config_area
) {
1146 case UI_CONFIG_AREA
:
1148 case PERM_CONFIG_AREA
:
1149 if (!fwu
->flash_properties
.has_perm_config
)
1152 case BL_CONFIG_AREA
:
1153 if (!fwu
->flash_properties
.has_bl_config
)
1156 case DISP_CONFIG_AREA
:
1157 if (!fwu
->flash_properties
.has_display_config
)
1164 if (fwu
->ext_data_source
)
1165 fwu
->config_data
= fwu
->ext_data_source
;
1169 if (fwu
->config_area
== UI_CONFIG_AREA
) {
1170 parse_header(&header
, fwu
->ext_data_source
);
1172 if (header
.config_size
) {
1173 fwu
->config_data
= fwu
->ext_data_source
+
1181 pr_notice("%s: Start of write config process\n", __func__
);
1183 retval
= fwu_do_write_config();
1185 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
1186 "%s: Failed to write config\n",
1190 fwu
->rmi4_data
->reset_device(fwu
->rmi4_data
);
1192 pr_notice("%s: End of write config process\n", __func__
);
1197 static int fwu_do_read_config(void)
1200 unsigned char block_offset
[] = {0, 0};
1201 unsigned short block_num
;
1202 unsigned short block_count
;
1203 unsigned short index
= 0;
1205 retval
= fwu_enter_flash_prog();
1210 "%s: Entered flash prog mode\n",
1213 switch (fwu
->config_area
) {
1214 case UI_CONFIG_AREA
:
1215 block_count
= fwu
->config_block_count
;
1217 case PERM_CONFIG_AREA
:
1218 if (!fwu
->flash_properties
.has_perm_config
) {
1222 block_count
= fwu
->perm_config_block_count
;
1224 case BL_CONFIG_AREA
:
1225 if (!fwu
->flash_properties
.has_bl_config
) {
1229 block_count
= fwu
->bl_config_block_count
;
1231 case DISP_CONFIG_AREA
:
1232 if (!fwu
->flash_properties
.has_display_config
) {
1236 block_count
= fwu
->disp_config_block_count
;
1243 fwu
->config_size
= fwu
->block_size
* block_count
;
1245 kfree(fwu
->read_config_buf
);
1246 fwu
->read_config_buf
= kzalloc(fwu
->config_size
, GFP_KERNEL
);
1248 block_offset
[1] |= (fwu
->config_area
<< 5);
1250 retval
= fwu
->fn_ptr
->write(fwu
->rmi4_data
,
1251 fwu
->f34_fd
.data_base_addr
+ BLOCK_NUMBER_OFFSET
,
1253 sizeof(block_offset
));
1255 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
1256 "%s: Failed to write to block number registers\n",
1261 for (block_num
= 0; block_num
< block_count
; block_num
++) {
1262 retval
= fwu_write_f34_command(CMD_READ_CONFIG_BLOCK
);
1264 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
1265 "%s: Failed to write read config command\n",
1270 retval
= fwu_wait_for_idle(WRITE_WAIT_MS
);
1272 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
1273 "%s: Failed to wait for idle status\n",
1278 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
1279 fwu
->f34_fd
.data_base_addr
+ BLOCK_DATA_OFFSET
,
1280 &fwu
->read_config_buf
[index
],
1283 dev_err(&fwu
->rmi4_data
->i2c_client
->dev
,
1284 "%s: Failed to read block data (block %d)\n",
1285 __func__
, block_num
);
1289 index
+= fwu
->block_size
;
1293 fwu
->rmi4_data
->reset_device(fwu
->rmi4_data
);
1298 int synaptics_fw_updater(unsigned char *fw_data
)
1305 if (!fwu
->initialized
)
1308 fwu
->ext_data_source
= fw_data
;
1309 fwu
->config_area
= UI_CONFIG_AREA
;
1311 retval
= fwu_start_reflash();
1315 EXPORT_SYMBOL(synaptics_fw_updater
);
1317 static ssize_t
fwu_sysfs_show_image(struct file
*data_file
,
1318 struct kobject
*kobj
, struct bin_attribute
*attributes
,
1319 char *buf
, loff_t pos
, size_t count
)
1321 struct synaptics_rmi4_data
*rmi4_data
= fwu
->rmi4_data
;
1323 if (count
< fwu
->config_size
) {
1324 dev_err(&rmi4_data
->i2c_client
->dev
,
1325 "%s: Not enough space (%d bytes) in buffer\n",
1330 memcpy(buf
, fwu
->read_config_buf
, fwu
->config_size
);
1332 return fwu
->config_size
;
1335 static ssize_t
fwu_sysfs_store_image(struct file
*data_file
,
1336 struct kobject
*kobj
, struct bin_attribute
*attributes
,
1337 char *buf
, loff_t pos
, size_t count
)
1339 memcpy((void *)(&fwu
->ext_data_source
[fwu
->data_pos
]),
1343 fwu
->data_pos
+= count
;
1348 static ssize_t
fwu_sysfs_do_reflash_store(struct device
*dev
,
1349 struct device_attribute
*attr
, const char *buf
, size_t count
)
1353 struct synaptics_rmi4_data
*rmi4_data
= fwu
->rmi4_data
;
1355 if (sscanf(buf
, "%u", &input
) != 1) {
1365 retval
= synaptics_fw_updater(fwu
->ext_data_source
);
1367 dev_err(&rmi4_data
->i2c_client
->dev
,
1368 "%s: Failed to do reflash\n",
1376 kfree(fwu
->ext_data_source
);
1377 fwu
->ext_data_source
= NULL
;
1381 static ssize_t
fwu_sysfs_write_config_store(struct device
*dev
,
1382 struct device_attribute
*attr
, const char *buf
, size_t count
)
1386 struct synaptics_rmi4_data
*rmi4_data
= fwu
->rmi4_data
;
1388 if (sscanf(buf
, "%u", &input
) != 1) {
1398 retval
= fwu_start_write_config();
1400 dev_err(&rmi4_data
->i2c_client
->dev
,
1401 "%s: Failed to write config\n",
1409 kfree(fwu
->ext_data_source
);
1410 fwu
->ext_data_source
= NULL
;
1414 static ssize_t
fwu_sysfs_read_config_store(struct device
*dev
,
1415 struct device_attribute
*attr
, const char *buf
, size_t count
)
1419 struct synaptics_rmi4_data
*rmi4_data
= fwu
->rmi4_data
;
1421 if (sscanf(buf
, "%u", &input
) != 1)
1427 retval
= fwu_do_read_config();
1429 dev_err(&rmi4_data
->i2c_client
->dev
,
1430 "%s: Failed to read config\n",
1438 static ssize_t
fwu_sysfs_config_area_store(struct device
*dev
,
1439 struct device_attribute
*attr
, const char *buf
, size_t count
)
1442 unsigned long config_area
;
1444 retval
= sstrtoul(buf
, 10, &config_area
);
1448 fwu
->config_area
= config_area
;
1453 static ssize_t
fwu_sysfs_image_size_store(struct device
*dev
,
1454 struct device_attribute
*attr
, const char *buf
, size_t count
)
1458 struct synaptics_rmi4_data
*rmi4_data
= fwu
->rmi4_data
;
1460 retval
= sstrtoul(buf
, 10, &size
);
1464 fwu
->image_size
= size
;
1467 kfree(fwu
->ext_data_source
);
1468 fwu
->ext_data_source
= kzalloc(fwu
->image_size
, GFP_KERNEL
);
1469 if (!fwu
->ext_data_source
) {
1470 dev_err(&rmi4_data
->i2c_client
->dev
,
1471 "%s: Failed to alloc mem for image data\n",
1479 static ssize_t
fwu_sysfs_block_size_show(struct device
*dev
,
1480 struct device_attribute
*attr
, char *buf
)
1482 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->block_size
);
1485 static ssize_t
fwu_sysfs_firmware_block_count_show(struct device
*dev
,
1486 struct device_attribute
*attr
, char *buf
)
1488 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->fw_block_count
);
1491 static ssize_t
fwu_sysfs_configuration_block_count_show(struct device
*dev
,
1492 struct device_attribute
*attr
, char *buf
)
1494 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->config_block_count
);
1497 static ssize_t
fwu_sysfs_perm_config_block_count_show(struct device
*dev
,
1498 struct device_attribute
*attr
, char *buf
)
1500 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->perm_config_block_count
);
1503 static ssize_t
fwu_sysfs_bl_config_block_count_show(struct device
*dev
,
1504 struct device_attribute
*attr
, char *buf
)
1506 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->bl_config_block_count
);
1509 static ssize_t
fwu_sysfs_disp_config_block_count_show(struct device
*dev
,
1510 struct device_attribute
*attr
, char *buf
)
1512 return snprintf(buf
, PAGE_SIZE
, "%u\n", fwu
->disp_config_block_count
);
1515 static void synaptics_rmi4_fwu_attn(struct i2c_client
*client
,
1516 unsigned char intr_mask
)
1518 if (fwu
->intr_mask
& intr_mask
)
1519 fwu_read_f34_flash_status();
1526 * synaptics_rmi4_set_page()
1528 * Called by synaptics_rmi4_i2c_read() and synaptics_rmi4_i2c_write().
1530 * This function writes to the page select register to switch to the
1534 static int synaptics_rmi4_set_page(struct synaptics_rmi4_data
*rmi4_data
,
1535 unsigned int address
)
1538 unsigned char retry
;
1539 unsigned char buf
[PAGE_SELECT_LEN
];
1541 struct i2c_client
*i2c
= rmi4_data
->i2c_client
;
1543 page
= ((address
>> 8) & MASK_8BIT
);
1544 if (page
!= rmi4_data
->current_page
) {
1547 for (retry
= 0; retry
< SYN_I2C_RETRY_TIMES
; retry
++) {
1548 retval
= i2c_master_send(i2c
, buf
, PAGE_SELECT_LEN
);
1549 if (retval
!= PAGE_SELECT_LEN
) {
1551 "%s: I2C retry %d\n",
1552 __func__
, retry
+ 1);
1555 rmi4_data
->current_page
= page
;
1560 retval
= PAGE_SELECT_LEN
;
1567 * synaptics_rmi4_i2c_read()
1569 * Called by various functions in this driver, and also exported to
1570 * other expansion Function modules such as rmi_dev.
1572 * This function reads data of an arbitrary length from the sensor,
1573 * starting from an assigned register address of the sensor, via I2C
1574 * with a retry mechanism.
1576 static int synaptics_rmi4_i2c_read(struct synaptics_rmi4_data
*rmi4_data
,
1577 unsigned short addr
, unsigned char *data
, unsigned short length
)
1579 return tpd_i2c_read_data(rmi4_data
->i2c_client
, addr
, data
, length
);
1583 unsigned char retry;
1585 struct i2c_msg msg[] = {
1587 .addr = rmi4_data->i2c_client->addr,
1593 .addr = rmi4_data->i2c_client->addr,
1600 buf = addr & MASK_8BIT;
1602 mutex_lock(&(rmi4_data->rmi4_io_ctrl_mutex));
1604 retval = synaptics_rmi4_set_page(rmi4_data, addr);
1605 if (retval != PAGE_SELECT_LEN)
1608 for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
1609 if (i2c_transfer(rmi4_data->i2c_client->adapter, msg, 2) == 2) {
1613 dev_err(&rmi4_data->i2c_client->dev,
1614 "%s: I2C retry %d\n",
1615 __func__, retry + 1);
1619 if (retry == SYN_I2C_RETRY_TIMES) {
1620 dev_err(&rmi4_data->i2c_client->dev,
1621 "%s: I2C read over retry limit\n",
1627 mutex_unlock(&(rmi4_data->rmi4_io_ctrl_mutex));
1633 * synaptics_rmi4_i2c_write()
1635 * Called by various functions in this driver, and also exported to
1636 * other expansion Function modules such as rmi_dev.
1638 * This function writes data of an arbitrary length to the sensor,
1639 * starting from an assigned register address of the sensor, via I2C with
1640 * a retry mechanism.
1642 static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data
*rmi4_data
,
1643 unsigned short addr
, unsigned char *data
, unsigned short length
)
1645 return tpd_i2c_write_data(rmi4_data
->i2c_client
, addr
, data
, length
);
1648 unsigned char retry;
1649 unsigned char buf[length + 1];
1650 struct i2c_msg msg[] = {
1652 .addr = rmi4_data->i2c_client->addr,
1659 mutex_lock(&(rmi4_data->rmi4_io_ctrl_mutex));
1661 retval = synaptics_rmi4_set_page(rmi4_data, addr);
1662 if (retval != PAGE_SELECT_LEN)
1665 buf[0] = addr & MASK_8BIT;
1666 memcpy(&buf[1], &data[0], length);
1668 for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
1669 if (i2c_transfer(rmi4_data->i2c_client->adapter, msg, 1) == 1) {
1673 dev_err(&rmi4_data->i2c_client->dev,
1674 "%s: I2C retry %d\n",
1675 __func__, retry + 1);
1679 if (retry == SYN_I2C_RETRY_TIMES) {
1680 dev_err(&rmi4_data->i2c_client->dev,
1681 "%s: I2C write over retry limit\n",
1687 mutex_unlock(&(rmi4_data->rmi4_io_ctrl_mutex));
1693 * synaptics_rmi4_irq_enable()
1695 * Called by synaptics_rmi4_probe() and the power management functions
1696 * in this driver and also exported to other expansion Function modules
1699 * This function handles the enabling and disabling of the attention
1700 * irq including the setting up of the ISR thread.
1702 static int synaptics_rmi4_irq_enable(struct synaptics_rmi4_data
*rmi4_data
,
1706 unsigned char intr_status
;
1707 //const struct synaptics_dsx_platform_data *platform_data = rmi4_data->i2c_client->dev.platform_data;
1710 if (rmi4_data
->irq_enabled
)
1713 /* Clear interrupts first */
1714 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1715 rmi4_data
->f01_data_base_addr
+ 1,
1717 rmi4_data
->num_of_intr_regs
);
1721 /* retval = request_threaded_irq(rmi4_data->irq, NULL,
1722 synaptics_rmi4_irq, platform_data->irq_type,
1723 DRIVER_NAME, rmi4_data);
1725 dev_err(&rmi4_data->i2c_client->dev,
1726 "%s: Failed to create irq thread\n",
1731 rmi4_data
->irq_enabled
= true;
1733 if (rmi4_data
->irq_enabled
) {
1734 disable_irq(rmi4_data
->irq
);
1735 free_irq(rmi4_data
->irq
, rmi4_data
);
1736 rmi4_data
->irq_enabled
= false;
1744 static int synaptics_rmi4_alloc_fh(struct synaptics_rmi4_fn
**fhandler
,
1745 struct synaptics_rmi4_fn_desc
*rmi_fd
, int page_number
)
1748 *fhandler
= kmalloc(sizeof(**fhandler
), GFP_KERNEL
);
1753 (*fhandler
)->full_addr
.data_base
=
1754 (rmi_fd
->data_base_addr
|
1755 (page_number
<< 8));
1756 (*fhandler
)->full_addr
.ctrl_base
=
1757 (rmi_fd
->ctrl_base_addr
|
1758 (page_number
<< 8));
1759 (*fhandler
)->full_addr
.cmd_base
=
1760 (rmi_fd
->cmd_base_addr
|
1761 (page_number
<< 8));
1762 (*fhandler
)->full_addr
.query_base
=
1763 (rmi_fd
->query_base_addr
|
1764 (page_number
<< 8));
1769 static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data
*rmi4_data
,
1770 struct synaptics_rmi4_fn
*fhandler
,
1771 struct synaptics_rmi4_fn_desc
*fd
,
1772 unsigned int intr_count
)
1776 unsigned char intr_offset
;
1777 unsigned char abs_data_size
;
1778 unsigned char abs_data_blk_size
;
1779 unsigned char query
[F11_STD_QUERY_LEN
];
1780 unsigned char control
[F11_STD_CTRL_LEN
];
1782 fhandler
->fn_number
= fd
->fn_number
;
1783 fhandler
->num_of_data_sources
= fd
->intr_src_count
;
1785 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1786 fhandler
->full_addr
.query_base
,
1792 /* Maximum number of fingers supported */
1793 if ((query
[1] & MASK_3BIT
) <= 4)
1794 fhandler
->num_of_data_points
= (query
[1] & MASK_3BIT
) + 1;
1795 else if ((query
[1] & MASK_3BIT
) == 5)
1796 fhandler
->num_of_data_points
= 10;
1798 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1799 fhandler
->full_addr
.ctrl_base
,
1805 /* Maximum x and y */
1806 rmi4_data
->sensor_max_x
= ((control
[6] & MASK_8BIT
) << 0) |
1807 ((control
[7] & MASK_4BIT
) << 8);
1808 rmi4_data
->sensor_max_y
= ((control
[8] & MASK_8BIT
) << 0) |
1809 ((control
[9] & MASK_4BIT
) << 8);
1810 dev_dbg(&rmi4_data
->i2c_client
->dev
,
1811 "%s: Function %02x max x = %d max y = %d\n",
1812 __func__
, fhandler
->fn_number
,
1813 rmi4_data
->sensor_max_x
,
1814 rmi4_data
->sensor_max_y
);
1816 fhandler
->intr_reg_num
= (intr_count
+ 7) / 8;
1817 if (fhandler
->intr_reg_num
!= 0)
1818 fhandler
->intr_reg_num
-= 1;
1820 /* Set an enable bit for each data source */
1821 intr_offset
= intr_count
% 8;
1822 fhandler
->intr_mask
= 0;
1823 for (ii
= intr_offset
;
1824 ii
< ((fd
->intr_src_count
& MASK_3BIT
) +
1827 fhandler
->intr_mask
|= 1 << ii
;
1829 abs_data_size
= query
[5] & MASK_2BIT
;
1830 abs_data_blk_size
= 3 + (2 * (abs_data_size
== 0 ? 1 : 0));
1831 fhandler
->size_of_data_register_block
= abs_data_blk_size
;
1837 * synaptics_rmi4_f12_init()
1839 * Called by synaptics_rmi4_query_device().
1841 * This funtion parses information from the Function 12 registers and
1842 * determines the number of fingers supported, offset to the data1
1843 * register, x and y data ranges, offset to the associated interrupt
1844 * status register, interrupt bit mask, and allocates memory resources
1845 * for finger data acquisition.
1847 static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data
*rmi4_data
,
1848 struct synaptics_rmi4_fn
*fhandler
,
1849 struct synaptics_rmi4_fn_desc
*fd
,
1850 unsigned int intr_count
)
1854 unsigned char intr_offset
;
1855 unsigned char ctrl_8_offset
;
1856 unsigned char ctrl_23_offset
;
1857 struct synaptics_rmi4_f12_query_5 query_5
;
1858 struct synaptics_rmi4_f12_query_8 query_8
;
1859 struct synaptics_rmi4_f12_ctrl_8 ctrl_8
;
1860 struct synaptics_rmi4_f12_ctrl_23 ctrl_23
;
1861 struct synaptics_rmi4_f12_finger_data
*finger_data_list
;
1863 fhandler
->fn_number
= fd
->fn_number
;
1864 fhandler
->num_of_data_sources
= fd
->intr_src_count
;
1866 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1867 fhandler
->full_addr
.query_base
+ 5,
1869 sizeof(query_5
.data
));
1873 ctrl_8_offset
= query_5
.ctrl0_is_present
+
1874 query_5
.ctrl1_is_present
+
1875 query_5
.ctrl2_is_present
+
1876 query_5
.ctrl3_is_present
+
1877 query_5
.ctrl4_is_present
+
1878 query_5
.ctrl5_is_present
+
1879 query_5
.ctrl6_is_present
+
1880 query_5
.ctrl7_is_present
;
1882 ctrl_23_offset
= ctrl_8_offset
+
1883 query_5
.ctrl8_is_present
+
1884 query_5
.ctrl9_is_present
+
1885 query_5
.ctrl10_is_present
+
1886 query_5
.ctrl11_is_present
+
1887 query_5
.ctrl12_is_present
+
1888 query_5
.ctrl13_is_present
+
1889 query_5
.ctrl14_is_present
+
1890 query_5
.ctrl15_is_present
+
1891 query_5
.ctrl16_is_present
+
1892 query_5
.ctrl17_is_present
+
1893 query_5
.ctrl18_is_present
+
1894 query_5
.ctrl19_is_present
+
1895 query_5
.ctrl20_is_present
+
1896 query_5
.ctrl21_is_present
+
1897 query_5
.ctrl22_is_present
;
1899 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1900 fhandler
->full_addr
.ctrl_base
+ ctrl_23_offset
,
1902 sizeof(ctrl_23
.data
));
1906 /* Maximum number of fingers supported */
1907 fhandler
->num_of_data_points
= ctrl_23
.max_reported_objects
;
1909 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1910 fhandler
->full_addr
.query_base
+ 8,
1912 sizeof(query_8
.data
));
1916 /* Determine the presence of the Data0 register */
1917 fhandler
->data1_offset
= query_8
.data0_is_present
;
1919 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1920 fhandler
->full_addr
.ctrl_base
+ ctrl_8_offset
,
1922 sizeof(ctrl_8
.data
));
1926 /* Maximum x and y */
1927 rmi4_data
->sensor_max_x
=
1928 ((unsigned short)ctrl_8
.max_x_coord_lsb
<< 0) |
1929 ((unsigned short)ctrl_8
.max_x_coord_msb
<< 8);
1930 rmi4_data
->sensor_max_y
=
1931 ((unsigned short)ctrl_8
.max_y_coord_lsb
<< 0) |
1932 ((unsigned short)ctrl_8
.max_y_coord_msb
<< 8);
1933 dev_dbg(&rmi4_data
->i2c_client
->dev
,
1934 "%s: Function %02x max x = %d max y = %d\n",
1935 __func__
, fhandler
->fn_number
,
1936 rmi4_data
->sensor_max_x
,
1937 rmi4_data
->sensor_max_y
);
1939 rmi4_data
->num_of_rx
= ctrl_8
.num_of_rx
;
1940 rmi4_data
->num_of_tx
= ctrl_8
.num_of_tx
;
1942 fhandler
->intr_reg_num
= (intr_count
+ 7) / 8;
1943 if (fhandler
->intr_reg_num
!= 0)
1944 fhandler
->intr_reg_num
-= 1;
1946 /* Set an enable bit for each data source */
1947 intr_offset
= intr_count
% 8;
1948 fhandler
->intr_mask
= 0;
1949 for (ii
= intr_offset
;
1950 ii
< ((fd
->intr_src_count
& MASK_3BIT
) +
1953 fhandler
->intr_mask
|= 1 << ii
;
1955 /* Allocate memory for finger data storage space */
1956 fhandler
->data_size
= fhandler
->num_of_data_points
*
1957 sizeof(struct synaptics_rmi4_f12_finger_data
);
1958 finger_data_list
= kmalloc(fhandler
->data_size
, GFP_KERNEL
);
1959 fhandler
->data
= (void *)finger_data_list
;
1965 static void synaptics_rmi4_f1a_kfree(struct synaptics_rmi4_fn
*fhandler
)
1967 struct synaptics_rmi4_f1a_handle
*f1a
= fhandler
->data
;
1970 kfree(f1a
->button_data_buffer
);
1971 kfree(f1a
->button_map
);
1973 fhandler
->data
= NULL
;
1979 static int synaptics_rmi4_f1a_alloc_mem(struct synaptics_rmi4_data
*rmi4_data
,
1980 struct synaptics_rmi4_fn
*fhandler
)
1983 struct synaptics_rmi4_f1a_handle
*f1a
;
1985 f1a
= kzalloc(sizeof(*f1a
), GFP_KERNEL
);
1987 dev_err(&rmi4_data
->i2c_client
->dev
,
1988 "%s: Failed to alloc mem for function handle\n",
1993 fhandler
->data
= (void *)f1a
;
1995 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
1996 fhandler
->full_addr
.query_base
,
1997 f1a
->button_query
.data
,
1998 sizeof(f1a
->button_query
.data
));
2000 dev_err(&rmi4_data
->i2c_client
->dev
,
2001 "%s: Failed to read query registers\n",
2006 f1a
->button_count
= f1a
->button_query
.max_button_count
+ 1;
2007 f1a
->button_bitmask_size
= (f1a
->button_count
+ 7) / 8;
2009 f1a
->button_data_buffer
= kcalloc(f1a
->button_bitmask_size
,
2010 sizeof(*(f1a
->button_data_buffer
)), GFP_KERNEL
);
2011 if (!f1a
->button_data_buffer
) {
2012 dev_err(&rmi4_data
->i2c_client
->dev
,
2013 "%s: Failed to alloc mem for data buffer\n",
2018 f1a
->button_map
= kcalloc(f1a
->button_count
,
2019 sizeof(*(f1a
->button_map
)), GFP_KERNEL
);
2020 if (!f1a
->button_map
) {
2021 dev_err(&rmi4_data
->i2c_client
->dev
,
2022 "%s: Failed to alloc mem for button map\n",
2030 static int synaptics_rmi4_f1a_button_map(struct synaptics_rmi4_data
*rmi4_data
,
2031 struct synaptics_rmi4_fn
*fhandler
)
2034 //struct synaptics_rmi4_f1a_handle *f1a = fhandler->data;
2035 /* const struct synaptics_dsx_platform_data *pdata = rmi4_data->board;
2037 if (!pdata->f1a_button_map) {
2038 dev_err(&rmi4_data->i2c_client->dev,
2039 "%s: f1a_button_map is NULL in board file\n",
2042 } else if (!pdata->f1a_button_map->map) {
2043 dev_err(&rmi4_data->i2c_client->dev,
2044 "%s: Button map is missing in board file\n",
2048 if (pdata->f1a_button_map->nbuttons != f1a->button_count) {
2049 f1a->valid_button_count = min(f1a->button_count,
2050 pdata->f1a_button_map->nbuttons);
2052 f1a->valid_button_count = f1a->button_count;
2055 for (ii = 0; ii < f1a->valid_button_count; ii++)
2056 f1a->button_map[ii] = pdata->f1a_button_map->map[ii];
2063 static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data
*rmi4_data
,
2064 struct synaptics_rmi4_fn
*fhandler
,
2065 struct synaptics_rmi4_fn_desc
*fd
,
2066 unsigned int intr_count
)
2070 unsigned short intr_offset
;
2072 fhandler
->fn_number
= fd
->fn_number
;
2073 fhandler
->num_of_data_sources
= fd
->intr_src_count
;
2075 fhandler
->intr_reg_num
= (intr_count
+ 7) / 8;
2076 if (fhandler
->intr_reg_num
!= 0)
2077 fhandler
->intr_reg_num
-= 1;
2079 /* Set an enable bit for each data source */
2080 intr_offset
= intr_count
% 8;
2081 fhandler
->intr_mask
= 0;
2082 for (ii
= intr_offset
;
2083 ii
< ((fd
->intr_src_count
& MASK_3BIT
) +
2086 fhandler
->intr_mask
|= 1 << ii
;
2088 retval
= synaptics_rmi4_f1a_alloc_mem(rmi4_data
, fhandler
);
2092 retval
= synaptics_rmi4_f1a_button_map(rmi4_data
, fhandler
);
2096 rmi4_data
->button_0d_enabled
= 1;
2101 synaptics_rmi4_f1a_kfree(fhandler
);
2109 * synaptics_rmi4_query_device()
2111 * Called by synaptics_rmi4_probe().
2113 * This funtion scans the page description table, records the offsets
2114 * to the register types of Function $01, sets up the function handlers
2115 * for Function $11 and Function $12, determines the number of interrupt
2116 * sources from the sensor, adds valid Functions with data inputs to the
2117 * Function linked list, parses information from the query registers of
2118 * Function $01, and enables the interrupt sources from the valid Functions
2121 static int synaptics_rmi4_query_device(struct synaptics_rmi4_data
*rmi4_data
)
2125 unsigned char page_number
;
2126 unsigned char intr_count
= 0;
2127 unsigned char data_sources
= 0;
2128 unsigned char f01_query
[F01_STD_QUERY_LEN
];
2129 unsigned short pdt_entry_addr
;
2130 unsigned short intr_addr
;
2131 struct synaptics_rmi4_f01_device_status status
;
2132 struct synaptics_rmi4_fn_desc rmi_fd
;
2133 struct synaptics_rmi4_fn
*fhandler
;
2134 struct synaptics_rmi4_device_info
*rmi
;
2136 rmi
= &(rmi4_data
->rmi4_mod_info
);
2138 INIT_LIST_HEAD(&rmi
->support_fn_list
);
2140 /* Scan the page description tables of the pages to service */
2141 for (page_number
= 0; page_number
< PAGES_TO_SERVICE
; page_number
++) {
2142 for (pdt_entry_addr
= PDT_START
; pdt_entry_addr
> PDT_END
;
2143 pdt_entry_addr
-= PDT_ENTRY_SIZE
) {
2144 pdt_entry_addr
|= (page_number
<< 8);
2146 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
2148 (unsigned char *)&rmi_fd
,
2155 if (rmi_fd
.fn_number
== 0) {
2157 "%s: Reached end of PDT\n",
2163 "%s: F%02x found (page %d)\n",
2164 __func__
, rmi_fd
.fn_number
,
2167 switch (rmi_fd
.fn_number
) {
2168 case SYNAPTICS_RMI4_F01
:
2169 rmi4_data
->f01_query_base_addr
=
2170 rmi_fd
.query_base_addr
;
2171 rmi4_data
->f01_ctrl_base_addr
=
2172 rmi_fd
.ctrl_base_addr
;
2173 rmi4_data
->f01_data_base_addr
=
2174 rmi_fd
.data_base_addr
;
2175 rmi4_data
->f01_cmd_base_addr
=
2176 rmi_fd
.cmd_base_addr
;
2178 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
2179 rmi4_data
->f01_data_base_addr
,
2181 sizeof(status
.data
));
2185 if (status
.flash_prog
== 1) {
2186 TPD_DMESG("%s: In flash prog mode, status = 0x%02x\n",
2188 status
.status_code
);
2189 goto flash_prog_mode
;
2192 case SYNAPTICS_RMI4_F11
:
2193 if (rmi_fd
.intr_src_count
== 0)
2196 retval
= synaptics_rmi4_alloc_fh(&fhandler
,
2197 &rmi_fd
, page_number
);
2199 dev_err(&rmi4_data
->i2c_client
->dev
,
2200 "%s: Failed to alloc for F%d\n",
2206 retval
= synaptics_rmi4_f11_init(rmi4_data
,
2207 fhandler
, &rmi_fd
, intr_count
);
2211 case SYNAPTICS_RMI4_F12
:
2212 if (rmi_fd
.intr_src_count
== 0)
2215 retval
= synaptics_rmi4_alloc_fh(&fhandler
,
2216 &rmi_fd
, page_number
);
2218 dev_err(&rmi4_data
->i2c_client
->dev
,
2219 "%s: Failed to alloc for F%d\n",
2225 retval
= synaptics_rmi4_f12_init(rmi4_data
,
2226 fhandler
, &rmi_fd
, intr_count
);
2230 case SYNAPTICS_RMI4_F1A
:
2231 if (rmi_fd
.intr_src_count
== 0)
2234 retval
= synaptics_rmi4_alloc_fh(&fhandler
,
2235 &rmi_fd
, page_number
);
2237 dev_err(&rmi4_data
->i2c_client
->dev
,
2238 "%s: Failed to alloc for F%d\n",
2244 retval
= synaptics_rmi4_f1a_init(rmi4_data
,
2245 fhandler
, &rmi_fd
, intr_count
);
2250 case SYNAPTICS_RMI4_F51
:
2251 if (rmi_fd
.intr_src_count
== 0)
2254 retval
= synaptics_rmi4_alloc_fh(&fhandler
,
2255 &rmi_fd
, page_number
);
2257 dev_err(&rmi4_data
->i2c_client
->dev
,
2258 "%s: Failed to alloc for F%d\n",
2264 retval
= synaptics_rmi4_f51_init(rmi4_data
,
2265 fhandler
, &rmi_fd
, intr_count
);
2272 /* Accumulate the interrupt count */
2273 intr_count
+= (rmi_fd
.intr_src_count
& MASK_3BIT
);
2275 if (fhandler
&& rmi_fd
.intr_src_count
) {
2276 list_add_tail(&fhandler
->link
,
2277 &rmi
->support_fn_list
);
2283 rmi4_data
->num_of_intr_regs
= (intr_count
+ 7) / 8;
2285 "%s: Number of interrupt registers = %d\n",
2286 __func__
, rmi4_data
->num_of_intr_regs
);
2288 retval
= synaptics_rmi4_i2c_read(rmi4_data
,
2289 rmi4_data
->f01_query_base_addr
,
2295 /* RMI Version 4.0 currently supported */
2296 rmi
->version_major
= 4;
2297 rmi
->version_minor
= 0;
2299 rmi
->manufacturer_id
= f01_query
[0];
2300 rmi
->product_props
= f01_query
[1];
2301 rmi
->product_info
[0] = f01_query
[2] & MASK_7BIT
;
2302 rmi
->product_info
[1] = f01_query
[3] & MASK_7BIT
;
2303 rmi
->date_code
[0] = f01_query
[4] & MASK_5BIT
;
2304 rmi
->date_code
[1] = f01_query
[5] & MASK_4BIT
;
2305 rmi
->date_code
[2] = f01_query
[6] & MASK_5BIT
;
2306 rmi
->tester_id
= ((f01_query
[7] & MASK_7BIT
) << 8) |
2307 (f01_query
[8] & MASK_7BIT
);
2308 rmi
->serial_number
= ((f01_query
[9] & MASK_7BIT
) << 8) |
2309 (f01_query
[10] & MASK_7BIT
);
2310 memcpy(rmi
->product_id_string
, &f01_query
[11], 10);
2312 if (rmi
->manufacturer_id
!= 1) {
2313 dev_err(&rmi4_data
->i2c_client
->dev
,
2314 "%s: Non-Synaptics device found, manufacturer ID = %d\n",
2315 __func__
, rmi
->manufacturer_id
);
2318 memset(rmi4_data
->intr_mask
, 0x00, sizeof(rmi4_data
->intr_mask
));
2321 * Map out the interrupt bit masks for the interrupt sources
2322 * from the registered function handlers.
2324 list_for_each_entry(fhandler
, &rmi
->support_fn_list
, link
)
2325 data_sources
+= fhandler
->num_of_data_sources
;
2327 list_for_each_entry(fhandler
, &rmi
->support_fn_list
, link
) {
2328 if (fhandler
->num_of_data_sources
) {
2329 rmi4_data
->intr_mask
[fhandler
->intr_reg_num
] |=
2330 fhandler
->intr_mask
;
2335 /* Enable the interrupt sources */
2336 for (ii
= 0; ii
< rmi4_data
->num_of_intr_regs
; ii
++) {
2337 if (rmi4_data
->intr_mask
[ii
] != 0x00) {
2338 TPD_DMESG("%s: Interrupt enable mask %d = 0x%02x\n",
2339 __func__
, ii
, rmi4_data
->intr_mask
[ii
]);
2340 intr_addr
= rmi4_data
->f01_ctrl_base_addr
+ 1 + ii
;
2341 retval
= synaptics_rmi4_i2c_write(rmi4_data
,
2343 &(rmi4_data
->intr_mask
[ii
]),
2344 sizeof(rmi4_data
->intr_mask
[ii
]));
2353 static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data
*rmi4_data
)
2356 unsigned char command
= 0x01;
2357 //struct synaptics_rmi4_fn *fhandler;
2358 struct synaptics_rmi4_device_info
*rmi
;
2360 rmi
= &(rmi4_data
->rmi4_mod_info
);
2362 retval
= synaptics_rmi4_i2c_write(rmi4_data
,
2363 rmi4_data
->f01_cmd_base_addr
,
2367 dev_err(&rmi4_data
->i2c_client
->dev
,
2368 "%s: Failed to issue reset command, error = %d\n",
2375 /* list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
2376 printk("kfree handler = 0x%x\n", fhandler);
2378 if (fhandler->fn_number == SYNAPTICS_RMI4_F1A)
2379 synaptics_rmi4_f1a_kfree(fhandler);
2381 kfree(fhandler->data);
2386 retval
= synaptics_rmi4_query_device(rmi4_data
);
2388 dev_err(&rmi4_data
->i2c_client
->dev
,
2389 "%s: Failed to query device\n",
2397 static int synaptics_rmi4_fwu_init(struct i2c_client
*client
)
2400 unsigned char attr_count
;
2401 struct pdt_properties pdt_props
;
2403 TPD_DMESG("%s:enter \n", __func__
);
2405 fwu
= kzalloc(sizeof(*fwu
), GFP_KERNEL
);
2407 dev_err(&client
->dev
,
2408 "%s: Failed to alloc mem for fwu\n",
2413 fwu
->rmi4_data
= kzalloc(sizeof(struct synaptics_rmi4_data
), GFP_KERNEL
);
2414 if (!fwu
->rmi4_data
) {
2415 dev_err(&client
->dev
,
2416 "%s: Failed to alloc mem for rmi4_data\n",
2422 fwu
->fn_ptr
= kzalloc(sizeof(*(fwu
->fn_ptr
)), GFP_KERNEL
);
2424 dev_err(&client
->dev
,
2425 "%s: Failed to alloc mem for fn_ptr\n",
2428 goto exit_free_rmi4
;
2431 fwu
->rmi4_data
->input_dev
= tpd
->dev
;
2432 fwu
->rmi4_data
->i2c_client
= client
;
2433 fwu
->fn_ptr
->read
= synaptics_rmi4_i2c_read
;
2434 fwu
->fn_ptr
->write
= synaptics_rmi4_i2c_write
;
2435 fwu
->fn_ptr
->enable
= synaptics_rmi4_irq_enable
;
2436 fwu
->rmi4_data
->reset_device
= synaptics_rmi4_reset_device
;
2438 synaptics_rmi4_query_device(fwu
->rmi4_data
);
2440 mutex_init(&(fwu
->rmi4_data
->rmi4_io_ctrl_mutex
));
2442 retval
= fwu
->fn_ptr
->read(fwu
->rmi4_data
,
2445 sizeof(pdt_props
.data
));
2447 TPD_DMESG("%s: Failed to read PDT properties, assuming 0x00\n",
2449 } else if (pdt_props
.has_bsr
) {
2451 "%s: Reflash for LTS not currently supported\n",
2456 retval
= fwu_scan_pdt();
2460 /* fwu->productinfo1 = rmi4_data->rmi4_mod_info.product_info[0];
2461 fwu->productinfo2 = rmi4_data->rmi4_mod_info.product_info[1];
2463 memcpy(fwu->product_id, rmi4_data->rmi4_mod_info.product_id_string,
2464 SYNAPTICS_RMI4_PRODUCT_ID_SIZE);
2465 fwu->product_id[SYNAPTICS_RMI4_PRODUCT_ID_SIZE] = 0;
2467 dev_dbg(&rmi4_data->i2c_client->dev,
2468 "%s: F01 product info: 0x%04x 0x%04x\n",
2469 __func__, fwu->productinfo1, fwu->productinfo2);
2470 dev_dbg(&rmi4_data->i2c_client->dev,
2471 "%s: F01 product ID: %s\n",
2472 __func__, fwu->product_id);
2474 retval
= fwu_read_f34_queries();
2478 TPD_DMESG("query_base_addr=0x%x, data_base_addr=0x%x, addr_f34_flash_control=0x%x, bootloader_id=%s\n",
2479 fwu
->f34_fd
.query_base_addr
, fwu
->f34_fd
.data_base_addr
,
2480 fwu
->addr_f34_flash_control
, fwu
->bootloader_id
);
2482 fwu
->initialized
= true;
2483 // fwu->ext_data_source = synaImage;
2484 // fwu->config_area = UI_CONFIG_AREA;
2486 properties_kobj_fwupdate
= kobject_create_and_add("fwupdate", properties_kobj_synap
);
2488 if (!properties_kobj_fwupdate
) {
2489 dev_err(&client
->dev
,
2490 "%s: Failed to create sysfs directory\n",
2494 retval
= sysfs_create_bin_file(properties_kobj_fwupdate
, &dev_attr_data
);
2496 dev_err(&client
->dev
,
2497 "%s: Failed to create sysfs bin file\n",
2502 for (attr_count
= 0; attr_count
< ARRAY_SIZE(attrs
); attr_count
++) {
2503 //retval = sysfs_create_file(&tpd->dev->dev.kobj, &attrs[attr_count].attr);
2504 retval
= sysfs_create_file(properties_kobj_fwupdate
, &attrs
[attr_count
].attr
);
2506 dev_err(&client
->dev
,
2507 "%s: Failed to create sysfs attributes\n",
2510 goto exit_remove_attrs
;
2514 attr_kobj = kobject_create_and_add("syna_reflash", NULL);
2515 retval = sysfs_create_group(attr_kobj,&syna_attr_group);
2516 if(!attr_kobj|| retval){
2517 printk("failed to create board_properties\n");
2520 // fwu_start_reflash();
2525 for (attr_count
--; attr_count
>= 0; attr_count
--) {
2526 sysfs_remove_file(properties_kobj_fwupdate
,&attrs
[attr_count
].attr
);
2529 sysfs_remove_bin_file(properties_kobj_fwupdate
, &dev_attr_data
);
2537 kfree(fwu
->rmi4_data
);
2547 static void synaptics_rmi4_fwu_remove(struct i2c_client
*client
)
2549 unsigned char attr_count
;
2551 sysfs_remove_bin_file(&fwu
->rmi4_data
->input_dev
->dev
.kobj
, &dev_attr_data
);
2553 for (attr_count
= 0; attr_count
< ARRAY_SIZE(attrs
); attr_count
++) {
2554 sysfs_remove_file(&fwu
->rmi4_data
->input_dev
->dev
.kobj
,
2555 &attrs
[attr_count
].attr
);
2561 complete(&remove_complete
);
2566 static int __init
rmi4_fw_update_module_init(void)
2568 synaptics_rmi4_new_function(RMI_FW_UPDATER
, true,
2569 synaptics_rmi4_fwu_init
,
2570 synaptics_rmi4_fwu_remove
,
2571 synaptics_rmi4_fwu_attn
);
2575 static void __exit
rmi4_fw_update_module_exit(void)
2577 init_completion(&remove_complete
);
2578 synaptics_rmi4_new_function(RMI_FW_UPDATER
, false,
2579 synaptics_rmi4_fwu_init
,
2580 synaptics_rmi4_fwu_remove
,
2581 synaptics_rmi4_fwu_attn
);
2582 wait_for_completion(&remove_complete
);
2586 module_init(rmi4_fw_update_module_init
);
2587 module_exit(rmi4_fw_update_module_exit
);
2589 MODULE_AUTHOR("Synaptics, Inc.");
2590 MODULE_DESCRIPTION("RMI4 FW Update Module");
2591 MODULE_LICENSE("GPL");
2592 MODULE_VERSION(SYNAPTICS_RMI4_DRIVER_VERSION
);