cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hideep.c (25943B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (C) 2012-2017 Hideep, Inc.
      4 */
      5
      6#include <linux/module.h>
      7#include <linux/of.h>
      8#include <linux/firmware.h>
      9#include <linux/delay.h>
     10#include <linux/gpio/consumer.h>
     11#include <linux/i2c.h>
     12#include <linux/acpi.h>
     13#include <linux/interrupt.h>
     14#include <linux/regmap.h>
     15#include <linux/sysfs.h>
     16#include <linux/input.h>
     17#include <linux/input/mt.h>
     18#include <linux/input/touchscreen.h>
     19#include <linux/regulator/consumer.h>
     20#include <asm/unaligned.h>
     21
     22#define HIDEEP_TS_NAME			"HiDeep Touchscreen"
     23#define HIDEEP_I2C_NAME			"hideep_ts"
     24
     25#define HIDEEP_MT_MAX			10
     26#define HIDEEP_KEY_MAX			3
     27
     28/* count(2) + touch data(100) + key data(6) */
     29#define HIDEEP_MAX_EVENT		108UL
     30
     31#define HIDEEP_TOUCH_EVENT_INDEX	2
     32#define HIDEEP_KEY_EVENT_INDEX		102
     33
     34/* Touch & key event */
     35#define HIDEEP_EVENT_ADDR		0x240
     36
     37/* command list */
     38#define HIDEEP_RESET_CMD		0x9800
     39
     40/* event bit */
     41#define HIDEEP_MT_RELEASED		BIT(4)
     42#define HIDEEP_KEY_PRESSED		BIT(7)
     43#define HIDEEP_KEY_FIRST_PRESSED	BIT(8)
     44#define HIDEEP_KEY_PRESSED_MASK		(HIDEEP_KEY_PRESSED | \
     45					 HIDEEP_KEY_FIRST_PRESSED)
     46
     47#define HIDEEP_KEY_IDX_MASK		0x0f
     48
     49/* For NVM */
     50#define HIDEEP_YRAM_BASE		0x40000000
     51#define HIDEEP_PERIPHERAL_BASE		0x50000000
     52#define HIDEEP_ESI_BASE			(HIDEEP_PERIPHERAL_BASE + 0x00000000)
     53#define HIDEEP_FLASH_BASE		(HIDEEP_PERIPHERAL_BASE + 0x01000000)
     54#define HIDEEP_SYSCON_BASE		(HIDEEP_PERIPHERAL_BASE + 0x02000000)
     55
     56#define HIDEEP_SYSCON_MOD_CON		(HIDEEP_SYSCON_BASE + 0x0000)
     57#define HIDEEP_SYSCON_SPC_CON		(HIDEEP_SYSCON_BASE + 0x0004)
     58#define HIDEEP_SYSCON_CLK_CON		(HIDEEP_SYSCON_BASE + 0x0008)
     59#define HIDEEP_SYSCON_CLK_ENA		(HIDEEP_SYSCON_BASE + 0x000C)
     60#define HIDEEP_SYSCON_RST_CON		(HIDEEP_SYSCON_BASE + 0x0010)
     61#define HIDEEP_SYSCON_WDT_CON		(HIDEEP_SYSCON_BASE + 0x0014)
     62#define HIDEEP_SYSCON_WDT_CNT		(HIDEEP_SYSCON_BASE + 0x0018)
     63#define HIDEEP_SYSCON_PWR_CON		(HIDEEP_SYSCON_BASE + 0x0020)
     64#define HIDEEP_SYSCON_PGM_ID		(HIDEEP_SYSCON_BASE + 0x00F4)
     65
     66#define HIDEEP_FLASH_CON		(HIDEEP_FLASH_BASE + 0x0000)
     67#define HIDEEP_FLASH_STA		(HIDEEP_FLASH_BASE + 0x0004)
     68#define HIDEEP_FLASH_CFG		(HIDEEP_FLASH_BASE + 0x0008)
     69#define HIDEEP_FLASH_TIM		(HIDEEP_FLASH_BASE + 0x000C)
     70#define HIDEEP_FLASH_CACHE_CFG		(HIDEEP_FLASH_BASE + 0x0010)
     71#define HIDEEP_FLASH_PIO_SIG		(HIDEEP_FLASH_BASE + 0x400000)
     72
     73#define HIDEEP_ESI_TX_INVALID		(HIDEEP_ESI_BASE + 0x0008)
     74
     75#define HIDEEP_PERASE			0x00040000
     76#define HIDEEP_WRONLY			0x00100000
     77
     78#define HIDEEP_NVM_MASK_OFS		0x0000000C
     79#define HIDEEP_NVM_DEFAULT_PAGE		0
     80#define HIDEEP_NVM_SFR_WPAGE		1
     81#define HIDEEP_NVM_SFR_RPAGE		2
     82
     83#define HIDEEP_PIO_SIG			0x00400000
     84#define HIDEEP_PROT_MODE		0x03400000
     85
     86#define HIDEEP_NVM_PAGE_SIZE		128
     87
     88#define HIDEEP_DWZ_INFO			0x000002C0
     89
     90struct hideep_event {
     91	__le16 x;
     92	__le16 y;
     93	__le16 z;
     94	u8 w;
     95	u8 flag;
     96	u8 type;
     97	u8 index;
     98};
     99
    100struct dwz_info {
    101	__be32 code_start;
    102	u8 code_crc[12];
    103
    104	__be32 c_code_start;
    105	__be16 gen_ver;
    106	__be16 c_code_len;
    107
    108	__be32 vr_start;
    109	__be16 rsv0;
    110	__be16 vr_len;
    111
    112	__be32 ft_start;
    113	__be16 vr_version;
    114	__be16 ft_len;
    115
    116	__be16 core_ver;
    117	__be16 boot_ver;
    118
    119	__be16 release_ver;
    120	__be16 custom_ver;
    121
    122	u8 factory_id;
    123	u8 panel_type;
    124	u8 model_name[6];
    125
    126	__be16 extra_option;
    127	__be16 product_code;
    128
    129	__be16 vendor_id;
    130	__be16 product_id;
    131};
    132
    133struct pgm_packet {
    134	struct {
    135		u8 unused[3];
    136		u8 len;
    137		__be32 addr;
    138	} header;
    139	__be32 payload[HIDEEP_NVM_PAGE_SIZE / sizeof(__be32)];
    140};
    141
    142#define HIDEEP_XFER_BUF_SIZE	sizeof(struct pgm_packet)
    143
    144struct hideep_ts {
    145	struct i2c_client *client;
    146	struct input_dev *input_dev;
    147	struct regmap *reg;
    148
    149	struct touchscreen_properties prop;
    150
    151	struct gpio_desc *reset_gpio;
    152
    153	struct regulator *vcc_vdd;
    154	struct regulator *vcc_vid;
    155
    156	struct mutex dev_mutex;
    157
    158	u32 tch_count;
    159	u32 lpm_count;
    160
    161	/*
    162	 * Data buffer to read packet from the device (contacts and key
    163	 * states). We align it on double-word boundary to keep word-sized
    164	 * fields in contact data and double-word-sized fields in program
    165	 * packet aligned.
    166	 */
    167	u8 xfer_buf[HIDEEP_XFER_BUF_SIZE] __aligned(4);
    168
    169	int key_num;
    170	u32 key_codes[HIDEEP_KEY_MAX];
    171
    172	struct dwz_info dwz_info;
    173
    174	unsigned int fw_size;
    175	u32 nvm_mask;
    176};
    177
    178static int hideep_pgm_w_mem(struct hideep_ts *ts, u32 addr,
    179			    const __be32 *data, size_t count)
    180{
    181	struct pgm_packet *packet = (void *)ts->xfer_buf;
    182	size_t len = count * sizeof(*data);
    183	struct i2c_msg msg = {
    184		.addr	= ts->client->addr,
    185		.len	= len + sizeof(packet->header.len) +
    186				sizeof(packet->header.addr),
    187		.buf	= &packet->header.len,
    188	};
    189	int ret;
    190
    191	if (len > HIDEEP_NVM_PAGE_SIZE)
    192		return -EINVAL;
    193
    194	packet->header.len = 0x80 | (count - 1);
    195	packet->header.addr = cpu_to_be32(addr);
    196	memcpy(packet->payload, data, len);
    197
    198	ret = i2c_transfer(ts->client->adapter, &msg, 1);
    199	if (ret != 1)
    200		return ret < 0 ? ret : -EIO;
    201
    202	return 0;
    203}
    204
    205static int hideep_pgm_r_mem(struct hideep_ts *ts, u32 addr,
    206			    __be32 *data, size_t count)
    207{
    208	struct pgm_packet *packet = (void *)ts->xfer_buf;
    209	size_t len = count * sizeof(*data);
    210	struct i2c_msg msg[] = {
    211		{
    212			.addr	= ts->client->addr,
    213			.len	= sizeof(packet->header.len) +
    214					sizeof(packet->header.addr),
    215			.buf	= &packet->header.len,
    216		},
    217		{
    218			.addr	= ts->client->addr,
    219			.flags	= I2C_M_RD,
    220			.len	= len,
    221			.buf	= (u8 *)data,
    222		},
    223	};
    224	int ret;
    225
    226	if (len > HIDEEP_NVM_PAGE_SIZE)
    227		return -EINVAL;
    228
    229	packet->header.len = count - 1;
    230	packet->header.addr = cpu_to_be32(addr);
    231
    232	ret = i2c_transfer(ts->client->adapter, msg, ARRAY_SIZE(msg));
    233	if (ret != ARRAY_SIZE(msg))
    234		return ret < 0 ? ret : -EIO;
    235
    236	return 0;
    237}
    238
    239static int hideep_pgm_r_reg(struct hideep_ts *ts, u32 addr, u32 *val)
    240{
    241	__be32 data;
    242	int error;
    243
    244	error = hideep_pgm_r_mem(ts, addr, &data, 1);
    245	if (error) {
    246		dev_err(&ts->client->dev,
    247			"read of register %#08x failed: %d\n",
    248			addr, error);
    249		return error;
    250	}
    251
    252	*val = be32_to_cpu(data);
    253	return 0;
    254}
    255
    256static int hideep_pgm_w_reg(struct hideep_ts *ts, u32 addr, u32 val)
    257{
    258	__be32 data = cpu_to_be32(val);
    259	int error;
    260
    261	error = hideep_pgm_w_mem(ts, addr, &data, 1);
    262	if (error) {
    263		dev_err(&ts->client->dev,
    264			"write to register %#08x (%#08x) failed: %d\n",
    265			addr, val, error);
    266		return error;
    267	}
    268
    269	return 0;
    270}
    271
    272#define SW_RESET_IN_PGM(clk)					\
    273{								\
    274	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CNT, (clk));	\
    275	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x03);	\
    276	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x01);	\
    277}
    278
    279#define SET_FLASH_PIO(ce)					\
    280	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CON,			\
    281			 0x01 | ((ce) << 1))
    282
    283#define SET_PIO_SIG(x, y)					\
    284	hideep_pgm_w_reg(ts, HIDEEP_FLASH_PIO_SIG + (x), (y))
    285
    286#define SET_FLASH_HWCONTROL()					\
    287	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CON, 0x00)
    288
    289#define NVM_W_SFR(x, y)						\
    290{								\
    291	SET_FLASH_PIO(1);					\
    292	SET_PIO_SIG(x, y);					\
    293	SET_FLASH_PIO(0);					\
    294}
    295
    296static void hideep_pgm_set(struct hideep_ts *ts)
    297{
    298	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_WDT_CON, 0x00);
    299	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_SPC_CON, 0x00);
    300	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_CLK_ENA, 0xFF);
    301	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_CLK_CON, 0x01);
    302	hideep_pgm_w_reg(ts, HIDEEP_SYSCON_PWR_CON, 0x01);
    303	hideep_pgm_w_reg(ts, HIDEEP_FLASH_TIM, 0x03);
    304	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CACHE_CFG, 0x00);
    305}
    306
    307static int hideep_pgm_get_pattern(struct hideep_ts *ts, u32 *pattern)
    308{
    309	u16 p1 = 0xAF39;
    310	u16 p2 = 0xDF9D;
    311	int error;
    312
    313	error = regmap_bulk_write(ts->reg, p1, &p2, 1);
    314	if (error) {
    315		dev_err(&ts->client->dev,
    316			"%s: regmap_bulk_write() failed with %d\n",
    317			__func__, error);
    318		return error;
    319	}
    320
    321	usleep_range(1000, 1100);
    322
    323	/* flush invalid Tx load register */
    324	error = hideep_pgm_w_reg(ts, HIDEEP_ESI_TX_INVALID, 0x01);
    325	if (error)
    326		return error;
    327
    328	error = hideep_pgm_r_reg(ts, HIDEEP_SYSCON_PGM_ID, pattern);
    329	if (error)
    330		return error;
    331
    332	return 0;
    333}
    334
    335static int hideep_enter_pgm(struct hideep_ts *ts)
    336{
    337	int retry_count = 10;
    338	u32 pattern;
    339	int error;
    340
    341	while (retry_count--) {
    342		error = hideep_pgm_get_pattern(ts, &pattern);
    343		if (error) {
    344			dev_err(&ts->client->dev,
    345				"hideep_pgm_get_pattern failed: %d\n", error);
    346		} else if (pattern != 0x39AF9DDF) {
    347			dev_err(&ts->client->dev, "%s: bad pattern: %#08x\n",
    348				__func__, pattern);
    349		} else {
    350			dev_dbg(&ts->client->dev, "found magic code");
    351
    352			hideep_pgm_set(ts);
    353			usleep_range(1000, 1100);
    354
    355			return 0;
    356		}
    357	}
    358
    359	dev_err(&ts->client->dev, "failed to  enter pgm mode\n");
    360	SW_RESET_IN_PGM(1000);
    361	return -EIO;
    362}
    363
    364static int hideep_nvm_unlock(struct hideep_ts *ts)
    365{
    366	u32 unmask_code;
    367	int error;
    368
    369	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_RPAGE);
    370	error = hideep_pgm_r_reg(ts, 0x0000000C, &unmask_code);
    371	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
    372	if (error)
    373		return error;
    374
    375	/* make it unprotected code */
    376	unmask_code &= ~HIDEEP_PROT_MODE;
    377
    378	/* compare unmask code */
    379	if (unmask_code != ts->nvm_mask)
    380		dev_warn(&ts->client->dev,
    381			 "read mask code different %#08x vs %#08x",
    382			 unmask_code, ts->nvm_mask);
    383
    384	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_SFR_WPAGE);
    385	SET_FLASH_PIO(0);
    386
    387	NVM_W_SFR(HIDEEP_NVM_MASK_OFS, ts->nvm_mask);
    388	SET_FLASH_HWCONTROL();
    389	hideep_pgm_w_reg(ts, HIDEEP_FLASH_CFG, HIDEEP_NVM_DEFAULT_PAGE);
    390
    391	return 0;
    392}
    393
    394static int hideep_check_status(struct hideep_ts *ts)
    395{
    396	int time_out = 100;
    397	int status;
    398	int error;
    399
    400	while (time_out--) {
    401		error = hideep_pgm_r_reg(ts, HIDEEP_FLASH_STA, &status);
    402		if (!error && status)
    403			return 0;
    404
    405		usleep_range(1000, 1100);
    406	}
    407
    408	return -ETIMEDOUT;
    409}
    410
    411static int hideep_program_page(struct hideep_ts *ts, u32 addr,
    412			       const __be32 *ucode, size_t xfer_count)
    413{
    414	u32 val;
    415	int error;
    416
    417	error = hideep_check_status(ts);
    418	if (error)
    419		return -EBUSY;
    420
    421	addr &= ~(HIDEEP_NVM_PAGE_SIZE - 1);
    422
    423	SET_FLASH_PIO(0);
    424	SET_FLASH_PIO(1);
    425
    426	/* erase page */
    427	SET_PIO_SIG(HIDEEP_PERASE | addr, 0xFFFFFFFF);
    428
    429	SET_FLASH_PIO(0);
    430
    431	error = hideep_check_status(ts);
    432	if (error)
    433		return -EBUSY;
    434
    435	/* write page */
    436	SET_FLASH_PIO(1);
    437
    438	val = be32_to_cpu(ucode[0]);
    439	SET_PIO_SIG(HIDEEP_WRONLY | addr, val);
    440
    441	hideep_pgm_w_mem(ts, HIDEEP_FLASH_PIO_SIG | HIDEEP_WRONLY,
    442			 ucode, xfer_count);
    443
    444	val = be32_to_cpu(ucode[xfer_count - 1]);
    445	SET_PIO_SIG(124, val);
    446
    447	SET_FLASH_PIO(0);
    448
    449	usleep_range(1000, 1100);
    450
    451	error = hideep_check_status(ts);
    452	if (error)
    453		return -EBUSY;
    454
    455	SET_FLASH_HWCONTROL();
    456
    457	return 0;
    458}
    459
    460static int hideep_program_nvm(struct hideep_ts *ts,
    461			      const __be32 *ucode, size_t ucode_len)
    462{
    463	struct pgm_packet *packet_r = (void *)ts->xfer_buf;
    464	__be32 *current_ucode = packet_r->payload;
    465	size_t xfer_len;
    466	size_t xfer_count;
    467	u32 addr = 0;
    468	int error;
    469
    470       error = hideep_nvm_unlock(ts);
    471       if (error)
    472               return error;
    473
    474	while (ucode_len > 0) {
    475		xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);
    476		xfer_count = xfer_len / sizeof(*ucode);
    477
    478		error = hideep_pgm_r_mem(ts, 0x00000000 + addr,
    479					 current_ucode, xfer_count);
    480		if (error) {
    481			dev_err(&ts->client->dev,
    482				"%s: failed to read page at offset %#08x: %d\n",
    483				__func__, addr, error);
    484			return error;
    485		}
    486
    487		/* See if the page needs updating */
    488		if (memcmp(ucode, current_ucode, xfer_len)) {
    489			error = hideep_program_page(ts, addr,
    490						    ucode, xfer_count);
    491			if (error) {
    492				dev_err(&ts->client->dev,
    493					"%s: iwrite failure @%#08x: %d\n",
    494					__func__, addr, error);
    495				return error;
    496			}
    497
    498			usleep_range(1000, 1100);
    499		}
    500
    501		ucode += xfer_count;
    502		addr += xfer_len;
    503		ucode_len -= xfer_len;
    504	}
    505
    506	return 0;
    507}
    508
    509static int hideep_verify_nvm(struct hideep_ts *ts,
    510			     const __be32 *ucode, size_t ucode_len)
    511{
    512	struct pgm_packet *packet_r = (void *)ts->xfer_buf;
    513	__be32 *current_ucode = packet_r->payload;
    514	size_t xfer_len;
    515	size_t xfer_count;
    516	u32 addr = 0;
    517	int i;
    518	int error;
    519
    520	while (ucode_len > 0) {
    521		xfer_len = min_t(size_t, ucode_len, HIDEEP_NVM_PAGE_SIZE);
    522		xfer_count = xfer_len / sizeof(*ucode);
    523
    524		error = hideep_pgm_r_mem(ts, 0x00000000 + addr,
    525					 current_ucode, xfer_count);
    526		if (error) {
    527			dev_err(&ts->client->dev,
    528				"%s: failed to read page at offset %#08x: %d\n",
    529				__func__, addr, error);
    530			return error;
    531		}
    532
    533		if (memcmp(ucode, current_ucode, xfer_len)) {
    534			const u8 *ucode_bytes = (const u8 *)ucode;
    535			const u8 *current_bytes = (const u8 *)current_ucode;
    536
    537			for (i = 0; i < xfer_len; i++)
    538				if (ucode_bytes[i] != current_bytes[i])
    539					dev_err(&ts->client->dev,
    540						"%s: mismatch @%#08x: (%#02x vs %#02x)\n",
    541						__func__, addr + i,
    542						ucode_bytes[i],
    543						current_bytes[i]);
    544
    545			return -EIO;
    546		}
    547
    548		ucode += xfer_count;
    549		addr += xfer_len;
    550		ucode_len -= xfer_len;
    551	}
    552
    553	return 0;
    554}
    555
    556static int hideep_load_dwz(struct hideep_ts *ts)
    557{
    558	u16 product_code;
    559	int error;
    560
    561	error = hideep_enter_pgm(ts);
    562	if (error)
    563		return error;
    564
    565	msleep(50);
    566
    567	error = hideep_pgm_r_mem(ts, HIDEEP_DWZ_INFO,
    568				 (void *)&ts->dwz_info,
    569				 sizeof(ts->dwz_info) / sizeof(__be32));
    570
    571	SW_RESET_IN_PGM(10);
    572	msleep(50);
    573
    574	if (error) {
    575		dev_err(&ts->client->dev,
    576			"failed to fetch DWZ data: %d\n", error);
    577		return error;
    578	}
    579
    580	product_code = be16_to_cpu(ts->dwz_info.product_code);
    581
    582	switch (product_code & 0xF0) {
    583	case 0x40:
    584		dev_dbg(&ts->client->dev, "used crimson IC");
    585		ts->fw_size = 1024 * 48;
    586		ts->nvm_mask = 0x00310000;
    587		break;
    588	case 0x60:
    589		dev_dbg(&ts->client->dev, "used lime IC");
    590		ts->fw_size = 1024 * 64;
    591		ts->nvm_mask = 0x0030027B;
    592		break;
    593	default:
    594		dev_err(&ts->client->dev, "product code is wrong: %#04x",
    595			product_code);
    596		return -EINVAL;
    597	}
    598
    599	dev_dbg(&ts->client->dev, "firmware release version: %#04x",
    600		be16_to_cpu(ts->dwz_info.release_ver));
    601
    602	return 0;
    603}
    604
    605static int hideep_flash_firmware(struct hideep_ts *ts,
    606				 const __be32 *ucode, size_t ucode_len)
    607{
    608	int retry_cnt = 3;
    609	int error;
    610
    611	while (retry_cnt--) {
    612		error = hideep_program_nvm(ts, ucode, ucode_len);
    613		if (!error) {
    614			error = hideep_verify_nvm(ts, ucode, ucode_len);
    615			if (!error)
    616				return 0;
    617		}
    618	}
    619
    620	return error;
    621}
    622
    623static int hideep_update_firmware(struct hideep_ts *ts,
    624				  const __be32 *ucode, size_t ucode_len)
    625{
    626	int error, error2;
    627
    628	dev_dbg(&ts->client->dev, "starting firmware update");
    629
    630	/* enter program mode */
    631	error = hideep_enter_pgm(ts);
    632	if (error)
    633		return error;
    634
    635	error = hideep_flash_firmware(ts, ucode, ucode_len);
    636	if (error)
    637		dev_err(&ts->client->dev,
    638			"firmware update failed: %d\n", error);
    639	else
    640		dev_dbg(&ts->client->dev, "firmware updated successfully\n");
    641
    642	SW_RESET_IN_PGM(1000);
    643
    644	error2 = hideep_load_dwz(ts);
    645	if (error2)
    646		dev_err(&ts->client->dev,
    647			"failed to load dwz after firmware update: %d\n",
    648			error2);
    649
    650	return error ?: error2;
    651}
    652
    653static int hideep_power_on(struct hideep_ts *ts)
    654{
    655	int error = 0;
    656
    657	error = regulator_enable(ts->vcc_vdd);
    658	if (error)
    659		dev_err(&ts->client->dev,
    660			"failed to enable 'vdd' regulator: %d", error);
    661
    662	usleep_range(999, 1000);
    663
    664	error = regulator_enable(ts->vcc_vid);
    665	if (error)
    666		dev_err(&ts->client->dev,
    667			"failed to enable 'vcc_vid' regulator: %d",
    668			error);
    669
    670	msleep(30);
    671
    672	if (ts->reset_gpio) {
    673		gpiod_set_value_cansleep(ts->reset_gpio, 0);
    674	} else {
    675		error = regmap_write(ts->reg, HIDEEP_RESET_CMD, 0x01);
    676		if (error)
    677			dev_err(&ts->client->dev,
    678				"failed to send 'reset' command: %d\n", error);
    679	}
    680
    681	msleep(50);
    682
    683	return error;
    684}
    685
    686static void hideep_power_off(void *data)
    687{
    688	struct hideep_ts *ts = data;
    689
    690	if (ts->reset_gpio)
    691		gpiod_set_value(ts->reset_gpio, 1);
    692
    693	regulator_disable(ts->vcc_vid);
    694	regulator_disable(ts->vcc_vdd);
    695}
    696
    697#define __GET_MT_TOOL_TYPE(type) ((type) == 0x01 ? MT_TOOL_FINGER : MT_TOOL_PEN)
    698
    699static void hideep_report_slot(struct input_dev *input,
    700			       const struct hideep_event *event)
    701{
    702	input_mt_slot(input, event->index & 0x0f);
    703	input_mt_report_slot_state(input,
    704				   __GET_MT_TOOL_TYPE(event->type),
    705				   !(event->flag & HIDEEP_MT_RELEASED));
    706	if (!(event->flag & HIDEEP_MT_RELEASED)) {
    707		input_report_abs(input, ABS_MT_POSITION_X,
    708				 le16_to_cpup(&event->x));
    709		input_report_abs(input, ABS_MT_POSITION_Y,
    710				 le16_to_cpup(&event->y));
    711		input_report_abs(input, ABS_MT_PRESSURE,
    712				 le16_to_cpup(&event->z));
    713		input_report_abs(input, ABS_MT_TOUCH_MAJOR, event->w);
    714	}
    715}
    716
    717static void hideep_parse_and_report(struct hideep_ts *ts)
    718{
    719	const struct hideep_event *events =
    720			(void *)&ts->xfer_buf[HIDEEP_TOUCH_EVENT_INDEX];
    721	const u8 *keys = &ts->xfer_buf[HIDEEP_KEY_EVENT_INDEX];
    722	int touch_count = ts->xfer_buf[0];
    723	int key_count = ts->xfer_buf[1] & 0x0f;
    724	int lpm_count = ts->xfer_buf[1] & 0xf0;
    725	int i;
    726
    727	/* get touch event count */
    728	dev_dbg(&ts->client->dev, "mt = %d, key = %d, lpm = %02x",
    729		touch_count, key_count, lpm_count);
    730
    731	touch_count = min(touch_count, HIDEEP_MT_MAX);
    732	for (i = 0; i < touch_count; i++)
    733		hideep_report_slot(ts->input_dev, events + i);
    734
    735	key_count = min(key_count, HIDEEP_KEY_MAX);
    736	for (i = 0; i < key_count; i++) {
    737		u8 key_data = keys[i * 2];
    738
    739		input_report_key(ts->input_dev,
    740				 ts->key_codes[key_data & HIDEEP_KEY_IDX_MASK],
    741				 key_data & HIDEEP_KEY_PRESSED_MASK);
    742	}
    743
    744	input_mt_sync_frame(ts->input_dev);
    745	input_sync(ts->input_dev);
    746}
    747
    748static irqreturn_t hideep_irq(int irq, void *handle)
    749{
    750	struct hideep_ts *ts = handle;
    751	int error;
    752
    753	BUILD_BUG_ON(HIDEEP_MAX_EVENT > HIDEEP_XFER_BUF_SIZE);
    754
    755	error = regmap_bulk_read(ts->reg, HIDEEP_EVENT_ADDR,
    756				 ts->xfer_buf, HIDEEP_MAX_EVENT / 2);
    757	if (error) {
    758		dev_err(&ts->client->dev, "failed to read events: %d\n", error);
    759		goto out;
    760	}
    761
    762	hideep_parse_and_report(ts);
    763
    764out:
    765	return IRQ_HANDLED;
    766}
    767
    768static int hideep_get_axis_info(struct hideep_ts *ts)
    769{
    770	__le16 val[2];
    771	int error;
    772
    773	error = regmap_bulk_read(ts->reg, 0x28, val, ARRAY_SIZE(val));
    774	if (error)
    775		return error;
    776
    777	ts->prop.max_x = le16_to_cpup(val);
    778	ts->prop.max_y = le16_to_cpup(val + 1);
    779
    780	dev_dbg(&ts->client->dev, "X: %d, Y: %d",
    781		ts->prop.max_x, ts->prop.max_y);
    782
    783	return 0;
    784}
    785
    786static int hideep_init_input(struct hideep_ts *ts)
    787{
    788	struct device *dev = &ts->client->dev;
    789	int i;
    790	int error;
    791
    792	ts->input_dev = devm_input_allocate_device(dev);
    793	if (!ts->input_dev) {
    794		dev_err(dev, "failed to allocate input device\n");
    795		return -ENOMEM;
    796	}
    797
    798	ts->input_dev->name = HIDEEP_TS_NAME;
    799	ts->input_dev->id.bustype = BUS_I2C;
    800	input_set_drvdata(ts->input_dev, ts);
    801
    802	input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_X);
    803	input_set_capability(ts->input_dev, EV_ABS, ABS_MT_POSITION_Y);
    804	input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, 65535, 0, 0);
    805	input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
    806	input_set_abs_params(ts->input_dev, ABS_MT_TOOL_TYPE,
    807			     0, MT_TOOL_MAX, 0, 0);
    808	touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
    809
    810	if (ts->prop.max_x == 0 || ts->prop.max_y == 0) {
    811		error = hideep_get_axis_info(ts);
    812		if (error)
    813			return error;
    814	}
    815
    816	error = input_mt_init_slots(ts->input_dev, HIDEEP_MT_MAX,
    817				    INPUT_MT_DIRECT);
    818	if (error)
    819		return error;
    820
    821	ts->key_num = device_property_count_u32(dev, "linux,keycodes");
    822	if (ts->key_num > HIDEEP_KEY_MAX) {
    823		dev_err(dev, "too many keys defined: %d\n",
    824			ts->key_num);
    825		return -EINVAL;
    826	}
    827
    828	if (ts->key_num <= 0) {
    829		dev_dbg(dev,
    830			"missing or malformed 'linux,keycodes' property\n");
    831	} else {
    832		error = device_property_read_u32_array(dev, "linux,keycodes",
    833						       ts->key_codes,
    834						       ts->key_num);
    835		if (error) {
    836			dev_dbg(dev, "failed to read keymap: %d", error);
    837			return error;
    838		}
    839
    840		if (ts->key_num) {
    841			ts->input_dev->keycode = ts->key_codes;
    842			ts->input_dev->keycodesize = sizeof(ts->key_codes[0]);
    843			ts->input_dev->keycodemax = ts->key_num;
    844
    845			for (i = 0; i < ts->key_num; i++)
    846				input_set_capability(ts->input_dev, EV_KEY,
    847					ts->key_codes[i]);
    848		}
    849	}
    850
    851	error = input_register_device(ts->input_dev);
    852	if (error) {
    853		dev_err(dev, "failed to register input device: %d", error);
    854		return error;
    855	}
    856
    857	return 0;
    858}
    859
    860static ssize_t hideep_update_fw(struct device *dev,
    861				struct device_attribute *attr,
    862				const char *buf, size_t count)
    863{
    864	struct i2c_client *client = to_i2c_client(dev);
    865	struct hideep_ts *ts = i2c_get_clientdata(client);
    866	const struct firmware *fw_entry;
    867	char *fw_name;
    868	int mode;
    869	int error;
    870
    871	error = kstrtoint(buf, 0, &mode);
    872	if (error)
    873		return error;
    874
    875	fw_name = kasprintf(GFP_KERNEL, "hideep_ts_%04x.bin",
    876			    be16_to_cpu(ts->dwz_info.product_id));
    877	if (!fw_name)
    878		return -ENOMEM;
    879
    880	error = request_firmware(&fw_entry, fw_name, dev);
    881	if (error) {
    882		dev_err(dev, "failed to request firmware %s: %d",
    883			fw_name, error);
    884		goto out_free_fw_name;
    885	}
    886
    887	if (fw_entry->size % sizeof(__be32)) {
    888		dev_err(dev, "invalid firmware size %zu\n", fw_entry->size);
    889		error = -EINVAL;
    890		goto out_release_fw;
    891	}
    892
    893	if (fw_entry->size > ts->fw_size) {
    894		dev_err(dev, "fw size (%zu) is too big (memory size %d)\n",
    895			fw_entry->size, ts->fw_size);
    896		error = -EFBIG;
    897		goto out_release_fw;
    898	}
    899
    900	mutex_lock(&ts->dev_mutex);
    901	disable_irq(client->irq);
    902
    903	error = hideep_update_firmware(ts, (const __be32 *)fw_entry->data,
    904				       fw_entry->size);
    905
    906	enable_irq(client->irq);
    907	mutex_unlock(&ts->dev_mutex);
    908
    909out_release_fw:
    910	release_firmware(fw_entry);
    911out_free_fw_name:
    912	kfree(fw_name);
    913
    914	return error ?: count;
    915}
    916
    917static ssize_t hideep_fw_version_show(struct device *dev,
    918				      struct device_attribute *attr, char *buf)
    919{
    920	struct i2c_client *client = to_i2c_client(dev);
    921	struct hideep_ts *ts = i2c_get_clientdata(client);
    922	ssize_t len;
    923
    924	mutex_lock(&ts->dev_mutex);
    925	len = scnprintf(buf, PAGE_SIZE, "%04x\n",
    926			be16_to_cpu(ts->dwz_info.release_ver));
    927	mutex_unlock(&ts->dev_mutex);
    928
    929	return len;
    930}
    931
    932static ssize_t hideep_product_id_show(struct device *dev,
    933				      struct device_attribute *attr, char *buf)
    934{
    935	struct i2c_client *client = to_i2c_client(dev);
    936	struct hideep_ts *ts = i2c_get_clientdata(client);
    937	ssize_t len;
    938
    939	mutex_lock(&ts->dev_mutex);
    940	len = scnprintf(buf, PAGE_SIZE, "%04x\n",
    941			be16_to_cpu(ts->dwz_info.product_id));
    942	mutex_unlock(&ts->dev_mutex);
    943
    944	return len;
    945}
    946
    947static DEVICE_ATTR(version, 0664, hideep_fw_version_show, NULL);
    948static DEVICE_ATTR(product_id, 0664, hideep_product_id_show, NULL);
    949static DEVICE_ATTR(update_fw, 0664, NULL, hideep_update_fw);
    950
    951static struct attribute *hideep_ts_sysfs_entries[] = {
    952	&dev_attr_version.attr,
    953	&dev_attr_product_id.attr,
    954	&dev_attr_update_fw.attr,
    955	NULL,
    956};
    957
    958static const struct attribute_group hideep_ts_attr_group = {
    959	.attrs = hideep_ts_sysfs_entries,
    960};
    961
    962static int __maybe_unused hideep_suspend(struct device *dev)
    963{
    964	struct i2c_client *client = to_i2c_client(dev);
    965	struct hideep_ts *ts = i2c_get_clientdata(client);
    966
    967	disable_irq(client->irq);
    968	hideep_power_off(ts);
    969
    970	return 0;
    971}
    972
    973static int __maybe_unused hideep_resume(struct device *dev)
    974{
    975	struct i2c_client *client = to_i2c_client(dev);
    976	struct hideep_ts *ts = i2c_get_clientdata(client);
    977	int error;
    978
    979	error = hideep_power_on(ts);
    980	if (error) {
    981		dev_err(&client->dev, "power on failed");
    982		return error;
    983	}
    984
    985	enable_irq(client->irq);
    986
    987	return 0;
    988}
    989
    990static SIMPLE_DEV_PM_OPS(hideep_pm_ops, hideep_suspend, hideep_resume);
    991
    992static const struct regmap_config hideep_regmap_config = {
    993	.reg_bits = 16,
    994	.reg_format_endian = REGMAP_ENDIAN_LITTLE,
    995	.val_bits = 16,
    996	.val_format_endian = REGMAP_ENDIAN_LITTLE,
    997	.max_register = 0xffff,
    998};
    999
   1000static int hideep_probe(struct i2c_client *client,
   1001			const struct i2c_device_id *id)
   1002{
   1003	struct hideep_ts *ts;
   1004	int error;
   1005
   1006	/* check i2c bus */
   1007	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
   1008		dev_err(&client->dev, "check i2c device error");
   1009		return -ENODEV;
   1010	}
   1011
   1012	if (client->irq <= 0) {
   1013		dev_err(&client->dev, "missing irq: %d\n", client->irq);
   1014		return -EINVAL;
   1015	}
   1016
   1017	ts = devm_kzalloc(&client->dev, sizeof(*ts), GFP_KERNEL);
   1018	if (!ts)
   1019		return -ENOMEM;
   1020
   1021	ts->client = client;
   1022	i2c_set_clientdata(client, ts);
   1023	mutex_init(&ts->dev_mutex);
   1024
   1025	ts->reg = devm_regmap_init_i2c(client, &hideep_regmap_config);
   1026	if (IS_ERR(ts->reg)) {
   1027		error = PTR_ERR(ts->reg);
   1028		dev_err(&client->dev,
   1029			"failed to initialize regmap: %d\n", error);
   1030		return error;
   1031	}
   1032
   1033	ts->vcc_vdd = devm_regulator_get(&client->dev, "vdd");
   1034	if (IS_ERR(ts->vcc_vdd))
   1035		return PTR_ERR(ts->vcc_vdd);
   1036
   1037	ts->vcc_vid = devm_regulator_get(&client->dev, "vid");
   1038	if (IS_ERR(ts->vcc_vid))
   1039		return PTR_ERR(ts->vcc_vid);
   1040
   1041	ts->reset_gpio = devm_gpiod_get_optional(&client->dev,
   1042						 "reset", GPIOD_OUT_HIGH);
   1043	if (IS_ERR(ts->reset_gpio))
   1044		return PTR_ERR(ts->reset_gpio);
   1045
   1046	error = hideep_power_on(ts);
   1047	if (error) {
   1048		dev_err(&client->dev, "power on failed: %d\n", error);
   1049		return error;
   1050	}
   1051
   1052	error = devm_add_action_or_reset(&client->dev, hideep_power_off, ts);
   1053	if (error)
   1054		return error;
   1055
   1056	error = hideep_load_dwz(ts);
   1057	if (error) {
   1058		dev_err(&client->dev, "failed to load dwz: %d", error);
   1059		return error;
   1060	}
   1061
   1062	error = hideep_init_input(ts);
   1063	if (error)
   1064		return error;
   1065
   1066	error = devm_request_threaded_irq(&client->dev, client->irq,
   1067					  NULL, hideep_irq, IRQF_ONESHOT,
   1068					  client->name, ts);
   1069	if (error) {
   1070		dev_err(&client->dev, "failed to request irq %d: %d\n",
   1071			client->irq, error);
   1072		return error;
   1073	}
   1074
   1075	error = devm_device_add_group(&client->dev, &hideep_ts_attr_group);
   1076	if (error) {
   1077		dev_err(&client->dev,
   1078			"failed to add sysfs attributes: %d\n", error);
   1079		return error;
   1080	}
   1081
   1082	return 0;
   1083}
   1084
   1085static const struct i2c_device_id hideep_i2c_id[] = {
   1086	{ HIDEEP_I2C_NAME, 0 },
   1087	{ }
   1088};
   1089MODULE_DEVICE_TABLE(i2c, hideep_i2c_id);
   1090
   1091#ifdef CONFIG_ACPI
   1092static const struct acpi_device_id hideep_acpi_id[] = {
   1093	{ "HIDP0001", 0 },
   1094	{ }
   1095};
   1096MODULE_DEVICE_TABLE(acpi, hideep_acpi_id);
   1097#endif
   1098
   1099#ifdef CONFIG_OF
   1100static const struct of_device_id hideep_match_table[] = {
   1101	{ .compatible = "hideep,hideep-ts" },
   1102	{ }
   1103};
   1104MODULE_DEVICE_TABLE(of, hideep_match_table);
   1105#endif
   1106
   1107static struct i2c_driver hideep_driver = {
   1108	.driver = {
   1109		.name			= HIDEEP_I2C_NAME,
   1110		.of_match_table		= of_match_ptr(hideep_match_table),
   1111		.acpi_match_table	= ACPI_PTR(hideep_acpi_id),
   1112		.pm			= &hideep_pm_ops,
   1113	},
   1114	.id_table	= hideep_i2c_id,
   1115	.probe		= hideep_probe,
   1116};
   1117
   1118module_i2c_driver(hideep_driver);
   1119
   1120MODULE_DESCRIPTION("Driver for HiDeep Touchscreen Controller");
   1121MODULE_AUTHOR("anthony.kim@hideep.com");
   1122MODULE_LICENSE("GPL v2");