linux-pwm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Nuno Sá" <noname.nuno@gmail.com>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>, nuno.sa@analog.com
Cc: linux-gpio@vger.kernel.org, linux-pwm@vger.kernel.org,
	devicetree@vger.kernel.org, linux-input@vger.kernel.org,
	"Lee Jones" <lee@kernel.org>, "Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Uwe Kleine-König" <ukleinek@kernel.org>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Bartosz Golaszewski" <brgl@bgdev.pl>,
	"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
	"Liu Ying" <victor.liu@nxp.com>
Subject: Re: [PATCH v2 13/17] Input: adp5589: remove the driver
Date: Mon, 21 Apr 2025 13:34:31 +0100	[thread overview]
Message-ID: <c13f4a4ecd248c4cf2ca908480ea76874a5c0814.camel@gmail.com> (raw)
In-Reply-To: <20250421094055.GK29968@pendragon.ideasonboard.com>

On Mon, 2025-04-21 at 12:40 +0300, Laurent Pinchart wrote:
> Hi Nuno,
> 
> Thank you for the patch.
> 
> On Tue, Apr 15, 2025 at 03:49:29PM +0100, Nuno Sá via B4 Relay wrote:
> > From: Nuno Sá <nuno.sa@analog.com>
> > 
> > The adp5589 support is based on legacy platform data and there's no
> > upstream pataform using this device.
> > Moreover, recently, with
> > 
> > commit
> > 480a8ad683d7 ("mfd: adp5585: Add Analog Devices ADP5585 core support")
> > 
> > we overlapped support for the adp5585 device (gpiochip part of it) but
> > since it actually makes sense for the device to be supported under MFD, we
> > can complement it and add the keymap support for it (properly based on FW
> > properties). And that is what
> > 
> > commit
> > 04840c5363a6 ("Input: adp5585: Add Analog Devices ADP5585/89 support")
> 
> Those commit IDs won't exist in mainline. With that fixed,

Hmm, I'll fix this...

> 
> > is doing.
> > 
> > Signed-off-by: Nuno Sá <nuno.sa@analog.com>
> > ---
> >  drivers/input/keyboard/Kconfig        |   10 -
> >  drivers/input/keyboard/Makefile       |    1 -
> >  drivers/input/keyboard/adp5589-keys.c | 1066 ------------------------------
> > ---
> 
> Shouldn't you also drop include/linux/input/adp5589.h ?
> 

Definitely...

> With those issues fixed,
> 
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> >  3 files changed, 1077 deletions(-)
> > 
> > diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
> > index
> > 322da0957067db77c7f66ab26a181d39c2c1d513..76d3397961fa006de4d5979e134b8c6e7d
> > d52c73 100644
> > --- a/drivers/input/keyboard/Kconfig
> > +++ b/drivers/input/keyboard/Kconfig
> > @@ -61,16 +61,6 @@ config KEYBOARD_ADP5588
> >  	  To compile this driver as a module, choose M here: the
> >  	  module will be called adp5588-keys.
> >  
> > -config KEYBOARD_ADP5589
> > -	tristate "ADP5585/ADP5589 I2C QWERTY Keypad and IO Expander"
> > -	depends on I2C
> > -	help
> > -	  Say Y here if you want to use a ADP5585/ADP5589 attached to your
> > -	  system I2C bus.
> > -
> > -	  To compile this driver as a module, choose M here: the
> > -	  module will be called adp5589-keys.
> > -
> >  config KEYBOARD_AMIGA
> >  	tristate "Amiga keyboard"
> >  	depends on AMIGA
> > diff --git a/drivers/input/keyboard/Makefile
> > b/drivers/input/keyboard/Makefile
> > index
> > f00ec003a59aa28577ae164c0539cc5aff9579fc..8bc20ab2b103b0b75c446e4aa919dad01a
> > a5f405 100644
> > --- a/drivers/input/keyboard/Makefile
> > +++ b/drivers/input/keyboard/Makefile
> > @@ -9,7 +9,6 @@ obj-$(CONFIG_KEYBOARD_ADC)		+= adc-keys.o
> >  obj-$(CONFIG_KEYBOARD_ADP5520)		+= adp5520-keys.o
> >  obj-$(CONFIG_KEYBOARD_ADP5585)		+= adp5585-keys.o
> >  obj-$(CONFIG_KEYBOARD_ADP5588)		+= adp5588-keys.o
> > -obj-$(CONFIG_KEYBOARD_ADP5589)		+= adp5589-keys.o
> >  obj-$(CONFIG_KEYBOARD_AMIGA)		+= amikbd.o
> >  obj-$(CONFIG_KEYBOARD_APPLESPI)		+= applespi.o
> >  obj-$(CONFIG_KEYBOARD_ATARI)		+= atakbd.o
> > diff --git a/drivers/input/keyboard/adp5589-keys.c
> > b/drivers/input/keyboard/adp5589-keys.c
> > deleted file mode 100644
> > index
> > 81d0876ee358ef4b521f3f936dc2ab108bb4cda3..0000000000000000000000000000000000
> > 000000
> > --- a/drivers/input/keyboard/adp5589-keys.c
> > +++ /dev/null
> > @@ -1,1066 +0,0 @@
> > -// SPDX-License-Identifier: GPL-2.0-only
> > -/*
> > - * Description:  keypad driver for ADP5589, ADP5585
> > - *		 I2C QWERTY Keypad and IO Expander
> > - * Bugs: Enter bugs at http://blackfin.uclinux.org/
> > - *
> > - * Copyright (C) 2010-2011 Analog Devices Inc.
> > - */
> > -
> > -#include <linux/bitops.h>
> > -#include <linux/module.h>
> > -#include <linux/interrupt.h>
> > -#include <linux/irq.h>
> > -#include <linux/workqueue.h>
> > -#include <linux/errno.h>
> > -#include <linux/pm.h>
> > -#include <linux/pm_wakeirq.h>
> > -#include <linux/platform_device.h>
> > -#include <linux/input.h>
> > -#include <linux/i2c.h>
> > -#include <linux/gpio/driver.h>
> > -#include <linux/slab.h>
> > -
> > -#include <linux/input/adp5589.h>
> > -
> > -/* ADP5589/ADP5585 Common Registers */
> > -#define ADP5589_5_ID			0x00
> > -#define ADP5589_5_INT_STATUS		0x01
> > -#define ADP5589_5_STATUS		0x02
> > -#define ADP5589_5_FIFO_1		0x03
> > -#define ADP5589_5_FIFO_2		0x04
> > -#define ADP5589_5_FIFO_3		0x05
> > -#define ADP5589_5_FIFO_4		0x06
> > -#define ADP5589_5_FIFO_5		0x07
> > -#define ADP5589_5_FIFO_6		0x08
> > -#define ADP5589_5_FIFO_7		0x09
> > -#define ADP5589_5_FIFO_8		0x0A
> > -#define ADP5589_5_FIFO_9		0x0B
> > -#define ADP5589_5_FIFO_10		0x0C
> > -#define ADP5589_5_FIFO_11		0x0D
> > -#define ADP5589_5_FIFO_12		0x0E
> > -#define ADP5589_5_FIFO_13		0x0F
> > -#define ADP5589_5_FIFO_14		0x10
> > -#define ADP5589_5_FIFO_15		0x11
> > -#define ADP5589_5_FIFO_16		0x12
> > -#define ADP5589_5_GPI_INT_STAT_A	0x13
> > -#define ADP5589_5_GPI_INT_STAT_B	0x14
> > -
> > -/* ADP5589 Registers */
> > -#define ADP5589_GPI_INT_STAT_C		0x15
> > -#define ADP5589_GPI_STATUS_A		0x16
> > -#define ADP5589_GPI_STATUS_B		0x17
> > -#define ADP5589_GPI_STATUS_C		0x18
> > -#define ADP5589_RPULL_CONFIG_A		0x19
> > -#define ADP5589_RPULL_CONFIG_B		0x1A
> > -#define ADP5589_RPULL_CONFIG_C		0x1B
> > -#define ADP5589_RPULL_CONFIG_D		0x1C
> > -#define ADP5589_RPULL_CONFIG_E		0x1D
> > -#define ADP5589_GPI_INT_LEVEL_A		0x1E
> > -#define ADP5589_GPI_INT_LEVEL_B		0x1F
> > -#define ADP5589_GPI_INT_LEVEL_C		0x20
> > -#define ADP5589_GPI_EVENT_EN_A		0x21
> > -#define ADP5589_GPI_EVENT_EN_B		0x22
> > -#define ADP5589_GPI_EVENT_EN_C		0x23
> > -#define ADP5589_GPI_INTERRUPT_EN_A	0x24
> > -#define ADP5589_GPI_INTERRUPT_EN_B	0x25
> > -#define ADP5589_GPI_INTERRUPT_EN_C	0x26
> > -#define ADP5589_DEBOUNCE_DIS_A		0x27
> > -#define ADP5589_DEBOUNCE_DIS_B		0x28
> > -#define ADP5589_DEBOUNCE_DIS_C		0x29
> > -#define ADP5589_GPO_DATA_OUT_A		0x2A
> > -#define ADP5589_GPO_DATA_OUT_B		0x2B
> > -#define ADP5589_GPO_DATA_OUT_C		0x2C
> > -#define ADP5589_GPO_OUT_MODE_A		0x2D
> > -#define ADP5589_GPO_OUT_MODE_B		0x2E
> > -#define ADP5589_GPO_OUT_MODE_C		0x2F
> > -#define ADP5589_GPIO_DIRECTION_A	0x30
> > -#define ADP5589_GPIO_DIRECTION_B	0x31
> > -#define ADP5589_GPIO_DIRECTION_C	0x32
> > -#define ADP5589_UNLOCK1			0x33
> > -#define ADP5589_UNLOCK2			0x34
> > -#define ADP5589_EXT_LOCK_EVENT		0x35
> > -#define ADP5589_UNLOCK_TIMERS		0x36
> > -#define ADP5589_LOCK_CFG		0x37
> > -#define ADP5589_RESET1_EVENT_A		0x38
> > -#define ADP5589_RESET1_EVENT_B		0x39
> > -#define ADP5589_RESET1_EVENT_C		0x3A
> > -#define ADP5589_RESET2_EVENT_A		0x3B
> > -#define ADP5589_RESET2_EVENT_B		0x3C
> > -#define ADP5589_RESET_CFG		0x3D
> > -#define ADP5589_PWM_OFFT_LOW		0x3E
> > -#define ADP5589_PWM_OFFT_HIGH		0x3F
> > -#define ADP5589_PWM_ONT_LOW		0x40
> > -#define ADP5589_PWM_ONT_HIGH		0x41
> > -#define ADP5589_PWM_CFG			0x42
> > -#define ADP5589_CLOCK_DIV_CFG		0x43
> > -#define ADP5589_LOGIC_1_CFG		0x44
> > -#define ADP5589_LOGIC_2_CFG		0x45
> > -#define ADP5589_LOGIC_FF_CFG		0x46
> > -#define ADP5589_LOGIC_INT_EVENT_EN	0x47
> > -#define ADP5589_POLL_PTIME_CFG		0x48
> > -#define ADP5589_PIN_CONFIG_A		0x49
> > -#define ADP5589_PIN_CONFIG_B		0x4A
> > -#define ADP5589_PIN_CONFIG_C		0x4B
> > -#define ADP5589_PIN_CONFIG_D		0x4C
> > -#define ADP5589_GENERAL_CFG		0x4D
> > -#define ADP5589_INT_EN			0x4E
> > -
> > -/* ADP5585 Registers */
> > -#define ADP5585_GPI_STATUS_A		0x15
> > -#define ADP5585_GPI_STATUS_B		0x16
> > -#define ADP5585_RPULL_CONFIG_A		0x17
> > -#define ADP5585_RPULL_CONFIG_B		0x18
> > -#define ADP5585_RPULL_CONFIG_C		0x19
> > -#define ADP5585_RPULL_CONFIG_D		0x1A
> > -#define ADP5585_GPI_INT_LEVEL_A		0x1B
> > -#define ADP5585_GPI_INT_LEVEL_B		0x1C
> > -#define ADP5585_GPI_EVENT_EN_A		0x1D
> > -#define ADP5585_GPI_EVENT_EN_B		0x1E
> > -#define ADP5585_GPI_INTERRUPT_EN_A	0x1F
> > -#define ADP5585_GPI_INTERRUPT_EN_B	0x20
> > -#define ADP5585_DEBOUNCE_DIS_A		0x21
> > -#define ADP5585_DEBOUNCE_DIS_B		0x22
> > -#define ADP5585_GPO_DATA_OUT_A		0x23
> > -#define ADP5585_GPO_DATA_OUT_B		0x24
> > -#define ADP5585_GPO_OUT_MODE_A		0x25
> > -#define ADP5585_GPO_OUT_MODE_B		0x26
> > -#define ADP5585_GPIO_DIRECTION_A	0x27
> > -#define ADP5585_GPIO_DIRECTION_B	0x28
> > -#define ADP5585_RESET1_EVENT_A		0x29
> > -#define ADP5585_RESET1_EVENT_B		0x2A
> > -#define ADP5585_RESET1_EVENT_C		0x2B
> > -#define ADP5585_RESET2_EVENT_A		0x2C
> > -#define ADP5585_RESET2_EVENT_B		0x2D
> > -#define ADP5585_RESET_CFG		0x2E
> > -#define ADP5585_PWM_OFFT_LOW		0x2F
> > -#define ADP5585_PWM_OFFT_HIGH		0x30
> > -#define ADP5585_PWM_ONT_LOW		0x31
> > -#define ADP5585_PWM_ONT_HIGH		0x32
> > -#define ADP5585_PWM_CFG			0x33
> > -#define ADP5585_LOGIC_CFG		0x34
> > -#define ADP5585_LOGIC_FF_CFG		0x35
> > -#define ADP5585_LOGIC_INT_EVENT_EN	0x36
> > -#define ADP5585_POLL_PTIME_CFG		0x37
> > -#define ADP5585_PIN_CONFIG_A		0x38
> > -#define ADP5585_PIN_CONFIG_B		0x39
> > -#define ADP5585_PIN_CONFIG_D		0x3A
> > -#define ADP5585_GENERAL_CFG		0x3B
> > -#define ADP5585_INT_EN			0x3C
> > -
> > -/* ID Register */
> > -#define ADP5589_5_DEVICE_ID_MASK	0xF
> > -#define ADP5589_5_MAN_ID_MASK		0xF
> > -#define ADP5589_5_MAN_ID_SHIFT		4
> > -#define ADP5589_5_MAN_ID		0x02
> > -
> > -/* GENERAL_CFG Register */
> > -#define OSC_EN		BIT(7)
> > -#define CORE_CLK(x)	(((x) & 0x3) << 5)
> > -#define LCK_TRK_LOGIC	BIT(4)		/* ADP5589 only */
> > -#define LCK_TRK_GPI	BIT(3)		/* ADP5589 only */
> > -#define INT_CFG		BIT(1)
> > -#define RST_CFG		BIT(0)
> > -
> > -/* INT_EN Register */
> > -#define LOGIC2_IEN	BIT(5)		/* ADP5589 only */
> > -#define LOGIC1_IEN	BIT(4)
> > -#define LOCK_IEN	BIT(3)		/* ADP5589 only */
> > -#define OVRFLOW_IEN	BIT(2)
> > -#define GPI_IEN		BIT(1)
> > -#define EVENT_IEN	BIT(0)
> > -
> > -/* Interrupt Status Register */
> > -#define LOGIC2_INT	BIT(5)		/* ADP5589 only */
> > -#define LOGIC1_INT	BIT(4)
> > -#define LOCK_INT	BIT(3)		/* ADP5589 only */
> > -#define OVRFLOW_INT	BIT(2)
> > -#define GPI_INT		BIT(1)
> > -#define EVENT_INT	BIT(0)
> > -
> > -/* STATUS Register */
> > -#define LOGIC2_STAT	BIT(7)		/* ADP5589 only */
> > -#define LOGIC1_STAT	BIT(6)
> > -#define LOCK_STAT	BIT(5)		/* ADP5589 only */
> > -#define KEC		0x1F
> > -
> > -/* PIN_CONFIG_D Register */
> > -#define C4_EXTEND_CFG	BIT(6)		/* RESET2 */
> > -#define R4_EXTEND_CFG	BIT(5)		/* RESET1 */
> > -
> > -/* LOCK_CFG */
> > -#define LOCK_EN		BIT(0)
> > -
> > -#define PTIME_MASK	0x3
> > -#define LTIME_MASK	0x3		/* ADP5589 only */
> > -
> > -/* Key Event Register xy */
> > -#define KEY_EV_PRESSED	BIT(7)
> > -#define KEY_EV_MASK	0x7F
> > -
> > -#define KEYP_MAX_EVENT		16
> > -#define ADP5589_MAXGPIO		19
> > -#define ADP5585_MAXGPIO		11 /* 10 on the ADP5585-01, 11 on
> > ADP5585-02 */
> > -
> > -enum {
> > -	ADP5589,
> > -	ADP5585_01,
> > -	ADP5585_02
> > -};
> > -
> > -struct adp_constants {
> > -	u8 maxgpio;
> > -	u8 keymapsize;
> > -	u8 gpi_pin_row_base;
> > -	u8 gpi_pin_row_end;
> > -	u8 gpi_pin_col_base;
> > -	u8 gpi_pin_base;
> > -	u8 gpi_pin_end;
> > -	u8 gpimapsize_max;
> > -	u8 max_row_num;
> > -	u8 max_col_num;
> > -	u8 row_mask;
> > -	u8 col_mask;
> > -	u8 col_shift;
> > -	u8 c4_extend_cfg;
> > -	u8 (*bank) (u8 offset);
> > -	u8 (*bit) (u8 offset);
> > -	u8 (*reg) (u8 reg);
> > -};
> > -
> > -struct adp5589_kpad {
> > -	struct i2c_client *client;
> > -	struct input_dev *input;
> > -	const struct adp_constants *var;
> > -	unsigned short keycode[ADP5589_KEYMAPSIZE];
> > -	const struct adp5589_gpi_map *gpimap;
> > -	unsigned short gpimapsize;
> > -	unsigned extend_cfg;
> > -	bool is_adp5585;
> > -	bool support_row5;
> > -#ifdef CONFIG_GPIOLIB
> > -	unsigned char gpiomap[ADP5589_MAXGPIO];
> > -	struct gpio_chip gc;
> > -	struct mutex gpio_lock;	/* Protect cached dir, dat_out */
> > -	u8 dat_out[3];
> > -	u8 dir[3];
> > -#endif
> > -};
> > -
> > -/*
> > - *  ADP5589 / ADP5585 derivative / variant handling
> > - */
> > -
> > -
> > -/* ADP5589 */
> > -
> > -static unsigned char adp5589_bank(unsigned char offset)
> > -{
> > -	return offset >> 3;
> > -}
> > -
> > -static unsigned char adp5589_bit(unsigned char offset)
> > -{
> > -	return 1u << (offset & 0x7);
> > -}
> > -
> > -static unsigned char adp5589_reg(unsigned char reg)
> > -{
> > -	return reg;
> > -}
> > -
> > -static const struct adp_constants const_adp5589 = {
> > -	.maxgpio		= ADP5589_MAXGPIO,
> > -	.keymapsize		= ADP5589_KEYMAPSIZE,
> > -	.gpi_pin_row_base	= ADP5589_GPI_PIN_ROW_BASE,
> > -	.gpi_pin_row_end	= ADP5589_GPI_PIN_ROW_END,
> > -	.gpi_pin_col_base	= ADP5589_GPI_PIN_COL_BASE,
> > -	.gpi_pin_base		= ADP5589_GPI_PIN_BASE,
> > -	.gpi_pin_end		= ADP5589_GPI_PIN_END,
> > -	.gpimapsize_max		= ADP5589_GPIMAPSIZE_MAX,
> > -	.c4_extend_cfg		= 12,
> > -	.max_row_num		= ADP5589_MAX_ROW_NUM,
> > -	.max_col_num		= ADP5589_MAX_COL_NUM,
> > -	.row_mask		= ADP5589_ROW_MASK,
> > -	.col_mask		= ADP5589_COL_MASK,
> > -	.col_shift		= ADP5589_COL_SHIFT,
> > -	.bank			= adp5589_bank,
> > -	.bit			= adp5589_bit,
> > -	.reg			= adp5589_reg,
> > -};
> > -
> > -/* ADP5585 */
> > -
> > -static unsigned char adp5585_bank(unsigned char offset)
> > -{
> > -	return offset > ADP5585_MAX_ROW_NUM;
> > -}
> > -
> > -static unsigned char adp5585_bit(unsigned char offset)
> > -{
> > -	return (offset > ADP5585_MAX_ROW_NUM) ?
> > -		1u << (offset - ADP5585_COL_SHIFT) : 1u << offset;
> > -}
> > -
> > -static const unsigned char adp5585_reg_lut[] = {
> > -	[ADP5589_GPI_STATUS_A]		= ADP5585_GPI_STATUS_A,
> > -	[ADP5589_GPI_STATUS_B]		= ADP5585_GPI_STATUS_B,
> > -	[ADP5589_RPULL_CONFIG_A]	= ADP5585_RPULL_CONFIG_A,
> > -	[ADP5589_RPULL_CONFIG_B]	= ADP5585_RPULL_CONFIG_B,
> > -	[ADP5589_RPULL_CONFIG_C]	= ADP5585_RPULL_CONFIG_C,
> > -	[ADP5589_RPULL_CONFIG_D]	= ADP5585_RPULL_CONFIG_D,
> > -	[ADP5589_GPI_INT_LEVEL_A]	= ADP5585_GPI_INT_LEVEL_A,
> > -	[ADP5589_GPI_INT_LEVEL_B]	= ADP5585_GPI_INT_LEVEL_B,
> > -	[ADP5589_GPI_EVENT_EN_A]	= ADP5585_GPI_EVENT_EN_A,
> > -	[ADP5589_GPI_EVENT_EN_B]	= ADP5585_GPI_EVENT_EN_B,
> > -	[ADP5589_GPI_INTERRUPT_EN_A]	= ADP5585_GPI_INTERRUPT_EN_A,
> > -	[ADP5589_GPI_INTERRUPT_EN_B]	= ADP5585_GPI_INTERRUPT_EN_B,
> > -	[ADP5589_DEBOUNCE_DIS_A]	= ADP5585_DEBOUNCE_DIS_A,
> > -	[ADP5589_DEBOUNCE_DIS_B]	= ADP5585_DEBOUNCE_DIS_B,
> > -	[ADP5589_GPO_DATA_OUT_A]	= ADP5585_GPO_DATA_OUT_A,
> > -	[ADP5589_GPO_DATA_OUT_B]	= ADP5585_GPO_DATA_OUT_B,
> > -	[ADP5589_GPO_OUT_MODE_A]	= ADP5585_GPO_OUT_MODE_A,
> > -	[ADP5589_GPO_OUT_MODE_B]	= ADP5585_GPO_OUT_MODE_B,
> > -	[ADP5589_GPIO_DIRECTION_A]	= ADP5585_GPIO_DIRECTION_A,
> > -	[ADP5589_GPIO_DIRECTION_B]	= ADP5585_GPIO_DIRECTION_B,
> > -	[ADP5589_RESET1_EVENT_A]	= ADP5585_RESET1_EVENT_A,
> > -	[ADP5589_RESET1_EVENT_B]	= ADP5585_RESET1_EVENT_B,
> > -	[ADP5589_RESET1_EVENT_C]	= ADP5585_RESET1_EVENT_C,
> > -	[ADP5589_RESET2_EVENT_A]	= ADP5585_RESET2_EVENT_A,
> > -	[ADP5589_RESET2_EVENT_B]	= ADP5585_RESET2_EVENT_B,
> > -	[ADP5589_RESET_CFG]		= ADP5585_RESET_CFG,
> > -	[ADP5589_PWM_OFFT_LOW]		= ADP5585_PWM_OFFT_LOW,
> > -	[ADP5589_PWM_OFFT_HIGH]		= ADP5585_PWM_OFFT_HIGH,
> > -	[ADP5589_PWM_ONT_LOW]		= ADP5585_PWM_ONT_LOW,
> > -	[ADP5589_PWM_ONT_HIGH]		= ADP5585_PWM_ONT_HIGH,
> > -	[ADP5589_PWM_CFG]		= ADP5585_PWM_CFG,
> > -	[ADP5589_LOGIC_1_CFG]		= ADP5585_LOGIC_CFG,
> > -	[ADP5589_LOGIC_FF_CFG]		= ADP5585_LOGIC_FF_CFG,
> > -	[ADP5589_LOGIC_INT_EVENT_EN]	= ADP5585_LOGIC_INT_EVENT_EN,
> > -	[ADP5589_POLL_PTIME_CFG]	= ADP5585_POLL_PTIME_CFG,
> > -	[ADP5589_PIN_CONFIG_A]		= ADP5585_PIN_CONFIG_A,
> > -	[ADP5589_PIN_CONFIG_B]		= ADP5585_PIN_CONFIG_B,
> > -	[ADP5589_PIN_CONFIG_D]		= ADP5585_PIN_CONFIG_D,
> > -	[ADP5589_GENERAL_CFG]		= ADP5585_GENERAL_CFG,
> > -	[ADP5589_INT_EN]		= ADP5585_INT_EN,
> > -};
> > -
> > -static unsigned char adp5585_reg(unsigned char reg)
> > -{
> > -	return adp5585_reg_lut[reg];
> > -}
> > -
> > -static const struct adp_constants const_adp5585 = {
> > -	.maxgpio		= ADP5585_MAXGPIO,
> > -	.keymapsize		= ADP5585_KEYMAPSIZE,
> > -	.gpi_pin_row_base	= ADP5585_GPI_PIN_ROW_BASE,
> > -	.gpi_pin_row_end	= ADP5585_GPI_PIN_ROW_END,
> > -	.gpi_pin_col_base	= ADP5585_GPI_PIN_COL_BASE,
> > -	.gpi_pin_base		= ADP5585_GPI_PIN_BASE,
> > -	.gpi_pin_end		= ADP5585_GPI_PIN_END,
> > -	.gpimapsize_max		= ADP5585_GPIMAPSIZE_MAX,
> > -	.c4_extend_cfg		= 10,
> > -	.max_row_num		= ADP5585_MAX_ROW_NUM,
> > -	.max_col_num		= ADP5585_MAX_COL_NUM,
> > -	.row_mask		= ADP5585_ROW_MASK,
> > -	.col_mask		= ADP5585_COL_MASK,
> > -	.col_shift		= ADP5585_COL_SHIFT,
> > -	.bank			= adp5585_bank,
> > -	.bit			= adp5585_bit,
> > -	.reg			= adp5585_reg,
> > -};
> > -
> > -static int adp5589_read(struct i2c_client *client, u8 reg)
> > -{
> > -	int ret = i2c_smbus_read_byte_data(client, reg);
> > -
> > -	if (ret < 0)
> > -		dev_err(&client->dev, "Read Error\n");
> > -
> > -	return ret;
> > -}
> > -
> > -static int adp5589_write(struct i2c_client *client, u8 reg, u8 val)
> > -{
> > -	return i2c_smbus_write_byte_data(client, reg, val);
> > -}
> > -
> > -#ifdef CONFIG_GPIOLIB
> > -static int adp5589_gpio_get_value(struct gpio_chip *chip, unsigned off)
> > -{
> > -	struct adp5589_kpad *kpad = gpiochip_get_data(chip);
> > -	unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
> > -	unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
> > -	int val;
> > -
> > -	mutex_lock(&kpad->gpio_lock);
> > -	if (kpad->dir[bank] & bit)
> > -		val = kpad->dat_out[bank];
> > -	else
> > -		val = adp5589_read(kpad->client,
> > -				   kpad->var->reg(ADP5589_GPI_STATUS_A) +
> > bank);
> > -	mutex_unlock(&kpad->gpio_lock);
> > -
> > -	return !!(val & bit);
> > -}
> > -
> > -static void adp5589_gpio_set_value(struct gpio_chip *chip,
> > -				   unsigned off, int val)
> > -{
> > -	struct adp5589_kpad *kpad = gpiochip_get_data(chip);
> > -	unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
> > -	unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
> > -
> > -	guard(mutex)(&kpad->gpio_lock);
> > -
> > -	if (val)
> > -		kpad->dat_out[bank] |= bit;
> > -	else
> > -		kpad->dat_out[bank] &= ~bit;
> > -
> > -	adp5589_write(kpad->client, kpad->var->reg(ADP5589_GPO_DATA_OUT_A)
> > +
> > -		      bank, kpad->dat_out[bank]);
> > -}
> > -
> > -static int adp5589_gpio_direction_input(struct gpio_chip *chip, unsigned
> > off)
> > -{
> > -	struct adp5589_kpad *kpad = gpiochip_get_data(chip);
> > -	unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
> > -	unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
> > -
> > -	guard(mutex)(&kpad->gpio_lock);
> > -
> > -	kpad->dir[bank] &= ~bit;
> > -	return adp5589_write(kpad->client,
> > -			     kpad->var->reg(ADP5589_GPIO_DIRECTION_A) +
> > bank,
> > -			     kpad->dir[bank]);
> > -}
> > -
> > -static int adp5589_gpio_direction_output(struct gpio_chip *chip,
> > -					 unsigned off, int val)
> > -{
> > -	struct adp5589_kpad *kpad = gpiochip_get_data(chip);
> > -	unsigned int bank = kpad->var->bank(kpad->gpiomap[off]);
> > -	unsigned int bit = kpad->var->bit(kpad->gpiomap[off]);
> > -	int error;
> > -
> > -	guard(mutex)(&kpad->gpio_lock);
> > -
> > -	kpad->dir[bank] |= bit;
> > -
> > -	if (val)
> > -		kpad->dat_out[bank] |= bit;
> > -	else
> > -		kpad->dat_out[bank] &= ~bit;
> > -
> > -	error = adp5589_write(kpad->client,
> > -			      kpad->var->reg(ADP5589_GPO_DATA_OUT_A) +
> > bank,
> > -			      kpad->dat_out[bank]);
> > -	if (error)
> > -		return error;
> > -
> > -	error = adp5589_write(kpad->client,
> > -			      kpad->var->reg(ADP5589_GPIO_DIRECTION_A) +
> > bank,
> > -			      kpad->dir[bank]);
> > -	if (error)
> > -		return error;
> > -
> > -	return 0;
> > -}
> > -
> > -static int adp5589_build_gpiomap(struct adp5589_kpad *kpad,
> > -				const struct adp5589_kpad_platform_data
> > *pdata)
> > -{
> > -	bool pin_used[ADP5589_MAXGPIO];
> > -	int n_unused = 0;
> > -	int i;
> > -
> > -	memset(pin_used, false, sizeof(pin_used));
> > -
> > -	for (i = 0; i < kpad->var->maxgpio; i++)
> > -		if (pdata->keypad_en_mask & BIT(i))
> > -			pin_used[i] = true;
> > -
> > -	for (i = 0; i < kpad->gpimapsize; i++)
> > -		pin_used[kpad->gpimap[i].pin - kpad->var->gpi_pin_base] =
> > true;
> > -
> > -	if (kpad->extend_cfg & R4_EXTEND_CFG)
> > -		pin_used[4] = true;
> > -
> > -	if (kpad->extend_cfg & C4_EXTEND_CFG)
> > -		pin_used[kpad->var->c4_extend_cfg] = true;
> > -
> > -	if (!kpad->support_row5)
> > -		pin_used[5] = true;
> > -
> > -	for (i = 0; i < kpad->var->maxgpio; i++)
> > -		if (!pin_used[i])
> > -			kpad->gpiomap[n_unused++] = i;
> > -
> > -	return n_unused;
> > -}
> > -
> > -static int adp5589_gpio_add(struct adp5589_kpad *kpad)
> > -{
> > -	struct device *dev = &kpad->client->dev;
> > -	const struct adp5589_kpad_platform_data *pdata =
> > dev_get_platdata(dev);
> > -	const struct adp5589_gpio_platform_data *gpio_data = pdata-
> > >gpio_data;
> > -	int i, error;
> > -
> > -	if (!gpio_data)
> > -		return 0;
> > -
> > -	kpad->gc.parent = dev;
> > -	kpad->gc.ngpio = adp5589_build_gpiomap(kpad, pdata);
> > -	if (kpad->gc.ngpio == 0) {
> > -		dev_info(dev, "No unused gpios left to export\n");
> > -		return 0;
> > -	}
> > -
> > -	kpad->gc.direction_input = adp5589_gpio_direction_input;
> > -	kpad->gc.direction_output = adp5589_gpio_direction_output;
> > -	kpad->gc.get = adp5589_gpio_get_value;
> > -	kpad->gc.set = adp5589_gpio_set_value;
> > -	kpad->gc.can_sleep = 1;
> > -
> > -	kpad->gc.base = gpio_data->gpio_start;
> > -	kpad->gc.label = kpad->client->name;
> > -	kpad->gc.owner = THIS_MODULE;
> > -
> > -	mutex_init(&kpad->gpio_lock);
> > -
> > -	error = devm_gpiochip_add_data(dev, &kpad->gc, kpad);
> > -	if (error)
> > -		return error;
> > -
> > -	for (i = 0; i <= kpad->var->bank(kpad->var->maxgpio); i++) {
> > -		kpad->dat_out[i] = adp5589_read(kpad->client, kpad->var-
> > >reg(
> > -						ADP5589_GPO_DATA_OUT_A) +
> > i);
> > -		kpad->dir[i] = adp5589_read(kpad->client, kpad->var->reg(
> > -					    ADP5589_GPIO_DIRECTION_A) + i);
> > -	}
> > -
> > -	return 0;
> > -}
> > -#else
> > -static inline int adp5589_gpio_add(struct adp5589_kpad *kpad)
> > -{
> > -	return 0;
> > -}
> > -#endif
> > -
> > -static void adp5589_report_switches(struct adp5589_kpad *kpad,
> > -				    int key, int key_val)
> > -{
> > -	int i;
> > -
> > -	for (i = 0; i < kpad->gpimapsize; i++) {
> > -		if (key_val == kpad->gpimap[i].pin) {
> > -			input_report_switch(kpad->input,
> > -					    kpad->gpimap[i].sw_evt,
> > -					    key & KEY_EV_PRESSED);
> > -			break;
> > -		}
> > -	}
> > -}
> > -
> > -static void adp5589_report_events(struct adp5589_kpad *kpad, int ev_cnt)
> > -{
> > -	int i;
> > -
> > -	for (i = 0; i < ev_cnt; i++) {
> > -		int key = adp5589_read(kpad->client, ADP5589_5_FIFO_1 + i);
> > -		int key_val = key & KEY_EV_MASK;
> > -
> > -		if (key_val >= kpad->var->gpi_pin_base &&
> > -		    key_val <= kpad->var->gpi_pin_end) {
> > -			adp5589_report_switches(kpad, key, key_val);
> > -		} else {
> > -			input_report_key(kpad->input,
> > -					 kpad->keycode[key_val - 1],
> > -					 key & KEY_EV_PRESSED);
> > -		}
> > -	}
> > -}
> > -
> > -static irqreturn_t adp5589_irq(int irq, void *handle)
> > -{
> > -	struct adp5589_kpad *kpad = handle;
> > -	struct i2c_client *client = kpad->client;
> > -	int status, ev_cnt;
> > -
> > -	status = adp5589_read(client, ADP5589_5_INT_STATUS);
> > -
> > -	if (status & OVRFLOW_INT)	/* Unlikely and should never happen
> > */
> > -		dev_err(&client->dev, "Event Overflow Error\n");
> > -
> > -	if (status & EVENT_INT) {
> > -		ev_cnt = adp5589_read(client, ADP5589_5_STATUS) & KEC;
> > -		if (ev_cnt) {
> > -			adp5589_report_events(kpad, ev_cnt);
> > -			input_sync(kpad->input);
> > -		}
> > -	}
> > -
> > -	adp5589_write(client, ADP5589_5_INT_STATUS, status); /* Status is
> > W1C */
> > -
> > -	return IRQ_HANDLED;
> > -}
> > -
> > -static int adp5589_get_evcode(struct adp5589_kpad *kpad, unsigned short
> > key)
> > -{
> > -	int i;
> > -
> > -	for (i = 0; i < kpad->var->keymapsize; i++)
> > -		if (key == kpad->keycode[i])
> > -			return (i + 1) | KEY_EV_PRESSED;
> > -
> > -	dev_err(&kpad->client->dev, "RESET/UNLOCK key not in keycode
> > map\n");
> > -
> > -	return -EINVAL;
> > -}
> > -
> > -static int adp5589_setup(struct adp5589_kpad *kpad)
> > -{
> > -	struct i2c_client *client = kpad->client;
> > -	const struct adp5589_kpad_platform_data *pdata =
> > -		dev_get_platdata(&client->dev);
> > -	u8 (*reg) (u8) = kpad->var->reg;
> > -	unsigned char evt_mode1 = 0, evt_mode2 = 0, evt_mode3 = 0;
> > -	unsigned char pull_mask = 0;
> > -	int i, ret;
> > -
> > -	ret = adp5589_write(client, reg(ADP5589_PIN_CONFIG_A),
> > -			    pdata->keypad_en_mask & kpad->var->row_mask);
> > -	ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_B),
> > -			     (pdata->keypad_en_mask >> kpad->var-
> > >col_shift) &
> > -			     kpad->var->col_mask);
> > -
> > -	if (!kpad->is_adp5585)
> > -		ret |= adp5589_write(client, ADP5589_PIN_CONFIG_C,
> > -				     (pdata->keypad_en_mask >> 16) & 0xFF);
> > -
> > -	if (!kpad->is_adp5585 && pdata->en_keylock) {
> > -		ret |= adp5589_write(client, ADP5589_UNLOCK1,
> > -				     pdata->unlock_key1);
> > -		ret |= adp5589_write(client, ADP5589_UNLOCK2,
> > -				     pdata->unlock_key2);
> > -		ret |= adp5589_write(client, ADP5589_UNLOCK_TIMERS,
> > -				     pdata->unlock_timer & LTIME_MASK);
> > -		ret |= adp5589_write(client, ADP5589_LOCK_CFG, LOCK_EN);
> > -	}
> > -
> > -	for (i = 0; i < KEYP_MAX_EVENT; i++)
> > -		ret |= adp5589_read(client, ADP5589_5_FIFO_1 + i);
> > -
> > -	for (i = 0; i < pdata->gpimapsize; i++) {
> > -		unsigned short pin = pdata->gpimap[i].pin;
> > -
> > -		if (pin <= kpad->var->gpi_pin_row_end) {
> > -			evt_mode1 |= BIT(pin - kpad->var-
> > >gpi_pin_row_base);
> > -		} else {
> > -			evt_mode2 |=
> > -			    BIT(pin - kpad->var->gpi_pin_col_base) & 0xFF;
> > -			if (!kpad->is_adp5585)
> > -				evt_mode3 |=
> > -				    BIT(pin - kpad->var->gpi_pin_col_base)
> > >> 8;
> > -		}
> > -	}
> > -
> > -	if (pdata->gpimapsize) {
> > -		ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_A),
> > -				     evt_mode1);
> > -		ret |= adp5589_write(client, reg(ADP5589_GPI_EVENT_EN_B),
> > -				     evt_mode2);
> > -		if (!kpad->is_adp5585)
> > -			ret |= adp5589_write(client,
> > -					     reg(ADP5589_GPI_EVENT_EN_C),
> > -					     evt_mode3);
> > -	}
> > -
> > -	if (pdata->pull_dis_mask & pdata->pullup_en_100k &
> > -		pdata->pullup_en_300k & pdata->pulldown_en_300k)
> > -		dev_warn(&client->dev, "Conflicting pull resistor
> > config\n");
> > -
> > -	for (i = 0; i <= kpad->var->max_row_num; i++) {
> > -		unsigned int val = 0, bit = BIT(i);
> > -		if (pdata->pullup_en_300k & bit)
> > -			val = 0;
> > -		else if (pdata->pulldown_en_300k & bit)
> > -			val = 1;
> > -		else if (pdata->pullup_en_100k & bit)
> > -			val = 2;
> > -		else if (pdata->pull_dis_mask & bit)
> > -			val = 3;
> > -
> > -		pull_mask |= val << (2 * (i & 0x3));
> > -
> > -		if (i % 4 == 3 || i == kpad->var->max_row_num) {
> > -			ret |= adp5589_write(client,
> > reg(ADP5585_RPULL_CONFIG_A)
> > -					     + (i >> 2), pull_mask);
> > -			pull_mask = 0;
> > -		}
> > -	}
> > -
> > -	for (i = 0; i <= kpad->var->max_col_num; i++) {
> > -		unsigned int val = 0, bit = BIT(i + kpad->var->col_shift);
> > -		if (pdata->pullup_en_300k & bit)
> > -			val = 0;
> > -		else if (pdata->pulldown_en_300k & bit)
> > -			val = 1;
> > -		else if (pdata->pullup_en_100k & bit)
> > -			val = 2;
> > -		else if (pdata->pull_dis_mask & bit)
> > -			val = 3;
> > -
> > -		pull_mask |= val << (2 * (i & 0x3));
> > -
> > -		if (i % 4 == 3 || i == kpad->var->max_col_num) {
> > -			ret |= adp5589_write(client,
> > -					     reg(ADP5585_RPULL_CONFIG_C) +
> > -					     (i >> 2), pull_mask);
> > -			pull_mask = 0;
> > -		}
> > -	}
> > -
> > -	if (pdata->reset1_key_1 && pdata->reset1_key_2 && pdata-
> > >reset1_key_3) {
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_A),
> > -				     adp5589_get_evcode(kpad,
> > -							pdata-
> > >reset1_key_1));
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_B),
> > -				     adp5589_get_evcode(kpad,
> > -							pdata-
> > >reset1_key_2));
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET1_EVENT_C),
> > -				     adp5589_get_evcode(kpad,
> > -							pdata-
> > >reset1_key_3));
> > -		kpad->extend_cfg |= R4_EXTEND_CFG;
> > -	}
> > -
> > -	if (pdata->reset2_key_1 && pdata->reset2_key_2) {
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_A),
> > -				     adp5589_get_evcode(kpad,
> > -							pdata-
> > >reset2_key_1));
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET2_EVENT_B),
> > -				     adp5589_get_evcode(kpad,
> > -							pdata-
> > >reset2_key_2));
> > -		kpad->extend_cfg |= C4_EXTEND_CFG;
> > -	}
> > -
> > -	if (kpad->extend_cfg) {
> > -		ret |= adp5589_write(client, reg(ADP5589_RESET_CFG),
> > -				     pdata->reset_cfg);
> > -		ret |= adp5589_write(client, reg(ADP5589_PIN_CONFIG_D),
> > -				     kpad->extend_cfg);
> > -	}
> > -
> > -	ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_A),
> > -			    pdata->debounce_dis_mask & kpad->var-
> > >row_mask);
> > -
> > -	ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_B),
> > -			     (pdata->debounce_dis_mask >> kpad->var-
> > >col_shift)
> > -			     & kpad->var->col_mask);
> > -
> > -	if (!kpad->is_adp5585)
> > -		ret |= adp5589_write(client, reg(ADP5589_DEBOUNCE_DIS_C),
> > -				     (pdata->debounce_dis_mask >> 16) &
> > 0xFF);
> > -
> > -	ret |= adp5589_write(client, reg(ADP5589_POLL_PTIME_CFG),
> > -			     pdata->scan_cycle_time & PTIME_MASK);
> > -	ret |= adp5589_write(client, ADP5589_5_INT_STATUS,
> > -			     (kpad->is_adp5585 ? 0 : LOGIC2_INT) |
> > -			     LOGIC1_INT | OVRFLOW_INT |
> > -			     (kpad->is_adp5585 ? 0 : LOCK_INT) |
> > -			     GPI_INT | EVENT_INT);	/* Status is W1C */
> > -
> > -	ret |= adp5589_write(client, reg(ADP5589_GENERAL_CFG),
> > -			     INT_CFG | OSC_EN | CORE_CLK(3));
> > -	ret |= adp5589_write(client, reg(ADP5589_INT_EN),
> > -			     OVRFLOW_IEN | GPI_IEN | EVENT_IEN);
> > -
> > -	if (ret < 0) {
> > -		dev_err(&client->dev, "Write Error\n");
> > -		return ret;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static void adp5589_report_switch_state(struct adp5589_kpad *kpad)
> > -{
> > -	int gpi_stat_tmp, pin_loc;
> > -	int i;
> > -	int gpi_stat1 = adp5589_read(kpad->client,
> > -				     kpad->var->reg(ADP5589_GPI_STATUS_A));
> > -	int gpi_stat2 = adp5589_read(kpad->client,
> > -				     kpad->var->reg(ADP5589_GPI_STATUS_B));
> > -	int gpi_stat3 = !kpad->is_adp5585 ?
> > -			adp5589_read(kpad->client, ADP5589_GPI_STATUS_C) :
> > 0;
> > -
> > -	for (i = 0; i < kpad->gpimapsize; i++) {
> > -		unsigned short pin = kpad->gpimap[i].pin;
> > -
> > -		if (pin <= kpad->var->gpi_pin_row_end) {
> > -			gpi_stat_tmp = gpi_stat1;
> > -			pin_loc = pin - kpad->var->gpi_pin_row_base;
> > -		} else if ((pin - kpad->var->gpi_pin_col_base) < 8) {
> > -			gpi_stat_tmp = gpi_stat2;
> > -			pin_loc = pin - kpad->var->gpi_pin_col_base;
> > -		} else {
> > -			gpi_stat_tmp = gpi_stat3;
> > -			pin_loc = pin - kpad->var->gpi_pin_col_base - 8;
> > -		}
> > -
> > -		if (gpi_stat_tmp < 0) {
> > -			dev_err(&kpad->client->dev,
> > -				"Can't read GPIO_DAT_STAT switch %d,
> > default to OFF\n",
> > -				pin);
> > -			gpi_stat_tmp = 0;
> > -		}
> > -
> > -		input_report_switch(kpad->input,
> > -				    kpad->gpimap[i].sw_evt,
> > -				    !(gpi_stat_tmp & BIT(pin_loc)));
> > -	}
> > -
> > -	input_sync(kpad->input);
> > -}
> > -
> > -static int adp5589_keypad_add(struct adp5589_kpad *kpad, unsigned int
> > revid)
> > -{
> > -	struct i2c_client *client = kpad->client;
> > -	const struct adp5589_kpad_platform_data *pdata =
> > -		dev_get_platdata(&client->dev);
> > -	struct input_dev *input;
> > -	unsigned int i;
> > -	int error;
> > -
> > -	if (!((pdata->keypad_en_mask & kpad->var->row_mask) &&
> > -			(pdata->keypad_en_mask >> kpad->var->col_shift)) ||
> > -			!pdata->keymap) {
> > -		dev_err(&client->dev, "no rows, cols or keymap from
> > pdata\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	if (pdata->keymapsize != kpad->var->keymapsize) {
> > -		dev_err(&client->dev, "invalid keymapsize\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	if (!pdata->gpimap && pdata->gpimapsize) {
> > -		dev_err(&client->dev, "invalid gpimap from pdata\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	if (pdata->gpimapsize > kpad->var->gpimapsize_max) {
> > -		dev_err(&client->dev, "invalid gpimapsize\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	for (i = 0; i < pdata->gpimapsize; i++) {
> > -		unsigned short pin = pdata->gpimap[i].pin;
> > -
> > -		if (pin < kpad->var->gpi_pin_base ||
> > -				pin > kpad->var->gpi_pin_end) {
> > -			dev_err(&client->dev, "invalid gpi pin data\n");
> > -			return -EINVAL;
> > -		}
> > -
> > -		if (BIT(pin - kpad->var->gpi_pin_row_base) &
> > -				pdata->keypad_en_mask) {
> > -			dev_err(&client->dev, "invalid gpi row/col
> > data\n");
> > -			return -EINVAL;
> > -		}
> > -	}
> > -
> > -	if (!client->irq) {
> > -		dev_err(&client->dev, "no IRQ?\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	input = devm_input_allocate_device(&client->dev);
> > -	if (!input)
> > -		return -ENOMEM;
> > -
> > -	kpad->input = input;
> > -
> > -	input->name = client->name;
> > -	input->phys = "adp5589-keys/input0";
> > -	input->dev.parent = &client->dev;
> > -
> > -	input_set_drvdata(input, kpad);
> > -
> > -	input->id.bustype = BUS_I2C;
> > -	input->id.vendor = 0x0001;
> > -	input->id.product = 0x0001;
> > -	input->id.version = revid;
> > -
> > -	input->keycodesize = sizeof(kpad->keycode[0]);
> > -	input->keycodemax = pdata->keymapsize;
> > -	input->keycode = kpad->keycode;
> > -
> > -	memcpy(kpad->keycode, pdata->keymap,
> > -	       pdata->keymapsize * input->keycodesize);
> > -
> > -	kpad->gpimap = pdata->gpimap;
> > -	kpad->gpimapsize = pdata->gpimapsize;
> > -
> > -	/* setup input device */
> > -	__set_bit(EV_KEY, input->evbit);
> > -
> > -	if (pdata->repeat)
> > -		__set_bit(EV_REP, input->evbit);
> > -
> > -	for (i = 0; i < input->keycodemax; i++)
> > -		if (kpad->keycode[i] <= KEY_MAX)
> > -			__set_bit(kpad->keycode[i], input->keybit);
> > -	__clear_bit(KEY_RESERVED, input->keybit);
> > -
> > -	if (kpad->gpimapsize)
> > -		__set_bit(EV_SW, input->evbit);
> > -	for (i = 0; i < kpad->gpimapsize; i++)
> > -		__set_bit(kpad->gpimap[i].sw_evt, input->swbit);
> > -
> > -	error = input_register_device(input);
> > -	if (error) {
> > -		dev_err(&client->dev, "unable to register input device\n");
> > -		return error;
> > -	}
> > -
> > -	error = devm_request_threaded_irq(&client->dev, client->irq,
> > -					  NULL, adp5589_irq,
> > -					  IRQF_TRIGGER_FALLING |
> > IRQF_ONESHOT,
> > -					  client->dev.driver->name, kpad);
> > -	if (error) {
> > -		dev_err(&client->dev, "unable to request irq %d\n", client-
> > >irq);
> > -		return error;
> > -	}
> > -
> > -	return 0;
> > -}
> > -
> > -static void adp5589_clear_config(void *data)
> > -{
> > -	struct adp5589_kpad *kpad = data;
> > -
> > -	adp5589_write(kpad->client, kpad->var->reg(ADP5589_GENERAL_CFG),
> > 0);
> > -}
> > -
> > -static int adp5589_probe(struct i2c_client *client)
> > -{
> > -	const struct i2c_device_id *id = i2c_client_get_device_id(client);
> > -	struct adp5589_kpad *kpad;
> > -	const struct adp5589_kpad_platform_data *pdata =
> > -		dev_get_platdata(&client->dev);
> > -	unsigned int revid;
> > -	int error, ret;
> > -
> > -	if (!i2c_check_functionality(client->adapter,
> > -				     I2C_FUNC_SMBUS_BYTE_DATA)) {
> > -		dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
> > -		return -EIO;
> > -	}
> > -
> > -	if (!pdata) {
> > -		dev_err(&client->dev, "no platform data?\n");
> > -		return -EINVAL;
> > -	}
> > -
> > -	kpad = devm_kzalloc(&client->dev, sizeof(*kpad), GFP_KERNEL);
> > -	if (!kpad)
> > -		return -ENOMEM;
> > -
> > -	kpad->client = client;
> > -
> > -	switch (id->driver_data) {
> > -	case ADP5585_02:
> > -		kpad->support_row5 = true;
> > -		fallthrough;
> > -	case ADP5585_01:
> > -		kpad->is_adp5585 = true;
> > -		kpad->var = &const_adp5585;
> > -		break;
> > -	case ADP5589:
> > -		kpad->support_row5 = true;
> > -		kpad->var = &const_adp5589;
> > -		break;
> > -	}
> > -
> > -	error = devm_add_action_or_reset(&client->dev,
> > adp5589_clear_config,
> > -					 kpad);
> > -	if (error)
> > -		return error;
> > -
> > -	ret = adp5589_read(client, ADP5589_5_ID);
> > -	if (ret < 0)
> > -		return ret;
> > -
> > -	revid = (u8) ret & ADP5589_5_DEVICE_ID_MASK;
> > -
> > -	if (pdata->keymapsize) {
> > -		error = adp5589_keypad_add(kpad, revid);
> > -		if (error)
> > -			return error;
> > -	}
> > -
> > -	error = adp5589_setup(kpad);
> > -	if (error)
> > -		return error;
> > -
> > -	if (kpad->gpimapsize)
> > -		adp5589_report_switch_state(kpad);
> > -
> > -	error = adp5589_gpio_add(kpad);
> > -	if (error)
> > -		return error;
> > -
> > -	dev_info(&client->dev, "Rev.%d keypad, irq %d\n", revid, client-
> > >irq);
> > -	return 0;
> > -}
> > -
> > -static int adp5589_suspend(struct device *dev)
> > -{
> > -	struct i2c_client *client = to_i2c_client(dev);
> > -	struct adp5589_kpad *kpad = i2c_get_clientdata(client);
> > -
> > -	if (kpad->input)
> > -		disable_irq(client->irq);
> > -
> > -	return 0;
> > -}
> > -
> > -static int adp5589_resume(struct device *dev)
> > -{
> > -	struct i2c_client *client = to_i2c_client(dev);
> > -	struct adp5589_kpad *kpad = i2c_get_clientdata(client);
> > -
> > -	if (kpad->input)
> > -		enable_irq(client->irq);
> > -
> > -	return 0;
> > -}
> > -
> > -static DEFINE_SIMPLE_DEV_PM_OPS(adp5589_dev_pm_ops, adp5589_suspend,
> > adp5589_resume);
> > -
> > -static const struct i2c_device_id adp5589_id[] = {
> > -	{"adp5589-keys", ADP5589},
> > -	{"adp5585-keys", ADP5585_01},
> > -	{"adp5585-02-keys", ADP5585_02}, /* Adds ROW5 to ADP5585 */
> > -	{}
> > -};
> > -
> > -MODULE_DEVICE_TABLE(i2c, adp5589_id);
> > -
> > -static struct i2c_driver adp5589_driver = {
> > -	.driver = {
> > -		.name = KBUILD_MODNAME,
> > -		.pm = pm_sleep_ptr(&adp5589_dev_pm_ops),
> > -	},
> > -	.probe = adp5589_probe,
> > -	.id_table = adp5589_id,
> > -};
> > -
> > -module_i2c_driver(adp5589_driver);
> > -
> > -MODULE_LICENSE("GPL");
> > -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
> > -MODULE_DESCRIPTION("ADP5589/ADP5585 Keypad driver");

  reply	other threads:[~2025-04-21 12:34 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-15 14:49 [PATCH v2 00/17] mfd: adp5585: support keymap events and drop legacy Input driver Nuno Sá via B4 Relay
2025-04-15 14:49 ` [PATCH v2 01/17] dt-bindings: mfd: adp5585: ease on the required properties Nuno Sá via B4 Relay
2025-04-21  8:56   ` Laurent Pinchart
2025-04-21 12:12     ` Nuno Sá
2025-04-21 12:29       ` Laurent Pinchart
2025-04-21 12:45         ` Nuno Sá
2025-04-21 18:57   ` Rob Herring (Arm)
2025-04-15 14:49 ` [PATCH v2 02/17] mfd: adp5585: enable oscilator during probe Nuno Sá via B4 Relay
2025-04-21  8:57   ` Laurent Pinchart
2025-04-21 12:14     ` Nuno Sá
2025-04-21 22:03       ` Laurent Pinchart
2025-04-22  7:50         ` Nuno Sá
2025-04-15 14:49 ` [PATCH v2 03/17] pwm: adp5585: don't control OSC_EN in the pwm driver Nuno Sá via B4 Relay
2025-04-15 14:49 ` [PATCH v2 04/17] mfd: adp5585: make use of MFD_CELL_NAME() Nuno Sá via B4 Relay
2025-04-21  9:03   ` Laurent Pinchart
2025-04-24 15:55   ` Lee Jones
2025-04-15 14:49 ` [PATCH v2 05/17] dt-bindings: mfd: adp5585: document adp5589 I/O expander Nuno Sá via B4 Relay
2025-04-21  9:07   ` Laurent Pinchart
2025-04-21 18:59   ` Rob Herring (Arm)
2025-04-15 14:49 ` [PATCH v2 06/17] mfd: adp5585: add support for adp5589 Nuno Sá via B4 Relay
2025-04-21  9:15   ` Laurent Pinchart
2025-04-21 12:21     ` Nuno Sá
2025-04-21 22:06       ` Laurent Pinchart
2025-04-22  7:51         ` Nuno Sá
2025-04-24 16:01         ` Lee Jones
2025-04-24 16:18   ` Lee Jones
2025-04-24 16:30     ` Laurent Pinchart
2025-04-24 16:38       ` Lee Jones
2025-04-24 19:39         ` Laurent Pinchart
2025-04-25  7:58           ` Lee Jones
2025-04-25  9:13             ` Laurent Pinchart
2025-04-25  9:23               ` Lee Jones
2025-04-28  9:24               ` Nuno Sá
2025-04-15 14:49 ` [PATCH v2 07/17] gpio: adp5585: add support for the ad5589 expander Nuno Sá via B4 Relay
2025-04-17 12:27   ` Bartosz Golaszewski
2025-04-21  9:23   ` Laurent Pinchart
2025-04-21 12:22     ` Nuno Sá
2025-04-15 14:49 ` [PATCH v2 08/17] pwm: adp5585: add support for adp5589 Nuno Sá via B4 Relay
2025-04-15 14:49 ` [PATCH v2 09/17] dt-bindings: mfd: adp5585: add properties for input events Nuno Sá via B4 Relay
2025-04-21  9:28   ` Laurent Pinchart
2025-04-21 12:24     ` Nuno Sá
2025-04-29 15:03   ` Rob Herring (Arm)
2025-04-15 14:49 ` [PATCH v2 10/17] mfd: adp5585: add support for key events Nuno Sá via B4 Relay
2025-04-21  9:33   ` Laurent Pinchart
2025-04-21 12:32     ` Nuno Sá
2025-04-21 22:13       ` Laurent Pinchart
2025-04-24 16:07     ` Lee Jones
2025-04-24 16:24       ` Laurent Pinchart
2025-04-24 16:28         ` Lee Jones
2025-04-15 14:49 ` [PATCH v2 11/17] gpio: adp5585: support gpi events Nuno Sá via B4 Relay
2025-04-17 12:28   ` Bartosz Golaszewski
2025-04-15 14:49 ` [PATCH v2 12/17] Input: adp5585: Add Analog Devices ADP5585/89 support Nuno Sá via B4 Relay
2025-04-19  2:44   ` Dmitry Torokhov
2025-04-21  9:35   ` Laurent Pinchart
2025-04-21 12:33     ` Nuno Sá
2025-04-15 14:49 ` [PATCH v2 13/17] Input: adp5589: remove the driver Nuno Sá via B4 Relay
2025-04-19  2:45   ` Dmitry Torokhov
2025-04-21  9:40   ` Laurent Pinchart
2025-04-21 12:34     ` Nuno Sá [this message]
2025-04-15 14:49 ` [PATCH v2 14/17] mfd: adp5585: support getting vdd regulator Nuno Sá via B4 Relay
2025-04-21  9:48   ` Laurent Pinchart
2025-04-21 12:38     ` Nuno Sá
2025-04-21 22:09       ` Laurent Pinchart
2025-04-22  8:12         ` Nuno Sá
2025-04-15 14:49 ` [PATCH v2 15/17] dt-bindings: mfd: adp5585: document reset gpio Nuno Sá via B4 Relay
2025-04-21  9:36   ` Laurent Pinchart
2025-04-15 14:49 ` [PATCH v2 16/17] mfd: adp5585: add support for a reset pin Nuno Sá via B4 Relay
2025-04-21  9:46   ` Laurent Pinchart
2025-04-21 12:42     ` Nuno Sá
2025-04-21 22:10       ` Laurent Pinchart
2025-04-15 14:49 ` [PATCH v2 17/17] pwm: adp5585: make sure to include mod_devicetable.h Nuno Sá via B4 Relay
2025-04-21  9:50   ` Laurent Pinchart
2025-04-15 15:56 ` [PATCH v2 00/17] mfd: adp5585: support keymap events and drop legacy Input driver Laurent Pinchart
2025-04-21 10:08   ` Laurent Pinchart
2025-04-16  9:02 ` Liu Ying
2025-04-16 10:03   ` Nuno Sá
2025-05-01 12:00 ` Lee Jones
2025-05-01 14:09   ` Laurent Pinchart
2025-05-02  7:13     ` Lee Jones
2025-05-02  7:35       ` Nuno Sá
2025-05-02  8:30         ` Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=c13f4a4ecd248c4cf2ca908480ea76874a5c0814.camel@gmail.com \
    --to=noname.nuno@gmail.com \
    --cc=brgl@bgdev.pl \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=krzk+dt@kernel.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=lee@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=nuno.sa@analog.com \
    --cc=robh@kernel.org \
    --cc=ukleinek@kernel.org \
    --cc=victor.liu@nxp.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).