From nobody Sat Apr 4 00:05:59 2026 Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 060FB34846C for ; Sat, 21 Mar 2026 20:26:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124774; cv=none; b=tg6PXRSblnOZSm9GewawZUiIS1CHCyFacyrF512+Ph5IlrU+I5if/4JrnOOgPzsqAEphcnyBDMxgI/F/VZ0AUmJwVewp0TI6+oQFWxTrQt8UNJ1IKyUuBLtrumLZXrz0xHY02i5U2rRZi39pml8aJ8r+uqowJtXqHR/e4oCMCPw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124774; c=relaxed/simple; bh=t4iTwfSbP9CDr6QHSr/r6bwsNo7DCFcSSmYQhYBQhGY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ryQZeiUQlDvgVWAG+vdHf573hxwnbGiQOpBh9ixB03EBwWHZpIwS1QVeqRFgfiYugRlnLFJZjdgWjV2MtMebxRNt0WpaQIL0TqcCIEidWfPZ9IXARUGLKJNHPt2iE2+jh/15XLNz6ukwN0UqUklYNzdkyIzZjzPtqcBbi7fjwaU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=d7a27cpE; arc=none smtp.client-ip=209.85.221.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="d7a27cpE" Received: by mail-vk1-f172.google.com with SMTP id 71dfb90a1353d-56a857578a8so607971e0c.3 for ; Sat, 21 Mar 2026 13:26:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774124772; x=1774729572; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2D90xvcAA0cYxqSav09Tazhs8VainBkG84YypcNOQbY=; b=d7a27cpEbBwVLjnfingo/ki9ASUHTKVswX07ny6OgcXEi/wyyYaWWQXalr+kHuGlch CIKH6zJHXCEbXxnOXhJEBEzZiCGTEyUYtvZDxQH2CuPs12A/cWxZMzchXtTj9zFjXfGq ydxKtLXm+ekO3BhiJAYtQL+hGq0E1vKL99DhieRqUtj1HykRHTa9umLUsTkzNL5q3uvD Shh66MalIJBGn5crmMzR4RJO56YgsSKr3vlQLwratnm4SKXZ/1ykGA01RNRh+aGFhQW4 P/5fDYgf1+ENRuMVF6IyxdGfSD3zBmHr5+O4eZrJX03OEnZpsLQEay1E92jgKFVVMJnr 7C7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774124772; x=1774729572; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=2D90xvcAA0cYxqSav09Tazhs8VainBkG84YypcNOQbY=; b=WpkjYPCwM4DC+xNM9q2+WtIne6KcHltzhGdwBz6fCgxCsNuJMenbBsBpv5jcBbAeHi iWnvBu6eGGdOaabQbeqO0arsy79L7uMHZvFiY7eWs6HccC9/2OzV4XOZZchuWe52G/qW d2BWrDDk3rhhfb3tLMqlRJRO66dO4ophl59Ow4VNPbDZ9cRGeLNwGSXos3DcICajQyhV +O6lhYNGCRtPbEAyMkjSxIfzA93uhrWoaBPBQFMDsDYZ9DT0V02KmNm9E/sP6U66z9Ah +GiS+dEl9EPCPQVA2uXi+0mtGhpSNbXovSfwVrc2HGXcHdbc72MuSmurAYNEsEM7VfPZ cj1w== X-Forwarded-Encrypted: i=1; AJvYcCWHTLfwWLCWA/6ws/cWCZFoXihalL0U0MK2ulV/O4/FYCsAL3dbBYbU8+iGmtPet0+0cS+OvoLC9Qcz1mo=@vger.kernel.org X-Gm-Message-State: AOJu0YxPJPJ/+m3asdlC5Aq4kpCjM3vDyHJ+i67tuxJFO9EN1kHNbpGm dz2u01IsKx3UnsH+B8syJ9stq246c3009NsZB5L6uZH5VQGlYmJbPjYp X-Gm-Gg: ATEYQzw3LqjXxWxeqhdeB+lbozra5QkpDQCYjjjdON/t09ExL43K8DPH/9J2afTlM+B Dprv6AkNSiyXyqXkX+mOzp008FP0wRhVW2Bmy4g1U5aTfSuuew0OBtOpOf8uCx78FBZIA7540tT wWfQzMjaFsaEgd1auKJlptLQa4skneWh6TNgfQY38oEVpyFi10UPIDSb2wabSaYLFb1ugeyJ2/9 hJAJNkU0LNgayKIRVCNRXpptSajqm9UNaMMQK1CyIHCDUjN566mDJhZM/BlcGyLR1Lk0vzXqXSP 98cN/XVnh28n/EWWPvfkWII4r5+KK3bBqYzE5nUAnlOcnZU6HEQprlF9HsP2rXU4y3FPP3FfFXJ BlY5ucNpCdQThotQme21xQkThSEpWVDjKOrwGn3X/MRmeB+hXfQ7Qokpqi+FYilqSBL/Oh56wr4 7yHtYfDyGlxzDD8uyBIfCzhzvachgsjySjnw== X-Received: by 2002:a05:6102:8099:b0:5ff:c794:96b1 with SMTP id ada2fe7eead31-602ae78f43fmr3443168137.0.1774124771975; Sat, 21 Mar 2026 13:26:11 -0700 (PDT) Received: from charlesdias.. ([191.22.16.211]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-95136de53d9sm4144378241.8.2026.03.21.13.26.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 13:26:11 -0700 (PDT) From: charles.embedded@gmail.com To: Anshul Dalal , Dmitry Torokhov Cc: Shuah Khan , Brigham Campbell , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Charles Dias Subject: [PATCH 1/3] Input: adafruit-seesaw - switch to using dev_err_probe() Date: Sat, 21 Mar 2026 17:24:44 -0300 Message-ID: <20260321202446.724277-2-charles.embedded@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260321202446.724277-1-charles.embedded@gmail.com> References: <20260321202446.724277-1-charles.embedded@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Charles Dias Use dev_err_probe() instead of dev_err() in seesaw_probe function to improve error handling. Signed-off-by: Charles Dias --- drivers/input/joystick/adafruit-seesaw.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/drivers/input/joystick/adafruit-seesaw.c b/drivers/input/joyst= ick/adafruit-seesaw.c index c248c15b849d..177b42446e9b 100644 --- a/drivers/input/joystick/adafruit-seesaw.c +++ b/drivers/input/joystick/adafruit-seesaw.c @@ -277,17 +277,12 @@ static int seesaw_probe(struct i2c_client *client) SEESAW_JOYSTICK_FUZZ, SEESAW_JOYSTICK_FLAT); =20 err =3D sparse_keymap_setup(seesaw->input_dev, seesaw_buttons_new, NULL); - if (err) { - dev_err(&client->dev, - "failed to set up input device keymap: %d\n", err); - return err; - } + if (err) + return dev_err_probe(&client->dev, err, "failed to set up input device k= eymap\n"); =20 err =3D input_setup_polling(seesaw->input_dev, seesaw_poll); - if (err) { - dev_err(&client->dev, "failed to set up polling: %d\n", err); - return err; - } + if (err) + return dev_err_probe(&client->dev, err, "failed to set up polling\n"); =20 input_set_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_INTERVAL_MS); @@ -295,10 +290,8 @@ static int seesaw_probe(struct i2c_client *client) input_set_min_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_MIN); =20 err =3D input_register_device(seesaw->input_dev); - if (err) { - dev_err(&client->dev, "failed to register joystick: %d\n", err); - return err; - } + if (err) + return dev_err_probe(&client->dev, err, "failed to register joystick\n"); =20 return 0; } From nobody Sat Apr 4 00:05:59 2026 Received: from mail-vs1-f42.google.com (mail-vs1-f42.google.com [209.85.217.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C4D3B30C37E for ; Sat, 21 Mar 2026 20:26:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.217.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124779; cv=none; b=DkV06ClernhHshXG9f2StuCdDRdR+dZqkKXZODXOLh9b0D7jwMuZjeTxXUTZUxsKTuWXMEv+zsEdocMn73BzVLZNfDgV3dR6BY3BU+gbETGpGw5A7Qwq62gl4dKlKwrPU1EkaPQHCnxUDyuj/4sESlbq4iCpDFiTrKvxIneMQAU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124779; c=relaxed/simple; bh=5ngumEjxfAFycPTzcVq1fGSTOt9ubavv/yYOSrGeaec=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VwTc/Acb8kQIjj3G544k7XE8BuNXDz0KCUdYqo7fAgmwno4wojc5H/jqJNndExQtKMFTmsxCwGvYRW3oKXWU9oy30C31QDGeCM397UDNRMrZaOFl3aShw1dOKi4Uy/2ZzAd1aQNvh3zez9ZjhqkoCopzPnR/hoNh4zPsAm75aBQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QzhcfBKQ; arc=none smtp.client-ip=209.85.217.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QzhcfBKQ" Received: by mail-vs1-f42.google.com with SMTP id ada2fe7eead31-6027ef7e068so2138082137.1 for ; Sat, 21 Mar 2026 13:26:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774124776; x=1774729576; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8fSugZcQTh0oH9WEdoXD6zAAOWVvT2ciBhlERPxyzt8=; b=QzhcfBKQqsqRSiN3XtxfMypNVDG6J38UqsfE+wbkr7j/4Bbry0HTaAbGhl3RuZCm7t V3YJ9/fBrhm+CkpnTnHp1u+rX5O4bH5LvSFPA00KoCaCz6T07vzBGeDKeIE4gJ7LAw3u xeGf64LuKNc6G+EDtc81wIlBO+kG9LM6Fh1l5szDD6HW5ircWPkBpt5A4GmyAsVR2VmR 3Z6EzC1vjFvrRj9fvWgB98Fxhf6s+uSjizPL5qAUP5ZTLz+cAuzZ9lhWC+G3iQw0QAyG jpEeRPIUEAzZwq/enkhM88afp4fAwToLXWEt6A9+8LNQw9ROys62tZ2T3fGRb1ttrNeR 1sng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774124776; x=1774729576; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=8fSugZcQTh0oH9WEdoXD6zAAOWVvT2ciBhlERPxyzt8=; b=Z95SIL9qw1dZz0QLEMZAYjQfHSOBegSy9nSsfMFmIkmasdE9HrRyXu39xKQb3X/8Nr +pSVY6uRNQ6hHCZLgpZHJvc70iJn72e1EHPUqj132Ei+6enWQ7yQtypEfCZWkFm4TYbB 3dMhiWgY4T8Y4vONYs+CzMgqkXMGDa2ha3aASoyA3IiV1PiQcyzXzNpfqWof//X3CX5B +yaEj/UgAeM6P1Z+RTRwcMfdsDleaScI99HM6V5zTGkDZqoXJ7nyoyx09P00F65GyK6w 8UEELAq4I0KQSsxStcEOwn/muq+mQAGUVZB5QiD5OSct4m0FOx3B7BWP0Bi/yjZ87Rlw 84fA== X-Forwarded-Encrypted: i=1; AJvYcCXZAdGM1hrB7gUxdUPABIy+BUzubRUvC3EjR+nyUaDBY3qVTAhDZM+LDX/Dtep0olpOsfdj6VHnpdN7DJ4=@vger.kernel.org X-Gm-Message-State: AOJu0Yz1MiE+61eVp+rv3zJEAXGS5RY/ISocGSRsLjGjyP57akVOtlOF OA929UjqoykvjAsPNzkzb+i8ZI6ikeYwflsdeOt2Zy2QCGKqfqxRDouU X-Gm-Gg: ATEYQzxCHBP09uJnzRbipd+3n9OgrEz5SDDtwKr0heE6CLEsfSwrnrmpvNYdVNPxuM1 MFj5uH1tfaGdL7yLJbV6QUupUqlmx2nflBGb4KhsGrHxK8s7Z3kHixoRP1lI8cJj42sLFlagWYO wUH5Es7C/ZVtmOx0cjNSyOz+/YGmXhVIXPrqISL7jX/fPmuSnSHPekD0SFWUOR4EAZIKzU1uZ2j Ch44QK6E4smlIjMoAE6RQuV6o4FyuFyXaqMpgHetCesKp+UpRaNUf2ZkaM+2yDMLCmPiEjcI9m7 xbpUK77f/42+wpgxq/QFRSSScUubHLHlEYWBc7MwYSoavTHVRWmByLyBAhRUnPofJ7sL0X6YSSq HujGvXZfLVq8sKkiwZGvqanZ9rAJzESEv6v7d3YdAotPoWGPJdok949j9++ePEEi3D2xYP8cyBo f91pWhKNcj88PRXosBgUszebVduj5tNk/ejw== X-Received: by 2002:a05:6102:38cd:b0:5fd:ff75:f437 with SMTP id ada2fe7eead31-602aed93dbfmr3558152137.33.1774124776545; Sat, 21 Mar 2026 13:26:16 -0700 (PDT) Received: from charlesdias.. ([191.22.16.211]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-95136de53d9sm4144378241.8.2026.03.21.13.26.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 13:26:15 -0700 (PDT) From: charles.embedded@gmail.com To: Anshul Dalal , Dmitry Torokhov Cc: Shuah Khan , Brigham Campbell , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Charles Dias Subject: [PATCH 2/3] Input: adafruit-seesaw - add interrupt support Date: Sat, 21 Mar 2026 17:24:45 -0300 Message-ID: <20260321202446.724277-3-charles.embedded@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260321202446.724277-1-charles.embedded@gmail.com> References: <20260321202446.724277-1-charles.embedded@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Charles Dias Use IRQ-driven reporting for button events when an interrupt is described in DTS. Joystick axis values still have no interrupt source, so axis reporting continues to use polling. When the DTS specifies an interrupt, the IRQ thread calls only seesaw_report_buttons(), avoiding unnecessary ADC reads on each button event. The polling path always calls seesaw_report_axes(), and calls seesaw_report_buttons() only when no IRQ is configured. This avoids concurrent access to button_state between the IRQ thread and the poll timer. When no interrupt is available, the driver falls back to fully polled operation. Also remove the now-unused seesaw_data structure. Axis values are read directly in seesaw_report_axes(), and button_state already lives in the driver data, where it persists across calls for state comparison. Signed-off-by: Charles Dias --- drivers/input/joystick/adafruit-seesaw.c | 141 +++++++++++++++++------ 1 file changed, 103 insertions(+), 38 deletions(-) diff --git a/drivers/input/joystick/adafruit-seesaw.c b/drivers/input/joyst= ick/adafruit-seesaw.c index 177b42446e9b..ed8896c639ce 100644 --- a/drivers/input/joystick/adafruit-seesaw.c +++ b/drivers/input/joystick/adafruit-seesaw.c @@ -11,8 +11,10 @@ * Product page: https://www.adafruit.com/product/5743 * Firmware and hardware sources: https://github.com/adafruit/Adafruit_See= saw * - * TODO: - * - Add interrupt support + * Interrupt support is available when the DTS defines an interrupt for the + * device. Button events are then driven by the seesaw INT line, while joy= stick + * axes are always polled since the seesaw ADC has no interrupt source. + * Without an interrupt, the driver falls back to fully polling mode. */ =20 #include @@ -21,6 +23,7 @@ #include #include #include +#include #include #include =20 @@ -31,12 +34,14 @@ #define SEESAW_GPIO_DIRCLR_BULK 0x0103 #define SEESAW_GPIO_BULK 0x0104 #define SEESAW_GPIO_BULK_SET 0x0105 +#define SEESAW_GPIO_INTENSET 0x0108 #define SEESAW_GPIO_PULLENSET 0x010b =20 #define SEESAW_STATUS_HW_ID 0x0001 #define SEESAW_STATUS_SWRST 0x007f =20 #define SEESAW_ADC_OFFSET 0x07 +#define SEESAW_ADC_REG(ch) (SEESAW_ADC_BASE | (SEESAW_ADC_OFFSET + (ch))) =20 #define SEESAW_BUTTON_A 0x05 #define SEESAW_BUTTON_B 0x01 @@ -67,12 +72,6 @@ struct seesaw_gamepad { u32 button_state; }; =20 -struct seesaw_data { - u16 x; - u16 y; - u32 button_state; -}; - static const struct key_entry seesaw_buttons_new[] =3D { { KE_KEY, SEESAW_BUTTON_A, .keycode =3D BTN_SOUTH }, { KE_KEY, SEESAW_BUTTON_B, .keycode =3D BTN_EAST }, @@ -142,39 +141,61 @@ static int seesaw_register_write_u32(struct i2c_clien= t *client, u16 reg, return 0; } =20 -static int seesaw_read_data(struct i2c_client *client, struct seesaw_data = *data) +static int seesaw_report_buttons(struct seesaw_gamepad *private) { - __be16 adc_data; + struct input_dev *input =3D private->input_dev; + unsigned long changed; + u32 button_state; __be32 read_buf; - int err; + int err, i; =20 - err =3D seesaw_register_read(client, SEESAW_GPIO_BULK, + err =3D seesaw_register_read(private->i2c_client, SEESAW_GPIO_BULK, &read_buf, sizeof(read_buf)); if (err) return err; =20 - data->button_state =3D ~be32_to_cpu(read_buf); + button_state =3D ~be32_to_cpu(read_buf) & SEESAW_BUTTON_MASK; + changed =3D private->button_state ^ button_state; + private->button_state =3D button_state; + + for_each_set_bit(i, &changed, fls(SEESAW_BUTTON_MASK)) { + if (!sparse_keymap_report_event(input, i, + button_state & BIT(i), false)) + dev_err_ratelimited(&input->dev, + "failed to report keymap event"); + } + + input_sync(input); + return 0; +} + +static int seesaw_report_axes(struct seesaw_gamepad *private) +{ + struct input_dev *input =3D private->input_dev; + __be16 adc_data; + int err; =20 - err =3D seesaw_register_read(client, - SEESAW_ADC_BASE | - (SEESAW_ADC_OFFSET + SEESAW_ANALOG_X), + err =3D seesaw_register_read(private->i2c_client, + SEESAW_ADC_REG(SEESAW_ANALOG_X), &adc_data, sizeof(adc_data)); if (err) return err; + /* * ADC reads left as max and right as 0, must be reversed since kernel * expects reports in opposite order. */ - data->x =3D SEESAW_JOYSTICK_MAX_AXIS - be16_to_cpu(adc_data); + input_report_abs(input, ABS_X, + SEESAW_JOYSTICK_MAX_AXIS - be16_to_cpu(adc_data)); =20 - err =3D seesaw_register_read(client, - SEESAW_ADC_BASE | - (SEESAW_ADC_OFFSET + SEESAW_ANALOG_Y), + err =3D seesaw_register_read(private->i2c_client, + SEESAW_ADC_REG(SEESAW_ANALOG_Y), &adc_data, sizeof(adc_data)); if (err) return err; =20 - data->y =3D be16_to_cpu(adc_data); + input_report_abs(input, ABS_Y, be16_to_cpu(adc_data)); + input_sync(input); =20 return 0; } @@ -182,42 +203,72 @@ static int seesaw_read_data(struct i2c_client *client= , struct seesaw_data *data) static int seesaw_open(struct input_dev *input) { struct seesaw_gamepad *private =3D input_get_drvdata(input); + int err; =20 private->button_state =3D 0; =20 + if (private->i2c_client->irq) { + /* + * Read and report current button state before enabling the + * edge-triggered IRQ. This deasserts any pending INT already + * latched by the chip since probe(), preventing the IRQ line + * from being stuck low on the first open. + */ + err =3D seesaw_report_buttons(private); + if (err) + return err; + + enable_irq(private->i2c_client->irq); + } + return 0; } =20 +static void seesaw_close(struct input_dev *input) +{ + struct seesaw_gamepad *private =3D input_get_drvdata(input); + + if (private->i2c_client->irq) + disable_irq(private->i2c_client->irq); +} + static void seesaw_poll(struct input_dev *input) { struct seesaw_gamepad *private =3D input_get_drvdata(input); - struct seesaw_data data; - unsigned long changed; - int err, i; + int err; =20 - err =3D seesaw_read_data(private->i2c_client, &data); + err =3D seesaw_report_axes(private); if (err) { dev_err_ratelimited(&input->dev, - "failed to read joystick state: %d\n", err); + "failed to read joystick axes: %d\n", err); return; } =20 - input_report_abs(input, ABS_X, data.x); - input_report_abs(input, ABS_Y, data.y); + /* + * In interrupt mode, buttons are reported exclusively by + * seesaw_irq_thread() to avoid concurrent access to button_state. + */ + if (!private->i2c_client->irq) { + err =3D seesaw_report_buttons(private); + if (err) + dev_err_ratelimited(&input->dev, + "failed to read button state: %d\n", err); + } +} =20 - data.button_state &=3D SEESAW_BUTTON_MASK; - changed =3D private->button_state ^ data.button_state; - private->button_state =3D data.button_state; +static irqreturn_t seesaw_irq_thread(int irq, void *dev_id) +{ + struct seesaw_gamepad *private =3D dev_id; + int err; =20 - for_each_set_bit(i, &changed, fls(SEESAW_BUTTON_MASK)) { - if (!sparse_keymap_report_event(input, i, - data.button_state & BIT(i), - false)) - dev_err_ratelimited(&input->dev, - "failed to report keymap event"); + err =3D seesaw_report_buttons(private); + if (err) { + dev_err_ratelimited(&private->input_dev->dev, + "failed to read button state: %d\n", err); + return IRQ_NONE; } =20 - input_sync(input); + return IRQ_HANDLED; } =20 static int seesaw_probe(struct i2c_client *client) @@ -268,6 +319,7 @@ static int seesaw_probe(struct i2c_client *client) seesaw->input_dev->name =3D "Adafruit Seesaw Gamepad"; seesaw->input_dev->phys =3D "i2c/" SEESAW_DEVICE_NAME; seesaw->input_dev->open =3D seesaw_open; + seesaw->input_dev->close =3D seesaw_close; input_set_drvdata(seesaw->input_dev, seesaw); input_set_abs_params(seesaw->input_dev, ABS_X, 0, SEESAW_JOYSTICK_MAX_AXIS, @@ -289,6 +341,19 @@ static int seesaw_probe(struct i2c_client *client) input_set_max_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_MAX); input_set_min_poll_interval(seesaw->input_dev, SEESAW_GAMEPAD_POLL_MIN); =20 + if (client->irq) { + err =3D seesaw_register_write_u32(client, SEESAW_GPIO_INTENSET, SEESAW_B= UTTON_MASK); + if (err) + return dev_err_probe(&client->dev, err, + "failed to enable hardware interrupts\n"); + + err =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, + seesaw_irq_thread, IRQF_ONESHOT | IRQF_NO_AUTOEN, + SEESAW_DEVICE_NAME, seesaw); + if (err) + return dev_err_probe(&client->dev, err, "failed to request IRQ\n"); + } + err =3D input_register_device(seesaw->input_dev); if (err) return dev_err_probe(&client->dev, err, "failed to register joystick\n"); From nobody Sat Apr 4 00:05:59 2026 Received: from mail-ua1-f51.google.com (mail-ua1-f51.google.com [209.85.222.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1777A36C9CA for ; Sat, 21 Mar 2026 20:26:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124783; cv=none; b=uG9ClxqHpeC2hmnkGCJqxv53Hi6+7XuL+Inv1/Za0fI/s+VEWR/761kSl3nxCE4bBfpe44vILLj51G7veC5MLG6vP1+FWCrt2LSKDL3JrQko70TzY1fwwC9KizBKJEHVi9Y9F+WS3+2OmHu2pj6oo75VqGvz/CMR+xjZAKgcF9s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774124783; c=relaxed/simple; bh=1ZJ4UW9VNpIfmKRylDWx30ZOWztqjUmTC5cFRStSjqo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kU9Ngz6KJf9/dTR8Za+EDoPyMw9bnZ9Y9TdPX4I//NSwA/wrLU/+Wva3HCOKyDn2Rmh81AzVrR/1Bvp3cKvKBqAvSfvltcaPcx3icGiwPrc+BQ00OE5KIJ0t3xNf3TvftSPxw9181DbBl85QDna3uIdG0CvLldyofrgz1AOOeo4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LUeOylC1; arc=none smtp.client-ip=209.85.222.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LUeOylC1" Received: by mail-ua1-f51.google.com with SMTP id a1e0cc1a2514c-94dd7178d63so1603097241.3 for ; Sat, 21 Mar 2026 13:26:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1774124781; x=1774729581; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ezBRmG+B1qFanDOxUrd5DeB6YRPxeO5OjVC/69MyO+U=; b=LUeOylC1J4LjzEefRcqOjokeZJ4N4T5f6dvFIcm9EjIR2BMnc/aLpY9e6ubvdWFlTq Ppr44hFn+nOVdZURtlwkL7lYpNKOxMNXTnq8n7PG6SS1ZmvXpDffLSfNyN1J2HCDSBBl P12B7hDwLc8TSlEx7JoeKOs8rCbToG++NQAXkDk796z2MQWqb8q9bjO/DwoA37Hk/Nbf YVKVJl8VbM0rlziwKhDEWPLSjLxtjI3ebz9dQj8zG+drBc7l7gmoMyLFrRmDLWhaV72D vj88ZPC8Pf4K5IHUS4ZZTSt24Iq73/G2LYMNsHCH9FnXdsVNJj1WdHgm/TivP0knb92T fgoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774124781; x=1774729581; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ezBRmG+B1qFanDOxUrd5DeB6YRPxeO5OjVC/69MyO+U=; b=PsPM7a6Zsnm52mCiSG/voZU6/Nl/RT/CmmuCek1Xp+wzUGFtg6/3X+2g5hx0H3k8bL Os9H7kbpY9DfuyPUgS9kWeAWq9Lg2TBOG8VOwSzhZTW7E3y4gzvOER1aQlkKfQ4BUf7z OZj0inliy1ljKgP7wYmQCr+gaU4xHfA9/PHmJs0+y9PJNYotwe2buhEmniQsxpi9wHXL YmVHPZLa9ZehAqkskNTJHJ2CXVLKBwnNiIWIVTfjeT+XXeCVnyo/8pTj5UpofpSYbknV 1FS/ZOWiraZ7+i8uSpbFwfhYR8A430SAhtabrvZoElMwYZG1zPgDGAdDAid6GceFVo6u q39w== X-Forwarded-Encrypted: i=1; AJvYcCWY7W2M9k+t4U3v6R4T1ri5Zxpf5mGX3gGot1KAyHRwGHHBzLPCDEbPaxlrp16ICGV/Gpcp0YVTgfe4GRU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6tlfGXWr7uOflU6G7aHIBYnmRl93YrLoP1IjevXA8ppi5m4ZQ 0lppcEB+7J1mU4SeUcr+QU+Ucs9mk5PTL9ak1bjYVRmAkHVrrsuHopjK X-Gm-Gg: ATEYQzyVPcy2g+KpC584lEgEIUtM953zIfQjouIXN8YpQLJXiiWS7ff4uLQ4ZpDb/0p 6USiY39gg86TRKAfFsQhIfRzbPZtdqzFbClJLuu6udt35NDpLPKhDRAQlWPCHTLQfVztQAqtmIv by49QsK3SHxVcQRppBfF4mqhM99nfavJ2fDmNBm7/x7qYFXl4kdg8BPVZGkbCZuWGGAAYbkMSh3 2a87AvKzP2BM1cADfAL6KH2AE1mL555yiaKjxeSlvzCb+X0RXbqlUgVA58OT/gWin4nXaBk30ag f19iX69HUAZlk1TUnPYLYHg0nd6f6YoYevkodzgVTiW7gKJK+KGptghP6SIgJjPnpEkdYEB+SM8 XCE2Y08e3kZuHrvITOr4vUFcNRJTizxMtmS7aapo8EBlgzq1L1khjPBceSWpaKfYsURTLz9rc55 ZgGE+szqB/2nWFx+wMGeYHNJm9Q+5vZD/UNQ== X-Received: by 2002:a05:6102:4194:b0:5fe:12c9:6e5a with SMTP id ada2fe7eead31-602aeb0234emr3859545137.12.1774124781101; Sat, 21 Mar 2026 13:26:21 -0700 (PDT) Received: from charlesdias.. ([191.22.16.211]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-95136de53d9sm4144378241.8.2026.03.21.13.26.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Mar 2026 13:26:19 -0700 (PDT) From: charles.embedded@gmail.com To: Anshul Dalal , Dmitry Torokhov Cc: Shuah Khan , Brigham Campbell , linux-input@vger.kernel.org, linux-kernel@vger.kernel.org, Charles Dias Subject: [PATCH 3/3] dt-bindings: input: adafruit-seesaw-gamepad: fix interrupt polarity Date: Sat, 21 Mar 2026 17:24:46 -0300 Message-ID: <20260321202446.724277-4-charles.embedded@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260321202446.724277-1-charles.embedded@gmail.com> References: <20260321202446.724277-1-charles.embedded@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Charles Dias The INT line is open-drain and asserts low on button GPIO changes, so the binding should describe a falling-edge trigger rather than rising edge. Also update the example to use IRQ_TYPE_EDGE_FALLING and add interrupt-parent, and clarify that the driver can fall back to polling when no IRQ is wired. Signed-off-by: Charles Dias --- .../bindings/input/adafruit,seesaw-gamepad.yaml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Documentation/devicetree/bindings/input/adafruit,seesaw-gamepa= d.yaml b/Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.ya= ml index 5e86f6de6978..f0ebb326bf74 100644 --- a/Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml +++ b/Documentation/devicetree/bindings/input/adafruit,seesaw-gamepad.yaml @@ -25,6 +25,11 @@ description: | SE -> Select X, A, B, Y -> Digital action buttons =20 + The gamepad exposes button events through the seesaw GPIO block and joys= tick + axes through the seesaw ADC block. If the optional IRQ pin is wired, but= ton + presses can be interrupt-driven while joystick axes remain polled. Witho= ut an + IRQ, the driver falls back to fully polled operation. + Datasheet: https://cdn-learn.adafruit.com/downloads/pdf/gamepad-qt.pdf Product page: https://www.adafruit.com/product/5743 Arduino Driver: https://github.com/adafruit/Adafruit_Seesaw @@ -39,7 +44,9 @@ properties: interrupts: maxItems: 1 description: - The gamepad's IRQ pin triggers a rising edge if interrupts are enabl= ed. + Optional interrupt from the gamepad's open-drain INT pin. The device + asserts INT low on button GPIO changes when interrupts are enabled i= n the + seesaw firmware, so the host should typically use a falling-edge tri= gger. =20 required: - compatible @@ -57,7 +64,8 @@ examples: =20 joystick@50 { compatible =3D "adafruit,seesaw-gamepad"; - interrupts =3D <18 IRQ_TYPE_EDGE_RISING>; + interrupt-parent =3D <&gpio1>; + interrupts =3D <18 IRQ_TYPE_EDGE_FALLING>; reg =3D <0x50>; }; };