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

iqs7222.c (58919B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Azoteq IQS7222A/B/C Capacitive Touch Controller
      4 *
      5 * Copyright (C) 2022 Jeff LaBundy <jeff@labundy.com>
      6 */
      7
      8#include <linux/bits.h>
      9#include <linux/delay.h>
     10#include <linux/device.h>
     11#include <linux/err.h>
     12#include <linux/gpio/consumer.h>
     13#include <linux/i2c.h>
     14#include <linux/input.h>
     15#include <linux/interrupt.h>
     16#include <linux/kernel.h>
     17#include <linux/ktime.h>
     18#include <linux/module.h>
     19#include <linux/of_device.h>
     20#include <linux/property.h>
     21#include <linux/slab.h>
     22#include <asm/unaligned.h>
     23
     24#define IQS7222_PROD_NUM			0x00
     25#define IQS7222_PROD_NUM_A			840
     26#define IQS7222_PROD_NUM_B			698
     27#define IQS7222_PROD_NUM_C			863
     28
     29#define IQS7222_SYS_STATUS			0x10
     30#define IQS7222_SYS_STATUS_RESET		BIT(3)
     31#define IQS7222_SYS_STATUS_ATI_ERROR		BIT(1)
     32#define IQS7222_SYS_STATUS_ATI_ACTIVE		BIT(0)
     33
     34#define IQS7222_CHAN_SETUP_0_REF_MODE_MASK	GENMASK(15, 14)
     35#define IQS7222_CHAN_SETUP_0_REF_MODE_FOLLOW	BIT(15)
     36#define IQS7222_CHAN_SETUP_0_REF_MODE_REF	BIT(14)
     37#define IQS7222_CHAN_SETUP_0_CHAN_EN		BIT(8)
     38
     39#define IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK	GENMASK(2, 0)
     40#define IQS7222_SLDR_SETUP_2_RES_MASK		GENMASK(15, 8)
     41#define IQS7222_SLDR_SETUP_2_RES_SHIFT		8
     42#define IQS7222_SLDR_SETUP_2_TOP_SPEED_MASK	GENMASK(7, 0)
     43#define IQS7222_SLDR_SETUP_3_CHAN_SEL_MASK	GENMASK(9, 0)
     44
     45#define IQS7222_GPIO_SETUP_0_GPIO_EN		BIT(0)
     46
     47#define IQS7222_SYS_SETUP			0xD0
     48#define IQS7222_SYS_SETUP_INTF_MODE_MASK	GENMASK(7, 6)
     49#define IQS7222_SYS_SETUP_INTF_MODE_TOUCH	BIT(7)
     50#define IQS7222_SYS_SETUP_INTF_MODE_EVENT	BIT(6)
     51#define IQS7222_SYS_SETUP_PWR_MODE_MASK		GENMASK(5, 4)
     52#define IQS7222_SYS_SETUP_PWR_MODE_AUTO		IQS7222_SYS_SETUP_PWR_MODE_MASK
     53#define IQS7222_SYS_SETUP_REDO_ATI		BIT(2)
     54#define IQS7222_SYS_SETUP_ACK_RESET		BIT(0)
     55
     56#define IQS7222_EVENT_MASK_ATI			BIT(12)
     57
     58#define IQS7222_COMMS_HOLD			BIT(0)
     59#define IQS7222_COMMS_ERROR			0xEEEE
     60#define IQS7222_COMMS_RETRY_MS			50
     61#define IQS7222_COMMS_TIMEOUT_MS		100
     62#define IQS7222_RESET_TIMEOUT_MS		250
     63#define IQS7222_ATI_TIMEOUT_MS			2000
     64
     65#define IQS7222_MAX_COLS_STAT			8
     66#define IQS7222_MAX_COLS_CYCLE			3
     67#define IQS7222_MAX_COLS_GLBL			3
     68#define IQS7222_MAX_COLS_BTN			3
     69#define IQS7222_MAX_COLS_CHAN			6
     70#define IQS7222_MAX_COLS_FILT			2
     71#define IQS7222_MAX_COLS_SLDR			11
     72#define IQS7222_MAX_COLS_GPIO			3
     73#define IQS7222_MAX_COLS_SYS			13
     74
     75#define IQS7222_MAX_CHAN			20
     76#define IQS7222_MAX_SLDR			2
     77
     78#define IQS7222_NUM_RETRIES			5
     79#define IQS7222_REG_OFFSET			0x100
     80
     81enum iqs7222_reg_key_id {
     82	IQS7222_REG_KEY_NONE,
     83	IQS7222_REG_KEY_PROX,
     84	IQS7222_REG_KEY_TOUCH,
     85	IQS7222_REG_KEY_DEBOUNCE,
     86	IQS7222_REG_KEY_TAP,
     87	IQS7222_REG_KEY_AXIAL,
     88	IQS7222_REG_KEY_WHEEL,
     89	IQS7222_REG_KEY_NO_WHEEL,
     90	IQS7222_REG_KEY_RESERVED
     91};
     92
     93enum iqs7222_reg_grp_id {
     94	IQS7222_REG_GRP_STAT,
     95	IQS7222_REG_GRP_CYCLE,
     96	IQS7222_REG_GRP_GLBL,
     97	IQS7222_REG_GRP_BTN,
     98	IQS7222_REG_GRP_CHAN,
     99	IQS7222_REG_GRP_FILT,
    100	IQS7222_REG_GRP_SLDR,
    101	IQS7222_REG_GRP_GPIO,
    102	IQS7222_REG_GRP_SYS,
    103	IQS7222_NUM_REG_GRPS
    104};
    105
    106static const char * const iqs7222_reg_grp_names[] = {
    107	[IQS7222_REG_GRP_CYCLE] = "cycle",
    108	[IQS7222_REG_GRP_CHAN] = "channel",
    109	[IQS7222_REG_GRP_SLDR] = "slider",
    110	[IQS7222_REG_GRP_GPIO] = "gpio",
    111};
    112
    113static const unsigned int iqs7222_max_cols[] = {
    114	[IQS7222_REG_GRP_STAT] = IQS7222_MAX_COLS_STAT,
    115	[IQS7222_REG_GRP_CYCLE] = IQS7222_MAX_COLS_CYCLE,
    116	[IQS7222_REG_GRP_GLBL] = IQS7222_MAX_COLS_GLBL,
    117	[IQS7222_REG_GRP_BTN] = IQS7222_MAX_COLS_BTN,
    118	[IQS7222_REG_GRP_CHAN] = IQS7222_MAX_COLS_CHAN,
    119	[IQS7222_REG_GRP_FILT] = IQS7222_MAX_COLS_FILT,
    120	[IQS7222_REG_GRP_SLDR] = IQS7222_MAX_COLS_SLDR,
    121	[IQS7222_REG_GRP_GPIO] = IQS7222_MAX_COLS_GPIO,
    122	[IQS7222_REG_GRP_SYS] = IQS7222_MAX_COLS_SYS,
    123};
    124
    125static const unsigned int iqs7222_gpio_links[] = { 2, 5, 6, };
    126
    127struct iqs7222_event_desc {
    128	const char *name;
    129	u16 mask;
    130	u16 val;
    131	u16 enable;
    132	enum iqs7222_reg_key_id reg_key;
    133};
    134
    135static const struct iqs7222_event_desc iqs7222_kp_events[] = {
    136	{
    137		.name = "event-prox",
    138		.enable = BIT(0),
    139		.reg_key = IQS7222_REG_KEY_PROX,
    140	},
    141	{
    142		.name = "event-touch",
    143		.enable = BIT(1),
    144		.reg_key = IQS7222_REG_KEY_TOUCH,
    145	},
    146};
    147
    148static const struct iqs7222_event_desc iqs7222_sl_events[] = {
    149	{ .name = "event-press", },
    150	{
    151		.name = "event-tap",
    152		.mask = BIT(0),
    153		.val = BIT(0),
    154		.enable = BIT(0),
    155		.reg_key = IQS7222_REG_KEY_TAP,
    156	},
    157	{
    158		.name = "event-swipe-pos",
    159		.mask = BIT(5) | BIT(1),
    160		.val = BIT(1),
    161		.enable = BIT(1),
    162		.reg_key = IQS7222_REG_KEY_AXIAL,
    163	},
    164	{
    165		.name = "event-swipe-neg",
    166		.mask = BIT(5) | BIT(1),
    167		.val = BIT(5) | BIT(1),
    168		.enable = BIT(1),
    169		.reg_key = IQS7222_REG_KEY_AXIAL,
    170	},
    171	{
    172		.name = "event-flick-pos",
    173		.mask = BIT(5) | BIT(2),
    174		.val = BIT(2),
    175		.enable = BIT(2),
    176		.reg_key = IQS7222_REG_KEY_AXIAL,
    177	},
    178	{
    179		.name = "event-flick-neg",
    180		.mask = BIT(5) | BIT(2),
    181		.val = BIT(5) | BIT(2),
    182		.enable = BIT(2),
    183		.reg_key = IQS7222_REG_KEY_AXIAL,
    184	},
    185};
    186
    187struct iqs7222_reg_grp_desc {
    188	u16 base;
    189	int num_row;
    190	int num_col;
    191};
    192
    193struct iqs7222_dev_desc {
    194	u16 prod_num;
    195	u16 fw_major;
    196	u16 fw_minor;
    197	u16 sldr_res;
    198	u16 touch_link;
    199	u16 wheel_enable;
    200	int allow_offset;
    201	int event_offset;
    202	int comms_offset;
    203	struct iqs7222_reg_grp_desc reg_grps[IQS7222_NUM_REG_GRPS];
    204};
    205
    206static const struct iqs7222_dev_desc iqs7222_devs[] = {
    207	{
    208		.prod_num = IQS7222_PROD_NUM_A,
    209		.fw_major = 1,
    210		.fw_minor = 12,
    211		.sldr_res = U8_MAX * 16,
    212		.touch_link = 1768,
    213		.allow_offset = 9,
    214		.event_offset = 10,
    215		.comms_offset = 12,
    216		.reg_grps = {
    217			[IQS7222_REG_GRP_STAT] = {
    218				.base = IQS7222_SYS_STATUS,
    219				.num_row = 1,
    220				.num_col = 8,
    221			},
    222			[IQS7222_REG_GRP_CYCLE] = {
    223				.base = 0x8000,
    224				.num_row = 7,
    225				.num_col = 3,
    226			},
    227			[IQS7222_REG_GRP_GLBL] = {
    228				.base = 0x8700,
    229				.num_row = 1,
    230				.num_col = 3,
    231			},
    232			[IQS7222_REG_GRP_BTN] = {
    233				.base = 0x9000,
    234				.num_row = 12,
    235				.num_col = 3,
    236			},
    237			[IQS7222_REG_GRP_CHAN] = {
    238				.base = 0xA000,
    239				.num_row = 12,
    240				.num_col = 6,
    241			},
    242			[IQS7222_REG_GRP_FILT] = {
    243				.base = 0xAC00,
    244				.num_row = 1,
    245				.num_col = 2,
    246			},
    247			[IQS7222_REG_GRP_SLDR] = {
    248				.base = 0xB000,
    249				.num_row = 2,
    250				.num_col = 11,
    251			},
    252			[IQS7222_REG_GRP_GPIO] = {
    253				.base = 0xC000,
    254				.num_row = 1,
    255				.num_col = 3,
    256			},
    257			[IQS7222_REG_GRP_SYS] = {
    258				.base = IQS7222_SYS_SETUP,
    259				.num_row = 1,
    260				.num_col = 13,
    261			},
    262		},
    263	},
    264	{
    265		.prod_num = IQS7222_PROD_NUM_B,
    266		.fw_major = 1,
    267		.fw_minor = 43,
    268		.event_offset = 10,
    269		.comms_offset = 11,
    270		.reg_grps = {
    271			[IQS7222_REG_GRP_STAT] = {
    272				.base = IQS7222_SYS_STATUS,
    273				.num_row = 1,
    274				.num_col = 6,
    275			},
    276			[IQS7222_REG_GRP_CYCLE] = {
    277				.base = 0x8000,
    278				.num_row = 10,
    279				.num_col = 2,
    280			},
    281			[IQS7222_REG_GRP_GLBL] = {
    282				.base = 0x8A00,
    283				.num_row = 1,
    284				.num_col = 3,
    285			},
    286			[IQS7222_REG_GRP_BTN] = {
    287				.base = 0x9000,
    288				.num_row = 20,
    289				.num_col = 2,
    290			},
    291			[IQS7222_REG_GRP_CHAN] = {
    292				.base = 0xB000,
    293				.num_row = 20,
    294				.num_col = 4,
    295			},
    296			[IQS7222_REG_GRP_FILT] = {
    297				.base = 0xC400,
    298				.num_row = 1,
    299				.num_col = 2,
    300			},
    301			[IQS7222_REG_GRP_SYS] = {
    302				.base = IQS7222_SYS_SETUP,
    303				.num_row = 1,
    304				.num_col = 13,
    305			},
    306		},
    307	},
    308	{
    309		.prod_num = IQS7222_PROD_NUM_B,
    310		.fw_major = 1,
    311		.fw_minor = 27,
    312		.reg_grps = {
    313			[IQS7222_REG_GRP_STAT] = {
    314				.base = IQS7222_SYS_STATUS,
    315				.num_row = 1,
    316				.num_col = 6,
    317			},
    318			[IQS7222_REG_GRP_CYCLE] = {
    319				.base = 0x8000,
    320				.num_row = 10,
    321				.num_col = 2,
    322			},
    323			[IQS7222_REG_GRP_GLBL] = {
    324				.base = 0x8A00,
    325				.num_row = 1,
    326				.num_col = 3,
    327			},
    328			[IQS7222_REG_GRP_BTN] = {
    329				.base = 0x9000,
    330				.num_row = 20,
    331				.num_col = 2,
    332			},
    333			[IQS7222_REG_GRP_CHAN] = {
    334				.base = 0xB000,
    335				.num_row = 20,
    336				.num_col = 4,
    337			},
    338			[IQS7222_REG_GRP_FILT] = {
    339				.base = 0xC400,
    340				.num_row = 1,
    341				.num_col = 2,
    342			},
    343			[IQS7222_REG_GRP_SYS] = {
    344				.base = IQS7222_SYS_SETUP,
    345				.num_row = 1,
    346				.num_col = 10,
    347			},
    348		},
    349	},
    350	{
    351		.prod_num = IQS7222_PROD_NUM_C,
    352		.fw_major = 2,
    353		.fw_minor = 6,
    354		.sldr_res = U16_MAX,
    355		.touch_link = 1686,
    356		.wheel_enable = BIT(3),
    357		.event_offset = 9,
    358		.comms_offset = 10,
    359		.reg_grps = {
    360			[IQS7222_REG_GRP_STAT] = {
    361				.base = IQS7222_SYS_STATUS,
    362				.num_row = 1,
    363				.num_col = 6,
    364			},
    365			[IQS7222_REG_GRP_CYCLE] = {
    366				.base = 0x8000,
    367				.num_row = 5,
    368				.num_col = 3,
    369			},
    370			[IQS7222_REG_GRP_GLBL] = {
    371				.base = 0x8500,
    372				.num_row = 1,
    373				.num_col = 3,
    374			},
    375			[IQS7222_REG_GRP_BTN] = {
    376				.base = 0x9000,
    377				.num_row = 10,
    378				.num_col = 3,
    379			},
    380			[IQS7222_REG_GRP_CHAN] = {
    381				.base = 0xA000,
    382				.num_row = 10,
    383				.num_col = 6,
    384			},
    385			[IQS7222_REG_GRP_FILT] = {
    386				.base = 0xAA00,
    387				.num_row = 1,
    388				.num_col = 2,
    389			},
    390			[IQS7222_REG_GRP_SLDR] = {
    391				.base = 0xB000,
    392				.num_row = 2,
    393				.num_col = 10,
    394			},
    395			[IQS7222_REG_GRP_GPIO] = {
    396				.base = 0xC000,
    397				.num_row = 3,
    398				.num_col = 3,
    399			},
    400			[IQS7222_REG_GRP_SYS] = {
    401				.base = IQS7222_SYS_SETUP,
    402				.num_row = 1,
    403				.num_col = 12,
    404			},
    405		},
    406	},
    407	{
    408		.prod_num = IQS7222_PROD_NUM_C,
    409		.fw_major = 1,
    410		.fw_minor = 13,
    411		.sldr_res = U16_MAX,
    412		.touch_link = 1674,
    413		.wheel_enable = BIT(3),
    414		.event_offset = 9,
    415		.comms_offset = 10,
    416		.reg_grps = {
    417			[IQS7222_REG_GRP_STAT] = {
    418				.base = IQS7222_SYS_STATUS,
    419				.num_row = 1,
    420				.num_col = 6,
    421			},
    422			[IQS7222_REG_GRP_CYCLE] = {
    423				.base = 0x8000,
    424				.num_row = 5,
    425				.num_col = 3,
    426			},
    427			[IQS7222_REG_GRP_GLBL] = {
    428				.base = 0x8500,
    429				.num_row = 1,
    430				.num_col = 3,
    431			},
    432			[IQS7222_REG_GRP_BTN] = {
    433				.base = 0x9000,
    434				.num_row = 10,
    435				.num_col = 3,
    436			},
    437			[IQS7222_REG_GRP_CHAN] = {
    438				.base = 0xA000,
    439				.num_row = 10,
    440				.num_col = 6,
    441			},
    442			[IQS7222_REG_GRP_FILT] = {
    443				.base = 0xAA00,
    444				.num_row = 1,
    445				.num_col = 2,
    446			},
    447			[IQS7222_REG_GRP_SLDR] = {
    448				.base = 0xB000,
    449				.num_row = 2,
    450				.num_col = 10,
    451			},
    452			[IQS7222_REG_GRP_GPIO] = {
    453				.base = 0xC000,
    454				.num_row = 1,
    455				.num_col = 3,
    456			},
    457			[IQS7222_REG_GRP_SYS] = {
    458				.base = IQS7222_SYS_SETUP,
    459				.num_row = 1,
    460				.num_col = 11,
    461			},
    462		},
    463	},
    464};
    465
    466struct iqs7222_prop_desc {
    467	const char *name;
    468	enum iqs7222_reg_grp_id reg_grp;
    469	enum iqs7222_reg_key_id reg_key;
    470	int reg_offset;
    471	int reg_shift;
    472	int reg_width;
    473	int val_pitch;
    474	int val_min;
    475	int val_max;
    476	bool invert;
    477	const char *label;
    478};
    479
    480static const struct iqs7222_prop_desc iqs7222_props[] = {
    481	{
    482		.name = "azoteq,conv-period",
    483		.reg_grp = IQS7222_REG_GRP_CYCLE,
    484		.reg_offset = 0,
    485		.reg_shift = 8,
    486		.reg_width = 8,
    487		.label = "conversion period",
    488	},
    489	{
    490		.name = "azoteq,conv-frac",
    491		.reg_grp = IQS7222_REG_GRP_CYCLE,
    492		.reg_offset = 0,
    493		.reg_shift = 0,
    494		.reg_width = 8,
    495		.label = "conversion frequency fractional divider",
    496	},
    497	{
    498		.name = "azoteq,rx-float-inactive",
    499		.reg_grp = IQS7222_REG_GRP_CYCLE,
    500		.reg_offset = 1,
    501		.reg_shift = 6,
    502		.reg_width = 1,
    503		.invert = true,
    504	},
    505	{
    506		.name = "azoteq,dead-time-enable",
    507		.reg_grp = IQS7222_REG_GRP_CYCLE,
    508		.reg_offset = 1,
    509		.reg_shift = 5,
    510		.reg_width = 1,
    511	},
    512	{
    513		.name = "azoteq,tx-freq-fosc",
    514		.reg_grp = IQS7222_REG_GRP_CYCLE,
    515		.reg_offset = 1,
    516		.reg_shift = 4,
    517		.reg_width = 1,
    518	},
    519	{
    520		.name = "azoteq,vbias-enable",
    521		.reg_grp = IQS7222_REG_GRP_CYCLE,
    522		.reg_offset = 1,
    523		.reg_shift = 3,
    524		.reg_width = 1,
    525	},
    526	{
    527		.name = "azoteq,sense-mode",
    528		.reg_grp = IQS7222_REG_GRP_CYCLE,
    529		.reg_offset = 1,
    530		.reg_shift = 0,
    531		.reg_width = 3,
    532		.val_max = 3,
    533		.label = "sensing mode",
    534	},
    535	{
    536		.name = "azoteq,iref-enable",
    537		.reg_grp = IQS7222_REG_GRP_CYCLE,
    538		.reg_offset = 2,
    539		.reg_shift = 10,
    540		.reg_width = 1,
    541	},
    542	{
    543		.name = "azoteq,iref-level",
    544		.reg_grp = IQS7222_REG_GRP_CYCLE,
    545		.reg_offset = 2,
    546		.reg_shift = 4,
    547		.reg_width = 4,
    548		.label = "current reference level",
    549	},
    550	{
    551		.name = "azoteq,iref-trim",
    552		.reg_grp = IQS7222_REG_GRP_CYCLE,
    553		.reg_offset = 2,
    554		.reg_shift = 0,
    555		.reg_width = 4,
    556		.label = "current reference trim",
    557	},
    558	{
    559		.name = "azoteq,rf-filt-enable",
    560		.reg_grp = IQS7222_REG_GRP_GLBL,
    561		.reg_offset = 0,
    562		.reg_shift = 15,
    563		.reg_width = 1,
    564	},
    565	{
    566		.name = "azoteq,max-counts",
    567		.reg_grp = IQS7222_REG_GRP_GLBL,
    568		.reg_offset = 0,
    569		.reg_shift = 13,
    570		.reg_width = 2,
    571		.label = "maximum counts",
    572	},
    573	{
    574		.name = "azoteq,auto-mode",
    575		.reg_grp = IQS7222_REG_GRP_GLBL,
    576		.reg_offset = 0,
    577		.reg_shift = 2,
    578		.reg_width = 2,
    579		.label = "number of conversions",
    580	},
    581	{
    582		.name = "azoteq,ati-frac-div-fine",
    583		.reg_grp = IQS7222_REG_GRP_GLBL,
    584		.reg_offset = 1,
    585		.reg_shift = 9,
    586		.reg_width = 5,
    587		.label = "ATI fine fractional divider",
    588	},
    589	{
    590		.name = "azoteq,ati-frac-div-coarse",
    591		.reg_grp = IQS7222_REG_GRP_GLBL,
    592		.reg_offset = 1,
    593		.reg_shift = 0,
    594		.reg_width = 5,
    595		.label = "ATI coarse fractional divider",
    596	},
    597	{
    598		.name = "azoteq,ati-comp-select",
    599		.reg_grp = IQS7222_REG_GRP_GLBL,
    600		.reg_offset = 2,
    601		.reg_shift = 0,
    602		.reg_width = 10,
    603		.label = "ATI compensation selection",
    604	},
    605	{
    606		.name = "azoteq,ati-band",
    607		.reg_grp = IQS7222_REG_GRP_CHAN,
    608		.reg_offset = 0,
    609		.reg_shift = 12,
    610		.reg_width = 2,
    611		.label = "ATI band",
    612	},
    613	{
    614		.name = "azoteq,global-halt",
    615		.reg_grp = IQS7222_REG_GRP_CHAN,
    616		.reg_offset = 0,
    617		.reg_shift = 11,
    618		.reg_width = 1,
    619	},
    620	{
    621		.name = "azoteq,invert-enable",
    622		.reg_grp = IQS7222_REG_GRP_CHAN,
    623		.reg_offset = 0,
    624		.reg_shift = 10,
    625		.reg_width = 1,
    626	},
    627	{
    628		.name = "azoteq,dual-direction",
    629		.reg_grp = IQS7222_REG_GRP_CHAN,
    630		.reg_offset = 0,
    631		.reg_shift = 9,
    632		.reg_width = 1,
    633	},
    634	{
    635		.name = "azoteq,samp-cap-double",
    636		.reg_grp = IQS7222_REG_GRP_CHAN,
    637		.reg_offset = 0,
    638		.reg_shift = 3,
    639		.reg_width = 1,
    640	},
    641	{
    642		.name = "azoteq,vref-half",
    643		.reg_grp = IQS7222_REG_GRP_CHAN,
    644		.reg_offset = 0,
    645		.reg_shift = 2,
    646		.reg_width = 1,
    647	},
    648	{
    649		.name = "azoteq,proj-bias",
    650		.reg_grp = IQS7222_REG_GRP_CHAN,
    651		.reg_offset = 0,
    652		.reg_shift = 0,
    653		.reg_width = 2,
    654		.label = "projected bias current",
    655	},
    656	{
    657		.name = "azoteq,ati-target",
    658		.reg_grp = IQS7222_REG_GRP_CHAN,
    659		.reg_offset = 1,
    660		.reg_shift = 8,
    661		.reg_width = 8,
    662		.val_pitch = 8,
    663		.label = "ATI target",
    664	},
    665	{
    666		.name = "azoteq,ati-base",
    667		.reg_grp = IQS7222_REG_GRP_CHAN,
    668		.reg_offset = 1,
    669		.reg_shift = 3,
    670		.reg_width = 5,
    671		.val_pitch = 16,
    672		.label = "ATI base",
    673	},
    674	{
    675		.name = "azoteq,ati-mode",
    676		.reg_grp = IQS7222_REG_GRP_CHAN,
    677		.reg_offset = 1,
    678		.reg_shift = 0,
    679		.reg_width = 3,
    680		.val_max = 5,
    681		.label = "ATI mode",
    682	},
    683	{
    684		.name = "azoteq,ati-frac-div-fine",
    685		.reg_grp = IQS7222_REG_GRP_CHAN,
    686		.reg_offset = 2,
    687		.reg_shift = 9,
    688		.reg_width = 5,
    689		.label = "ATI fine fractional divider",
    690	},
    691	{
    692		.name = "azoteq,ati-frac-mult-coarse",
    693		.reg_grp = IQS7222_REG_GRP_CHAN,
    694		.reg_offset = 2,
    695		.reg_shift = 5,
    696		.reg_width = 4,
    697		.label = "ATI coarse fractional multiplier",
    698	},
    699	{
    700		.name = "azoteq,ati-frac-div-coarse",
    701		.reg_grp = IQS7222_REG_GRP_CHAN,
    702		.reg_offset = 2,
    703		.reg_shift = 0,
    704		.reg_width = 5,
    705		.label = "ATI coarse fractional divider",
    706	},
    707	{
    708		.name = "azoteq,ati-comp-div",
    709		.reg_grp = IQS7222_REG_GRP_CHAN,
    710		.reg_offset = 3,
    711		.reg_shift = 11,
    712		.reg_width = 5,
    713		.label = "ATI compensation divider",
    714	},
    715	{
    716		.name = "azoteq,ati-comp-select",
    717		.reg_grp = IQS7222_REG_GRP_CHAN,
    718		.reg_offset = 3,
    719		.reg_shift = 0,
    720		.reg_width = 10,
    721		.label = "ATI compensation selection",
    722	},
    723	{
    724		.name = "azoteq,debounce-exit",
    725		.reg_grp = IQS7222_REG_GRP_BTN,
    726		.reg_key = IQS7222_REG_KEY_DEBOUNCE,
    727		.reg_offset = 0,
    728		.reg_shift = 12,
    729		.reg_width = 4,
    730		.label = "debounce exit factor",
    731	},
    732	{
    733		.name = "azoteq,debounce-enter",
    734		.reg_grp = IQS7222_REG_GRP_BTN,
    735		.reg_key = IQS7222_REG_KEY_DEBOUNCE,
    736		.reg_offset = 0,
    737		.reg_shift = 8,
    738		.reg_width = 4,
    739		.label = "debounce entrance factor",
    740	},
    741	{
    742		.name = "azoteq,thresh",
    743		.reg_grp = IQS7222_REG_GRP_BTN,
    744		.reg_key = IQS7222_REG_KEY_PROX,
    745		.reg_offset = 0,
    746		.reg_shift = 0,
    747		.reg_width = 8,
    748		.val_max = 127,
    749		.label = "threshold",
    750	},
    751	{
    752		.name = "azoteq,thresh",
    753		.reg_grp = IQS7222_REG_GRP_BTN,
    754		.reg_key = IQS7222_REG_KEY_TOUCH,
    755		.reg_offset = 1,
    756		.reg_shift = 0,
    757		.reg_width = 8,
    758		.label = "threshold",
    759	},
    760	{
    761		.name = "azoteq,hyst",
    762		.reg_grp = IQS7222_REG_GRP_BTN,
    763		.reg_key = IQS7222_REG_KEY_TOUCH,
    764		.reg_offset = 1,
    765		.reg_shift = 8,
    766		.reg_width = 8,
    767		.label = "hysteresis",
    768	},
    769	{
    770		.name = "azoteq,lta-beta-lp",
    771		.reg_grp = IQS7222_REG_GRP_FILT,
    772		.reg_offset = 0,
    773		.reg_shift = 12,
    774		.reg_width = 4,
    775		.label = "low-power mode long-term average beta",
    776	},
    777	{
    778		.name = "azoteq,lta-beta-np",
    779		.reg_grp = IQS7222_REG_GRP_FILT,
    780		.reg_offset = 0,
    781		.reg_shift = 8,
    782		.reg_width = 4,
    783		.label = "normal-power mode long-term average beta",
    784	},
    785	{
    786		.name = "azoteq,counts-beta-lp",
    787		.reg_grp = IQS7222_REG_GRP_FILT,
    788		.reg_offset = 0,
    789		.reg_shift = 4,
    790		.reg_width = 4,
    791		.label = "low-power mode counts beta",
    792	},
    793	{
    794		.name = "azoteq,counts-beta-np",
    795		.reg_grp = IQS7222_REG_GRP_FILT,
    796		.reg_offset = 0,
    797		.reg_shift = 0,
    798		.reg_width = 4,
    799		.label = "normal-power mode counts beta",
    800	},
    801	{
    802		.name = "azoteq,lta-fast-beta-lp",
    803		.reg_grp = IQS7222_REG_GRP_FILT,
    804		.reg_offset = 1,
    805		.reg_shift = 4,
    806		.reg_width = 4,
    807		.label = "low-power mode long-term average fast beta",
    808	},
    809	{
    810		.name = "azoteq,lta-fast-beta-np",
    811		.reg_grp = IQS7222_REG_GRP_FILT,
    812		.reg_offset = 1,
    813		.reg_shift = 0,
    814		.reg_width = 4,
    815		.label = "normal-power mode long-term average fast beta",
    816	},
    817	{
    818		.name = "azoteq,lower-cal",
    819		.reg_grp = IQS7222_REG_GRP_SLDR,
    820		.reg_offset = 0,
    821		.reg_shift = 8,
    822		.reg_width = 8,
    823		.label = "lower calibration",
    824	},
    825	{
    826		.name = "azoteq,static-beta",
    827		.reg_grp = IQS7222_REG_GRP_SLDR,
    828		.reg_key = IQS7222_REG_KEY_NO_WHEEL,
    829		.reg_offset = 0,
    830		.reg_shift = 6,
    831		.reg_width = 1,
    832	},
    833	{
    834		.name = "azoteq,bottom-beta",
    835		.reg_grp = IQS7222_REG_GRP_SLDR,
    836		.reg_key = IQS7222_REG_KEY_NO_WHEEL,
    837		.reg_offset = 0,
    838		.reg_shift = 3,
    839		.reg_width = 3,
    840		.label = "bottom beta",
    841	},
    842	{
    843		.name = "azoteq,static-beta",
    844		.reg_grp = IQS7222_REG_GRP_SLDR,
    845		.reg_key = IQS7222_REG_KEY_WHEEL,
    846		.reg_offset = 0,
    847		.reg_shift = 7,
    848		.reg_width = 1,
    849	},
    850	{
    851		.name = "azoteq,bottom-beta",
    852		.reg_grp = IQS7222_REG_GRP_SLDR,
    853		.reg_key = IQS7222_REG_KEY_WHEEL,
    854		.reg_offset = 0,
    855		.reg_shift = 4,
    856		.reg_width = 3,
    857		.label = "bottom beta",
    858	},
    859	{
    860		.name = "azoteq,bottom-speed",
    861		.reg_grp = IQS7222_REG_GRP_SLDR,
    862		.reg_offset = 1,
    863		.reg_shift = 8,
    864		.reg_width = 8,
    865		.label = "bottom speed",
    866	},
    867	{
    868		.name = "azoteq,upper-cal",
    869		.reg_grp = IQS7222_REG_GRP_SLDR,
    870		.reg_offset = 1,
    871		.reg_shift = 0,
    872		.reg_width = 8,
    873		.label = "upper calibration",
    874	},
    875	{
    876		.name = "azoteq,gesture-max-ms",
    877		.reg_grp = IQS7222_REG_GRP_SLDR,
    878		.reg_key = IQS7222_REG_KEY_TAP,
    879		.reg_offset = 9,
    880		.reg_shift = 8,
    881		.reg_width = 8,
    882		.val_pitch = 4,
    883		.label = "maximum gesture time",
    884	},
    885	{
    886		.name = "azoteq,gesture-min-ms",
    887		.reg_grp = IQS7222_REG_GRP_SLDR,
    888		.reg_key = IQS7222_REG_KEY_TAP,
    889		.reg_offset = 9,
    890		.reg_shift = 3,
    891		.reg_width = 5,
    892		.val_pitch = 4,
    893		.label = "minimum gesture time",
    894	},
    895	{
    896		.name = "azoteq,gesture-dist",
    897		.reg_grp = IQS7222_REG_GRP_SLDR,
    898		.reg_key = IQS7222_REG_KEY_AXIAL,
    899		.reg_offset = 10,
    900		.reg_shift = 8,
    901		.reg_width = 8,
    902		.val_pitch = 16,
    903		.label = "gesture distance",
    904	},
    905	{
    906		.name = "azoteq,gesture-max-ms",
    907		.reg_grp = IQS7222_REG_GRP_SLDR,
    908		.reg_key = IQS7222_REG_KEY_AXIAL,
    909		.reg_offset = 10,
    910		.reg_shift = 0,
    911		.reg_width = 8,
    912		.val_pitch = 4,
    913		.label = "maximum gesture time",
    914	},
    915	{
    916		.name = "drive-open-drain",
    917		.reg_grp = IQS7222_REG_GRP_GPIO,
    918		.reg_offset = 0,
    919		.reg_shift = 1,
    920		.reg_width = 1,
    921	},
    922	{
    923		.name = "azoteq,timeout-ati-ms",
    924		.reg_grp = IQS7222_REG_GRP_SYS,
    925		.reg_offset = 1,
    926		.reg_shift = 0,
    927		.reg_width = 16,
    928		.val_pitch = 500,
    929		.label = "ATI error timeout",
    930	},
    931	{
    932		.name = "azoteq,rate-ati-ms",
    933		.reg_grp = IQS7222_REG_GRP_SYS,
    934		.reg_offset = 2,
    935		.reg_shift = 0,
    936		.reg_width = 16,
    937		.label = "ATI report rate",
    938	},
    939	{
    940		.name = "azoteq,timeout-np-ms",
    941		.reg_grp = IQS7222_REG_GRP_SYS,
    942		.reg_offset = 3,
    943		.reg_shift = 0,
    944		.reg_width = 16,
    945		.label = "normal-power mode timeout",
    946	},
    947	{
    948		.name = "azoteq,rate-np-ms",
    949		.reg_grp = IQS7222_REG_GRP_SYS,
    950		.reg_offset = 4,
    951		.reg_shift = 0,
    952		.reg_width = 16,
    953		.val_max = 3000,
    954		.label = "normal-power mode report rate",
    955	},
    956	{
    957		.name = "azoteq,timeout-lp-ms",
    958		.reg_grp = IQS7222_REG_GRP_SYS,
    959		.reg_offset = 5,
    960		.reg_shift = 0,
    961		.reg_width = 16,
    962		.label = "low-power mode timeout",
    963	},
    964	{
    965		.name = "azoteq,rate-lp-ms",
    966		.reg_grp = IQS7222_REG_GRP_SYS,
    967		.reg_offset = 6,
    968		.reg_shift = 0,
    969		.reg_width = 16,
    970		.val_max = 3000,
    971		.label = "low-power mode report rate",
    972	},
    973	{
    974		.name = "azoteq,timeout-ulp-ms",
    975		.reg_grp = IQS7222_REG_GRP_SYS,
    976		.reg_offset = 7,
    977		.reg_shift = 0,
    978		.reg_width = 16,
    979		.label = "ultra-low-power mode timeout",
    980	},
    981	{
    982		.name = "azoteq,rate-ulp-ms",
    983		.reg_grp = IQS7222_REG_GRP_SYS,
    984		.reg_offset = 8,
    985		.reg_shift = 0,
    986		.reg_width = 16,
    987		.val_max = 3000,
    988		.label = "ultra-low-power mode report rate",
    989	},
    990};
    991
    992struct iqs7222_private {
    993	const struct iqs7222_dev_desc *dev_desc;
    994	struct gpio_desc *reset_gpio;
    995	struct gpio_desc *irq_gpio;
    996	struct i2c_client *client;
    997	struct input_dev *keypad;
    998	unsigned int kp_type[IQS7222_MAX_CHAN][ARRAY_SIZE(iqs7222_kp_events)];
    999	unsigned int kp_code[IQS7222_MAX_CHAN][ARRAY_SIZE(iqs7222_kp_events)];
   1000	unsigned int sl_code[IQS7222_MAX_SLDR][ARRAY_SIZE(iqs7222_sl_events)];
   1001	unsigned int sl_axis[IQS7222_MAX_SLDR];
   1002	u16 cycle_setup[IQS7222_MAX_CHAN / 2][IQS7222_MAX_COLS_CYCLE];
   1003	u16 glbl_setup[IQS7222_MAX_COLS_GLBL];
   1004	u16 btn_setup[IQS7222_MAX_CHAN][IQS7222_MAX_COLS_BTN];
   1005	u16 chan_setup[IQS7222_MAX_CHAN][IQS7222_MAX_COLS_CHAN];
   1006	u16 filt_setup[IQS7222_MAX_COLS_FILT];
   1007	u16 sldr_setup[IQS7222_MAX_SLDR][IQS7222_MAX_COLS_SLDR];
   1008	u16 gpio_setup[ARRAY_SIZE(iqs7222_gpio_links)][IQS7222_MAX_COLS_GPIO];
   1009	u16 sys_setup[IQS7222_MAX_COLS_SYS];
   1010};
   1011
   1012static u16 *iqs7222_setup(struct iqs7222_private *iqs7222,
   1013			  enum iqs7222_reg_grp_id reg_grp, int row)
   1014{
   1015	switch (reg_grp) {
   1016	case IQS7222_REG_GRP_CYCLE:
   1017		return iqs7222->cycle_setup[row];
   1018
   1019	case IQS7222_REG_GRP_GLBL:
   1020		return iqs7222->glbl_setup;
   1021
   1022	case IQS7222_REG_GRP_BTN:
   1023		return iqs7222->btn_setup[row];
   1024
   1025	case IQS7222_REG_GRP_CHAN:
   1026		return iqs7222->chan_setup[row];
   1027
   1028	case IQS7222_REG_GRP_FILT:
   1029		return iqs7222->filt_setup;
   1030
   1031	case IQS7222_REG_GRP_SLDR:
   1032		return iqs7222->sldr_setup[row];
   1033
   1034	case IQS7222_REG_GRP_GPIO:
   1035		return iqs7222->gpio_setup[row];
   1036
   1037	case IQS7222_REG_GRP_SYS:
   1038		return iqs7222->sys_setup;
   1039
   1040	default:
   1041		return NULL;
   1042	}
   1043}
   1044
   1045static int iqs7222_irq_poll(struct iqs7222_private *iqs7222, u16 timeout_ms)
   1046{
   1047	ktime_t irq_timeout = ktime_add_ms(ktime_get(), timeout_ms);
   1048	int ret;
   1049
   1050	do {
   1051		usleep_range(1000, 1100);
   1052
   1053		ret = gpiod_get_value_cansleep(iqs7222->irq_gpio);
   1054		if (ret < 0)
   1055			return ret;
   1056		else if (ret > 0)
   1057			return 0;
   1058	} while (ktime_compare(ktime_get(), irq_timeout) < 0);
   1059
   1060	return -EBUSY;
   1061}
   1062
   1063static int iqs7222_hard_reset(struct iqs7222_private *iqs7222)
   1064{
   1065	struct i2c_client *client = iqs7222->client;
   1066	int error;
   1067
   1068	if (!iqs7222->reset_gpio)
   1069		return 0;
   1070
   1071	gpiod_set_value_cansleep(iqs7222->reset_gpio, 1);
   1072	usleep_range(1000, 1100);
   1073
   1074	gpiod_set_value_cansleep(iqs7222->reset_gpio, 0);
   1075
   1076	error = iqs7222_irq_poll(iqs7222, IQS7222_RESET_TIMEOUT_MS);
   1077	if (error)
   1078		dev_err(&client->dev, "Failed to reset device: %d\n", error);
   1079
   1080	return error;
   1081}
   1082
   1083static int iqs7222_force_comms(struct iqs7222_private *iqs7222)
   1084{
   1085	u8 msg_buf[] = { 0xFF, 0x00, };
   1086	int ret;
   1087
   1088	/*
   1089	 * The device cannot communicate until it asserts its interrupt (RDY)
   1090	 * pin. Attempts to do so while RDY is deasserted return an ACK; how-
   1091	 * ever all write data is ignored, and all read data returns 0xEE.
   1092	 *
   1093	 * Unsolicited communication must be preceded by a special force com-
   1094	 * munication command, after which the device eventually asserts its
   1095	 * RDY pin and agrees to communicate.
   1096	 *
   1097	 * Regardless of whether communication is forced or the result of an
   1098	 * interrupt, the device automatically deasserts its RDY pin once it
   1099	 * detects an I2C stop condition, or a timeout expires.
   1100	 */
   1101	ret = gpiod_get_value_cansleep(iqs7222->irq_gpio);
   1102	if (ret < 0)
   1103		return ret;
   1104	else if (ret > 0)
   1105		return 0;
   1106
   1107	ret = i2c_master_send(iqs7222->client, msg_buf, sizeof(msg_buf));
   1108	if (ret < (int)sizeof(msg_buf)) {
   1109		if (ret >= 0)
   1110			ret = -EIO;
   1111
   1112		/*
   1113		 * The datasheet states that the host must wait to retry any
   1114		 * failed attempt to communicate over I2C.
   1115		 */
   1116		msleep(IQS7222_COMMS_RETRY_MS);
   1117		return ret;
   1118	}
   1119
   1120	return iqs7222_irq_poll(iqs7222, IQS7222_COMMS_TIMEOUT_MS);
   1121}
   1122
   1123static int iqs7222_read_burst(struct iqs7222_private *iqs7222,
   1124			      u16 reg, void *val, u16 num_val)
   1125{
   1126	u8 reg_buf[sizeof(__be16)];
   1127	int ret, i;
   1128	struct i2c_client *client = iqs7222->client;
   1129	struct i2c_msg msg[] = {
   1130		{
   1131			.addr = client->addr,
   1132			.flags = 0,
   1133			.len = reg > U8_MAX ? sizeof(reg) : sizeof(u8),
   1134			.buf = reg_buf,
   1135		},
   1136		{
   1137			.addr = client->addr,
   1138			.flags = I2C_M_RD,
   1139			.len = num_val * sizeof(__le16),
   1140			.buf = (u8 *)val,
   1141		},
   1142	};
   1143
   1144	if (reg > U8_MAX)
   1145		put_unaligned_be16(reg, reg_buf);
   1146	else
   1147		*reg_buf = (u8)reg;
   1148
   1149	/*
   1150	 * The following loop protects against an edge case in which the RDY
   1151	 * pin is automatically deasserted just as the read is initiated. In
   1152	 * that case, the read must be retried using forced communication.
   1153	 */
   1154	for (i = 0; i < IQS7222_NUM_RETRIES; i++) {
   1155		ret = iqs7222_force_comms(iqs7222);
   1156		if (ret < 0)
   1157			continue;
   1158
   1159		ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg));
   1160		if (ret < (int)ARRAY_SIZE(msg)) {
   1161			if (ret >= 0)
   1162				ret = -EIO;
   1163
   1164			msleep(IQS7222_COMMS_RETRY_MS);
   1165			continue;
   1166		}
   1167
   1168		if (get_unaligned_le16(msg[1].buf) == IQS7222_COMMS_ERROR) {
   1169			ret = -ENODATA;
   1170			continue;
   1171		}
   1172
   1173		ret = 0;
   1174		break;
   1175	}
   1176
   1177	/*
   1178	 * The following delay ensures the device has deasserted the RDY pin
   1179	 * following the I2C stop condition.
   1180	 */
   1181	usleep_range(50, 100);
   1182
   1183	if (ret < 0)
   1184		dev_err(&client->dev,
   1185			"Failed to read from address 0x%04X: %d\n", reg, ret);
   1186
   1187	return ret;
   1188}
   1189
   1190static int iqs7222_read_word(struct iqs7222_private *iqs7222, u16 reg, u16 *val)
   1191{
   1192	__le16 val_buf;
   1193	int error;
   1194
   1195	error = iqs7222_read_burst(iqs7222, reg, &val_buf, 1);
   1196	if (error)
   1197		return error;
   1198
   1199	*val = le16_to_cpu(val_buf);
   1200
   1201	return 0;
   1202}
   1203
   1204static int iqs7222_write_burst(struct iqs7222_private *iqs7222,
   1205			       u16 reg, const void *val, u16 num_val)
   1206{
   1207	int reg_len = reg > U8_MAX ? sizeof(reg) : sizeof(u8);
   1208	int val_len = num_val * sizeof(__le16);
   1209	int msg_len = reg_len + val_len;
   1210	int ret, i;
   1211	struct i2c_client *client = iqs7222->client;
   1212	u8 *msg_buf;
   1213
   1214	msg_buf = kzalloc(msg_len, GFP_KERNEL);
   1215	if (!msg_buf)
   1216		return -ENOMEM;
   1217
   1218	if (reg > U8_MAX)
   1219		put_unaligned_be16(reg, msg_buf);
   1220	else
   1221		*msg_buf = (u8)reg;
   1222
   1223	memcpy(msg_buf + reg_len, val, val_len);
   1224
   1225	/*
   1226	 * The following loop protects against an edge case in which the RDY
   1227	 * pin is automatically asserted just before the force communication
   1228	 * command is sent.
   1229	 *
   1230	 * In that case, the subsequent I2C stop condition tricks the device
   1231	 * into preemptively deasserting the RDY pin and the command must be
   1232	 * sent again.
   1233	 */
   1234	for (i = 0; i < IQS7222_NUM_RETRIES; i++) {
   1235		ret = iqs7222_force_comms(iqs7222);
   1236		if (ret < 0)
   1237			continue;
   1238
   1239		ret = i2c_master_send(client, msg_buf, msg_len);
   1240		if (ret < msg_len) {
   1241			if (ret >= 0)
   1242				ret = -EIO;
   1243
   1244			msleep(IQS7222_COMMS_RETRY_MS);
   1245			continue;
   1246		}
   1247
   1248		ret = 0;
   1249		break;
   1250	}
   1251
   1252	kfree(msg_buf);
   1253
   1254	usleep_range(50, 100);
   1255
   1256	if (ret < 0)
   1257		dev_err(&client->dev,
   1258			"Failed to write to address 0x%04X: %d\n", reg, ret);
   1259
   1260	return ret;
   1261}
   1262
   1263static int iqs7222_write_word(struct iqs7222_private *iqs7222, u16 reg, u16 val)
   1264{
   1265	__le16 val_buf = cpu_to_le16(val);
   1266
   1267	return iqs7222_write_burst(iqs7222, reg, &val_buf, 1);
   1268}
   1269
   1270static int iqs7222_ati_trigger(struct iqs7222_private *iqs7222)
   1271{
   1272	struct i2c_client *client = iqs7222->client;
   1273	ktime_t ati_timeout;
   1274	u16 sys_status = 0;
   1275	u16 sys_setup = iqs7222->sys_setup[0] & ~IQS7222_SYS_SETUP_ACK_RESET;
   1276	int error, i;
   1277
   1278	for (i = 0; i < IQS7222_NUM_RETRIES; i++) {
   1279		/*
   1280		 * Trigger ATI from streaming and normal-power modes so that
   1281		 * the RDY pin continues to be asserted during ATI.
   1282		 */
   1283		error = iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP,
   1284					   sys_setup |
   1285					   IQS7222_SYS_SETUP_REDO_ATI);
   1286		if (error)
   1287			return error;
   1288
   1289		ati_timeout = ktime_add_ms(ktime_get(), IQS7222_ATI_TIMEOUT_MS);
   1290
   1291		do {
   1292			error = iqs7222_irq_poll(iqs7222,
   1293						 IQS7222_COMMS_TIMEOUT_MS);
   1294			if (error)
   1295				continue;
   1296
   1297			error = iqs7222_read_word(iqs7222, IQS7222_SYS_STATUS,
   1298						  &sys_status);
   1299			if (error)
   1300				return error;
   1301
   1302			if (sys_status & IQS7222_SYS_STATUS_ATI_ACTIVE)
   1303				continue;
   1304
   1305			if (sys_status & IQS7222_SYS_STATUS_ATI_ERROR)
   1306				break;
   1307
   1308			/*
   1309			 * Use stream-in-touch mode if either slider reports
   1310			 * absolute position.
   1311			 */
   1312			sys_setup |= test_bit(EV_ABS, iqs7222->keypad->evbit)
   1313				   ? IQS7222_SYS_SETUP_INTF_MODE_TOUCH
   1314				   : IQS7222_SYS_SETUP_INTF_MODE_EVENT;
   1315			sys_setup |= IQS7222_SYS_SETUP_PWR_MODE_AUTO;
   1316
   1317			return iqs7222_write_word(iqs7222, IQS7222_SYS_SETUP,
   1318						  sys_setup);
   1319		} while (ktime_compare(ktime_get(), ati_timeout) < 0);
   1320
   1321		dev_err(&client->dev,
   1322			"ATI attempt %d of %d failed with status 0x%02X, %s\n",
   1323			i + 1, IQS7222_NUM_RETRIES, (u8)sys_status,
   1324			i < IQS7222_NUM_RETRIES ? "retrying..." : "stopping");
   1325	}
   1326
   1327	return -ETIMEDOUT;
   1328}
   1329
   1330static int iqs7222_dev_init(struct iqs7222_private *iqs7222, int dir)
   1331{
   1332	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   1333	int comms_offset = dev_desc->comms_offset;
   1334	int error, i, j, k;
   1335
   1336	/*
   1337	 * Take advantage of the stop-bit disable function, if available, to
   1338	 * save the trouble of having to reopen a communication window after
   1339	 * each burst read or write.
   1340	 */
   1341	if (comms_offset) {
   1342		u16 comms_setup;
   1343
   1344		error = iqs7222_read_word(iqs7222,
   1345					  IQS7222_SYS_SETUP + comms_offset,
   1346					  &comms_setup);
   1347		if (error)
   1348			return error;
   1349
   1350		error = iqs7222_write_word(iqs7222,
   1351					   IQS7222_SYS_SETUP + comms_offset,
   1352					   comms_setup | IQS7222_COMMS_HOLD);
   1353		if (error)
   1354			return error;
   1355	}
   1356
   1357	for (i = 0; i < IQS7222_NUM_REG_GRPS; i++) {
   1358		int num_row = dev_desc->reg_grps[i].num_row;
   1359		int num_col = dev_desc->reg_grps[i].num_col;
   1360		u16 reg = dev_desc->reg_grps[i].base;
   1361		__le16 *val_buf;
   1362		u16 *val;
   1363
   1364		if (!num_col)
   1365			continue;
   1366
   1367		val = iqs7222_setup(iqs7222, i, 0);
   1368		if (!val)
   1369			continue;
   1370
   1371		val_buf = kcalloc(num_col, sizeof(__le16), GFP_KERNEL);
   1372		if (!val_buf)
   1373			return -ENOMEM;
   1374
   1375		for (j = 0; j < num_row; j++) {
   1376			switch (dir) {
   1377			case READ:
   1378				error = iqs7222_read_burst(iqs7222, reg,
   1379							   val_buf, num_col);
   1380				for (k = 0; k < num_col; k++)
   1381					val[k] = le16_to_cpu(val_buf[k]);
   1382				break;
   1383
   1384			case WRITE:
   1385				for (k = 0; k < num_col; k++)
   1386					val_buf[k] = cpu_to_le16(val[k]);
   1387				error = iqs7222_write_burst(iqs7222, reg,
   1388							    val_buf, num_col);
   1389				break;
   1390
   1391			default:
   1392				error = -EINVAL;
   1393			}
   1394
   1395			if (error)
   1396				break;
   1397
   1398			reg += IQS7222_REG_OFFSET;
   1399			val += iqs7222_max_cols[i];
   1400		}
   1401
   1402		kfree(val_buf);
   1403
   1404		if (error)
   1405			return error;
   1406	}
   1407
   1408	if (comms_offset) {
   1409		u16 comms_setup;
   1410
   1411		error = iqs7222_read_word(iqs7222,
   1412					  IQS7222_SYS_SETUP + comms_offset,
   1413					  &comms_setup);
   1414		if (error)
   1415			return error;
   1416
   1417		error = iqs7222_write_word(iqs7222,
   1418					   IQS7222_SYS_SETUP + comms_offset,
   1419					   comms_setup & ~IQS7222_COMMS_HOLD);
   1420		if (error)
   1421			return error;
   1422	}
   1423
   1424	if (dir == READ)
   1425		return 0;
   1426
   1427	return iqs7222_ati_trigger(iqs7222);
   1428}
   1429
   1430static int iqs7222_dev_info(struct iqs7222_private *iqs7222)
   1431{
   1432	struct i2c_client *client = iqs7222->client;
   1433	bool prod_num_valid = false;
   1434	__le16 dev_id[3];
   1435	int error, i;
   1436
   1437	error = iqs7222_read_burst(iqs7222, IQS7222_PROD_NUM, dev_id,
   1438				   ARRAY_SIZE(dev_id));
   1439	if (error)
   1440		return error;
   1441
   1442	for (i = 0; i < ARRAY_SIZE(iqs7222_devs); i++) {
   1443		if (le16_to_cpu(dev_id[0]) != iqs7222_devs[i].prod_num)
   1444			continue;
   1445
   1446		prod_num_valid = true;
   1447
   1448		if (le16_to_cpu(dev_id[1]) < iqs7222_devs[i].fw_major)
   1449			continue;
   1450
   1451		if (le16_to_cpu(dev_id[2]) < iqs7222_devs[i].fw_minor)
   1452			continue;
   1453
   1454		iqs7222->dev_desc = &iqs7222_devs[i];
   1455		return 0;
   1456	}
   1457
   1458	if (prod_num_valid)
   1459		dev_err(&client->dev, "Unsupported firmware revision: %u.%u\n",
   1460			le16_to_cpu(dev_id[1]), le16_to_cpu(dev_id[2]));
   1461	else
   1462		dev_err(&client->dev, "Unrecognized product number: %u\n",
   1463			le16_to_cpu(dev_id[0]));
   1464
   1465	return -EINVAL;
   1466}
   1467
   1468static int iqs7222_gpio_select(struct iqs7222_private *iqs7222,
   1469			       struct fwnode_handle *child_node,
   1470			       int child_enable, u16 child_link)
   1471{
   1472	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   1473	struct i2c_client *client = iqs7222->client;
   1474	int num_gpio = dev_desc->reg_grps[IQS7222_REG_GRP_GPIO].num_row;
   1475	int error, count, i;
   1476	unsigned int gpio_sel[ARRAY_SIZE(iqs7222_gpio_links)];
   1477
   1478	if (!num_gpio)
   1479		return 0;
   1480
   1481	if (!fwnode_property_present(child_node, "azoteq,gpio-select"))
   1482		return 0;
   1483
   1484	count = fwnode_property_count_u32(child_node, "azoteq,gpio-select");
   1485	if (count > num_gpio) {
   1486		dev_err(&client->dev, "Invalid number of %s GPIOs\n",
   1487			fwnode_get_name(child_node));
   1488		return -EINVAL;
   1489	} else if (count < 0) {
   1490		dev_err(&client->dev, "Failed to count %s GPIOs: %d\n",
   1491			fwnode_get_name(child_node), count);
   1492		return count;
   1493	}
   1494
   1495	error = fwnode_property_read_u32_array(child_node,
   1496					       "azoteq,gpio-select",
   1497					       gpio_sel, count);
   1498	if (error) {
   1499		dev_err(&client->dev, "Failed to read %s GPIOs: %d\n",
   1500			fwnode_get_name(child_node), error);
   1501		return error;
   1502	}
   1503
   1504	for (i = 0; i < count; i++) {
   1505		u16 *gpio_setup;
   1506
   1507		if (gpio_sel[i] >= num_gpio) {
   1508			dev_err(&client->dev, "Invalid %s GPIO: %u\n",
   1509				fwnode_get_name(child_node), gpio_sel[i]);
   1510			return -EINVAL;
   1511		}
   1512
   1513		gpio_setup = iqs7222->gpio_setup[gpio_sel[i]];
   1514
   1515		if (gpio_setup[2] && child_link != gpio_setup[2]) {
   1516			dev_err(&client->dev,
   1517				"Conflicting GPIO %u event types\n",
   1518				gpio_sel[i]);
   1519			return -EINVAL;
   1520		}
   1521
   1522		gpio_setup[0] |= IQS7222_GPIO_SETUP_0_GPIO_EN;
   1523		gpio_setup[1] |= child_enable;
   1524		gpio_setup[2] = child_link;
   1525	}
   1526
   1527	return 0;
   1528}
   1529
   1530static int iqs7222_parse_props(struct iqs7222_private *iqs7222,
   1531			       struct fwnode_handle **child_node,
   1532			       int child_index,
   1533			       enum iqs7222_reg_grp_id reg_grp,
   1534			       enum iqs7222_reg_key_id reg_key)
   1535{
   1536	u16 *setup = iqs7222_setup(iqs7222, reg_grp, child_index);
   1537	struct i2c_client *client = iqs7222->client;
   1538	struct fwnode_handle *reg_grp_node;
   1539	char reg_grp_name[16];
   1540	int i;
   1541
   1542	switch (reg_grp) {
   1543	case IQS7222_REG_GRP_CYCLE:
   1544	case IQS7222_REG_GRP_CHAN:
   1545	case IQS7222_REG_GRP_SLDR:
   1546	case IQS7222_REG_GRP_GPIO:
   1547	case IQS7222_REG_GRP_BTN:
   1548		/*
   1549		 * These groups derive a child node and return it to the caller
   1550		 * for additional group-specific processing. In some cases, the
   1551		 * child node may have already been derived.
   1552		 */
   1553		reg_grp_node = *child_node;
   1554		if (reg_grp_node)
   1555			break;
   1556
   1557		snprintf(reg_grp_name, sizeof(reg_grp_name), "%s-%d",
   1558			 iqs7222_reg_grp_names[reg_grp], child_index);
   1559
   1560		reg_grp_node = device_get_named_child_node(&client->dev,
   1561							   reg_grp_name);
   1562		if (!reg_grp_node)
   1563			return 0;
   1564
   1565		*child_node = reg_grp_node;
   1566		break;
   1567
   1568	case IQS7222_REG_GRP_GLBL:
   1569	case IQS7222_REG_GRP_FILT:
   1570	case IQS7222_REG_GRP_SYS:
   1571		/*
   1572		 * These groups are not organized beneath a child node, nor are
   1573		 * they subject to any additional processing by the caller.
   1574		 */
   1575		reg_grp_node = dev_fwnode(&client->dev);
   1576		break;
   1577
   1578	default:
   1579		return -EINVAL;
   1580	}
   1581
   1582	for (i = 0; i < ARRAY_SIZE(iqs7222_props); i++) {
   1583		const char *name = iqs7222_props[i].name;
   1584		int reg_offset = iqs7222_props[i].reg_offset;
   1585		int reg_shift = iqs7222_props[i].reg_shift;
   1586		int reg_width = iqs7222_props[i].reg_width;
   1587		int val_pitch = iqs7222_props[i].val_pitch ? : 1;
   1588		int val_min = iqs7222_props[i].val_min;
   1589		int val_max = iqs7222_props[i].val_max;
   1590		bool invert = iqs7222_props[i].invert;
   1591		const char *label = iqs7222_props[i].label ? : name;
   1592		unsigned int val;
   1593		int error;
   1594
   1595		if (iqs7222_props[i].reg_grp != reg_grp ||
   1596		    iqs7222_props[i].reg_key != reg_key)
   1597			continue;
   1598
   1599		/*
   1600		 * Boolean register fields are one bit wide; they are forcibly
   1601		 * reset to provide a means to undo changes by a bootloader if
   1602		 * necessary.
   1603		 *
   1604		 * Scalar fields, on the other hand, are left untouched unless
   1605		 * their corresponding properties are present.
   1606		 */
   1607		if (reg_width == 1) {
   1608			if (invert)
   1609				setup[reg_offset] |= BIT(reg_shift);
   1610			else
   1611				setup[reg_offset] &= ~BIT(reg_shift);
   1612		}
   1613
   1614		if (!fwnode_property_present(reg_grp_node, name))
   1615			continue;
   1616
   1617		if (reg_width == 1) {
   1618			if (invert)
   1619				setup[reg_offset] &= ~BIT(reg_shift);
   1620			else
   1621				setup[reg_offset] |= BIT(reg_shift);
   1622
   1623			continue;
   1624		}
   1625
   1626		error = fwnode_property_read_u32(reg_grp_node, name, &val);
   1627		if (error) {
   1628			dev_err(&client->dev, "Failed to read %s %s: %d\n",
   1629				fwnode_get_name(reg_grp_node), label, error);
   1630			return error;
   1631		}
   1632
   1633		if (!val_max)
   1634			val_max = GENMASK(reg_width - 1, 0) * val_pitch;
   1635
   1636		if (val < val_min || val > val_max) {
   1637			dev_err(&client->dev, "Invalid %s %s: %u\n",
   1638				fwnode_get_name(reg_grp_node), label, val);
   1639			return -EINVAL;
   1640		}
   1641
   1642		setup[reg_offset] &= ~GENMASK(reg_shift + reg_width - 1,
   1643					      reg_shift);
   1644		setup[reg_offset] |= (val / val_pitch << reg_shift);
   1645	}
   1646
   1647	return 0;
   1648}
   1649
   1650static int iqs7222_parse_cycle(struct iqs7222_private *iqs7222, int cycle_index)
   1651{
   1652	u16 *cycle_setup = iqs7222->cycle_setup[cycle_index];
   1653	struct i2c_client *client = iqs7222->client;
   1654	struct fwnode_handle *cycle_node = NULL;
   1655	unsigned int pins[9];
   1656	int error, count, i;
   1657
   1658	/*
   1659	 * Each channel shares a cycle with one other channel; the mapping of
   1660	 * channels to cycles is fixed. Properties defined for a cycle impact
   1661	 * both channels tied to the cycle.
   1662	 */
   1663	error = iqs7222_parse_props(iqs7222, &cycle_node, cycle_index,
   1664				    IQS7222_REG_GRP_CYCLE,
   1665				    IQS7222_REG_KEY_NONE);
   1666	if (error)
   1667		return error;
   1668
   1669	if (!cycle_node)
   1670		return 0;
   1671
   1672	/*
   1673	 * Unlike channels which are restricted to a select range of CRx pins
   1674	 * based on channel number, any cycle can claim any of the device's 9
   1675	 * CTx pins (CTx0-8).
   1676	 */
   1677	if (!fwnode_property_present(cycle_node, "azoteq,tx-enable"))
   1678		return 0;
   1679
   1680	count = fwnode_property_count_u32(cycle_node, "azoteq,tx-enable");
   1681	if (count < 0) {
   1682		dev_err(&client->dev, "Failed to count %s CTx pins: %d\n",
   1683			fwnode_get_name(cycle_node), count);
   1684		return count;
   1685	} else if (count > ARRAY_SIZE(pins)) {
   1686		dev_err(&client->dev, "Invalid number of %s CTx pins\n",
   1687			fwnode_get_name(cycle_node));
   1688		return -EINVAL;
   1689	}
   1690
   1691	error = fwnode_property_read_u32_array(cycle_node, "azoteq,tx-enable",
   1692					       pins, count);
   1693	if (error) {
   1694		dev_err(&client->dev, "Failed to read %s CTx pins: %d\n",
   1695			fwnode_get_name(cycle_node), error);
   1696		return error;
   1697	}
   1698
   1699	cycle_setup[1] &= ~GENMASK(7 + ARRAY_SIZE(pins) - 1, 7);
   1700
   1701	for (i = 0; i < count; i++) {
   1702		if (pins[i] > 8) {
   1703			dev_err(&client->dev, "Invalid %s CTx pin: %u\n",
   1704				fwnode_get_name(cycle_node), pins[i]);
   1705			return -EINVAL;
   1706		}
   1707
   1708		cycle_setup[1] |= BIT(pins[i] + 7);
   1709	}
   1710
   1711	return 0;
   1712}
   1713
   1714static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, int chan_index)
   1715{
   1716	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   1717	struct i2c_client *client = iqs7222->client;
   1718	struct fwnode_handle *chan_node = NULL;
   1719	int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row;
   1720	int ext_chan = rounddown(num_chan, 10);
   1721	int error, i;
   1722	u16 *chan_setup = iqs7222->chan_setup[chan_index];
   1723	u16 *sys_setup = iqs7222->sys_setup;
   1724	unsigned int val;
   1725
   1726	error = iqs7222_parse_props(iqs7222, &chan_node, chan_index,
   1727				    IQS7222_REG_GRP_CHAN,
   1728				    IQS7222_REG_KEY_NONE);
   1729	if (error)
   1730		return error;
   1731
   1732	if (!chan_node)
   1733		return 0;
   1734
   1735	if (dev_desc->allow_offset) {
   1736		sys_setup[dev_desc->allow_offset] |= BIT(chan_index);
   1737		if (fwnode_property_present(chan_node, "azoteq,ulp-allow"))
   1738			sys_setup[dev_desc->allow_offset] &= ~BIT(chan_index);
   1739	}
   1740
   1741	chan_setup[0] |= IQS7222_CHAN_SETUP_0_CHAN_EN;
   1742
   1743	/*
   1744	 * The reference channel function allows for differential measurements
   1745	 * and is only available in the case of IQS7222A or IQS7222C.
   1746	 */
   1747	if (dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_col > 4 &&
   1748	    fwnode_property_present(chan_node, "azoteq,ref-select")) {
   1749		u16 *ref_setup;
   1750
   1751		error = fwnode_property_read_u32(chan_node, "azoteq,ref-select",
   1752						 &val);
   1753		if (error) {
   1754			dev_err(&client->dev,
   1755				"Failed to read %s reference channel: %d\n",
   1756				fwnode_get_name(chan_node), error);
   1757			return error;
   1758		}
   1759
   1760		if (val >= ext_chan) {
   1761			dev_err(&client->dev,
   1762				"Invalid %s reference channel: %u\n",
   1763				fwnode_get_name(chan_node), val);
   1764			return -EINVAL;
   1765		}
   1766
   1767		ref_setup = iqs7222->chan_setup[val];
   1768
   1769		/*
   1770		 * Configure the current channel as a follower of the selected
   1771		 * reference channel.
   1772		 */
   1773		chan_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_FOLLOW;
   1774		chan_setup[4] = val * 42 + 1048;
   1775
   1776		if (!fwnode_property_read_u32(chan_node, "azoteq,ref-weight",
   1777					      &val)) {
   1778			if (val > U16_MAX) {
   1779				dev_err(&client->dev,
   1780					"Invalid %s reference weight: %u\n",
   1781					fwnode_get_name(chan_node), val);
   1782				return -EINVAL;
   1783			}
   1784
   1785			chan_setup[5] = val;
   1786		}
   1787
   1788		/*
   1789		 * Configure the selected channel as a reference channel which
   1790		 * serves the current channel.
   1791		 */
   1792		ref_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_REF;
   1793		ref_setup[5] |= BIT(chan_index);
   1794
   1795		ref_setup[4] = dev_desc->touch_link;
   1796		if (fwnode_property_present(chan_node, "azoteq,use-prox"))
   1797			ref_setup[4] -= 2;
   1798	}
   1799
   1800	if (fwnode_property_present(chan_node, "azoteq,rx-enable")) {
   1801		/*
   1802		 * Each channel can claim up to 4 CRx pins. The first half of
   1803		 * the channels can use CRx0-3, while the second half can use
   1804		 * CRx4-7.
   1805		 */
   1806		unsigned int pins[4];
   1807		int count;
   1808
   1809		count = fwnode_property_count_u32(chan_node,
   1810						  "azoteq,rx-enable");
   1811		if (count < 0) {
   1812			dev_err(&client->dev,
   1813				"Failed to count %s CRx pins: %d\n",
   1814				fwnode_get_name(chan_node), count);
   1815			return count;
   1816		} else if (count > ARRAY_SIZE(pins)) {
   1817			dev_err(&client->dev,
   1818				"Invalid number of %s CRx pins\n",
   1819				fwnode_get_name(chan_node));
   1820			return -EINVAL;
   1821		}
   1822
   1823		error = fwnode_property_read_u32_array(chan_node,
   1824						       "azoteq,rx-enable",
   1825						       pins, count);
   1826		if (error) {
   1827			dev_err(&client->dev,
   1828				"Failed to read %s CRx pins: %d\n",
   1829				fwnode_get_name(chan_node), error);
   1830			return error;
   1831		}
   1832
   1833		chan_setup[0] &= ~GENMASK(4 + ARRAY_SIZE(pins) - 1, 4);
   1834
   1835		for (i = 0; i < count; i++) {
   1836			int min_crx = chan_index < ext_chan / 2 ? 0 : 4;
   1837
   1838			if (pins[i] < min_crx || pins[i] > min_crx + 3) {
   1839				dev_err(&client->dev,
   1840					"Invalid %s CRx pin: %u\n",
   1841					fwnode_get_name(chan_node), pins[i]);
   1842				return -EINVAL;
   1843			}
   1844
   1845			chan_setup[0] |= BIT(pins[i] + 4 - min_crx);
   1846		}
   1847	}
   1848
   1849	for (i = 0; i < ARRAY_SIZE(iqs7222_kp_events); i++) {
   1850		const char *event_name = iqs7222_kp_events[i].name;
   1851		u16 event_enable = iqs7222_kp_events[i].enable;
   1852		struct fwnode_handle *event_node;
   1853
   1854		event_node = fwnode_get_named_child_node(chan_node, event_name);
   1855		if (!event_node)
   1856			continue;
   1857
   1858		error = iqs7222_parse_props(iqs7222, &event_node, chan_index,
   1859					    IQS7222_REG_GRP_BTN,
   1860					    iqs7222_kp_events[i].reg_key);
   1861		if (error)
   1862			return error;
   1863
   1864		error = iqs7222_gpio_select(iqs7222, event_node,
   1865					    BIT(chan_index),
   1866					    dev_desc->touch_link - (i ? 0 : 2));
   1867		if (error)
   1868			return error;
   1869
   1870		if (!fwnode_property_read_u32(event_node,
   1871					      "azoteq,timeout-press-ms",
   1872					      &val)) {
   1873			/*
   1874			 * The IQS7222B employs a global pair of press timeout
   1875			 * registers as opposed to channel-specific registers.
   1876			 */
   1877			u16 *setup = dev_desc->reg_grps
   1878				     [IQS7222_REG_GRP_BTN].num_col > 2 ?
   1879				     &iqs7222->btn_setup[chan_index][2] :
   1880				     &sys_setup[9];
   1881
   1882			if (val > U8_MAX * 500) {
   1883				dev_err(&client->dev,
   1884					"Invalid %s press timeout: %u\n",
   1885					fwnode_get_name(chan_node), val);
   1886				return -EINVAL;
   1887			}
   1888
   1889			*setup &= ~(U8_MAX << i * 8);
   1890			*setup |= (val / 500 << i * 8);
   1891		}
   1892
   1893		error = fwnode_property_read_u32(event_node, "linux,code",
   1894						 &val);
   1895		if (error) {
   1896			dev_err(&client->dev, "Failed to read %s code: %d\n",
   1897				fwnode_get_name(chan_node), error);
   1898			return error;
   1899		}
   1900
   1901		iqs7222->kp_code[chan_index][i] = val;
   1902		iqs7222->kp_type[chan_index][i] = EV_KEY;
   1903
   1904		if (fwnode_property_present(event_node, "linux,input-type")) {
   1905			error = fwnode_property_read_u32(event_node,
   1906							 "linux,input-type",
   1907							 &val);
   1908			if (error) {
   1909				dev_err(&client->dev,
   1910					"Failed to read %s input type: %d\n",
   1911					fwnode_get_name(chan_node), error);
   1912				return error;
   1913			}
   1914
   1915			if (val != EV_KEY && val != EV_SW) {
   1916				dev_err(&client->dev,
   1917					"Invalid %s input type: %u\n",
   1918					fwnode_get_name(chan_node), val);
   1919				return -EINVAL;
   1920			}
   1921
   1922			iqs7222->kp_type[chan_index][i] = val;
   1923		}
   1924
   1925		/*
   1926		 * Reference channels can opt out of event reporting by using
   1927		 * KEY_RESERVED in place of a true key or switch code.
   1928		 */
   1929		if (iqs7222->kp_type[chan_index][i] == EV_KEY &&
   1930		    iqs7222->kp_code[chan_index][i] == KEY_RESERVED)
   1931			continue;
   1932
   1933		input_set_capability(iqs7222->keypad,
   1934				     iqs7222->kp_type[chan_index][i],
   1935				     iqs7222->kp_code[chan_index][i]);
   1936
   1937		if (!dev_desc->event_offset)
   1938			continue;
   1939
   1940		sys_setup[dev_desc->event_offset] |= event_enable;
   1941	}
   1942
   1943	/*
   1944	 * The following call handles a special pair of properties that apply
   1945	 * to a channel node, but reside within the button (event) group.
   1946	 */
   1947	return iqs7222_parse_props(iqs7222, &chan_node, chan_index,
   1948				   IQS7222_REG_GRP_BTN,
   1949				   IQS7222_REG_KEY_DEBOUNCE);
   1950}
   1951
   1952static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
   1953{
   1954	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   1955	struct i2c_client *client = iqs7222->client;
   1956	struct fwnode_handle *sldr_node = NULL;
   1957	int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row;
   1958	int ext_chan = rounddown(num_chan, 10);
   1959	int count, error, reg_offset, i;
   1960	u16 *sldr_setup = iqs7222->sldr_setup[sldr_index];
   1961	u16 *sys_setup = iqs7222->sys_setup;
   1962	unsigned int chan_sel[4], val;
   1963
   1964	error = iqs7222_parse_props(iqs7222, &sldr_node, sldr_index,
   1965				    IQS7222_REG_GRP_SLDR,
   1966				    IQS7222_REG_KEY_NONE);
   1967	if (error)
   1968		return error;
   1969
   1970	if (!sldr_node)
   1971		return 0;
   1972
   1973	/*
   1974	 * Each slider can be spread across 3 to 4 channels. It is possible to
   1975	 * select only 2 channels, but doing so prevents the slider from using
   1976	 * the specified resolution.
   1977	 */
   1978	count = fwnode_property_count_u32(sldr_node, "azoteq,channel-select");
   1979	if (count < 0) {
   1980		dev_err(&client->dev, "Failed to count %s channels: %d\n",
   1981			fwnode_get_name(sldr_node), count);
   1982		return count;
   1983	} else if (count < 3 || count > ARRAY_SIZE(chan_sel)) {
   1984		dev_err(&client->dev, "Invalid number of %s channels\n",
   1985			fwnode_get_name(sldr_node));
   1986		return -EINVAL;
   1987	}
   1988
   1989	error = fwnode_property_read_u32_array(sldr_node,
   1990					       "azoteq,channel-select",
   1991					       chan_sel, count);
   1992	if (error) {
   1993		dev_err(&client->dev, "Failed to read %s channels: %d\n",
   1994			fwnode_get_name(sldr_node), error);
   1995		return error;
   1996	}
   1997
   1998	/*
   1999	 * Resolution and top speed, if small enough, are packed into a single
   2000	 * register. Otherwise, each occupies its own register and the rest of
   2001	 * the slider-related register addresses are offset by one.
   2002	 */
   2003	reg_offset = dev_desc->sldr_res < U16_MAX ? 0 : 1;
   2004
   2005	sldr_setup[0] |= count;
   2006	sldr_setup[3 + reg_offset] &= ~IQS7222_SLDR_SETUP_3_CHAN_SEL_MASK;
   2007
   2008	for (i = 0; i < ARRAY_SIZE(chan_sel); i++) {
   2009		sldr_setup[5 + reg_offset + i] = 0;
   2010		if (i >= count)
   2011			continue;
   2012
   2013		if (chan_sel[i] >= ext_chan) {
   2014			dev_err(&client->dev, "Invalid %s channel: %u\n",
   2015				fwnode_get_name(sldr_node), chan_sel[i]);
   2016			return -EINVAL;
   2017		}
   2018
   2019		/*
   2020		 * The following fields indicate which channels participate in
   2021		 * the slider, as well as each channel's relative placement.
   2022		 */
   2023		sldr_setup[3 + reg_offset] |= BIT(chan_sel[i]);
   2024		sldr_setup[5 + reg_offset + i] = chan_sel[i] * 42 + 1080;
   2025	}
   2026
   2027	sldr_setup[4 + reg_offset] = dev_desc->touch_link;
   2028	if (fwnode_property_present(sldr_node, "azoteq,use-prox"))
   2029		sldr_setup[4 + reg_offset] -= 2;
   2030
   2031	if (!fwnode_property_read_u32(sldr_node, "azoteq,slider-size", &val)) {
   2032		if (!val || val > dev_desc->sldr_res) {
   2033			dev_err(&client->dev, "Invalid %s size: %u\n",
   2034				fwnode_get_name(sldr_node), val);
   2035			return -EINVAL;
   2036		}
   2037
   2038		if (reg_offset) {
   2039			sldr_setup[3] = val;
   2040		} else {
   2041			sldr_setup[2] &= ~IQS7222_SLDR_SETUP_2_RES_MASK;
   2042			sldr_setup[2] |= (val / 16 <<
   2043					  IQS7222_SLDR_SETUP_2_RES_SHIFT);
   2044		}
   2045	}
   2046
   2047	if (!fwnode_property_read_u32(sldr_node, "azoteq,top-speed", &val)) {
   2048		if (val > (reg_offset ? U16_MAX : U8_MAX * 4)) {
   2049			dev_err(&client->dev, "Invalid %s top speed: %u\n",
   2050				fwnode_get_name(sldr_node), val);
   2051			return -EINVAL;
   2052		}
   2053
   2054		if (reg_offset) {
   2055			sldr_setup[2] = val;
   2056		} else {
   2057			sldr_setup[2] &= ~IQS7222_SLDR_SETUP_2_TOP_SPEED_MASK;
   2058			sldr_setup[2] |= (val / 4);
   2059		}
   2060	}
   2061
   2062	if (!fwnode_property_read_u32(sldr_node, "linux,axis", &val)) {
   2063		u16 sldr_max = sldr_setup[3] - 1;
   2064
   2065		if (!reg_offset) {
   2066			sldr_max = sldr_setup[2];
   2067
   2068			sldr_max &= IQS7222_SLDR_SETUP_2_RES_MASK;
   2069			sldr_max >>= IQS7222_SLDR_SETUP_2_RES_SHIFT;
   2070
   2071			sldr_max = sldr_max * 16 - 1;
   2072		}
   2073
   2074		input_set_abs_params(iqs7222->keypad, val, 0, sldr_max, 0, 0);
   2075		iqs7222->sl_axis[sldr_index] = val;
   2076	}
   2077
   2078	if (dev_desc->wheel_enable) {
   2079		sldr_setup[0] &= ~dev_desc->wheel_enable;
   2080		if (iqs7222->sl_axis[sldr_index] == ABS_WHEEL)
   2081			sldr_setup[0] |= dev_desc->wheel_enable;
   2082	}
   2083
   2084	for (i = 0; i < ARRAY_SIZE(iqs7222_sl_events); i++) {
   2085		const char *event_name = iqs7222_sl_events[i].name;
   2086		struct fwnode_handle *event_node;
   2087
   2088		/*
   2089		 * The absence of a register offset means the remaining fields
   2090		 * in the group represent gesture settings.
   2091		 */
   2092		if (iqs7222_sl_events[i].enable && !reg_offset)
   2093			sldr_setup[9] &= ~iqs7222_sl_events[i].enable;
   2094
   2095		event_node = fwnode_get_named_child_node(sldr_node, event_name);
   2096		if (!event_node)
   2097			continue;
   2098
   2099		error = iqs7222_parse_props(iqs7222, &event_node, sldr_index,
   2100					    IQS7222_REG_GRP_SLDR,
   2101					    reg_offset ?
   2102					    IQS7222_REG_KEY_RESERVED :
   2103					    iqs7222_sl_events[i].reg_key);
   2104		if (error)
   2105			return error;
   2106
   2107		error = fwnode_property_read_u32(event_node, "linux,code",
   2108						 &val);
   2109		if (error) {
   2110			dev_err(&client->dev, "Failed to read %s code: %d\n",
   2111				fwnode_get_name(sldr_node), error);
   2112			return error;
   2113		}
   2114
   2115		iqs7222->sl_code[sldr_index][i] = val;
   2116		input_set_capability(iqs7222->keypad, EV_KEY, val);
   2117
   2118		/*
   2119		 * The press/release event is determined based on whether the
   2120		 * coordinate field reports 0xFFFF and has no explicit enable
   2121		 * control.
   2122		 */
   2123		if (!iqs7222_sl_events[i].enable || reg_offset)
   2124			continue;
   2125
   2126		sldr_setup[9] |= iqs7222_sl_events[i].enable;
   2127
   2128		error = iqs7222_gpio_select(iqs7222, event_node,
   2129					    iqs7222_sl_events[i].enable,
   2130					    1568 + sldr_index * 30);
   2131		if (error)
   2132			return error;
   2133
   2134		if (!dev_desc->event_offset)
   2135			continue;
   2136
   2137		sys_setup[dev_desc->event_offset] |= BIT(10 + sldr_index);
   2138	}
   2139
   2140	/*
   2141	 * The following call handles a special pair of properties that shift
   2142	 * to make room for a wheel enable control in the case of IQS7222C.
   2143	 */
   2144	return iqs7222_parse_props(iqs7222, &sldr_node, sldr_index,
   2145				   IQS7222_REG_GRP_SLDR,
   2146				   dev_desc->wheel_enable ?
   2147				   IQS7222_REG_KEY_WHEEL :
   2148				   IQS7222_REG_KEY_NO_WHEEL);
   2149}
   2150
   2151static int iqs7222_parse_all(struct iqs7222_private *iqs7222)
   2152{
   2153	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   2154	const struct iqs7222_reg_grp_desc *reg_grps = dev_desc->reg_grps;
   2155	u16 *sys_setup = iqs7222->sys_setup;
   2156	int error, i;
   2157
   2158	if (dev_desc->event_offset)
   2159		sys_setup[dev_desc->event_offset] = IQS7222_EVENT_MASK_ATI;
   2160
   2161	for (i = 0; i < reg_grps[IQS7222_REG_GRP_CYCLE].num_row; i++) {
   2162		error = iqs7222_parse_cycle(iqs7222, i);
   2163		if (error)
   2164			return error;
   2165	}
   2166
   2167	error = iqs7222_parse_props(iqs7222, NULL, 0, IQS7222_REG_GRP_GLBL,
   2168				    IQS7222_REG_KEY_NONE);
   2169	if (error)
   2170		return error;
   2171
   2172	for (i = 0; i < reg_grps[IQS7222_REG_GRP_GPIO].num_row; i++) {
   2173		struct fwnode_handle *gpio_node = NULL;
   2174		u16 *gpio_setup = iqs7222->gpio_setup[i];
   2175		int j;
   2176
   2177		gpio_setup[0] &= ~IQS7222_GPIO_SETUP_0_GPIO_EN;
   2178		gpio_setup[1] = 0;
   2179		gpio_setup[2] = 0;
   2180
   2181		error = iqs7222_parse_props(iqs7222, &gpio_node, i,
   2182					    IQS7222_REG_GRP_GPIO,
   2183					    IQS7222_REG_KEY_NONE);
   2184		if (error)
   2185			return error;
   2186
   2187		if (reg_grps[IQS7222_REG_GRP_GPIO].num_row == 1)
   2188			continue;
   2189
   2190		/*
   2191		 * The IQS7222C exposes multiple GPIO and must be informed
   2192		 * as to which GPIO this group represents.
   2193		 */
   2194		for (j = 0; j < ARRAY_SIZE(iqs7222_gpio_links); j++)
   2195			gpio_setup[0] &= ~BIT(iqs7222_gpio_links[j]);
   2196
   2197		gpio_setup[0] |= BIT(iqs7222_gpio_links[i]);
   2198	}
   2199
   2200	for (i = 0; i < reg_grps[IQS7222_REG_GRP_CHAN].num_row; i++) {
   2201		u16 *chan_setup = iqs7222->chan_setup[i];
   2202
   2203		chan_setup[0] &= ~IQS7222_CHAN_SETUP_0_REF_MODE_MASK;
   2204		chan_setup[0] &= ~IQS7222_CHAN_SETUP_0_CHAN_EN;
   2205
   2206		chan_setup[5] = 0;
   2207	}
   2208
   2209	for (i = 0; i < reg_grps[IQS7222_REG_GRP_CHAN].num_row; i++) {
   2210		error = iqs7222_parse_chan(iqs7222, i);
   2211		if (error)
   2212			return error;
   2213	}
   2214
   2215	error = iqs7222_parse_props(iqs7222, NULL, 0, IQS7222_REG_GRP_FILT,
   2216				    IQS7222_REG_KEY_NONE);
   2217	if (error)
   2218		return error;
   2219
   2220	for (i = 0; i < reg_grps[IQS7222_REG_GRP_SLDR].num_row; i++) {
   2221		u16 *sldr_setup = iqs7222->sldr_setup[i];
   2222
   2223		sldr_setup[0] &= ~IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK;
   2224
   2225		error = iqs7222_parse_sldr(iqs7222, i);
   2226		if (error)
   2227			return error;
   2228	}
   2229
   2230	sys_setup[0] &= ~IQS7222_SYS_SETUP_INTF_MODE_MASK;
   2231	sys_setup[0] &= ~IQS7222_SYS_SETUP_PWR_MODE_MASK;
   2232
   2233	sys_setup[0] |= IQS7222_SYS_SETUP_ACK_RESET;
   2234
   2235	return iqs7222_parse_props(iqs7222, NULL, 0, IQS7222_REG_GRP_SYS,
   2236				   IQS7222_REG_KEY_NONE);
   2237}
   2238
   2239static int iqs7222_report(struct iqs7222_private *iqs7222)
   2240{
   2241	const struct iqs7222_dev_desc *dev_desc = iqs7222->dev_desc;
   2242	struct i2c_client *client = iqs7222->client;
   2243	int num_chan = dev_desc->reg_grps[IQS7222_REG_GRP_CHAN].num_row;
   2244	int num_stat = dev_desc->reg_grps[IQS7222_REG_GRP_STAT].num_col;
   2245	int error, i, j;
   2246	__le16 status[IQS7222_MAX_COLS_STAT];
   2247
   2248	error = iqs7222_read_burst(iqs7222, IQS7222_SYS_STATUS, status,
   2249				   num_stat);
   2250	if (error)
   2251		return error;
   2252
   2253	if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_RESET) {
   2254		dev_err(&client->dev, "Unexpected device reset\n");
   2255		return iqs7222_dev_init(iqs7222, WRITE);
   2256	}
   2257
   2258	if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_ATI_ERROR) {
   2259		dev_err(&client->dev, "Unexpected ATI error\n");
   2260		return iqs7222_ati_trigger(iqs7222);
   2261	}
   2262
   2263	if (le16_to_cpu(status[0]) & IQS7222_SYS_STATUS_ATI_ACTIVE)
   2264		return 0;
   2265
   2266	for (i = 0; i < num_chan; i++) {
   2267		u16 *chan_setup = iqs7222->chan_setup[i];
   2268
   2269		if (!(chan_setup[0] & IQS7222_CHAN_SETUP_0_CHAN_EN))
   2270			continue;
   2271
   2272		for (j = 0; j < ARRAY_SIZE(iqs7222_kp_events); j++) {
   2273			/*
   2274			 * Proximity state begins at offset 2 and spills into
   2275			 * offset 3 for devices with more than 16 channels.
   2276			 *
   2277			 * Touch state begins at the first offset immediately
   2278			 * following proximity state.
   2279			 */
   2280			int k = 2 + j * (num_chan > 16 ? 2 : 1);
   2281			u16 state = le16_to_cpu(status[k + i / 16]);
   2282
   2283			input_event(iqs7222->keypad,
   2284				    iqs7222->kp_type[i][j],
   2285				    iqs7222->kp_code[i][j],
   2286				    !!(state & BIT(i % 16)));
   2287		}
   2288	}
   2289
   2290	for (i = 0; i < dev_desc->reg_grps[IQS7222_REG_GRP_SLDR].num_row; i++) {
   2291		u16 *sldr_setup = iqs7222->sldr_setup[i];
   2292		u16 sldr_pos = le16_to_cpu(status[4 + i]);
   2293		u16 state = le16_to_cpu(status[6 + i]);
   2294
   2295		if (!(sldr_setup[0] & IQS7222_SLDR_SETUP_0_CHAN_CNT_MASK))
   2296			continue;
   2297
   2298		if (sldr_pos < dev_desc->sldr_res)
   2299			input_report_abs(iqs7222->keypad, iqs7222->sl_axis[i],
   2300					 sldr_pos);
   2301
   2302		for (j = 0; j < ARRAY_SIZE(iqs7222_sl_events); j++) {
   2303			u16 mask = iqs7222_sl_events[j].mask;
   2304			u16 val = iqs7222_sl_events[j].val;
   2305
   2306			if (!iqs7222_sl_events[j].enable) {
   2307				input_report_key(iqs7222->keypad,
   2308						 iqs7222->sl_code[i][j],
   2309						 sldr_pos < dev_desc->sldr_res);
   2310				continue;
   2311			}
   2312
   2313			/*
   2314			 * The remaining offsets represent gesture state, and
   2315			 * are discarded in the case of IQS7222C because only
   2316			 * absolute position is reported.
   2317			 */
   2318			if (num_stat < IQS7222_MAX_COLS_STAT)
   2319				continue;
   2320
   2321			input_report_key(iqs7222->keypad,
   2322					 iqs7222->sl_code[i][j],
   2323					 (state & mask) == val);
   2324		}
   2325	}
   2326
   2327	input_sync(iqs7222->keypad);
   2328
   2329	return 0;
   2330}
   2331
   2332static irqreturn_t iqs7222_irq(int irq, void *context)
   2333{
   2334	struct iqs7222_private *iqs7222 = context;
   2335
   2336	return iqs7222_report(iqs7222) ? IRQ_NONE : IRQ_HANDLED;
   2337}
   2338
   2339static int iqs7222_probe(struct i2c_client *client)
   2340{
   2341	struct iqs7222_private *iqs7222;
   2342	unsigned long irq_flags;
   2343	int error, irq;
   2344
   2345	iqs7222 = devm_kzalloc(&client->dev, sizeof(*iqs7222), GFP_KERNEL);
   2346	if (!iqs7222)
   2347		return -ENOMEM;
   2348
   2349	i2c_set_clientdata(client, iqs7222);
   2350	iqs7222->client = client;
   2351
   2352	iqs7222->keypad = devm_input_allocate_device(&client->dev);
   2353	if (!iqs7222->keypad)
   2354		return -ENOMEM;
   2355
   2356	iqs7222->keypad->name = client->name;
   2357	iqs7222->keypad->id.bustype = BUS_I2C;
   2358
   2359	/*
   2360	 * The RDY pin behaves as an interrupt, but must also be polled ahead
   2361	 * of unsolicited I2C communication. As such, it is first opened as a
   2362	 * GPIO and then passed to gpiod_to_irq() to register the interrupt.
   2363	 */
   2364	iqs7222->irq_gpio = devm_gpiod_get(&client->dev, "irq", GPIOD_IN);
   2365	if (IS_ERR(iqs7222->irq_gpio)) {
   2366		error = PTR_ERR(iqs7222->irq_gpio);
   2367		dev_err(&client->dev, "Failed to request IRQ GPIO: %d\n",
   2368			error);
   2369		return error;
   2370	}
   2371
   2372	iqs7222->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
   2373						      GPIOD_OUT_HIGH);
   2374	if (IS_ERR(iqs7222->reset_gpio)) {
   2375		error = PTR_ERR(iqs7222->reset_gpio);
   2376		dev_err(&client->dev, "Failed to request reset GPIO: %d\n",
   2377			error);
   2378		return error;
   2379	}
   2380
   2381	error = iqs7222_hard_reset(iqs7222);
   2382	if (error)
   2383		return error;
   2384
   2385	error = iqs7222_dev_info(iqs7222);
   2386	if (error)
   2387		return error;
   2388
   2389	error = iqs7222_dev_init(iqs7222, READ);
   2390	if (error)
   2391		return error;
   2392
   2393	error = iqs7222_parse_all(iqs7222);
   2394	if (error)
   2395		return error;
   2396
   2397	error = iqs7222_dev_init(iqs7222, WRITE);
   2398	if (error)
   2399		return error;
   2400
   2401	error = iqs7222_report(iqs7222);
   2402	if (error)
   2403		return error;
   2404
   2405	error = input_register_device(iqs7222->keypad);
   2406	if (error) {
   2407		dev_err(&client->dev, "Failed to register device: %d\n", error);
   2408		return error;
   2409	}
   2410
   2411	irq = gpiod_to_irq(iqs7222->irq_gpio);
   2412	if (irq < 0)
   2413		return irq;
   2414
   2415	irq_flags = gpiod_is_active_low(iqs7222->irq_gpio) ? IRQF_TRIGGER_LOW
   2416							   : IRQF_TRIGGER_HIGH;
   2417	irq_flags |= IRQF_ONESHOT;
   2418
   2419	error = devm_request_threaded_irq(&client->dev, irq, NULL, iqs7222_irq,
   2420					  irq_flags, client->name, iqs7222);
   2421	if (error)
   2422		dev_err(&client->dev, "Failed to request IRQ: %d\n", error);
   2423
   2424	return error;
   2425}
   2426
   2427static const struct of_device_id iqs7222_of_match[] = {
   2428	{ .compatible = "azoteq,iqs7222a" },
   2429	{ .compatible = "azoteq,iqs7222b" },
   2430	{ .compatible = "azoteq,iqs7222c" },
   2431	{ }
   2432};
   2433MODULE_DEVICE_TABLE(of, iqs7222_of_match);
   2434
   2435static struct i2c_driver iqs7222_i2c_driver = {
   2436	.driver = {
   2437		.name = "iqs7222",
   2438		.of_match_table = iqs7222_of_match,
   2439	},
   2440	.probe_new = iqs7222_probe,
   2441};
   2442module_i2c_driver(iqs7222_i2c_driver);
   2443
   2444MODULE_AUTHOR("Jeff LaBundy <jeff@labundy.com>");
   2445MODULE_DESCRIPTION("Azoteq IQS7222A/B/C Capacitive Touch Controller");
   2446MODULE_LICENSE("GPL");