From nobody Sun May 10 05:00:19 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 907E815B0EC; Sun, 19 Apr 2026 16:21:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776615670; cv=pass; b=nWeJIiYfWZjrMxhguVsm3wUGJ36gZViSQhiB2dRcDzu6OjxjJRa5NvXIHwyVjwMSI/mniIMAWc4rSn2NjXziHqArOAOpTTRZtPXqrpfVH4Jky65uVMb4fUWwTUM48LI4fVbp2vKi24M5T51XCjEEW7T9AodWTc0AsbzvFhJj0Tw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776615670; c=relaxed/simple; bh=ypLXZP0uoQMatmZPXY9s7cHRuiHe/rLoVEu+5IH1yGU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dy/ZRO3nlYjvDUTX0lgMJM8GyHg1SNKT6hNZznAQyHKZcT18odx8bvJEJZORbQaXdxZykwawc8cy6HMOk3xHLPBYZMn5cxXSTvrfmRNKlAyt4k05jfZQU+mxIXPAzOITN+49ZS/tQed0noF+8JqruLLRVRLoERHTsBuQwDBJRBA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=j13Z8/sr; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="j13Z8/sr" Received: from darkstar.. (unknown [83.245.248.121]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: aaro.koskinen) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4fzDPt06dMz49QF8; Sun, 19 Apr 2026 19:21:05 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1776615666; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W7XO7FWqgom7KsF2M6YEpOhwdlIoM/d76jegJD5iWQk=; b=j13Z8/sr2T+KrAXPl3KsZemAHnbHEEPQGZsUe9tC/oTyUM/omBgGhyiDPEOX4WRd+/ePsx cIB0g1KgvhC66GlBQdAvBMOPCdYapT9siR5lP0KUtsBkHo3YUBujpJ4FTFLRvMg1d9r7T/ A4xBfxzLw3tBlJzBas2YnBmdkcO3sv0lxCwuKnlWrscv7FgsioIXH5wj3rjfZ6eCeauVxm R0ct8ir+uUgX4qTTgLU+mtcaGT+NoFs/JTq3KNHL1z0gppAM7GATxIUsT5XNvmpENP6I38 GeKZx9ViVYbdAO8Qk6VE9MFSMlaFrkeCOPADJR6LL5/HvjaYgC+LQbHSvhCdwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1776615666; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=W7XO7FWqgom7KsF2M6YEpOhwdlIoM/d76jegJD5iWQk=; b=BbutvFAxZ7nU+bt6MNF/xhLWciDL14mdVYlTeERUOghlPkqbSmpxOwo5K4pX2SK6k0lFAN V829y5ubbqU33gLGyiMpvTJgBf72sywv7MOOiuFKcmw6Ftq6zV5hT0iravDaR4mnY2g6P1 8u3L7h17aw+rca5qd3WujfbjBo9w/Z9+3cVPga6Kuq/9jEykLGJBDV/pmhvOWIaeLtWB63 w2I6+vOyS0kpQ2N8cccKSRYEZynwq+BWoQUA0VTtiJm3rC7bl5qk2Ke8yqH8CYvPGiMREW kKbfpUpobVv5SaQhobjCGm2nlFV1XH/Bba9Ej+IQFrLtEfxFMM2O42YtVFfzTA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=aaro.koskinen smtp.mailfrom=aaro.koskinen@iki.fi ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1776615666; b=biYK33woq0DJ9deRqyGRjs2IaI395llmvH0j+3dtYwxMTdl1j+IHisC4vWIlcykLiXA3VF QpmDle62LE+9VfRzhemc6G1HYKjkh8em/OjT8sTWjO7ZzLf32cGIC3Tl0XM/GELWl7K7TI B3er4YkLvtSy1RFkD0W/o0gvNMvpdHVesE3uwpOob8MDReJ+al/smfpw4LcdiKaQ6ohQ2V RKKtLf+d34JowPNmzzSo/P6VBDCarO2T5zSPmjuAr9wmTdHwmIGbJYQWaucfiSX8rzucjE A913USUCpwC+Z2cETRkaw/GijTY9zuCZvDHHKPuD+QenzrXNmw1KkQDzjm94tw== From: Aaro Koskinen To: Dmitry Torokhov , Oleksij Rempel , Janusz Krzysztofik , Tony Lindgren , Linus Walleij , linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, Aaro Koskinen Subject: [PATCH v2 1/2] Input: ads7846 - restore half-duplex support Date: Sun, 19 Apr 2026 19:18:47 +0300 Message-ID: <20260419161848.825831-2-aaro.koskinen@iki.fi> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260419161848.825831-1-aaro.koskinen@iki.fi> References: <20260419161848.825831-1-aaro.koskinen@iki.fi> 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" On some boards, the SPI controller is limited to half-duplex and the driver fails spamming "ads7846 spi2.1: spi_sync --> -22". Restore half-duplex support with multiple SPI transfers. Fixes: 9c9509717b53 ("Input: ads7846 - convert to full duplex") Signed-off-by: Aaro Koskinen Reviewed-by: Linus Walleij --- drivers/input/touchscreen/ads7846.c | 168 +++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 2 deletions(-) diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscree= n/ads7846.c index 0963b1a78a0c..4f8cc450e779 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -134,6 +134,9 @@ struct ads7846 { bool disabled; /* P: lock */ bool suspended; /* P: lock */ =20 + int (*setup_spi_msg)(struct ads7846 *ts, + const struct ads7846_platform_data *pdata); + void (*read_state)(struct ads7846 *ts); int (*filter)(void *data, int data_idx, int *val); void *filter_data; int (*get_pendown_state)(void); @@ -797,6 +800,22 @@ static int ads7846_filter(struct ads7846 *ts) return 0; } =20 +static int ads7846_filter_one(struct ads7846 *ts, unsigned int cmd_idx) +{ + struct ads7846_packet *packet =3D ts->packet; + struct ads7846_buf_layout *l =3D &packet->l[cmd_idx]; + int action, val; + + val =3D ads7846_get_value(&packet->rx[l->offset + l->count - 1]); + action =3D ts->filter(ts->filter_data, cmd_idx, &val); + if (action =3D=3D ADS7846_FILTER_REPEAT) + return -EAGAIN; + else if (action !=3D ADS7846_FILTER_OK) + return -EIO; + ads7846_set_cmd_val(ts, cmd_idx, val); + return 0; +} + static void ads7846_wait_for_hsync(struct ads7846 *ts) { if (ts->wait_for_sync) { @@ -819,6 +838,45 @@ static void ads7846_wait_for_hsync(struct ads7846 *ts) cpu_relax(); } =20 +static void ads7846_halfd_read_state(struct ads7846 *ts) +{ + struct ads7846_packet *packet =3D ts->packet; + int msg_idx =3D 0; + + packet->ignore =3D false; + + while (msg_idx < ts->msg_count) { + int error; + + ads7846_wait_for_hsync(ts); + + error =3D spi_sync(ts->spi, &ts->msg[msg_idx]); + if (error) { + dev_err_ratelimited(&ts->spi->dev, "spi_sync --> %d\n", + error); + packet->ignore =3D true; + return; + } + + /* + * Last message is power down request, no need to convert + * or filter the value. + */ + if (msg_idx =3D=3D ts->msg_count - 1) + break; + + error =3D ads7846_filter_one(ts, msg_idx); + if (error =3D=3D -EAGAIN) { + continue; + } else if (error) { + packet->ignore =3D true; + msg_idx =3D ts->msg_count - 1; + } else { + msg_idx++; + } + } +} + static void ads7846_read_state(struct ads7846 *ts) { struct ads7846_packet *packet =3D ts->packet; @@ -947,7 +1005,7 @@ static irqreturn_t ads7846_irq(int irq, void *handle) while (!ts->stopped && get_pendown_state(ts)) { =20 /* pen is down, continue with the measurement */ - ads7846_read_state(ts); + ts->read_state(ts); =20 if (!ts->stopped) ads7846_report_state(ts); @@ -1034,6 +1092,102 @@ static int ads7846_setup_pendown(struct spi_device = *spi, return 0; } =20 +/* + * Set up the transfers to read touchscreen state; this assumes we + * use formula #2 for pressure, not #3. + */ +static int ads7846_halfd_spi_msg(struct ads7846 *ts, + const struct ads7846_platform_data *pdata) +{ + struct spi_message *m =3D ts->msg; + struct spi_transfer *x =3D ts->xfer; + struct ads7846_packet *packet =3D ts->packet; + int vref =3D pdata->keep_vref_on; + unsigned int offset =3D 0; + unsigned int cmd_idx, b; + size_t size =3D 0; + + if (pdata->settle_delay_usecs) + packet->count =3D 2; + else + packet->count =3D 1; + + if (ts->model =3D=3D 7846) + packet->cmds =3D 5; /* x, y, z1, z2, pwdown */ + else + packet->cmds =3D 3; /* x, y, pwdown */ + + for (cmd_idx =3D 0; cmd_idx < packet->cmds; cmd_idx++) { + struct ads7846_buf_layout *l =3D &packet->l[cmd_idx]; + unsigned int max_count; + + if (cmd_idx =3D=3D packet->cmds - 1) { + cmd_idx =3D ADS7846_PWDOWN; + max_count =3D 1; + } else { + max_count =3D packet->count; + } + + l->offset =3D offset; + offset +=3D max_count; + l->count =3D max_count; + l->skip =3D 0; + size +=3D sizeof(*packet->rx) * max_count; + } + + /* We use two transfers per command. */ + if (ARRAY_SIZE(ts->xfer) < offset * 2) + return -ENOMEM; + + packet->rx =3D devm_kzalloc(&ts->spi->dev, size, GFP_KERNEL); + if (!packet->rx) + return -ENOMEM; + + if (ts->model =3D=3D 7873) { + /* + * The AD7873 is almost identical to the ADS7846 + * keep VREF off during differential/ratiometric + * conversion modes. + */ + ts->model =3D 7846; + vref =3D 0; + } + + ts->msg_count =3D 0; + + for (cmd_idx =3D 0; cmd_idx < packet->cmds; cmd_idx++) { + struct ads7846_buf_layout *l =3D &packet->l[cmd_idx]; + u8 cmd; + + ts->msg_count++; + spi_message_init(m); + m->context =3D ts; + + if (cmd_idx =3D=3D packet->cmds - 1) + cmd_idx =3D ADS7846_PWDOWN; + + cmd =3D ads7846_get_cmd(cmd_idx, vref); + + for (b =3D 0; b < l->count; b++) { + packet->rx[l->offset + b].cmd =3D cmd; + x->tx_buf =3D &packet->rx[l->offset + b].cmd; + x->len =3D 1; + spi_message_add_tail(x, m); + x++; + x->rx_buf =3D &packet->rx[l->offset + b].data; + x->len =3D 2; + if (b < l->count - 1 && l->count > 1) { + x->delay.value =3D pdata->settle_delay_usecs; + x->delay.unit =3D SPI_DELAY_UNIT_USECS; + } + spi_message_add_tail(x, m); + x++; + } + m++; + } + return 0; +} + /* * Set up the transfers to read touchscreen state; this assumes we * use formula #2 for pressure, not #3. @@ -1248,6 +1402,14 @@ static int ads7846_probe(struct spi_device *spi) if (!ts) return -ENOMEM; =20 + if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) { + ts->setup_spi_msg =3D ads7846_halfd_spi_msg; + ts->read_state =3D ads7846_halfd_read_state; + } else { + ts->setup_spi_msg =3D ads7846_setup_spi_msg; + ts->read_state =3D ads7846_read_state; + } + packet =3D devm_kzalloc(dev, sizeof(struct ads7846_packet), GFP_KERNEL); if (!packet) return -ENOMEM; @@ -1342,7 +1504,9 @@ static int ads7846_probe(struct spi_device *spi) ts->core_prop.swap_x_y =3D true; } =20 - ads7846_setup_spi_msg(ts, pdata); + err =3D ts->setup_spi_msg(ts, pdata); + if (err) + return err; =20 ts->reg =3D devm_regulator_get(dev, "vcc"); if (IS_ERR(ts->reg)) { --=20 2.39.2 From nobody Sun May 10 05:00:19 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 54BA91C3C1F; Sun, 19 Apr 2026 16:21:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776615670; cv=pass; b=MX5MHPM82UFivnfa9gCrRq3ZSnalrynA26oIL05JGPmdNVYgsbArq7mx5edAxo5LBsXM4hMG5SRAsMYBjV3/73vbu6c575mQZevSySwS21PJd0TQa4CXOkF3AiZYpFgCunWAgrrSjKfy+b1Q9i3OzbE5ITS6yF4a7hpNE2NSonU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776615670; c=relaxed/simple; bh=61vVW5aGCnzVF4GoEJPKAGsyaoh4olcL1bjqP2JGL3A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TaxM1daq6m8iOx4a+BmVXgWelZRXALYXk3bgFqkVJcPje/ZJ8aS8YmBluCtctOhn64SbFfjYNiJNhLreGN05Vz0ASZseCYW1Y9jqkQy7YznoR7uHu4QuERikGwtHamaYU6zPSoqWbNZV97LbOhGXweCheHAUSPh7NCGNd7bVAdU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=KRzcMkLB; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="KRzcMkLB" Received: from darkstar.. (unknown [83.245.248.121]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: aaro.koskinen) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4fzDPv0z8Jz49QFl; Sun, 19 Apr 2026 19:21:07 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1776615667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JpcBR4k0LbC/Ndgf6TQTCcQuvX8Fc8RSJqb/Bb6m7Bo=; b=KRzcMkLB12GjNcjXxQI6w95I0GJx3/hleCQ7rVx02HnGzZFn8Qn6IeFRwvrCqD+Y/JVBLG +Y58FghU+AtLCrkLekAXUXz7U48vdCsW3B/UQaznrmIvZdO+koujI2f2KJg/m/vpbTDLg3 /l/qfBXVO4O061JWNTP8mSy2wVPkiKV5XYqPcGrmoX9zHCNh9J1D7e6E00Veb1u3yS0fy+ gVqCBDGZM3hieH5g3FgbMPZnLSbaeqE/1/yIybahy4uNDZ8zzXDdK3Gwdy9n92TLbVmVrC pUlIz74rIL3Njey3WzlJ3szpAgcYOoelLplAlH2aSeoPwKKnJIU5pcSULuHWcA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1776615667; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=JpcBR4k0LbC/Ndgf6TQTCcQuvX8Fc8RSJqb/Bb6m7Bo=; b=N2aSXXZOukfVNlRb5un21AKEHCdXmsx+HVZx4bUQogCFYc+GISwLvslWrOmOa/sAvFIsW5 tJuBEEC5oUcikBOi60o5tGkKfHWypR7lI7cLiW5+/2ZQZh6pv7MR7mTTAg90FGi5LAwhAm nXjrC4egxV+F641Ba79+8Xld+pR0u1EPmehDO4WeZw/hwyI0o4fzfaRNlejgEIk5wMquav lU6y8LhHcm7JYWx4VSiqyokulhtNIZv6dTUhqbtLpWmmW4VCE5yQ1Q6yANkMkOhju82vll K6gdYCez3k0sd3pxgtluklqnAAzl4DAjLUf2Ny58Fyesnj+QOoPB0f6aM6KPNA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=aaro.koskinen smtp.mailfrom=aaro.koskinen@iki.fi ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1776615667; b=TYxO1KuJ3rG6tTBlU6MdPmT/afCCcDZwgRkl44DiQeNJgNPwsYsShQVSlY7nFNsEHr1AVf afAruzwHQRXHUe7hYyCIUP7K63TMmhI3QvxaMsp7ouvOozSJUgv1SJXR9kNT33HmkQ8MxA OHtHsunnyAA9MEVooK5r5+EQ4fqWURpRh02YCTZMItW7Y8tx+ohcg8a8E5HXI/kmRKn/Tg VQy34HjZHDGgq4vwHfc6KJPEZX8MLVwedd2vT3FkpyByOtxXDfFdLTqys573ka4OTKSd4y TSjB/3mY2DCASXMAXnzYt39QV1aNiNBd45gFHx947Br11ZDT+WAPyeSjImFKJw== From: Aaro Koskinen To: Dmitry Torokhov , Oleksij Rempel , Janusz Krzysztofik , Tony Lindgren , Linus Walleij , linux-input@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org, Aaro Koskinen Subject: [PATCH v2 2/2] Input: ads7846 - fix up the pendown GPIO setup on Nokia 770 Date: Sun, 19 Apr 2026 19:18:48 +0300 Message-ID: <20260419161848.825831-3-aaro.koskinen@iki.fi> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260419161848.825831-1-aaro.koskinen@iki.fi> References: <20260419161848.825831-1-aaro.koskinen@iki.fi> 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" Commit 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes") added gpiod set up for the IRQ in the 770 board file, then another in the touchscreen driver for reading the pen state. This will make the probe fail: [ 1.347381] ads7846 spi2.0: failed to request pendown GPIO [ 1.361846] ads7846: probe of spi2.0 failed with error -16 I originally tried to fix it using non-exclusive flag, but that was not found acceptable. Instead, just use a single gpiod. Fixes: 767d83361aaa6 ("Input: ads7846 - Convert to use software nodes") Signed-off-by: Aaro Koskinen Reviewed-by: Linus Walleij --- arch/arm/mach-omap1/board-nokia770.c | 11 ----------- drivers/input/touchscreen/ads7846.c | 12 +++++++----- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/boa= rd-nokia770.c index a5bf5554800f..8b8013ab4590 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -285,9 +285,6 @@ static void __init nokia770_cbus_init(void) static struct gpiod_lookup_table nokia770_irq_gpio_table =3D { .dev_id =3D NULL, .table =3D { - /* GPIO used by SPI device 1 */ - GPIO_LOOKUP("gpio-0-15", 15, "ads7846_irq", - GPIO_ACTIVE_HIGH), /* GPIO used for retu IRQ */ GPIO_LOOKUP("gpio-48-63", 14, "retu_irq", GPIO_ACTIVE_HIGH), @@ -307,8 +304,6 @@ static struct gpiod_lookup_table nokia770_irq_gpio_tabl= e =3D { =20 static void __init omap_nokia770_init(void) { - struct gpio_desc *d; - /* On Nokia 770, the SleepX signal is masked with an * MPUIO line by default. It has to be unmasked for it * to become functional */ @@ -322,12 +317,6 @@ static void __init omap_nokia770_init(void) platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices)); =20 gpiod_add_lookup_table(&nokia770_irq_gpio_table); - d =3D gpiod_get(NULL, "ads7846_irq", GPIOD_IN); - if (IS_ERR(d)) - pr_err("Unable to get ADS7846 IRQ GPIO descriptor\n"); - else - nokia770_spi_board_info[1].irq =3D gpiod_to_irq(d); - spi_register_board_info(nokia770_spi_board_info, ARRAY_SIZE(nokia770_spi_board_info)); omap_serial_init(); diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscree= n/ads7846.c index 4f8cc450e779..ca7dbd3afe29 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c @@ -1084,6 +1084,8 @@ static int ads7846_setup_pendown(struct spi_device *s= pi, dev_err(&spi->dev, "failed to request pendown GPIO\n"); return PTR_ERR(ts->gpio_pendown); } + if (!spi->irq) + spi->irq =3D gpiod_to_irq(ts->gpio_pendown); if (pdata->gpio_pendown_debounce) gpiod_set_debounce(ts->gpio_pendown, pdata->gpio_pendown_debounce); @@ -1374,11 +1376,6 @@ static int ads7846_probe(struct spi_device *spi) unsigned long irq_flags; int err; =20 - if (!spi->irq) { - dev_dbg(dev, "no IRQ?\n"); - return -EINVAL; - } - /* don't exceed max specified sample rate */ if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) { dev_err(dev, "f(sample) %d KHz?\n", @@ -1455,6 +1452,11 @@ static int ads7846_probe(struct spi_device *spi) if (err) return err; =20 + if (!spi->irq) { + dev_dbg(dev, "no IRQ?\n"); + return -EINVAL; + } + if (pdata->penirq_recheck_delay_usecs) ts->penirq_recheck_delay_usecs =3D pdata->penirq_recheck_delay_usecs; --=20 2.39.2