mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH 0/2] Input: remove unused lm8323 and lm8333 keypad drivers
@ 2026-11-09  7:29 Dmitry Torokhov
  2026-11-09  7:29 ` [PATCH 1/2] Input: lm8323 - remove driver Dmitry Torokhov
  2026-11-09  7:29 ` [PATCH 2/2] Input: lm8333 " Dmitry Torokhov
  0 siblings, 2 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2026-11-09  7:29 UTC (permalink / raw)
  To: Wolfram Sang, Arnd Bergmann
  Cc: Felipe Balbi, Tony Lindgren, Hyunjung Ko, linux-input, linux-kernel

Both the LM8323 and LM8333 keypad drivers strictly require legacy
platform data, lack Device Tree or generic device property support, and
have no users in mainline.

Follow up on the earlier mailing list inquiry [1] (where Wolfram Sang
confirmed that LM8333 can be dropped and no objections were raised for
either driver) and remove both drivers along with their platform data
headers.

[1] https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com

Thanks.

Dmitry Torokhov (2):
  Input: lm8323 - remove driver
  Input: lm8333 - remove driver

 drivers/input/keyboard/Kconfig       |  22 -
 drivers/input/keyboard/Makefile      |   2 -
 drivers/input/keyboard/lm8323.c      | 813 ---------------------------
 drivers/input/keyboard/lm8333.c      | 213 -------
 include/linux/input/lm8333.h         |  24 -
 include/linux/platform_data/lm8323.h |  34 --
 6 files changed, 1108 deletions(-)
 delete mode 100644 drivers/input/keyboard/lm8323.c
 delete mode 100644 drivers/input/keyboard/lm8333.c
 delete mode 100644 include/linux/input/lm8333.h
 delete mode 100644 include/linux/platform_data/lm8323.h

-- 
2.56.0.506.g506a7eabc5-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] Input: lm8323 - remove driver
  2026-11-09  7:29 [PATCH 0/2] Input: remove unused lm8323 and lm8333 keypad drivers Dmitry Torokhov
@ 2026-11-09  7:29 ` Dmitry Torokhov
  2026-11-09  7:46   ` khj
  2026-11-09  7:53   ` Arnd Bergmann
  2026-11-09  7:29 ` [PATCH 2/2] Input: lm8333 " Dmitry Torokhov
  1 sibling, 2 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2026-11-09  7:29 UTC (permalink / raw)
  To: Wolfram Sang, Arnd Bergmann
  Cc: Felipe Balbi, Tony Lindgren, Hyunjung Ko, linux-input, linux-kernel

The LM8323 keypad driver relies exclusively on legacy platform data,
has no Device Tree or generic device property support, and has no users
in mainline (including the Nokia N810 DTS, which never added support
for it). Its PWM/LED handling and unbind lifetime are broken, and after
hardware-tested IRQ fixes in 2011 the driver has for over a decade only
received mechanical API conversions and static-analysis cleanups
without hardware testing.

An inquiry on the mailing list asking whether anyone still uses or
wishes to keep the driver received no objections. Remove the driver
and its platform data header.

Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/keyboard/Kconfig       |  11 -
 drivers/input/keyboard/Makefile      |   1 -
 drivers/input/keyboard/lm8323.c      | 813 ---------------------------
 include/linux/platform_data/lm8323.h |  34 --
 4 files changed, 859 deletions(-)
 delete mode 100644 drivers/input/keyboard/lm8323.c
 delete mode 100644 include/linux/platform_data/lm8323.h

diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index d8c64f333462..a1102115093d 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -316,17 +316,6 @@ config KEYBOARD_HP7XX
 	  To compile this driver as a module, choose M here: the
 	  module will be called jornada720_kbd.
 
-config KEYBOARD_LM8323
-	tristate "LM8323 keypad chip"
-	depends on I2C
-	depends on LEDS_CLASS
-	help
-	  If you say yes here you get support for the National Semiconductor
-	  LM8323 keypad controller.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called lm8323.
-
 config KEYBOARD_LM8333
 	tristate "LM8333 keypad chip"
 	depends on I2C
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 60bb7baf802f..282d41e346ba 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -35,7 +35,6 @@ obj-$(CONFIG_KEYBOARD_IMX_BBM_SCMI)	+= imx-sm-bbm-key.o
 obj-$(CONFIG_KEYBOARD_HP6XX)		+= jornada680_kbd.o
 obj-$(CONFIG_KEYBOARD_HP7XX)		+= jornada720_kbd.o
 obj-$(CONFIG_KEYBOARD_LKKBD)		+= lkkbd.o
-obj-$(CONFIG_KEYBOARD_LM8323)		+= lm8323.o
 obj-$(CONFIG_KEYBOARD_LM8333)		+= lm8333.o
 obj-$(CONFIG_KEYBOARD_LOCOMO)		+= locomokbd.o
 obj-$(CONFIG_KEYBOARD_LPC32XX)		+= lpc32xx-keys.o
diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c
deleted file mode 100644
index 8eac63b2d304..000000000000
--- a/drivers/input/keyboard/lm8323.c
+++ /dev/null
@@ -1,813 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * drivers/i2c/chips/lm8323.c
- *
- * Copyright (C) 2007-2009 Nokia Corporation
- *
- * Written by Daniel Stone <daniel.stone@nokia.com>
- *            Timo O. Karjalainen <timo.o.karjalainen@nokia.com>
- *
- * Updated by Felipe Balbi <felipe.balbi@nokia.com>
- */
-
-#include <linux/module.h>
-#include <linux/i2c.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/mutex.h>
-#include <linux/delay.h>
-#include <linux/input.h>
-#include <linux/leds.h>
-#include <linux/platform_data/lm8323.h>
-#include <linux/pm.h>
-#include <linux/slab.h>
-#include <linux/string_choices.h>
-
-/* Commands to send to the chip. */
-#define LM8323_CMD_READ_ID		0x80 /* Read chip ID. */
-#define LM8323_CMD_WRITE_CFG		0x81 /* Set configuration item. */
-#define LM8323_CMD_READ_INT		0x82 /* Get interrupt status. */
-#define LM8323_CMD_RESET		0x83 /* Reset, same as external one */
-#define LM8323_CMD_WRITE_PORT_SEL	0x85 /* Set GPIO in/out. */
-#define LM8323_CMD_WRITE_PORT_STATE	0x86 /* Set GPIO pullup. */
-#define LM8323_CMD_READ_PORT_SEL	0x87 /* Get GPIO in/out. */
-#define LM8323_CMD_READ_PORT_STATE	0x88 /* Get GPIO pullup. */
-#define LM8323_CMD_READ_FIFO		0x89 /* Read byte from FIFO. */
-#define LM8323_CMD_RPT_READ_FIFO	0x8a /* Read FIFO (no increment). */
-#define LM8323_CMD_SET_ACTIVE		0x8b /* Set active time. */
-#define LM8323_CMD_READ_ERR		0x8c /* Get error status. */
-#define LM8323_CMD_READ_ROTATOR		0x8e /* Read rotator status. */
-#define LM8323_CMD_SET_DEBOUNCE		0x8f /* Set debouncing time. */
-#define LM8323_CMD_SET_KEY_SIZE		0x90 /* Set keypad size. */
-#define LM8323_CMD_READ_KEY_SIZE	0x91 /* Get keypad size. */
-#define LM8323_CMD_READ_CFG		0x92 /* Get configuration item. */
-#define LM8323_CMD_WRITE_CLOCK		0x93 /* Set clock config. */
-#define LM8323_CMD_READ_CLOCK		0x94 /* Get clock config. */
-#define LM8323_CMD_PWM_WRITE		0x95 /* Write PWM script. */
-#define LM8323_CMD_START_PWM		0x96 /* Start PWM engine. */
-#define LM8323_CMD_STOP_PWM		0x97 /* Stop PWM engine. */
-
-/* Interrupt status. */
-#define INT_KEYPAD			0x01 /* Key event. */
-#define INT_ROTATOR			0x02 /* Rotator event. */
-#define INT_ERROR			0x08 /* Error: use CMD_READ_ERR. */
-#define INT_NOINIT			0x10 /* Lost configuration. */
-#define INT_PWM1			0x20 /* PWM1 stopped. */
-#define INT_PWM2			0x40 /* PWM2 stopped. */
-#define INT_PWM3			0x80 /* PWM3 stopped. */
-
-/* Errors (signalled by INT_ERROR, read with CMD_READ_ERR). */
-#define ERR_BADPAR			0x01 /* Bad parameter. */
-#define ERR_CMDUNK			0x02 /* Unknown command. */
-#define ERR_KEYOVR			0x04 /* Too many keys pressed. */
-#define ERR_FIFOOVER			0x40 /* FIFO overflow. */
-
-/* Configuration keys (CMD_{WRITE,READ}_CFG). */
-#define CFG_MUX1SEL			0x01 /* Select MUX1_OUT input. */
-#define CFG_MUX1EN			0x02 /* Enable MUX1_OUT. */
-#define CFG_MUX2SEL			0x04 /* Select MUX2_OUT input. */
-#define CFG_MUX2EN			0x08 /* Enable MUX2_OUT. */
-#define CFG_PSIZE			0x20 /* Package size (must be 0). */
-#define CFG_ROTEN			0x40 /* Enable rotator. */
-
-/* Clock settings (CMD_{WRITE,READ}_CLOCK). */
-#define CLK_RCPWM_INTERNAL		0x00
-#define CLK_RCPWM_EXTERNAL		0x03
-#define CLK_SLOWCLKEN			0x08 /* Enable 32.768kHz clock. */
-#define CLK_SLOWCLKOUT			0x40 /* Enable slow pulse output. */
-
-/* The possible addresses corresponding to CONFIG1 and CONFIG2 pin wirings. */
-#define LM8323_I2C_ADDR00		(0x84 >> 1)	/* 1000 010x */
-#define LM8323_I2C_ADDR01		(0x86 >> 1)	/* 1000 011x */
-#define LM8323_I2C_ADDR10		(0x88 >> 1)	/* 1000 100x */
-#define LM8323_I2C_ADDR11		(0x8A >> 1)	/* 1000 101x */
-
-/* Key event fifo length */
-#define LM8323_FIFO_LEN			15
-
-/* Commands for PWM engine; feed in with PWM_WRITE. */
-/* Load ramp counter from duty cycle field (range 0 - 0xff). */
-#define PWM_SET(v)			(0x4000 | ((v) & 0xff))
-/* Go to start of script. */
-#define PWM_GOTOSTART			0x0000
-/*
- * Stop engine (generates interrupt).  If reset is 1, clear the program
- * counter, else leave it.
- */
-#define PWM_END(reset)			(0xc000 | (!!(reset) << 11))
-/*
- * Ramp.  If s is 1, divide clock by 512, else divide clock by 16.
- * Take t clock scales (up to 63) per step, for n steps (up to 126).
- * If u is set, ramp up, else ramp down.
- */
-#define PWM_RAMP(s, t, n, u)		((!!(s) << 14) | ((t) & 0x3f) << 8 | \
-					 ((n) & 0x7f) | ((u) ? 0 : 0x80))
-/*
- * Loop (i.e. jump back to pos) for a given number of iterations (up to 63).
- * If cnt is zero, execute until PWM_END is encountered.
- */
-#define PWM_LOOP(cnt, pos)		(0xa000 | (((cnt) & 0x3f) << 7) | \
-					 ((pos) & 0x3f))
-/*
- * Wait for trigger.  Argument is a mask of channels, shifted by the channel
- * number, e.g. 0xa for channels 3 and 1.  Note that channels are numbered
- * from 1, not 0.
- */
-#define PWM_WAIT_TRIG(chans)		(0xe000 | (((chans) & 0x7) << 6))
-/* Send trigger.  Argument is same as PWM_WAIT_TRIG. */
-#define PWM_SEND_TRIG(chans)		(0xe000 | ((chans) & 0x7))
-
-struct lm8323_pwm {
-	int			id;
-	int			fade_time;
-	int			brightness;
-	int			desired_brightness;
-	bool			enabled;
-	bool			running;
-	/* pwm lock */
-	struct mutex		lock;
-	struct work_struct	work;
-	struct led_classdev	cdev;
-	struct lm8323_chip	*chip;
-};
-
-struct lm8323_chip {
-	/* device lock */
-	struct mutex		lock;
-	struct i2c_client	*client;
-	struct input_dev	*idev;
-	bool			kp_enabled;
-	bool			pm_suspend;
-	unsigned		keys_down;
-	char			phys[32];
-	unsigned short		keymap[LM8323_KEYMAP_SIZE];
-	int			size_x;
-	int			size_y;
-	int			debounce_time;
-	int			active_time;
-	struct lm8323_pwm	pwm[LM8323_NUM_PWMS];
-};
-
-#define client_to_lm8323(c)	container_of(c, struct lm8323_chip, client)
-#define dev_to_lm8323(d)	container_of(d, struct lm8323_chip, client->dev)
-#define cdev_to_pwm(c)		container_of(c, struct lm8323_pwm, cdev)
-#define work_to_pwm(w)		container_of(w, struct lm8323_pwm, work)
-
-#define LM8323_MAX_DATA 8
-
-/*
- * To write, we just access the chip's address in write mode, and dump the
- * command and data out on the bus.  The command byte and data are taken as
- * sequential u8s out of varargs, to a maximum of LM8323_MAX_DATA.
- */
-static int lm8323_write(struct lm8323_chip *lm, int len, ...)
-{
-	int ret, i;
-	va_list ap;
-	u8 data[LM8323_MAX_DATA];
-
-	va_start(ap, len);
-
-	if (unlikely(len > LM8323_MAX_DATA)) {
-		dev_err(&lm->client->dev, "tried to send %d bytes\n", len);
-		va_end(ap);
-		return 0;
-	}
-
-	for (i = 0; i < len; i++)
-		data[i] = va_arg(ap, int);
-
-	va_end(ap);
-
-	/*
-	 * If the host is asleep while we send the data, we can get a NACK
-	 * back while it wakes up, so try again, once.
-	 */
-	ret = i2c_master_send(lm->client, data, len);
-	if (unlikely(ret == -EREMOTEIO))
-		ret = i2c_master_send(lm->client, data, len);
-	if (unlikely(ret != len))
-		dev_err(&lm->client->dev, "sent %d bytes of %d total\n",
-			len, ret);
-
-	return ret;
-}
-
-/*
- * To read, we first send the command byte to the chip and end the transaction,
- * then access the chip in read mode, at which point it will send the data.
- */
-static int lm8323_read(struct lm8323_chip *lm, u8 cmd, u8 *buf, int len)
-{
-	int ret;
-
-	/*
-	 * If the host is asleep while we send the byte, we can get a NACK
-	 * back while it wakes up, so try again, once.
-	 */
-	ret = i2c_master_send(lm->client, &cmd, 1);
-	if (unlikely(ret == -EREMOTEIO))
-		ret = i2c_master_send(lm->client, &cmd, 1);
-	if (unlikely(ret != 1)) {
-		dev_err(&lm->client->dev, "sending read cmd 0x%02x failed\n",
-			cmd);
-		return 0;
-	}
-
-	ret = i2c_master_recv(lm->client, buf, len);
-	if (unlikely(ret != len))
-		dev_err(&lm->client->dev, "wanted %d bytes, got %d\n",
-			len, ret);
-
-	return ret;
-}
-
-/*
- * Set the chip active time (idle time before it enters halt).
- */
-static void lm8323_set_active_time(struct lm8323_chip *lm, int time)
-{
-	lm8323_write(lm, 2, LM8323_CMD_SET_ACTIVE, time >> 2);
-}
-
-/*
- * The signals are AT-style: the low 7 bits are the keycode, and the top
- * bit indicates the state (1 for down, 0 for up).
- */
-static inline u8 lm8323_whichkey(u8 event)
-{
-	return event & 0x7f;
-}
-
-static inline int lm8323_ispress(u8 event)
-{
-	return (event & 0x80) ? 1 : 0;
-}
-
-static void process_keys(struct lm8323_chip *lm)
-{
-	u8 event;
-	u8 key_fifo[LM8323_FIFO_LEN + 1];
-	int old_keys_down = lm->keys_down;
-	int ret;
-	int i = 0;
-
-	/*
-	 * Read all key events from the FIFO at once. Next READ_FIFO clears the
-	 * FIFO even if we didn't read all events previously.
-	 */
-	ret = lm8323_read(lm, LM8323_CMD_READ_FIFO, key_fifo, LM8323_FIFO_LEN);
-
-	if (ret < 0) {
-		dev_err(&lm->client->dev, "Failed reading fifo\n");
-		return;
-	}
-	key_fifo[ret] = 0;
-
-	while ((event = key_fifo[i++])) {
-		u8 key = lm8323_whichkey(event);
-		int isdown = lm8323_ispress(event);
-		unsigned short keycode = lm->keymap[key];
-
-		dev_vdbg(&lm->client->dev, "key 0x%02x %s\n",
-			 key, str_down_up(isdown));
-
-		if (lm->kp_enabled) {
-			input_event(lm->idev, EV_MSC, MSC_SCAN, key);
-			input_report_key(lm->idev, keycode, isdown);
-			input_sync(lm->idev);
-		}
-
-		if (isdown)
-			lm->keys_down++;
-		else
-			lm->keys_down--;
-	}
-
-	/*
-	 * Errata: We need to ensure that the chip never enters halt mode
-	 * during a keypress, so set active time to 0.  When it's released,
-	 * we can enter halt again, so set the active time back to normal.
-	 */
-	if (!old_keys_down && lm->keys_down)
-		lm8323_set_active_time(lm, 0);
-	if (old_keys_down && !lm->keys_down)
-		lm8323_set_active_time(lm, lm->active_time);
-}
-
-static void lm8323_process_error(struct lm8323_chip *lm)
-{
-	u8 error;
-
-	if (lm8323_read(lm, LM8323_CMD_READ_ERR, &error, 1) == 1) {
-		if (error & ERR_FIFOOVER)
-			dev_vdbg(&lm->client->dev, "fifo overflow!\n");
-		if (error & ERR_KEYOVR)
-			dev_vdbg(&lm->client->dev,
-					"more than two keys pressed\n");
-		if (error & ERR_CMDUNK)
-			dev_vdbg(&lm->client->dev,
-					"unknown command submitted\n");
-		if (error & ERR_BADPAR)
-			dev_vdbg(&lm->client->dev, "bad command parameter\n");
-	}
-}
-
-static void lm8323_reset(struct lm8323_chip *lm)
-{
-	/* The docs say we must pass 0xAA as the data byte. */
-	lm8323_write(lm, 2, LM8323_CMD_RESET, 0xAA);
-}
-
-static int lm8323_configure(struct lm8323_chip *lm)
-{
-	int keysize = (lm->size_x << 4) | lm->size_y;
-	int clock = (CLK_SLOWCLKEN | CLK_RCPWM_EXTERNAL);
-	int debounce = lm->debounce_time >> 2;
-	int active = lm->active_time >> 2;
-
-	/*
-	 * Active time must be greater than the debounce time: if it's
-	 * a close-run thing, give ourselves a 12ms buffer.
-	 */
-	if (debounce >= active)
-		active = debounce + 3;
-
-	lm8323_write(lm, 2, LM8323_CMD_WRITE_CFG, 0);
-	lm8323_write(lm, 2, LM8323_CMD_WRITE_CLOCK, clock);
-	lm8323_write(lm, 2, LM8323_CMD_SET_KEY_SIZE, keysize);
-	lm8323_set_active_time(lm, lm->active_time);
-	lm8323_write(lm, 2, LM8323_CMD_SET_DEBOUNCE, debounce);
-	lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_STATE, 0xff, 0xff);
-	lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_SEL, 0, 0);
-
-	/*
-	 * Not much we can do about errors at this point, so just hope
-	 * for the best.
-	 */
-
-	return 0;
-}
-
-static void pwm_done(struct lm8323_pwm *pwm)
-{
-	guard(mutex)(&pwm->lock);
-
-	pwm->running = false;
-	if (pwm->desired_brightness != pwm->brightness)
-		schedule_work(&pwm->work);
-}
-
-/*
- * Bottom half: handle the interrupt by posting key events, or dealing with
- * errors appropriately.
- */
-static irqreturn_t lm8323_irq(int irq, void *_lm)
-{
-	struct lm8323_chip *lm = _lm;
-	u8 ints;
-	int i;
-
-	guard(mutex)(&lm->lock);
-
-	while ((lm8323_read(lm, LM8323_CMD_READ_INT, &ints, 1) == 1) && ints) {
-		if (likely(ints & INT_KEYPAD))
-			process_keys(lm);
-		if (ints & INT_ROTATOR) {
-			/* We don't currently support the rotator. */
-			dev_vdbg(&lm->client->dev, "rotator fired\n");
-		}
-		if (ints & INT_ERROR) {
-			dev_vdbg(&lm->client->dev, "error!\n");
-			lm8323_process_error(lm);
-		}
-		if (ints & INT_NOINIT) {
-			dev_err(&lm->client->dev, "chip lost config; "
-						  "reinitialising\n");
-			lm8323_configure(lm);
-		}
-		for (i = 0; i < LM8323_NUM_PWMS; i++) {
-			if (ints & (INT_PWM1 << i)) {
-				dev_vdbg(&lm->client->dev,
-					 "pwm%d engine completed\n", i);
-				pwm_done(&lm->pwm[i]);
-			}
-		}
-	}
-
-	return IRQ_HANDLED;
-}
-
-/*
- * Read the chip ID.
- */
-static int lm8323_read_id(struct lm8323_chip *lm, u8 *buf)
-{
-	int bytes;
-
-	bytes = lm8323_read(lm, LM8323_CMD_READ_ID, buf, 2);
-	if (unlikely(bytes != 2))
-		return -EIO;
-
-	return 0;
-}
-
-static void lm8323_write_pwm_one(struct lm8323_pwm *pwm, int pos, u16 cmd)
-{
-	lm8323_write(pwm->chip, 4, LM8323_CMD_PWM_WRITE, (pos << 2) | pwm->id,
-		     (cmd & 0xff00) >> 8, cmd & 0x00ff);
-}
-
-/*
- * Write a script into a given PWM engine, concluding with PWM_END.
- * If 'kill' is nonzero, the engine will be shut down at the end
- * of the script, producing a zero output. Otherwise the engine
- * will be kept running at the final PWM level indefinitely.
- */
-static void lm8323_write_pwm(struct lm8323_pwm *pwm, int kill,
-			     int len, const u16 *cmds)
-{
-	int i;
-
-	for (i = 0; i < len; i++)
-		lm8323_write_pwm_one(pwm, i, cmds[i]);
-
-	lm8323_write_pwm_one(pwm, i++, PWM_END(kill));
-	lm8323_write(pwm->chip, 2, LM8323_CMD_START_PWM, pwm->id);
-	pwm->running = true;
-}
-
-static void lm8323_pwm_work(struct work_struct *work)
-{
-	struct lm8323_pwm *pwm = work_to_pwm(work);
-	int div512, perstep, steps, hz, up, kill;
-	u16 pwm_cmds[3];
-	int num_cmds = 0;
-
-	guard(mutex)(&pwm->lock);
-
-	/*
-	 * Do nothing if we're already at the requested level,
-	 * or previous setting is not yet complete. In the latter
-	 * case we will be called again when the previous PWM script
-	 * finishes.
-	 */
-	if (pwm->running || pwm->desired_brightness == pwm->brightness)
-		return;
-
-	kill = (pwm->desired_brightness == 0);
-	up = (pwm->desired_brightness > pwm->brightness);
-	steps = abs(pwm->desired_brightness - pwm->brightness);
-
-	/*
-	 * Convert time (in ms) into a divisor (512 or 16 on a refclk of
-	 * 32768Hz), and number of ticks per step.
-	 */
-	if ((pwm->fade_time / steps) > (32768 / 512)) {
-		div512 = 1;
-		hz = 32768 / 512;
-	} else {
-		div512 = 0;
-		hz = 32768 / 16;
-	}
-
-	perstep = (hz * pwm->fade_time) / (steps * 1000);
-
-	if (perstep == 0)
-		perstep = 1;
-	else if (perstep > 63)
-		perstep = 63;
-
-	while (steps) {
-		int s;
-
-		s = min(126, steps);
-		pwm_cmds[num_cmds++] = PWM_RAMP(div512, perstep, s, up);
-		steps -= s;
-	}
-
-	lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds);
-	pwm->brightness = pwm->desired_brightness;
-}
-
-static void lm8323_pwm_set_brightness(struct led_classdev *led_cdev,
-				      enum led_brightness brightness)
-{
-	struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
-	struct lm8323_chip *lm = pwm->chip;
-
-	scoped_guard(mutex, &pwm->lock) {
-		pwm->desired_brightness = brightness;
-	}
-
-	if (in_interrupt()) {
-		schedule_work(&pwm->work);
-	} else {
-		/*
-		 * Schedule PWM work as usual unless we are going into suspend
-		 */
-		scoped_guard(mutex, &lm->lock) {
-			if (likely(!lm->pm_suspend))
-				schedule_work(&pwm->work);
-			else
-				lm8323_pwm_work(&pwm->work);
-		}
-	}
-}
-
-static ssize_t lm8323_pwm_show_time(struct device *dev,
-		struct device_attribute *attr, char *buf)
-{
-	struct led_classdev *led_cdev = dev_get_drvdata(dev);
-	struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
-
-	return sprintf(buf, "%d\n", pwm->fade_time);
-}
-
-static ssize_t lm8323_pwm_store_time(struct device *dev,
-		struct device_attribute *attr, const char *buf, size_t len)
-{
-	struct led_classdev *led_cdev = dev_get_drvdata(dev);
-	struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
-	int ret, time;
-
-	ret = kstrtoint(buf, 10, &time);
-	/* Numbers only, please. */
-	if (ret)
-		return ret;
-
-	pwm->fade_time = time;
-
-	return strlen(buf);
-}
-static DEVICE_ATTR(time, 0644, lm8323_pwm_show_time, lm8323_pwm_store_time);
-
-static struct attribute *lm8323_pwm_attrs[] = {
-	&dev_attr_time.attr,
-	NULL
-};
-ATTRIBUTE_GROUPS(lm8323_pwm);
-
-static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev,
-		    const char *name)
-{
-	struct lm8323_pwm *pwm;
-	int err;
-
-	BUG_ON(id > 3);
-
-	pwm = &lm->pwm[id - 1];
-
-	pwm->id = id;
-	pwm->fade_time = 0;
-	pwm->brightness = 0;
-	pwm->desired_brightness = 0;
-	pwm->running = false;
-	pwm->enabled = false;
-	INIT_WORK(&pwm->work, lm8323_pwm_work);
-	mutex_init(&pwm->lock);
-	pwm->chip = lm;
-
-	if (name) {
-		pwm->cdev.name = name;
-		pwm->cdev.brightness_set = lm8323_pwm_set_brightness;
-		pwm->cdev.groups = lm8323_pwm_groups;
-
-		err = devm_led_classdev_register(dev, &pwm->cdev);
-		if (err) {
-			dev_err(dev, "couldn't register PWM %d: %d\n", id, err);
-			return err;
-		}
-		pwm->enabled = true;
-	}
-
-	return 0;
-}
-
-static ssize_t lm8323_show_disable(struct device *dev,
-				   struct device_attribute *attr, char *buf)
-{
-	struct lm8323_chip *lm = dev_get_drvdata(dev);
-
-	return sprintf(buf, "%u\n", !lm->kp_enabled);
-}
-
-static ssize_t lm8323_set_disable(struct device *dev,
-				  struct device_attribute *attr,
-				  const char *buf, size_t count)
-{
-	struct lm8323_chip *lm = dev_get_drvdata(dev);
-	int ret;
-	unsigned int i;
-
-	ret = kstrtouint(buf, 10, &i);
-	if (ret)
-		return ret;
-
-	guard(mutex)(&lm->lock);
-
-	lm->kp_enabled = !i;
-
-	return count;
-}
-static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable);
-
-static struct attribute *lm8323_attrs[] = {
-	&dev_attr_disable_kp.attr,
-	NULL,
-};
-ATTRIBUTE_GROUPS(lm8323);
-
-static int lm8323_probe(struct i2c_client *client)
-{
-	struct lm8323_platform_data *pdata = dev_get_platdata(&client->dev);
-	struct input_dev *idev;
-	struct lm8323_chip *lm;
-	int pwm;
-	int i, err;
-	unsigned long tmo;
-	u8 data[2];
-
-	if (!pdata || !pdata->size_x || !pdata->size_y) {
-		dev_err(&client->dev, "missing platform_data\n");
-		return -EINVAL;
-	}
-
-	if (pdata->size_x > 8) {
-		dev_err(&client->dev, "invalid x size %d specified\n",
-			pdata->size_x);
-		return -EINVAL;
-	}
-
-	if (pdata->size_y > 12) {
-		dev_err(&client->dev, "invalid y size %d specified\n",
-			pdata->size_y);
-		return -EINVAL;
-	}
-
-	lm = devm_kzalloc(&client->dev, sizeof(*lm), GFP_KERNEL);
-	if (!lm)
-		return -ENOMEM;
-
-	idev = devm_input_allocate_device(&client->dev);
-	if (!idev)
-		return -ENOMEM;
-
-	lm->client = client;
-	lm->idev = idev;
-	mutex_init(&lm->lock);
-
-	lm->size_x = pdata->size_x;
-	lm->size_y = pdata->size_y;
-	dev_vdbg(&client->dev, "Keypad size: %d x %d\n",
-		 lm->size_x, lm->size_y);
-
-	lm->debounce_time = pdata->debounce_time;
-	lm->active_time = pdata->active_time;
-
-	lm8323_reset(lm);
-
-	/*
-	 * Nothing's set up to service the IRQ yet, so just spin for max.
-	 * 100ms until we can configure.
-	 */
-	tmo = jiffies + msecs_to_jiffies(100);
-	while (lm8323_read(lm, LM8323_CMD_READ_INT, data, 1) == 1) {
-		if (data[0] & INT_NOINIT)
-			break;
-
-		if (time_after(jiffies, tmo)) {
-			dev_err(&client->dev,
-				"timeout waiting for initialisation\n");
-			break;
-		}
-
-		msleep(1);
-	}
-
-	lm8323_configure(lm);
-
-	/* If a true probe check the device */
-	if (lm8323_read_id(lm, data) != 0) {
-		dev_err(&client->dev, "device not found\n");
-		return -ENODEV;
-	}
-
-	for (pwm = 0; pwm < LM8323_NUM_PWMS; pwm++) {
-		err = init_pwm(lm, pwm + 1, &client->dev,
-			       pdata->pwm_names[pwm]);
-		if (err)
-			return err;
-	}
-
-	lm->kp_enabled = true;
-
-	idev->name = pdata->name ? : "LM8323 keypad";
-	snprintf(lm->phys, sizeof(lm->phys),
-		 "%s/input-kp", dev_name(&client->dev));
-	idev->phys = lm->phys;
-
-	idev->evbit[0] = BIT(EV_KEY) | BIT(EV_MSC);
-	__set_bit(MSC_SCAN, idev->mscbit);
-	for (i = 0; i < LM8323_KEYMAP_SIZE; i++) {
-		__set_bit(pdata->keymap[i], idev->keybit);
-		lm->keymap[i] = pdata->keymap[i];
-	}
-	__clear_bit(KEY_RESERVED, idev->keybit);
-
-	if (pdata->repeat)
-		__set_bit(EV_REP, idev->evbit);
-
-	err = input_register_device(idev);
-	if (err) {
-		dev_dbg(&client->dev, "error registering input device\n");
-		return err;
-	}
-
-	err = devm_request_threaded_irq(&client->dev, client->irq,
-					NULL, lm8323_irq,
-					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-					"lm8323", lm);
-	if (err) {
-		dev_err(&client->dev, "could not get IRQ %d\n", client->irq);
-		return err;
-	}
-
-	i2c_set_clientdata(client, lm);
-
-	device_init_wakeup(&client->dev, 1);
-	enable_irq_wake(client->irq);
-
-	return 0;
-}
-
-/*
- * We don't need to explicitly suspend the chip, as it already switches off
- * when there's no activity.
- */
-static int lm8323_suspend(struct device *dev)
-{
-	struct i2c_client *client = to_i2c_client(dev);
-	struct lm8323_chip *lm = i2c_get_clientdata(client);
-	int i;
-
-	irq_set_irq_wake(client->irq, 0);
-	disable_irq(client->irq);
-
-	scoped_guard(mutex, &lm->lock) {
-		lm->pm_suspend = true;
-	}
-
-	for (i = 0; i < 3; i++)
-		if (lm->pwm[i].enabled)
-			led_classdev_suspend(&lm->pwm[i].cdev);
-
-	return 0;
-}
-
-static int lm8323_resume(struct device *dev)
-{
-	struct i2c_client *client = to_i2c_client(dev);
-	struct lm8323_chip *lm = i2c_get_clientdata(client);
-	int i;
-
-	scoped_guard(mutex, &lm->lock) {
-		lm->pm_suspend = false;
-	}
-
-	for (i = 0; i < 3; i++)
-		if (lm->pwm[i].enabled)
-			led_classdev_resume(&lm->pwm[i].cdev);
-
-	enable_irq(client->irq);
-	irq_set_irq_wake(client->irq, 1);
-
-	return 0;
-}
-
-static DEFINE_SIMPLE_DEV_PM_OPS(lm8323_pm_ops, lm8323_suspend, lm8323_resume);
-
-static const struct i2c_device_id lm8323_id[] = {
-	{ .name = "lm8323" },
-	{ }
-};
-
-static struct i2c_driver lm8323_i2c_driver = {
-	.driver = {
-		.name		= "lm8323",
-		.pm		= pm_sleep_ptr(&lm8323_pm_ops),
-		.dev_groups	= lm8323_groups,
-	},
-	.probe		= lm8323_probe,
-	.id_table	= lm8323_id,
-};
-MODULE_DEVICE_TABLE(i2c, lm8323_id);
-
-module_i2c_driver(lm8323_i2c_driver);
-
-MODULE_AUTHOR("Timo O. Karjalainen <timo.o.karjalainen@nokia.com>");
-MODULE_AUTHOR("Daniel Stone");
-MODULE_AUTHOR("Felipe Balbi <felipe.balbi@nokia.com>");
-MODULE_DESCRIPTION("LM8323 keypad driver");
-MODULE_LICENSE("GPL");
-
diff --git a/include/linux/platform_data/lm8323.h b/include/linux/platform_data/lm8323.h
deleted file mode 100644
index 311999260614..000000000000
--- a/include/linux/platform_data/lm8323.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * lm8323.h - Configuration for LM8323 keypad driver.
- */
-
-#ifndef __LINUX_LM8323_H
-#define __LINUX_LM8323_H
-
-#include <linux/types.h>
-
-/*
- * Largest keycode that the chip can send, plus one,
- * so keys can be mapped directly at the index of the
- * LM8323 keycode instead of subtracting one.
- */
-#define LM8323_KEYMAP_SIZE	(0x7f + 1)
-
-#define LM8323_NUM_PWMS		3
-
-struct lm8323_platform_data {
-	int debounce_time; /* Time to watch for key bouncing, in ms. */
-	int active_time; /* Idle time until sleep, in ms. */
-
-	int size_x;
-	int size_y;
-	bool repeat;
-	const unsigned short *keymap;
-
-	const char *pwm_names[LM8323_NUM_PWMS];
-
-	const char *name; /* Device name. */
-};
-
-#endif /* __LINUX_LM8323_H */
-- 
2.56.0.506.g506a7eabc5-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 2/2] Input: lm8333 - remove driver
  2026-11-09  7:29 [PATCH 0/2] Input: remove unused lm8323 and lm8333 keypad drivers Dmitry Torokhov
  2026-11-09  7:29 ` [PATCH 1/2] Input: lm8323 - remove driver Dmitry Torokhov
@ 2026-11-09  7:29 ` Dmitry Torokhov
  2026-11-09 17:32   ` Wolfram Sang
  2026-11-09 17:39   ` Arnd Bergmann
  1 sibling, 2 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2026-11-09  7:29 UTC (permalink / raw)
  To: Wolfram Sang, Arnd Bergmann
  Cc: Felipe Balbi, Tony Lindgren, Hyunjung Ko, linux-input, linux-kernel

The LM8333 keypad driver relies exclusively on legacy platform data,
has no Device Tree or generic device property support, and has no
users in mainline. The BSP board file it was originally written for
was never upstreamed, and the original author Wolfram Sang confirmed
in the mailing list discussion that it will likely never be converted
to Device Tree and agreed to dropping it.

Remove the driver and its platform data header.

Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
Link: https://lore.kernel.org/r/Zr6PnlsdoyLoX261@shikoro
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
 drivers/input/keyboard/Kconfig  |  11 --
 drivers/input/keyboard/Makefile |   1 -
 drivers/input/keyboard/lm8333.c | 213 --------------------------------
 include/linux/input/lm8333.h    |  24 ----
 4 files changed, 249 deletions(-)
 delete mode 100644 drivers/input/keyboard/lm8333.c
 delete mode 100644 include/linux/input/lm8333.h

diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index a1102115093d..cc6d22394c39 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -316,17 +316,6 @@ config KEYBOARD_HP7XX
 	  To compile this driver as a module, choose M here: the
 	  module will be called jornada720_kbd.
 
-config KEYBOARD_LM8333
-	tristate "LM8333 keypad chip"
-	depends on I2C
-	select INPUT_MATRIXKMAP
-	help
-	  If you say yes here you get support for the National Semiconductor
-	  LM8333 keypad controller.
-
-	  To compile this driver as a module, choose M here: the
-	  module will be called lm8333.
-
 config KEYBOARD_LOCOMO
 	tristate "LoCoMo Keyboard Support"
 	depends on SHARP_LOCOMO
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 282d41e346ba..110b250e6e51 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -35,7 +35,6 @@ obj-$(CONFIG_KEYBOARD_IMX_BBM_SCMI)	+= imx-sm-bbm-key.o
 obj-$(CONFIG_KEYBOARD_HP6XX)		+= jornada680_kbd.o
 obj-$(CONFIG_KEYBOARD_HP7XX)		+= jornada720_kbd.o
 obj-$(CONFIG_KEYBOARD_LKKBD)		+= lkkbd.o
-obj-$(CONFIG_KEYBOARD_LM8333)		+= lm8333.o
 obj-$(CONFIG_KEYBOARD_LOCOMO)		+= locomokbd.o
 obj-$(CONFIG_KEYBOARD_LPC32XX)		+= lpc32xx-keys.o
 obj-$(CONFIG_KEYBOARD_MAPLE)		+= maple_keyb.o
diff --git a/drivers/input/keyboard/lm8333.c b/drivers/input/keyboard/lm8333.c
deleted file mode 100644
index 84e1faf1f5ab..000000000000
--- a/drivers/input/keyboard/lm8333.c
+++ /dev/null
@@ -1,213 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * LM8333 keypad driver
- * Copyright (C) 2012 Wolfram Sang, Pengutronix <kernel@pengutronix.de>
- */
-
-#include <linux/i2c.h>
-#include <linux/input.h>
-#include <linux/input/matrix_keypad.h>
-#include <linux/input/lm8333.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/slab.h>
-
-#define LM8333_FIFO_READ		0x20
-#define LM8333_DEBOUNCE			0x22
-#define LM8333_READ_INT			0xD0
-#define LM8333_ACTIVE			0xE4
-#define LM8333_READ_ERROR		0xF0
-
-#define LM8333_KEYPAD_IRQ		(1 << 0)
-#define LM8333_ERROR_IRQ		(1 << 3)
-
-#define LM8333_ERROR_KEYOVR		0x04
-#define LM8333_ERROR_FIFOOVR		0x40
-
-#define LM8333_FIFO_TRANSFER_SIZE	16
-
-#define LM8333_NUM_ROWS		8
-#define LM8333_NUM_COLS		16
-#define LM8333_ROW_SHIFT	4
-
-struct lm8333 {
-	struct i2c_client *client;
-	struct input_dev *input;
-	unsigned short keycodes[LM8333_NUM_ROWS << LM8333_ROW_SHIFT];
-};
-
-/* The accessors try twice because the first access may be needed for wakeup */
-#define LM8333_READ_RETRIES 2
-
-int lm8333_read8(struct lm8333 *lm8333, u8 cmd)
-{
-	int retries = 0, ret;
-
-	do {
-		ret = i2c_smbus_read_byte_data(lm8333->client, cmd);
-	} while (ret < 0 && retries++ < LM8333_READ_RETRIES);
-
-	return ret;
-}
-
-int lm8333_write8(struct lm8333 *lm8333, u8 cmd, u8 val)
-{
-	int retries = 0, ret;
-
-	do {
-		ret = i2c_smbus_write_byte_data(lm8333->client, cmd, val);
-	} while (ret < 0 && retries++ < LM8333_READ_RETRIES);
-
-	return ret;
-}
-
-int lm8333_read_block(struct lm8333 *lm8333, u8 cmd, u8 len, u8 *buf)
-{
-	int retries = 0, ret;
-
-	do {
-		ret = i2c_smbus_read_i2c_block_data(lm8333->client,
-						    cmd, len, buf);
-	} while (ret < 0 && retries++ < LM8333_READ_RETRIES);
-
-	return ret;
-}
-
-static void lm8333_key_handler(struct lm8333 *lm8333)
-{
-	struct input_dev *input = lm8333->input;
-	u8 keys[LM8333_FIFO_TRANSFER_SIZE];
-	u8 code, pressed;
-	int i, ret;
-
-	ret = lm8333_read_block(lm8333, LM8333_FIFO_READ,
-				LM8333_FIFO_TRANSFER_SIZE, keys);
-	if (ret != LM8333_FIFO_TRANSFER_SIZE) {
-		dev_err(&lm8333->client->dev,
-			"Error %d while reading FIFO\n", ret);
-		return;
-	}
-
-	for (i = 0; i < LM8333_FIFO_TRANSFER_SIZE && keys[i]; i++) {
-		pressed = keys[i] & 0x80;
-		code = keys[i] & 0x7f;
-
-		input_event(input, EV_MSC, MSC_SCAN, code);
-		input_report_key(input, lm8333->keycodes[code], pressed);
-	}
-
-	input_sync(input);
-}
-
-static irqreturn_t lm8333_irq_thread(int irq, void *data)
-{
-	struct lm8333 *lm8333 = data;
-	u8 status = lm8333_read8(lm8333, LM8333_READ_INT);
-
-	if (!status)
-		return IRQ_NONE;
-
-	if (status & LM8333_ERROR_IRQ) {
-		u8 err = lm8333_read8(lm8333, LM8333_READ_ERROR);
-
-		if (err & (LM8333_ERROR_KEYOVR | LM8333_ERROR_FIFOOVR)) {
-			u8 dummy[LM8333_FIFO_TRANSFER_SIZE];
-
-			lm8333_read_block(lm8333, LM8333_FIFO_READ,
-					LM8333_FIFO_TRANSFER_SIZE, dummy);
-		}
-		dev_err(&lm8333->client->dev, "Got error %02x\n", err);
-	}
-
-	if (status & LM8333_KEYPAD_IRQ)
-		lm8333_key_handler(lm8333);
-
-	return IRQ_HANDLED;
-}
-
-static int lm8333_probe(struct i2c_client *client)
-{
-	const struct lm8333_platform_data *pdata =
-			dev_get_platdata(&client->dev);
-	struct lm8333 *lm8333;
-	struct input_dev *input;
-	int err, active_time;
-
-	if (!pdata)
-		return -EINVAL;
-
-	active_time = pdata->active_time ?: 500;
-	if (active_time / 3 <= pdata->debounce_time / 3) {
-		dev_err(&client->dev, "Active time not big enough!\n");
-		return -EINVAL;
-	}
-
-	lm8333 = devm_kzalloc(&client->dev, sizeof(*lm8333), GFP_KERNEL);
-	if (!lm8333)
-		return -ENOMEM;
-
-	input = devm_input_allocate_device(&client->dev);
-	if (!input)
-		return -ENOMEM;
-
-	lm8333->client = client;
-	lm8333->input = input;
-
-	input->name = client->name;
-	input->id.bustype = BUS_I2C;
-
-	input_set_capability(input, EV_MSC, MSC_SCAN);
-
-	err = matrix_keypad_build_keymap(pdata->matrix_data,
-					 LM8333_NUM_ROWS, LM8333_NUM_COLS,
-					 lm8333->keycodes, input);
-	if (err)
-		return err;
-
-	if (pdata->debounce_time) {
-		err = lm8333_write8(lm8333, LM8333_DEBOUNCE,
-				    pdata->debounce_time / 3);
-		if (err)
-			dev_warn(&client->dev, "Unable to set debounce time\n");
-	}
-
-	if (pdata->active_time) {
-		err = lm8333_write8(lm8333, LM8333_ACTIVE,
-				    pdata->active_time / 3);
-		if (err)
-			dev_warn(&client->dev, "Unable to set active time\n");
-	}
-
-	err = devm_request_threaded_irq(&client->dev, client->irq,
-					NULL, lm8333_irq_thread,
-					IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
-					"lm8333", lm8333);
-	if (err)
-		return err;
-
-	err = input_register_device(input);
-	if (err)
-		return err;
-
-	i2c_set_clientdata(client, lm8333);
-	return 0;
-}
-
-static const struct i2c_device_id lm8333_id[] = {
-	{ .name = "lm8333" },
-	{ }
-};
-MODULE_DEVICE_TABLE(i2c, lm8333_id);
-
-static struct i2c_driver lm8333_driver = {
-	.driver = {
-		.name		= "lm8333",
-	},
-	.probe		= lm8333_probe,
-	.id_table	= lm8333_id,
-};
-module_i2c_driver(lm8333_driver);
-
-MODULE_AUTHOR("Wolfram Sang <kernel@pengutronix.de>");
-MODULE_DESCRIPTION("LM8333 keyboard driver");
-MODULE_LICENSE("GPL v2");
diff --git a/include/linux/input/lm8333.h b/include/linux/input/lm8333.h
deleted file mode 100644
index 906da5fc06e0..000000000000
--- a/include/linux/input/lm8333.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * public include for LM8333 keypad driver - same license as driver
- * Copyright (C) 2012 Wolfram Sang, Pengutronix <kernel@pengutronix.de>
- */
-
-#ifndef _LM8333_H
-#define _LM8333_H
-
-struct lm8333;
-
-struct lm8333_platform_data {
-	/* Keymap data */
-	const struct matrix_keymap_data *matrix_data;
-	/* Active timeout before enter HALT mode in microseconds */
-	unsigned active_time;
-	/* Debounce interval in microseconds */
-	unsigned debounce_time;
-};
-
-extern int lm8333_read8(struct lm8333 *lm8333, u8 cmd);
-extern int lm8333_write8(struct lm8333 *lm8333, u8 cmd, u8 val);
-extern int lm8333_read_block(struct lm8333 *lm8333, u8 cmd, u8 len, u8 *buf);
-
-#endif /* _LM8333_H */
-- 
2.56.0.506.g506a7eabc5-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] Input: lm8323 - remove driver
  2026-11-09  7:29 ` [PATCH 1/2] Input: lm8323 - remove driver Dmitry Torokhov
@ 2026-11-09  7:46   ` khj
  2026-11-09  7:53   ` Arnd Bergmann
  1 sibling, 0 replies; 8+ messages in thread
From: khj @ 2026-11-09  7:46 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Wolfram Sang, Arnd Bergmann, Felipe Balbi, Tony Lindgren,
	linux-input, linux-kernel

Makes sense — for a user-less, pdata-only driver with no DT support,
removing it is better than carrying another untested fix. Thanks for
cleaning it up.

2026년 11월 9일 (월) 오후 4:29, Dmitry Torokhov <dmitry.torokhov@gmail.com>님이 작성:
>
> The LM8323 keypad driver relies exclusively on legacy platform data,
> has no Device Tree or generic device property support, and has no users
> in mainline (including the Nokia N810 DTS, which never added support
> for it). Its PWM/LED handling and unbind lifetime are broken, and after
> hardware-tested IRQ fixes in 2011 the driver has for over a decade only
> received mechanical API conversions and static-analysis cleanups
> without hardware testing.
>
> An inquiry on the mailing list asking whether anyone still uses or
> wishes to keep the driver received no objections. Remove the driver
> and its platform data header.
>
> Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> ---
>  drivers/input/keyboard/Kconfig       |  11 -
>  drivers/input/keyboard/Makefile      |   1 -
>  drivers/input/keyboard/lm8323.c      | 813 ---------------------------
>  include/linux/platform_data/lm8323.h |  34 --
>  4 files changed, 859 deletions(-)
>  delete mode 100644 drivers/input/keyboard/lm8323.c
>  delete mode 100644 include/linux/platform_data/lm8323.h
>
> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
> index d8c64f333462..a1102115093d 100644
> --- a/drivers/input/keyboard/Kconfig
> +++ b/drivers/input/keyboard/Kconfig
> @@ -316,17 +316,6 @@ config KEYBOARD_HP7XX
>           To compile this driver as a module, choose M here: the
>           module will be called jornada720_kbd.
>
> -config KEYBOARD_LM8323
> -       tristate "LM8323 keypad chip"
> -       depends on I2C
> -       depends on LEDS_CLASS
> -       help
> -         If you say yes here you get support for the National Semiconductor
> -         LM8323 keypad controller.
> -
> -         To compile this driver as a module, choose M here: the
> -         module will be called lm8323.
> -
>  config KEYBOARD_LM8333
>         tristate "LM8333 keypad chip"
>         depends on I2C
> diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
> index 60bb7baf802f..282d41e346ba 100644
> --- a/drivers/input/keyboard/Makefile
> +++ b/drivers/input/keyboard/Makefile
> @@ -35,7 +35,6 @@ obj-$(CONFIG_KEYBOARD_IMX_BBM_SCMI)   += imx-sm-bbm-key.o
>  obj-$(CONFIG_KEYBOARD_HP6XX)           += jornada680_kbd.o
>  obj-$(CONFIG_KEYBOARD_HP7XX)           += jornada720_kbd.o
>  obj-$(CONFIG_KEYBOARD_LKKBD)           += lkkbd.o
> -obj-$(CONFIG_KEYBOARD_LM8323)          += lm8323.o
>  obj-$(CONFIG_KEYBOARD_LM8333)          += lm8333.o
>  obj-$(CONFIG_KEYBOARD_LOCOMO)          += locomokbd.o
>  obj-$(CONFIG_KEYBOARD_LPC32XX)         += lpc32xx-keys.o
> diff --git a/drivers/input/keyboard/lm8323.c b/drivers/input/keyboard/lm8323.c
> deleted file mode 100644
> index 8eac63b2d304..000000000000
> --- a/drivers/input/keyboard/lm8323.c
> +++ /dev/null
> @@ -1,813 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * drivers/i2c/chips/lm8323.c
> - *
> - * Copyright (C) 2007-2009 Nokia Corporation
> - *
> - * Written by Daniel Stone <daniel.stone@nokia.com>
> - *            Timo O. Karjalainen <timo.o.karjalainen@nokia.com>
> - *
> - * Updated by Felipe Balbi <felipe.balbi@nokia.com>
> - */
> -
> -#include <linux/module.h>
> -#include <linux/i2c.h>
> -#include <linux/interrupt.h>
> -#include <linux/sched.h>
> -#include <linux/mutex.h>
> -#include <linux/delay.h>
> -#include <linux/input.h>
> -#include <linux/leds.h>
> -#include <linux/platform_data/lm8323.h>
> -#include <linux/pm.h>
> -#include <linux/slab.h>
> -#include <linux/string_choices.h>
> -
> -/* Commands to send to the chip. */
> -#define LM8323_CMD_READ_ID             0x80 /* Read chip ID. */
> -#define LM8323_CMD_WRITE_CFG           0x81 /* Set configuration item. */
> -#define LM8323_CMD_READ_INT            0x82 /* Get interrupt status. */
> -#define LM8323_CMD_RESET               0x83 /* Reset, same as external one */
> -#define LM8323_CMD_WRITE_PORT_SEL      0x85 /* Set GPIO in/out. */
> -#define LM8323_CMD_WRITE_PORT_STATE    0x86 /* Set GPIO pullup. */
> -#define LM8323_CMD_READ_PORT_SEL       0x87 /* Get GPIO in/out. */
> -#define LM8323_CMD_READ_PORT_STATE     0x88 /* Get GPIO pullup. */
> -#define LM8323_CMD_READ_FIFO           0x89 /* Read byte from FIFO. */
> -#define LM8323_CMD_RPT_READ_FIFO       0x8a /* Read FIFO (no increment). */
> -#define LM8323_CMD_SET_ACTIVE          0x8b /* Set active time. */
> -#define LM8323_CMD_READ_ERR            0x8c /* Get error status. */
> -#define LM8323_CMD_READ_ROTATOR                0x8e /* Read rotator status. */
> -#define LM8323_CMD_SET_DEBOUNCE                0x8f /* Set debouncing time. */
> -#define LM8323_CMD_SET_KEY_SIZE                0x90 /* Set keypad size. */
> -#define LM8323_CMD_READ_KEY_SIZE       0x91 /* Get keypad size. */
> -#define LM8323_CMD_READ_CFG            0x92 /* Get configuration item. */
> -#define LM8323_CMD_WRITE_CLOCK         0x93 /* Set clock config. */
> -#define LM8323_CMD_READ_CLOCK          0x94 /* Get clock config. */
> -#define LM8323_CMD_PWM_WRITE           0x95 /* Write PWM script. */
> -#define LM8323_CMD_START_PWM           0x96 /* Start PWM engine. */
> -#define LM8323_CMD_STOP_PWM            0x97 /* Stop PWM engine. */
> -
> -/* Interrupt status. */
> -#define INT_KEYPAD                     0x01 /* Key event. */
> -#define INT_ROTATOR                    0x02 /* Rotator event. */
> -#define INT_ERROR                      0x08 /* Error: use CMD_READ_ERR. */
> -#define INT_NOINIT                     0x10 /* Lost configuration. */
> -#define INT_PWM1                       0x20 /* PWM1 stopped. */
> -#define INT_PWM2                       0x40 /* PWM2 stopped. */
> -#define INT_PWM3                       0x80 /* PWM3 stopped. */
> -
> -/* Errors (signalled by INT_ERROR, read with CMD_READ_ERR). */
> -#define ERR_BADPAR                     0x01 /* Bad parameter. */
> -#define ERR_CMDUNK                     0x02 /* Unknown command. */
> -#define ERR_KEYOVR                     0x04 /* Too many keys pressed. */
> -#define ERR_FIFOOVER                   0x40 /* FIFO overflow. */
> -
> -/* Configuration keys (CMD_{WRITE,READ}_CFG). */
> -#define CFG_MUX1SEL                    0x01 /* Select MUX1_OUT input. */
> -#define CFG_MUX1EN                     0x02 /* Enable MUX1_OUT. */
> -#define CFG_MUX2SEL                    0x04 /* Select MUX2_OUT input. */
> -#define CFG_MUX2EN                     0x08 /* Enable MUX2_OUT. */
> -#define CFG_PSIZE                      0x20 /* Package size (must be 0). */
> -#define CFG_ROTEN                      0x40 /* Enable rotator. */
> -
> -/* Clock settings (CMD_{WRITE,READ}_CLOCK). */
> -#define CLK_RCPWM_INTERNAL             0x00
> -#define CLK_RCPWM_EXTERNAL             0x03
> -#define CLK_SLOWCLKEN                  0x08 /* Enable 32.768kHz clock. */
> -#define CLK_SLOWCLKOUT                 0x40 /* Enable slow pulse output. */
> -
> -/* The possible addresses corresponding to CONFIG1 and CONFIG2 pin wirings. */
> -#define LM8323_I2C_ADDR00              (0x84 >> 1)     /* 1000 010x */
> -#define LM8323_I2C_ADDR01              (0x86 >> 1)     /* 1000 011x */
> -#define LM8323_I2C_ADDR10              (0x88 >> 1)     /* 1000 100x */
> -#define LM8323_I2C_ADDR11              (0x8A >> 1)     /* 1000 101x */
> -
> -/* Key event fifo length */
> -#define LM8323_FIFO_LEN                        15
> -
> -/* Commands for PWM engine; feed in with PWM_WRITE. */
> -/* Load ramp counter from duty cycle field (range 0 - 0xff). */
> -#define PWM_SET(v)                     (0x4000 | ((v) & 0xff))
> -/* Go to start of script. */
> -#define PWM_GOTOSTART                  0x0000
> -/*
> - * Stop engine (generates interrupt).  If reset is 1, clear the program
> - * counter, else leave it.
> - */
> -#define PWM_END(reset)                 (0xc000 | (!!(reset) << 11))
> -/*
> - * Ramp.  If s is 1, divide clock by 512, else divide clock by 16.
> - * Take t clock scales (up to 63) per step, for n steps (up to 126).
> - * If u is set, ramp up, else ramp down.
> - */
> -#define PWM_RAMP(s, t, n, u)           ((!!(s) << 14) | ((t) & 0x3f) << 8 | \
> -                                        ((n) & 0x7f) | ((u) ? 0 : 0x80))
> -/*
> - * Loop (i.e. jump back to pos) for a given number of iterations (up to 63).
> - * If cnt is zero, execute until PWM_END is encountered.
> - */
> -#define PWM_LOOP(cnt, pos)             (0xa000 | (((cnt) & 0x3f) << 7) | \
> -                                        ((pos) & 0x3f))
> -/*
> - * Wait for trigger.  Argument is a mask of channels, shifted by the channel
> - * number, e.g. 0xa for channels 3 and 1.  Note that channels are numbered
> - * from 1, not 0.
> - */
> -#define PWM_WAIT_TRIG(chans)           (0xe000 | (((chans) & 0x7) << 6))
> -/* Send trigger.  Argument is same as PWM_WAIT_TRIG. */
> -#define PWM_SEND_TRIG(chans)           (0xe000 | ((chans) & 0x7))
> -
> -struct lm8323_pwm {
> -       int                     id;
> -       int                     fade_time;
> -       int                     brightness;
> -       int                     desired_brightness;
> -       bool                    enabled;
> -       bool                    running;
> -       /* pwm lock */
> -       struct mutex            lock;
> -       struct work_struct      work;
> -       struct led_classdev     cdev;
> -       struct lm8323_chip      *chip;
> -};
> -
> -struct lm8323_chip {
> -       /* device lock */
> -       struct mutex            lock;
> -       struct i2c_client       *client;
> -       struct input_dev        *idev;
> -       bool                    kp_enabled;
> -       bool                    pm_suspend;
> -       unsigned                keys_down;
> -       char                    phys[32];
> -       unsigned short          keymap[LM8323_KEYMAP_SIZE];
> -       int                     size_x;
> -       int                     size_y;
> -       int                     debounce_time;
> -       int                     active_time;
> -       struct lm8323_pwm       pwm[LM8323_NUM_PWMS];
> -};
> -
> -#define client_to_lm8323(c)    container_of(c, struct lm8323_chip, client)
> -#define dev_to_lm8323(d)       container_of(d, struct lm8323_chip, client->dev)
> -#define cdev_to_pwm(c)         container_of(c, struct lm8323_pwm, cdev)
> -#define work_to_pwm(w)         container_of(w, struct lm8323_pwm, work)
> -
> -#define LM8323_MAX_DATA 8
> -
> -/*
> - * To write, we just access the chip's address in write mode, and dump the
> - * command and data out on the bus.  The command byte and data are taken as
> - * sequential u8s out of varargs, to a maximum of LM8323_MAX_DATA.
> - */
> -static int lm8323_write(struct lm8323_chip *lm, int len, ...)
> -{
> -       int ret, i;
> -       va_list ap;
> -       u8 data[LM8323_MAX_DATA];
> -
> -       va_start(ap, len);
> -
> -       if (unlikely(len > LM8323_MAX_DATA)) {
> -               dev_err(&lm->client->dev, "tried to send %d bytes\n", len);
> -               va_end(ap);
> -               return 0;
> -       }
> -
> -       for (i = 0; i < len; i++)
> -               data[i] = va_arg(ap, int);
> -
> -       va_end(ap);
> -
> -       /*
> -        * If the host is asleep while we send the data, we can get a NACK
> -        * back while it wakes up, so try again, once.
> -        */
> -       ret = i2c_master_send(lm->client, data, len);
> -       if (unlikely(ret == -EREMOTEIO))
> -               ret = i2c_master_send(lm->client, data, len);
> -       if (unlikely(ret != len))
> -               dev_err(&lm->client->dev, "sent %d bytes of %d total\n",
> -                       len, ret);
> -
> -       return ret;
> -}
> -
> -/*
> - * To read, we first send the command byte to the chip and end the transaction,
> - * then access the chip in read mode, at which point it will send the data.
> - */
> -static int lm8323_read(struct lm8323_chip *lm, u8 cmd, u8 *buf, int len)
> -{
> -       int ret;
> -
> -       /*
> -        * If the host is asleep while we send the byte, we can get a NACK
> -        * back while it wakes up, so try again, once.
> -        */
> -       ret = i2c_master_send(lm->client, &cmd, 1);
> -       if (unlikely(ret == -EREMOTEIO))
> -               ret = i2c_master_send(lm->client, &cmd, 1);
> -       if (unlikely(ret != 1)) {
> -               dev_err(&lm->client->dev, "sending read cmd 0x%02x failed\n",
> -                       cmd);
> -               return 0;
> -       }
> -
> -       ret = i2c_master_recv(lm->client, buf, len);
> -       if (unlikely(ret != len))
> -               dev_err(&lm->client->dev, "wanted %d bytes, got %d\n",
> -                       len, ret);
> -
> -       return ret;
> -}
> -
> -/*
> - * Set the chip active time (idle time before it enters halt).
> - */
> -static void lm8323_set_active_time(struct lm8323_chip *lm, int time)
> -{
> -       lm8323_write(lm, 2, LM8323_CMD_SET_ACTIVE, time >> 2);
> -}
> -
> -/*
> - * The signals are AT-style: the low 7 bits are the keycode, and the top
> - * bit indicates the state (1 for down, 0 for up).
> - */
> -static inline u8 lm8323_whichkey(u8 event)
> -{
> -       return event & 0x7f;
> -}
> -
> -static inline int lm8323_ispress(u8 event)
> -{
> -       return (event & 0x80) ? 1 : 0;
> -}
> -
> -static void process_keys(struct lm8323_chip *lm)
> -{
> -       u8 event;
> -       u8 key_fifo[LM8323_FIFO_LEN + 1];
> -       int old_keys_down = lm->keys_down;
> -       int ret;
> -       int i = 0;
> -
> -       /*
> -        * Read all key events from the FIFO at once. Next READ_FIFO clears the
> -        * FIFO even if we didn't read all events previously.
> -        */
> -       ret = lm8323_read(lm, LM8323_CMD_READ_FIFO, key_fifo, LM8323_FIFO_LEN);
> -
> -       if (ret < 0) {
> -               dev_err(&lm->client->dev, "Failed reading fifo\n");
> -               return;
> -       }
> -       key_fifo[ret] = 0;
> -
> -       while ((event = key_fifo[i++])) {
> -               u8 key = lm8323_whichkey(event);
> -               int isdown = lm8323_ispress(event);
> -               unsigned short keycode = lm->keymap[key];
> -
> -               dev_vdbg(&lm->client->dev, "key 0x%02x %s\n",
> -                        key, str_down_up(isdown));
> -
> -               if (lm->kp_enabled) {
> -                       input_event(lm->idev, EV_MSC, MSC_SCAN, key);
> -                       input_report_key(lm->idev, keycode, isdown);
> -                       input_sync(lm->idev);
> -               }
> -
> -               if (isdown)
> -                       lm->keys_down++;
> -               else
> -                       lm->keys_down--;
> -       }
> -
> -       /*
> -        * Errata: We need to ensure that the chip never enters halt mode
> -        * during a keypress, so set active time to 0.  When it's released,
> -        * we can enter halt again, so set the active time back to normal.
> -        */
> -       if (!old_keys_down && lm->keys_down)
> -               lm8323_set_active_time(lm, 0);
> -       if (old_keys_down && !lm->keys_down)
> -               lm8323_set_active_time(lm, lm->active_time);
> -}
> -
> -static void lm8323_process_error(struct lm8323_chip *lm)
> -{
> -       u8 error;
> -
> -       if (lm8323_read(lm, LM8323_CMD_READ_ERR, &error, 1) == 1) {
> -               if (error & ERR_FIFOOVER)
> -                       dev_vdbg(&lm->client->dev, "fifo overflow!\n");
> -               if (error & ERR_KEYOVR)
> -                       dev_vdbg(&lm->client->dev,
> -                                       "more than two keys pressed\n");
> -               if (error & ERR_CMDUNK)
> -                       dev_vdbg(&lm->client->dev,
> -                                       "unknown command submitted\n");
> -               if (error & ERR_BADPAR)
> -                       dev_vdbg(&lm->client->dev, "bad command parameter\n");
> -       }
> -}
> -
> -static void lm8323_reset(struct lm8323_chip *lm)
> -{
> -       /* The docs say we must pass 0xAA as the data byte. */
> -       lm8323_write(lm, 2, LM8323_CMD_RESET, 0xAA);
> -}
> -
> -static int lm8323_configure(struct lm8323_chip *lm)
> -{
> -       int keysize = (lm->size_x << 4) | lm->size_y;
> -       int clock = (CLK_SLOWCLKEN | CLK_RCPWM_EXTERNAL);
> -       int debounce = lm->debounce_time >> 2;
> -       int active = lm->active_time >> 2;
> -
> -       /*
> -        * Active time must be greater than the debounce time: if it's
> -        * a close-run thing, give ourselves a 12ms buffer.
> -        */
> -       if (debounce >= active)
> -               active = debounce + 3;
> -
> -       lm8323_write(lm, 2, LM8323_CMD_WRITE_CFG, 0);
> -       lm8323_write(lm, 2, LM8323_CMD_WRITE_CLOCK, clock);
> -       lm8323_write(lm, 2, LM8323_CMD_SET_KEY_SIZE, keysize);
> -       lm8323_set_active_time(lm, lm->active_time);
> -       lm8323_write(lm, 2, LM8323_CMD_SET_DEBOUNCE, debounce);
> -       lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_STATE, 0xff, 0xff);
> -       lm8323_write(lm, 3, LM8323_CMD_WRITE_PORT_SEL, 0, 0);
> -
> -       /*
> -        * Not much we can do about errors at this point, so just hope
> -        * for the best.
> -        */
> -
> -       return 0;
> -}
> -
> -static void pwm_done(struct lm8323_pwm *pwm)
> -{
> -       guard(mutex)(&pwm->lock);
> -
> -       pwm->running = false;
> -       if (pwm->desired_brightness != pwm->brightness)
> -               schedule_work(&pwm->work);
> -}
> -
> -/*
> - * Bottom half: handle the interrupt by posting key events, or dealing with
> - * errors appropriately.
> - */
> -static irqreturn_t lm8323_irq(int irq, void *_lm)
> -{
> -       struct lm8323_chip *lm = _lm;
> -       u8 ints;
> -       int i;
> -
> -       guard(mutex)(&lm->lock);
> -
> -       while ((lm8323_read(lm, LM8323_CMD_READ_INT, &ints, 1) == 1) && ints) {
> -               if (likely(ints & INT_KEYPAD))
> -                       process_keys(lm);
> -               if (ints & INT_ROTATOR) {
> -                       /* We don't currently support the rotator. */
> -                       dev_vdbg(&lm->client->dev, "rotator fired\n");
> -               }
> -               if (ints & INT_ERROR) {
> -                       dev_vdbg(&lm->client->dev, "error!\n");
> -                       lm8323_process_error(lm);
> -               }
> -               if (ints & INT_NOINIT) {
> -                       dev_err(&lm->client->dev, "chip lost config; "
> -                                                 "reinitialising\n");
> -                       lm8323_configure(lm);
> -               }
> -               for (i = 0; i < LM8323_NUM_PWMS; i++) {
> -                       if (ints & (INT_PWM1 << i)) {
> -                               dev_vdbg(&lm->client->dev,
> -                                        "pwm%d engine completed\n", i);
> -                               pwm_done(&lm->pwm[i]);
> -                       }
> -               }
> -       }
> -
> -       return IRQ_HANDLED;
> -}
> -
> -/*
> - * Read the chip ID.
> - */
> -static int lm8323_read_id(struct lm8323_chip *lm, u8 *buf)
> -{
> -       int bytes;
> -
> -       bytes = lm8323_read(lm, LM8323_CMD_READ_ID, buf, 2);
> -       if (unlikely(bytes != 2))
> -               return -EIO;
> -
> -       return 0;
> -}
> -
> -static void lm8323_write_pwm_one(struct lm8323_pwm *pwm, int pos, u16 cmd)
> -{
> -       lm8323_write(pwm->chip, 4, LM8323_CMD_PWM_WRITE, (pos << 2) | pwm->id,
> -                    (cmd & 0xff00) >> 8, cmd & 0x00ff);
> -}
> -
> -/*
> - * Write a script into a given PWM engine, concluding with PWM_END.
> - * If 'kill' is nonzero, the engine will be shut down at the end
> - * of the script, producing a zero output. Otherwise the engine
> - * will be kept running at the final PWM level indefinitely.
> - */
> -static void lm8323_write_pwm(struct lm8323_pwm *pwm, int kill,
> -                            int len, const u16 *cmds)
> -{
> -       int i;
> -
> -       for (i = 0; i < len; i++)
> -               lm8323_write_pwm_one(pwm, i, cmds[i]);
> -
> -       lm8323_write_pwm_one(pwm, i++, PWM_END(kill));
> -       lm8323_write(pwm->chip, 2, LM8323_CMD_START_PWM, pwm->id);
> -       pwm->running = true;
> -}
> -
> -static void lm8323_pwm_work(struct work_struct *work)
> -{
> -       struct lm8323_pwm *pwm = work_to_pwm(work);
> -       int div512, perstep, steps, hz, up, kill;
> -       u16 pwm_cmds[3];
> -       int num_cmds = 0;
> -
> -       guard(mutex)(&pwm->lock);
> -
> -       /*
> -        * Do nothing if we're already at the requested level,
> -        * or previous setting is not yet complete. In the latter
> -        * case we will be called again when the previous PWM script
> -        * finishes.
> -        */
> -       if (pwm->running || pwm->desired_brightness == pwm->brightness)
> -               return;
> -
> -       kill = (pwm->desired_brightness == 0);
> -       up = (pwm->desired_brightness > pwm->brightness);
> -       steps = abs(pwm->desired_brightness - pwm->brightness);
> -
> -       /*
> -        * Convert time (in ms) into a divisor (512 or 16 on a refclk of
> -        * 32768Hz), and number of ticks per step.
> -        */
> -       if ((pwm->fade_time / steps) > (32768 / 512)) {
> -               div512 = 1;
> -               hz = 32768 / 512;
> -       } else {
> -               div512 = 0;
> -               hz = 32768 / 16;
> -       }
> -
> -       perstep = (hz * pwm->fade_time) / (steps * 1000);
> -
> -       if (perstep == 0)
> -               perstep = 1;
> -       else if (perstep > 63)
> -               perstep = 63;
> -
> -       while (steps) {
> -               int s;
> -
> -               s = min(126, steps);
> -               pwm_cmds[num_cmds++] = PWM_RAMP(div512, perstep, s, up);
> -               steps -= s;
> -       }
> -
> -       lm8323_write_pwm(pwm, kill, num_cmds, pwm_cmds);
> -       pwm->brightness = pwm->desired_brightness;
> -}
> -
> -static void lm8323_pwm_set_brightness(struct led_classdev *led_cdev,
> -                                     enum led_brightness brightness)
> -{
> -       struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
> -       struct lm8323_chip *lm = pwm->chip;
> -
> -       scoped_guard(mutex, &pwm->lock) {
> -               pwm->desired_brightness = brightness;
> -       }
> -
> -       if (in_interrupt()) {
> -               schedule_work(&pwm->work);
> -       } else {
> -               /*
> -                * Schedule PWM work as usual unless we are going into suspend
> -                */
> -               scoped_guard(mutex, &lm->lock) {
> -                       if (likely(!lm->pm_suspend))
> -                               schedule_work(&pwm->work);
> -                       else
> -                               lm8323_pwm_work(&pwm->work);
> -               }
> -       }
> -}
> -
> -static ssize_t lm8323_pwm_show_time(struct device *dev,
> -               struct device_attribute *attr, char *buf)
> -{
> -       struct led_classdev *led_cdev = dev_get_drvdata(dev);
> -       struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
> -
> -       return sprintf(buf, "%d\n", pwm->fade_time);
> -}
> -
> -static ssize_t lm8323_pwm_store_time(struct device *dev,
> -               struct device_attribute *attr, const char *buf, size_t len)
> -{
> -       struct led_classdev *led_cdev = dev_get_drvdata(dev);
> -       struct lm8323_pwm *pwm = cdev_to_pwm(led_cdev);
> -       int ret, time;
> -
> -       ret = kstrtoint(buf, 10, &time);
> -       /* Numbers only, please. */
> -       if (ret)
> -               return ret;
> -
> -       pwm->fade_time = time;
> -
> -       return strlen(buf);
> -}
> -static DEVICE_ATTR(time, 0644, lm8323_pwm_show_time, lm8323_pwm_store_time);
> -
> -static struct attribute *lm8323_pwm_attrs[] = {
> -       &dev_attr_time.attr,
> -       NULL
> -};
> -ATTRIBUTE_GROUPS(lm8323_pwm);
> -
> -static int init_pwm(struct lm8323_chip *lm, int id, struct device *dev,
> -                   const char *name)
> -{
> -       struct lm8323_pwm *pwm;
> -       int err;
> -
> -       BUG_ON(id > 3);
> -
> -       pwm = &lm->pwm[id - 1];
> -
> -       pwm->id = id;
> -       pwm->fade_time = 0;
> -       pwm->brightness = 0;
> -       pwm->desired_brightness = 0;
> -       pwm->running = false;
> -       pwm->enabled = false;
> -       INIT_WORK(&pwm->work, lm8323_pwm_work);
> -       mutex_init(&pwm->lock);
> -       pwm->chip = lm;
> -
> -       if (name) {
> -               pwm->cdev.name = name;
> -               pwm->cdev.brightness_set = lm8323_pwm_set_brightness;
> -               pwm->cdev.groups = lm8323_pwm_groups;
> -
> -               err = devm_led_classdev_register(dev, &pwm->cdev);
> -               if (err) {
> -                       dev_err(dev, "couldn't register PWM %d: %d\n", id, err);
> -                       return err;
> -               }
> -               pwm->enabled = true;
> -       }
> -
> -       return 0;
> -}
> -
> -static ssize_t lm8323_show_disable(struct device *dev,
> -                                  struct device_attribute *attr, char *buf)
> -{
> -       struct lm8323_chip *lm = dev_get_drvdata(dev);
> -
> -       return sprintf(buf, "%u\n", !lm->kp_enabled);
> -}
> -
> -static ssize_t lm8323_set_disable(struct device *dev,
> -                                 struct device_attribute *attr,
> -                                 const char *buf, size_t count)
> -{
> -       struct lm8323_chip *lm = dev_get_drvdata(dev);
> -       int ret;
> -       unsigned int i;
> -
> -       ret = kstrtouint(buf, 10, &i);
> -       if (ret)
> -               return ret;
> -
> -       guard(mutex)(&lm->lock);
> -
> -       lm->kp_enabled = !i;
> -
> -       return count;
> -}
> -static DEVICE_ATTR(disable_kp, 0644, lm8323_show_disable, lm8323_set_disable);
> -
> -static struct attribute *lm8323_attrs[] = {
> -       &dev_attr_disable_kp.attr,
> -       NULL,
> -};
> -ATTRIBUTE_GROUPS(lm8323);
> -
> -static int lm8323_probe(struct i2c_client *client)
> -{
> -       struct lm8323_platform_data *pdata = dev_get_platdata(&client->dev);
> -       struct input_dev *idev;
> -       struct lm8323_chip *lm;
> -       int pwm;
> -       int i, err;
> -       unsigned long tmo;
> -       u8 data[2];
> -
> -       if (!pdata || !pdata->size_x || !pdata->size_y) {
> -               dev_err(&client->dev, "missing platform_data\n");
> -               return -EINVAL;
> -       }
> -
> -       if (pdata->size_x > 8) {
> -               dev_err(&client->dev, "invalid x size %d specified\n",
> -                       pdata->size_x);
> -               return -EINVAL;
> -       }
> -
> -       if (pdata->size_y > 12) {
> -               dev_err(&client->dev, "invalid y size %d specified\n",
> -                       pdata->size_y);
> -               return -EINVAL;
> -       }
> -
> -       lm = devm_kzalloc(&client->dev, sizeof(*lm), GFP_KERNEL);
> -       if (!lm)
> -               return -ENOMEM;
> -
> -       idev = devm_input_allocate_device(&client->dev);
> -       if (!idev)
> -               return -ENOMEM;
> -
> -       lm->client = client;
> -       lm->idev = idev;
> -       mutex_init(&lm->lock);
> -
> -       lm->size_x = pdata->size_x;
> -       lm->size_y = pdata->size_y;
> -       dev_vdbg(&client->dev, "Keypad size: %d x %d\n",
> -                lm->size_x, lm->size_y);
> -
> -       lm->debounce_time = pdata->debounce_time;
> -       lm->active_time = pdata->active_time;
> -
> -       lm8323_reset(lm);
> -
> -       /*
> -        * Nothing's set up to service the IRQ yet, so just spin for max.
> -        * 100ms until we can configure.
> -        */
> -       tmo = jiffies + msecs_to_jiffies(100);
> -       while (lm8323_read(lm, LM8323_CMD_READ_INT, data, 1) == 1) {
> -               if (data[0] & INT_NOINIT)
> -                       break;
> -
> -               if (time_after(jiffies, tmo)) {
> -                       dev_err(&client->dev,
> -                               "timeout waiting for initialisation\n");
> -                       break;
> -               }
> -
> -               msleep(1);
> -       }
> -
> -       lm8323_configure(lm);
> -
> -       /* If a true probe check the device */
> -       if (lm8323_read_id(lm, data) != 0) {
> -               dev_err(&client->dev, "device not found\n");
> -               return -ENODEV;
> -       }
> -
> -       for (pwm = 0; pwm < LM8323_NUM_PWMS; pwm++) {
> -               err = init_pwm(lm, pwm + 1, &client->dev,
> -                              pdata->pwm_names[pwm]);
> -               if (err)
> -                       return err;
> -       }
> -
> -       lm->kp_enabled = true;
> -
> -       idev->name = pdata->name ? : "LM8323 keypad";
> -       snprintf(lm->phys, sizeof(lm->phys),
> -                "%s/input-kp", dev_name(&client->dev));
> -       idev->phys = lm->phys;
> -
> -       idev->evbit[0] = BIT(EV_KEY) | BIT(EV_MSC);
> -       __set_bit(MSC_SCAN, idev->mscbit);
> -       for (i = 0; i < LM8323_KEYMAP_SIZE; i++) {
> -               __set_bit(pdata->keymap[i], idev->keybit);
> -               lm->keymap[i] = pdata->keymap[i];
> -       }
> -       __clear_bit(KEY_RESERVED, idev->keybit);
> -
> -       if (pdata->repeat)
> -               __set_bit(EV_REP, idev->evbit);
> -
> -       err = input_register_device(idev);
> -       if (err) {
> -               dev_dbg(&client->dev, "error registering input device\n");
> -               return err;
> -       }
> -
> -       err = devm_request_threaded_irq(&client->dev, client->irq,
> -                                       NULL, lm8323_irq,
> -                                       IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> -                                       "lm8323", lm);
> -       if (err) {
> -               dev_err(&client->dev, "could not get IRQ %d\n", client->irq);
> -               return err;
> -       }
> -
> -       i2c_set_clientdata(client, lm);
> -
> -       device_init_wakeup(&client->dev, 1);
> -       enable_irq_wake(client->irq);
> -
> -       return 0;
> -}
> -
> -/*
> - * We don't need to explicitly suspend the chip, as it already switches off
> - * when there's no activity.
> - */
> -static int lm8323_suspend(struct device *dev)
> -{
> -       struct i2c_client *client = to_i2c_client(dev);
> -       struct lm8323_chip *lm = i2c_get_clientdata(client);
> -       int i;
> -
> -       irq_set_irq_wake(client->irq, 0);
> -       disable_irq(client->irq);
> -
> -       scoped_guard(mutex, &lm->lock) {
> -               lm->pm_suspend = true;
> -       }
> -
> -       for (i = 0; i < 3; i++)
> -               if (lm->pwm[i].enabled)
> -                       led_classdev_suspend(&lm->pwm[i].cdev);
> -
> -       return 0;
> -}
> -
> -static int lm8323_resume(struct device *dev)
> -{
> -       struct i2c_client *client = to_i2c_client(dev);
> -       struct lm8323_chip *lm = i2c_get_clientdata(client);
> -       int i;
> -
> -       scoped_guard(mutex, &lm->lock) {
> -               lm->pm_suspend = false;
> -       }
> -
> -       for (i = 0; i < 3; i++)
> -               if (lm->pwm[i].enabled)
> -                       led_classdev_resume(&lm->pwm[i].cdev);
> -
> -       enable_irq(client->irq);
> -       irq_set_irq_wake(client->irq, 1);
> -
> -       return 0;
> -}
> -
> -static DEFINE_SIMPLE_DEV_PM_OPS(lm8323_pm_ops, lm8323_suspend, lm8323_resume);
> -
> -static const struct i2c_device_id lm8323_id[] = {
> -       { .name = "lm8323" },
> -       { }
> -};
> -
> -static struct i2c_driver lm8323_i2c_driver = {
> -       .driver = {
> -               .name           = "lm8323",
> -               .pm             = pm_sleep_ptr(&lm8323_pm_ops),
> -               .dev_groups     = lm8323_groups,
> -       },
> -       .probe          = lm8323_probe,
> -       .id_table       = lm8323_id,
> -};
> -MODULE_DEVICE_TABLE(i2c, lm8323_id);
> -
> -module_i2c_driver(lm8323_i2c_driver);
> -
> -MODULE_AUTHOR("Timo O. Karjalainen <timo.o.karjalainen@nokia.com>");
> -MODULE_AUTHOR("Daniel Stone");
> -MODULE_AUTHOR("Felipe Balbi <felipe.balbi@nokia.com>");
> -MODULE_DESCRIPTION("LM8323 keypad driver");
> -MODULE_LICENSE("GPL");
> -
> diff --git a/include/linux/platform_data/lm8323.h b/include/linux/platform_data/lm8323.h
> deleted file mode 100644
> index 311999260614..000000000000
> --- a/include/linux/platform_data/lm8323.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0-only */
> -/*
> - * lm8323.h - Configuration for LM8323 keypad driver.
> - */
> -
> -#ifndef __LINUX_LM8323_H
> -#define __LINUX_LM8323_H
> -
> -#include <linux/types.h>
> -
> -/*
> - * Largest keycode that the chip can send, plus one,
> - * so keys can be mapped directly at the index of the
> - * LM8323 keycode instead of subtracting one.
> - */
> -#define LM8323_KEYMAP_SIZE     (0x7f + 1)
> -
> -#define LM8323_NUM_PWMS                3
> -
> -struct lm8323_platform_data {
> -       int debounce_time; /* Time to watch for key bouncing, in ms. */
> -       int active_time; /* Idle time until sleep, in ms. */
> -
> -       int size_x;
> -       int size_y;
> -       bool repeat;
> -       const unsigned short *keymap;
> -
> -       const char *pwm_names[LM8323_NUM_PWMS];
> -
> -       const char *name; /* Device name. */
> -};
> -
> -#endif /* __LINUX_LM8323_H */
> --
> 2.56.0.506.g506a7eabc5-goog
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] Input: lm8323 - remove driver
  2026-11-09  7:29 ` [PATCH 1/2] Input: lm8323 - remove driver Dmitry Torokhov
  2026-11-09  7:46   ` khj
@ 2026-11-09  7:53   ` Arnd Bergmann
  2026-11-09  8:01     ` Dmitry Torokhov
  1 sibling, 1 reply; 8+ messages in thread
From: Arnd Bergmann @ 2026-11-09  7:53 UTC (permalink / raw)
  To: Dmitry Torokhov, Wolfram Sang
  Cc: Felipe Balbi, Tony Lindgren, Hyunjung Ko, linux-input, linux-kernel

On Mon, Nov 9, 2026, at 08:29, Dmitry Torokhov wrote:
> The LM8323 keypad driver relies exclusively on legacy platform data,
> has no Device Tree or generic device property support, and has no users
> in mainline (including the Nokia N810 DTS, which never added support
> for it). Its PWM/LED handling and unbind lifetime are broken, and after
> hardware-tested IRQ fixes in 2011 the driver has for over a decade only
> received mechanical API conversions and static-analysis cleanups
> without hardware testing.
>
> An inquiry on the mailing list asking whether anyone still uses or
> wishes to keep the driver received no objections. Remove the driver
> and its platform data header.
>
> Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Reviewed-by: Arnd Bergmann <arnd@arndb.de>

I made an identical patch (for both drivers combined) based on the
same conclusion, but you beat me to posting it.

I have additional Input driver patches in the same series at

https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=board-remove-7.4

It's a mix of three types of changes:

- drivers that have been unused for years
- drivers that become unused after I remove the board files
- drivers that support both DT and platform_data, and I remove the latter

My plan was to post these after my board removal series is merged,
and this got delayed until 7.5 now after some back and forth because
I wanted to make sure they remain in the LTS kernel.

If you like, I can send more of these earlier.

      Arnd

2fc6e4e7ae89 Input: serio: remove RiscPC keyboard driver
 drivers/input/serio/Kconfig  |  11 ----
 drivers/input/serio/Makefile |   1 -
 drivers/input/serio/rpckbd.c | 152 -------------------------------------------
 3 files changed, 164 deletions(-)
48553e29487a Input: mouse: remove RiscPC mouse driver
 drivers/input/mouse/Kconfig    |  10 ----
 drivers/input/mouse/Makefile   |   1 -
 drivers/input/mouse/rpcmouse.c | 113 -----------------------------------------
 3 files changed, 124 deletions(-)
cc705b30670f Input: touchscreen: remove unused iPaq micro driver
 drivers/input/touchscreen/Kconfig         |  12 ---
 drivers/input/touchscreen/Makefile        |   1 -
 drivers/input/touchscreen/ipaq-micro-ts.c | 156 ------------------------------
 3 files changed, 169 deletions(-)
e0fa7869cf39 Input: touchscreen: remove HP jornada720 support
 drivers/input/touchscreen/Kconfig         |  10 --
 drivers/input/touchscreen/Makefile        |   1 -
 drivers/input/touchscreen/jornada720_ts.c | 156 ------------------------------
 3 files changed, 167 deletions(-)
0e7bc6741e99 Input: touchscreen: remove unused mc13783 driver
 drivers/input/touchscreen/Kconfig      |  12 --
 drivers/input/touchscreen/Makefile     |   1 -
 drivers/input/touchscreen/mc13783_ts.c | 245 ---------------------------------
 3 files changed, 258 deletions(-)
b106094d20b6 Input: touchscreen: remove unused ad7877 driver
 drivers/input/touchscreen/Kconfig  |  13 -
 drivers/input/touchscreen/Makefile |   1 -
 drivers/input/touchscreen/ad7877.c | 813 -------------------------------------
 3 files changed, 827 deletions(-)
618f5f964ae6 Input: touchscreen: remove unused tps6507x driver
 drivers/input/touchscreen/Kconfig       |  12 --
 drivers/input/touchscreen/Makefile      |   1 -
 drivers/input/touchscreen/tps6507x-ts.c | 291 --------------------------------
 3 files changed, 304 deletions(-)
f19aee30274b Input: serio: remove sa1111 ps/2 driver
 drivers/input/serio/Kconfig     |   4 -
 drivers/input/serio/Makefile    |   1 -
 drivers/input/serio/sa1111ps2.c | 384 ----------------------------------------
 3 files changed, 389 deletions(-)
f89e36a6d981 Input: keyboard: remove unused ipaq-micro driver
 drivers/input/keyboard/Kconfig           |  10 --
 drivers/input/keyboard/Makefile          |   1 -
 drivers/input/keyboard/ipaq-micro-keys.c | 165 -------------------------------
 3 files changed, 176 deletions(-)
f47f4668b39e Input: keyboard: remove unused locomo driver
 drivers/input/keyboard/Kconfig     |   8 -
 drivers/input/keyboard/Makefile    |   1 -
 drivers/input/keyboard/locomokbd.c | 340 -------------------------------------
 3 files changed, 349 deletions(-)
94397d400e71 Input: keyboard: remove unused jornada720_kbd driver
 drivers/input/keyboard/Kconfig          |  10 ---
 drivers/input/keyboard/Makefile         |   1 -
 drivers/input/keyboard/jornada720_kbd.c | 142 --------------------------------
 3 files changed, 153 deletions(-)
45a0b5d9aec8 Input: keyboard: remove lm8323 and lm8333 drivers
 drivers/input/keyboard/Kconfig  |  22 --
 drivers/input/keyboard/Makefile |   2 -
 drivers/input/keyboard/lm8323.c | 813 ----------------------------------------
 drivers/input/keyboard/lm8333.c | 213 -----------
 4 files changed, 1050 deletions(-)
7b34e2e324ff Input: joystick: remove as5011 joystick driver
 drivers/input/joystick/Kconfig  |  10 --
 drivers/input/joystick/Makefile |   1 -
 drivers/input/joystick/as5011.c | 354 ----------------------------------------
 3 files changed, 365 deletions(-)
62cfa3e37cba Input: misc: remove unused mc13783-pwrbutton driver
 drivers/input/misc/Kconfig             |  10 --
 drivers/input/misc/Makefile            |   1 -
 drivers/input/misc/mc13783-pwrbutton.c | 266 ---------------------------------
 3 files changed, 277 deletions(-)
e907244315b7 Input: misc: remove unused cma3000 accelerometer driver
 drivers/input/misc/Kconfig           |  24 ---
 drivers/input/misc/Makefile          |   2 -
 drivers/input/misc/cma3000_d0x.c     | 379 -----------------------------------
 drivers/input/misc/cma3000_d0x.h     |  31 ---
 drivers/input/misc/cma3000_d0x_i2c.c | 113 -----------
 5 files changed, 549 deletions(-)
9dcaab7ec67a Input: misc: remove unused kxtj9 driver
 drivers/input/misc/Kconfig  |  10 -
 drivers/input/misc/Makefile |   1 -
 drivers/input/misc/kxtj9.c  | 548 --------------------------------------------
 3 files changed, 559 deletions(-)
82f1f73d7331 Input: misc: remove unused max8997_haptic driver
 drivers/input/misc/Kconfig          |  12 -
 drivers/input/misc/Makefile         |   1 -
 drivers/input/misc/max8997_haptic.c | 434 ------------------------------------
 3 files changed, 447 deletions(-)
8a21394cb9e7 Input: misc: remove unused bma150 driver
 drivers/input/misc/Kconfig  |  10 -
 drivers/input/misc/Makefile |   1 -
 drivers/input/misc/bma150.c | 575 --------------------------------------------
 3 files changed, 586 deletions(-)
a25190646153 Input: misc: bma150: remove platform data based probing
 drivers/input/misc/bma150.c | 49 ++++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 18 deletions(-)
3ee02d394861 Input: misc: remove unused adxl34x driver
 drivers/input/misc/Kconfig       |  37 --
 drivers/input/misc/Makefile      |   3 -
 drivers/input/misc/adxl34x-i2c.c | 137 ------
 drivers/input/misc/adxl34x-spi.c | 103 -----
 drivers/input/misc/adxl34x.c     | 872 ---------------------------------------
 drivers/input/misc/adxl34x.h     |  30 --
 6 files changed, 1182 deletions(-)
7303850802da Input: misc: remove unused ad714x driver
 drivers/input/misc/Kconfig      |   30 -
 drivers/input/misc/Makefile     |    3 -
 drivers/input/misc/ad714x-i2c.c |   97 ----
 drivers/input/misc/ad714x-spi.c |  103 ----
 drivers/input/misc/ad714x.c     | 1200 ---------------------------------------
 drivers/input/misc/ad714x.h     |   53 --
 6 files changed, 1486 deletions(-)
067581d4518d mfd: remove unused da903x driver
 drivers/input/touchscreen/Kconfig     |  13 --
 drivers/input/touchscreen/Makefile    |   1 -
 drivers/input/touchscreen/da9034-ts.c | 364 ----------------------------------
 3 files changed, 378 deletions(-)
0403fd11877e mfd: remove unused adp5520 driver
 drivers/input/keyboard/Kconfig        |  10 --
 drivers/input/keyboard/Makefile       |   1 -
 drivers/input/keyboard/adp5520-keys.c | 190 ----------------------------------
 3 files changed, 201 deletions(-)
d26d231fe10b mfd: remove unused 88pm80x driver
 drivers/input/misc/88pm80x_onkey.c | 152 -------------------------------------
 drivers/input/misc/Kconfig         |  10 ---
 drivers/input/misc/Makefile        |   1 -
 3 files changed, 163 deletions(-)


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] Input: lm8323 - remove driver
  2026-11-09  7:53   ` Arnd Bergmann
@ 2026-11-09  8:01     ` Dmitry Torokhov
  0 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2026-11-09  8:01 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Wolfram Sang, Felipe Balbi, Tony Lindgren, Hyunjung Ko,
	linux-input, linux-kernel

On Mon, Nov 09, 2026 at 08:53:58AM +0100, Arnd Bergmann wrote:
> On Mon, Nov 9, 2026, at 08:29, Dmitry Torokhov wrote:
> > The LM8323 keypad driver relies exclusively on legacy platform data,
> > has no Device Tree or generic device property support, and has no users
> > in mainline (including the Nokia N810 DTS, which never added support
> > for it). Its PWM/LED handling and unbind lifetime are broken, and after
> > hardware-tested IRQ fixes in 2011 the driver has for over a decade only
> > received mechanical API conversions and static-analysis cleanups
> > without hardware testing.
> >
> > An inquiry on the mailing list asking whether anyone still uses or
> > wishes to keep the driver received no objections. Remove the driver
> > and its platform data header.
> >
> > Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
> > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> 
> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
> 
> I made an identical patch (for both drivers combined) based on the
> same conclusion, but you beat me to posting it.
> 
> I have additional Input driver patches in the same series at
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/arnd/playground.git/log/?h=board-remove-7.4
> 
> It's a mix of three types of changes:
> 
> - drivers that have been unused for years
> - drivers that become unused after I remove the board files
> - drivers that support both DT and platform_data, and I remove the latter
> 
> My plan was to post these after my board removal series is merged,
> and this got delayed until 7.5 now after some back and forth because
> I wanted to make sure they remain in the LTS kernel.
> 
> If you like, I can send more of these earlier.

Please send them to me so I can queue them: this way there's less chance
someone sends cleanup patches for them. And then they will be gone from
7.5.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] Input: lm8333 - remove driver
  2026-11-09  7:29 ` [PATCH 2/2] Input: lm8333 " Dmitry Torokhov
@ 2026-11-09 17:32   ` Wolfram Sang
  2026-11-09 17:39   ` Arnd Bergmann
  1 sibling, 0 replies; 8+ messages in thread
From: Wolfram Sang @ 2026-11-09 17:32 UTC (permalink / raw)
  To: Dmitry Torokhov
  Cc: Wolfram Sang, Arnd Bergmann, Felipe Balbi, Tony Lindgren,
	Hyunjung Ko, linux-input, linux-kernel

On Sun, Nov 08, 2026 at 11:29:50PM -0800, Dmitry Torokhov wrote:
> The LM8333 keypad driver relies exclusively on legacy platform data,
> has no Device Tree or generic device property support, and has no
> users in mainline. The BSP board file it was originally written for
> was never upstreamed, and the original author Wolfram Sang confirmed
> in the mailing list discussion that it will likely never be converted
> to Device Tree and agreed to dropping it.
> 
> Remove the driver and its platform data header.
> 
> Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
> Link: https://lore.kernel.org/r/Zr6PnlsdoyLoX261@shikoro
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Acked-by: Wolfram Sang <wsa+renesas@sang-engineering.com>


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] Input: lm8333 - remove driver
  2026-11-09  7:29 ` [PATCH 2/2] Input: lm8333 " Dmitry Torokhov
  2026-11-09 17:32   ` Wolfram Sang
@ 2026-11-09 17:39   ` Arnd Bergmann
  1 sibling, 0 replies; 8+ messages in thread
From: Arnd Bergmann @ 2026-11-09 17:39 UTC (permalink / raw)
  To: Dmitry Torokhov, Wolfram Sang
  Cc: Felipe Balbi, Tony Lindgren, Hyunjung Ko, linux-input, linux-kernel

On Mon, Nov 9, 2026, at 08:29, Dmitry Torokhov wrote:
> The LM8333 keypad driver relies exclusively on legacy platform data,
> has no Device Tree or generic device property support, and has no
> users in mainline. The BSP board file it was originally written for
> was never upstreamed, and the original author Wolfram Sang confirmed
> in the mailing list discussion that it will likely never be converted
> to Device Tree and agreed to dropping it.
>
> Remove the driver and its platform data header.
>
> Link: https://lore.kernel.org/r/Zr6I9RB5mibU_12N@google.com
> Link: https://lore.kernel.org/r/Zr6PnlsdoyLoX261@shikoro
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

Reviewed-by: Arnd Bergmann <arnd@arndb.de>

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2026-11-09 17:39 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-09  7:29 [PATCH 0/2] Input: remove unused lm8323 and lm8333 keypad drivers Dmitry Torokhov
2026-11-09  7:29 ` [PATCH 1/2] Input: lm8323 - remove driver Dmitry Torokhov
2026-11-09  7:46   ` khj
2026-11-09  7:53   ` Arnd Bergmann
2026-11-09  8:01     ` Dmitry Torokhov
2026-11-09  7:29 ` [PATCH 2/2] Input: lm8333 " Dmitry Torokhov
2026-11-09 17:32   ` Wolfram Sang
2026-11-09 17:39   ` Arnd Bergmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®