From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F1606CD4F3D for ; Wed, 20 May 2026 18:40:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From: Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=HHUWFmbh3ImfDe6wOM7pvhSPGQimsw8ZMlhl9gdClj0=; b=T5ZDL4HbTvLGOc9YzVlQ24BtWm pfeF0ypk5GMPeMcvUzviTtfDWkaUvfoqcgk+txqK/Pw38+Ydx1WZMeyQhKm5k978En9yj0RZlHInx lJWUZ5mlKAH+/uiXosAB3IJVNsGKUwbJaU1Vj7zfRC3DkXNjXYKK5HQumLktUaaClqtBfACPT/MWr ZlqzOoEmjEMAec4GBLDBQNFPoFckoD10FkG0JYNH4Vxm224A3V1ttsVibxylP3C/5ETYOWJ5Sys6e RMpebo5DAsjMK0AmOx/sWdaIAyCyt254TZe9pVEJua4vo14qa97U5SVYHZlvXYpa7MVkNCRwrlNT1 fwNQBOww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wPlps-00000005VMW-2fd2; Wed, 20 May 2026 18:40:04 +0000 Received: from desiato.infradead.org ([2001:8b0:10b:1:d65d:64ff:fe57:4e05]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wPlpk-00000005V5s-2RnC for linux-arm-kernel@bombadil.infradead.org; Wed, 20 May 2026 18:39:56 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=desiato.20200630; h=Content-Transfer-Encoding:MIME-Version :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=HHUWFmbh3ImfDe6wOM7pvhSPGQimsw8ZMlhl9gdClj0=; b=If5DuQMNxFhZKo8N/1Xdgd6Q0f qwtz7fyk7lLQmExmz1T/wTWJExLyB5blC833vYVe5WTBnjH6iRgC+ogWgq/4R3NaBrJ+JR6S4qBSD fV2/49UPBQGrH7h218bKhytCWw9vBYTXRecP3ehZZrzOjYiM+sHUuwBFEAEutQcb9Q8YYrZPDmUXg cMJihU2ayaYrL/LKs/0Ii0hs3ZiQmX7F+dj1vyQRbWfr4UAVgjmg+Vo8gyTuqMmEmIggMZtTmlrDB ybcys3+4HseWL51EKDqy7VtMVrQKETOiGZMlWdAbOE9x16p1MW4SAH+Ks3nGnXrREomEGWXgQUps5 1W7ZhpMg==; Received: from sea.source.kernel.org ([172.234.252.31]) by desiato.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wPlpf-000000002xL-2Cdn for linux-arm-kernel@lists.infradead.org; Wed, 20 May 2026 18:39:55 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 5392C445FE; Wed, 20 May 2026 18:39:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1DA691F000E9; Wed, 20 May 2026 18:39:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1779302390; bh=HHUWFmbh3ImfDe6wOM7pvhSPGQimsw8ZMlhl9gdClj0=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=c8+2xhO5RnbVl3GQjSFxhQSreCyaoMFISEf7aB3AuPaI1I5olVwoDdS3CppiqIsM9 6qBOSA+AxNPflL+q+Hoe/UW5p8MBI1dB9kxFKTs3Cz+voCT1d2DJ9/qDxKFXosezrK S5XM2FT4gjomdQ6L+3Hzf72v8c+StbK1lJyg8IICM4Bh50XuRVqfMsLzOi95egM1Gb tmBT37YhgafXKSw3GENUYIzK9zQwwXgDbDOlQ6CBuhpl1DzLVIQrk1jWoJIF5lc/9O F2ctOYy8/waqsSBiKjbEKqwq+ereYdA3N60sCCZVymbKSBbDM8UbdzVAqW+chfh6ej qi7MZ6eQS/VVA== From: Arnd Bergmann To: linux-gpio@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , Christian Lamparter , Johannes Berg , Aaro Koskinen , Andreas Kemnade , Kevin Hilman , Roger Quadros , Tony Lindgren , Thomas Bogendoerfer , John Paul Adrian Glaubitz , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Linus Walleij , Bartosz Golaszewski , Dmitry Torokhov , Lee Jones , Pavel Machek , Matti Vaittinen , Florian Fainelli , Jonas Gorski , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , linux-wireless@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mips@vger.kernel.org, linux-sh@vger.kernel.org, linux-input@vger.kernel.org, linux-leds@vger.kernel.org, netdev@vger.kernel.org, Christian Lamparter , Bartosz Golaszewski Subject: [PATCH 08/10] [v6 net-next] p54spi: convert to devicetree Date: Wed, 20 May 2026 20:38:13 +0200 Message-Id: <20260520183815.2510387-9-arnd@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260520183815.2510387-1-arnd@kernel.org> References: <20260520183815.2510387-1-arnd@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260520_193952_140996_B9C93886 X-CRM114-Status: GOOD ( 25.49 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Arnd Bergmann The Prism54 SPI driver hardcodes GPIO numbers and expects users to pass them as module parameters, apparently a relic from its life as a staging driver. This works because there is only one user, the Nokia N8x0 tablet. Convert this to the gpio descriptor interface and DT based probing to improve this and simplify the code at the same time. Acked-by: Christian Lamparter Reviewed-by: Linus Walleij Reviewed-by: Bartosz Golaszewski Signed-off-by: Arnd Bergmann --- v6: - no changes. Sashiko comments about incorrect on-stack SPI transfers and error handling in the IRQ registration turned out to be irrelevant for this submission. v5: - fix irq assignment # https://sashiko.dev/#/patchset/20260430081242.3686993-1-arnd%40kernel.org v4: - make gpio line optional again - fix EPROBE_DEFER handling - match only st,stlc4560 compatible value, with binding change v3: - rebase an older patch --- arch/arm/mach-omap2/board-n8x0.c | 18 ------ drivers/net/wireless/intersil/p54/p54spi.c | 67 ++++++++-------------- drivers/net/wireless/intersil/p54/p54spi.h | 3 + 3 files changed, 26 insertions(+), 62 deletions(-) diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 969265d5d5c6..d9acd32c5457 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -106,21 +105,6 @@ static void __init n8x0_usb_init(void) {} #endif /*CONFIG_USB_MUSB_TUSB6010 */ - -static struct omap2_mcspi_device_config p54spi_mcspi_config = { - .turbo_mode = 0, -}; - -static struct spi_board_info n800_spi_board_info[] __initdata = { - { - .modalias = "p54spi", - .bus_num = 2, - .chip_select = 0, - .max_speed_hz = 48000000, - .controller_data = &p54spi_mcspi_config, - }, -}; - #if defined(CONFIG_MENELAUS) && IS_ENABLED(CONFIG_MMC_OMAP) /* @@ -524,7 +508,5 @@ omap_late_initcall(n8x0_late_initcall); void * __init n8x0_legacy_init(void) { board_check_revision(); - spi_register_board_info(n800_spi_board_info, - ARRAY_SIZE(n800_spi_board_info)); return &mmc1_data; } diff --git a/drivers/net/wireless/intersil/p54/p54spi.c b/drivers/net/wireless/intersil/p54/p54spi.c index 9d66dcae54e0..d18be2545028 100644 --- a/drivers/net/wireless/intersil/p54/p54spi.c +++ b/drivers/net/wireless/intersil/p54/p54spi.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -15,7 +16,7 @@ #include #include #include -#include +#include #include #include "p54spi.h" @@ -30,19 +31,6 @@ MODULE_FIRMWARE("3826.arm"); MODULE_FIRMWARE("3826.eeprom"); -/* gpios should be handled in board files and provided via platform data, - * but because it's currently impossible for p54spi to have a header file - * in include/linux, let's use module parameters for now - */ - -static int p54spi_gpio_power = 97; -module_param(p54spi_gpio_power, int, 0444); -MODULE_PARM_DESC(p54spi_gpio_power, "gpio number for power line"); - -static int p54spi_gpio_irq = 87; -module_param(p54spi_gpio_irq, int, 0444); -MODULE_PARM_DESC(p54spi_gpio_irq, "gpio number for irq line"); - static void p54spi_spi_read(struct p54s_priv *priv, u8 address, void *buf, size_t len) { @@ -262,14 +250,14 @@ static int p54spi_upload_firmware(struct ieee80211_hw *dev) static void p54spi_power_off(struct p54s_priv *priv) { - disable_irq(gpio_to_irq(p54spi_gpio_irq)); - gpio_set_value(p54spi_gpio_power, 0); + disable_irq(priv->irq); + gpiod_set_value(priv->gpio_powerdown, 1); } static void p54spi_power_on(struct p54s_priv *priv) { - gpio_set_value(p54spi_gpio_power, 1); - enable_irq(gpio_to_irq(p54spi_gpio_irq)); + gpiod_set_value(priv->gpio_powerdown, 0); + enable_irq(priv->irq); /* need to wait a while before device can be accessed, the length * is just a guess @@ -608,31 +596,20 @@ static int p54spi_probe(struct spi_device *spi) goto err_free; } - ret = gpio_request(p54spi_gpio_power, "p54spi power"); - if (ret < 0) { - dev_err(&priv->spi->dev, "power GPIO request failed: %d", ret); + priv->gpio_powerdown = gpiod_get_optional(&spi->dev, "powerdown", GPIOD_OUT_HIGH); + if (IS_ERR(priv->gpio_powerdown)) { + ret = dev_err_probe(&priv->spi->dev, PTR_ERR(priv->gpio_powerdown), + "powerdown GPIO request failed\n"); goto err_free; } - ret = gpio_request(p54spi_gpio_irq, "p54spi irq"); - if (ret < 0) { - dev_err(&priv->spi->dev, "irq GPIO request failed: %d", ret); - goto err_free_gpio_power; - } - - gpio_direction_output(p54spi_gpio_power, 0); - gpio_direction_input(p54spi_gpio_irq); - - ret = request_irq(gpio_to_irq(p54spi_gpio_irq), - p54spi_interrupt, IRQF_NO_AUTOEN, "p54spi", - priv->spi); + ret = request_irq(spi->irq, p54spi_interrupt, IRQF_NO_AUTOEN, "p54spi", priv->spi); if (ret < 0) { dev_err(&priv->spi->dev, "request_irq() failed"); - goto err_free_gpio_irq; + goto err_free_gpio_power; } - irq_set_irq_type(gpio_to_irq(p54spi_gpio_irq), IRQ_TYPE_EDGE_RISING); - + priv->irq = spi->irq; INIT_WORK(&priv->work, p54spi_work); init_completion(&priv->fw_comp); INIT_LIST_HEAD(&priv->tx_pending); @@ -659,11 +636,9 @@ static int p54spi_probe(struct spi_device *spi) err_free_common: release_firmware(priv->firmware); - free_irq(gpio_to_irq(p54spi_gpio_irq), spi); -err_free_gpio_irq: - gpio_free(p54spi_gpio_irq); + free_irq(priv->irq, spi); err_free_gpio_power: - gpio_free(p54spi_gpio_power); + gpiod_put(priv->gpio_powerdown); err_free: p54_free_common(priv->hw); return ret; @@ -675,10 +650,8 @@ static void p54spi_remove(struct spi_device *spi) p54_unregister_common(priv->hw); - free_irq(gpio_to_irq(p54spi_gpio_irq), spi); - - gpio_free(p54spi_gpio_power); - gpio_free(p54spi_gpio_irq); + free_irq(priv->irq, spi); + gpiod_put(priv->gpio_powerdown); release_firmware(priv->firmware); mutex_destroy(&priv->mutex); @@ -686,10 +659,16 @@ static void p54spi_remove(struct spi_device *spi) p54_free_common(priv->hw); } +static const struct of_device_id p54spi_of_ids[] = { + { .compatible = "st,stlc4560", }, + { }, +}; +MODULE_DEVICE_TABLE(of, p54spi_of_ids); static struct spi_driver p54spi_driver = { .driver = { .name = "p54spi", + .of_match_table = p54spi_of_ids, }, .probe = p54spi_probe, diff --git a/drivers/net/wireless/intersil/p54/p54spi.h b/drivers/net/wireless/intersil/p54/p54spi.h index e5619a13fd61..118785cc635a 100644 --- a/drivers/net/wireless/intersil/p54/p54spi.h +++ b/drivers/net/wireless/intersil/p54/p54spi.h @@ -107,6 +107,9 @@ struct p54s_priv { enum fw_state fw_state; const struct firmware *firmware; + + struct gpio_desc *gpio_powerdown; + int irq; }; #endif /* P54SPI_H */ -- 2.39.5