From nobody Sat Jul 25 20:47:10 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (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 4B86236F411 for ; Mon, 13 Jul 2026 21:58:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979912; cv=none; b=XS4UamvP3lL629R0AcSc8hYVK5Doq3DDoP2n26oBZsNZzbaazDG2z77mdhqkvqDd1Cmz3ou20BuNSuJsC++olUEIUZj4+Y3uAYVNwD2MLmLFamxSKS6TsRk0CRurBcefgEyCsBnAS+nhF9h6Kh1PCqT7p/vwNJdEOBXEOMtY60A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979912; c=relaxed/simple; bh=YrpLPHBD1J0GQmK89CSL4Gy6M2t6Tszp23YYmEbriXg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sYAXjPc6AtHC9baPs8hq19cb/rUfREu8ZM2pyt0/m6CqJgC7QdMSEdwpLsg/lIkGbqh6eC0SaDp/qI+isoXKafUG576FQ6q/5WZTpaBmz57BC0Rx0cyj+EIRvewipSslx2lgTMsfg+EGK2NBcHcFlSEuSLeJRhi/mctOFhgW5m4= 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=FLJoZXDs; arc=none smtp.client-ip=209.85.215.175 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="FLJoZXDs" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-ca12086c06eso3060864a12.0 for ; Mon, 13 Jul 2026 14:58:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783979910; x=1784584710; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FTIRIedZIUsEUdvn5iYSlLCj+0D+t4h6dGSrNv3pQhE=; b=FLJoZXDsHXormQvcGyNUwHqCd2us6Mc0xgZbuXQzgR04iaGtAX7mC06+dPiq4lYrB2 s6y2QnIDQarcKFE+B7ttPILoH24AGykVYxsNWtaBlPpz4zlKBwCNP0NrcwuTuFonAONa CmgMtlh9lnJfTU+kB7Q7gsRPFbgUNvvucEMzXdTU+dPK+TQi94z1h8gyl4vET0Qrpwbv PgDuR2U2yTtbghqNRSpCuvtarln1DPvYE7UOsQd1BGH3UsqPTSydlbvxUR5RrcCsMgTX SJTbXkeBIX83U4P8kQYKVwBmobZzdm3NMrxSTpRENylni86CQhNHTm/aDx+AEd+4SZ+c LuwQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783979910; x=1784584710; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=FTIRIedZIUsEUdvn5iYSlLCj+0D+t4h6dGSrNv3pQhE=; b=DxO8W/VCh4phvPpdHvnleezAuysrOn38sj7e0MNIMqFRPc4X/dfTtNOxh6UBaMSFWw s8FI+LNClc0jgqohww8NdP3CpWwt2mS06iIZWA0mZQkJ2E2ZQQrPfavlkqViiDkU5Nr/ In08mZAX08zy6VO26weeNGq8lhxsMyLdJYUzQU/XuuOwkTMF7a69XAO4YWfiQcqQCG+R +1oKM4ZMy2GFCDYyPh1KZkRvItSIcx3n+R1ThZAKJk1MAa66/9ujDQRYmsKGsVFSZkYp EUkIpj30OiS2kIz+ekImwwNjBs6Y9LFoRuN8OxvRHvYkEjuQ23MCTcP149DI0QHyonA9 xnhA== X-Forwarded-Encrypted: i=1; AHgh+Rqj2F/U9jnpBNDva9cG1dx6KfGNani0rUeVk65LYG86qmMfMCuXRs5khAxM4W2Fonw2qLCNgaI+7r1oVOk=@vger.kernel.org X-Gm-Message-State: AOJu0YzWF8cjvmZgwagl/67ejx8YvG1aIIBq7Nh55jWZDk4LYBrKWfMR 7E4B7mwO94tpEGuiFJDElS2LqYnhq/pFfJCZKKGNkwBWTaiUoTC9UXU4ZFbxhQ== X-Gm-Gg: AfdE7clnUideMuRe5tCLm5ylBwq0dXWKFgVtqKVS6R59ZWOwFzDjD/4SBQfKZ1OaPm7 rvQOy5uN4B0iARE3UT7WfnbNuWehaLJsW392lKGe59ZTufedRRiseEm/OtEQQs9Zud/hrurv3DB kfNs5Msc/T9APlGvt0vXH5IXweVajgS9+Bopl7/zWaQNNpeD4MaqbmlcwWsETRyo1qFf+4/s2Iz ZQkHXZ+s1ZFrW0waQzC/fv6utfGeURxlxkO9Zp5D2WjlUzV4aZAKf16k54H4gxDgFbxC3zxw8z6 QgFD4PGJOkkoAxqovJmDskEBft6FlLGf9s2oOhLKMx7KxMgOcZQ1ptz67+NBo23UWbGdp1JZnl9 oyV1BFYydiRHNafW78YchkJQ+1NWAnSnGgxzghmXnAyXBaunB3g+oE/0muJesMNO2DD0HoJqOpf ynkUzFQ/G8GtfhWSivqtSYfXyo1hjN5EA0SPrxiAk1v9D15AT5f7Ve1KvEtv7IgE7J7/9+2pWxH qmH X-Received: by 2002:a05:6a20:5491:b0:3a0:b781:4c78 with SMTP id adf61e73a8af0-3c11003090dmr14016770637.15.1783979909685; Mon, 13 Jul 2026 14:58:29 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2a00:79e0:2ebe:8:e15f:5d5f:580b:f2e9]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b8a5992c9sm28371487c88.4.2026.07.13.14.58.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 14:58:28 -0700 (PDT) From: Dmitry Torokhov Date: Mon, 13 Jul 2026 14:58:22 -0700 Subject: [PATCH v2 1/3] bcma: gpio: Add and register software node for GPIO controller Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260713-b4-bcm47xx-swnode-v2-1-2b879f0c193c@gmail.com> References: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> In-Reply-To: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> To: =?utf-8?q?Rafa=C5=82_Mi=C5=82ecki?= , Michael Buesch , Hauke Mehrtens , Thomas Bogendoerfer Cc: Bartosz Golaszewski , Arnd Bergmann , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org X-Mailer: b4 0.16-dev-b242f We want to convert the legacy gpio-keys platform device on BCM47XX boards to use software nodes. To do this properly and allow referencing the GPIO controller by address rather than relying on name-based matching (which is being removed from the gpiolib core), we need to associate the GPIO controller with a software node. Introduce bcma_gpio_swnode, register it if the device does not already have a firmware node, and associate it with the gpio_chip. Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Dmitry Torokhov Tested-by: Waldemar Brodkorb --- drivers/bcma/driver_gpio.c | 43 +++++++++++++++++++++++++++++++++++++------ include/linux/bcma/bcma.h | 2 ++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/drivers/bcma/driver_gpio.c b/drivers/bcma/driver_gpio.c index 658c7e2ac8bf..ea45222f2fa0 100644 --- a/drivers/bcma/driver_gpio.c +++ b/drivers/bcma/driver_gpio.c @@ -19,6 +19,11 @@ =20 #define BCMA_GPIO_MAX_PINS 32 =20 +const struct software_node bcma_gpio_swnode =3D { + .name =3D "bcma-gpio", +}; +EXPORT_SYMBOL_GPL(bcma_gpio_swnode); + static int bcma_gpio_get_value(struct gpio_chip *chip, unsigned gpio) { struct bcma_drv_cc *cc =3D gpiochip_get_data(chip); @@ -190,7 +195,20 @@ int bcma_gpio_init(struct bcma_drv_cc *cc) chip->direction_input =3D bcma_gpio_direction_input; chip->direction_output =3D bcma_gpio_direction_output; chip->parent =3D bus->dev; - chip->fwnode =3D dev_fwnode(&cc->core->dev); + + /* + * Register software node only for the host SoC bus, unless there is + * already a firmware node assigned. There is only one SoC instance + * in the system, so there are no concerns with registration conflicts. + */ + if (bus->hosttype =3D=3D BCMA_HOSTTYPE_SOC && !dev_fwnode(&cc->core->dev)= ) { + err =3D software_node_register(&bcma_gpio_swnode); + if (err) + return err; + chip->fwnode =3D software_node_fwnode(&bcma_gpio_swnode); + } else { + chip->fwnode =3D dev_fwnode(&cc->core->dev); + } =20 switch (bus->chipinfo.id) { case BCMA_CHIP_ID_BCM4707: @@ -219,20 +237,33 @@ int bcma_gpio_init(struct bcma_drv_cc *cc) =20 err =3D bcma_gpio_irq_init(cc); if (err) - return err; + goto err_unregister_swnode; =20 err =3D gpiochip_add_data(chip, cc); - if (err) { - bcma_gpio_irq_exit(cc); - return err; - } + if (err) + goto err_irq_exit; =20 return 0; + +err_irq_exit: + bcma_gpio_irq_exit(cc); +err_unregister_swnode: + if (bus->hosttype =3D=3D BCMA_HOSTTYPE_SOC && + chip->fwnode && is_software_node(chip->fwnode)) { + software_node_unregister(&bcma_gpio_swnode); + chip->fwnode =3D NULL; + } + return err; } =20 int bcma_gpio_unregister(struct bcma_drv_cc *cc) { bcma_gpio_irq_exit(cc); gpiochip_remove(&cc->gpio); + if (cc->core->bus->hosttype =3D=3D BCMA_HOSTTYPE_SOC && + cc->gpio.fwnode && is_software_node(cc->gpio.fwnode)) { + software_node_unregister(&bcma_gpio_swnode); + cc->gpio.fwnode =3D NULL; + } return 0; } diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index f02cb3909375..17fc50190014 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -486,4 +486,6 @@ extern u32 bcma_core_dma_translation(struct bcma_device= *core); =20 extern unsigned int bcma_core_irq(struct bcma_device *core, int num); =20 +extern const struct software_node bcma_gpio_swnode; + #endif /* LINUX_BCMA_H_ */ --=20 2.55.0.795.g602f6c329a-goog From nobody Sat Jul 25 20:47:10 2026 Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) (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 C6B30371D1D for ; Mon, 13 Jul 2026 21:58:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979914; cv=none; b=kf3lm2sMmhTl4FOqc9CGy8VG/8ycl+WCwwWQRiL6y3YSGBvJbnqGlUeUHIT1zNrINvuvYnDt7/8arEQt54GMJjaQE1l1l4Yb8mSn9ramWq4UaQuYsekYHkwkWTptxXJ8YjeKUXJkNKrJKCuFqRkdaj0/RCgZl2+t/baFUL6+tLE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979914; c=relaxed/simple; bh=29e1zWLx7tR8NGQ6MXjQX3b25i7ejmmUrpbreYdw5K8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rRx2IiQyRXChCkJcwNh5kvFDjf7obPIpFnGBf2BUf9a3kGc6jNPoMJZ0gEXuN9vi0YtlJbXwKFLSReqrzB59+B4JBRlqpt64CLeOmUUJci2c/XHFgFRjMWlugoV/qFcMR+ERh3EuhIryQaYeVAGa9YJBn0nUXuCbXR47p9D+5dQ= 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=WoY2M2oL; arc=none smtp.client-ip=209.85.215.177 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="WoY2M2oL" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-ca957432c7fso2499713a12.1 for ; Mon, 13 Jul 2026 14:58:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783979911; x=1784584711; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=RlMUdZeGBVP+uq5JMmWJnIlIlnx5G6dUdNZ/G/e6M0A=; b=WoY2M2oL+xzXzZYOLyobN3ZtXeyafQHO/uTae8rIaFGhY0vrj6Q88PO22a3YDops1Y OVwk3UaUEd4vbBveo24CRaufEOtxYYM2mbKzJE1mzBdn7Kwrquzjnm7OUyxbSjiLs2Dg tVsIlmPuRqwyezR9jwf+xqnAqp4JmZ9NQp7tLFBuy6nBH345gfiGTEssRerdtlYsB6si S2ZGUzsO8clsTnQDbV7B1OAimTrDYiiFN9xZxzBsWUvNAGS3XOaDz/sTms9OYX2EITM4 iG0it9T9OYtWPphWL1RtZzmgE2ZN8hC3U4ZHXDLfD7YgVlFvGdJ4tsXCbqlfgZiSERoN 2Nsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783979911; x=1784584711; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=RlMUdZeGBVP+uq5JMmWJnIlIlnx5G6dUdNZ/G/e6M0A=; b=jaMJGelZgNe9JcpiAsFVbfpaYNReCvDJ5gKsCehhg5iNHlODlehKSFTreB5seWG1il tRcGPYgI+1yplOUwil8qTqWmx4Qw88pyuJL9VTm/RbcmWOM6N5VBSB/Z9PX8lTULgOsu J1bb04PGWOVauLjhc434OOeddtjxxrt8/XQWTMhZxaIMOwaRCLV3iEgf1BuBLDE0av3k 8Yw38nPQCkTZN6KcAoJtl6EBt9/vQeq09yQkVAkreH2VNBQZ+R+rnQe25VRqclI8+O6C TUHyCTkJG9o40nIc9SIWG1Tdrvkid7C9pd5PoeZuKvtWH00epnNwYn0EcbnIW3+zIh8o zzzA== X-Forwarded-Encrypted: i=1; AHgh+RqA6LnQHOaIPSqkaytIF5TdQGCy1+n3O6CWMBZpmpFdjWfXXOHakE7wBGwHyKOPEYLiOVlgDgF1ZvqHZRQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yztd+m2KaZd2DuYr/0SOf5Z8s3w/RBjyTTT+nViOx3vpvHox3J9 8qa1842hJAC5X2p29F1PtR6WNrEO90kGTJjv5MUM5GXF5YE+EHl56t7/Sd+4WQ== X-Gm-Gg: AfdE7cnch75fWTo+NwlwPjmkRX+sy0PegsBCCMoJTib0OZBxHHigYSqdsloW1LD3UAb t8QibMPX1mU6U+qUWcZa6EbMuEzAaygPcGNdFsZ8eVWmWFQXxeCPkJHVoX09jTaP1idbPHggq6+ w2OTxvuEwA7+X5PyCGO35+slwaKXi+fdATa79++b43dQDs4Hi9ZLb2mQHYMzYcaJS3tb+ss7GO7 7Hu38nqEoLz8uE8vn9W/iJHPMg9bd61c2dTePY5GrxAPfsX5QdTWUu4CLkWq9e70S+0+FYFJwMd lOX390wUKFoK2Zmt+mUezCLAms8lQiXxM1d0zF0nboQVQdxEj+mLufLAGSaLHXgKGk+rUf+09a3 dNt0+NiMgRDNiWSrjweqTJz1ocqDZZp3e7SRh0KIJBXhebjPPLawo9UsOCs7Y6HES535BKRD9Qw tr555+lvMXIP+IfarirrWWffHmikRtwOWDKvjufnzK5g73P3Azyd+uqt+xsK6Oo2UOpse+mqsrV 1GdDdWFiYkf9Fw= X-Received: by 2002:a05:6a21:4c08:b0:3bf:d1f9:b1d9 with SMTP id adf61e73a8af0-3c110ba2a1amr10746536637.57.1783979911168; Mon, 13 Jul 2026 14:58:31 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2a00:79e0:2ebe:8:e15f:5d5f:580b:f2e9]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b8a5992c9sm28371487c88.4.2026.07.13.14.58.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 14:58:30 -0700 (PDT) From: Dmitry Torokhov Date: Mon, 13 Jul 2026 14:58:23 -0700 Subject: [PATCH v2 2/3] ssb: gpio: Add and register software node for GPIO controller Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260713-b4-bcm47xx-swnode-v2-2-2b879f0c193c@gmail.com> References: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> In-Reply-To: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> To: =?utf-8?q?Rafa=C5=82_Mi=C5=82ecki?= , Michael Buesch , Hauke Mehrtens , Thomas Bogendoerfer Cc: Bartosz Golaszewski , Arnd Bergmann , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org X-Mailer: b4 0.16-dev-b242f We want to convert the legacy gpio-keys platform device on BCM47XX boards to use software nodes. To do this properly and allow referencing the GPIO controller by address rather than relying on name-based matching (which is being removed from the gpiolib core), we need to associate the GPIO controller with a software node. Introduce ssb_gpio_swnode, register it, and associate it with the gpio_chip. Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Dmitry Torokhov Tested-by: Waldemar Brodkorb --- drivers/ssb/driver_gpio.c | 48 ++++++++++++++++++++++++++++++++++++++++---= ---- include/linux/ssb/ssb.h | 2 ++ 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/drivers/ssb/driver_gpio.c b/drivers/ssb/driver_gpio.c index 905657c925bc..87922479946c 100644 --- a/drivers/ssb/driver_gpio.c +++ b/drivers/ssb/driver_gpio.c @@ -15,8 +15,14 @@ #include #include #include +#include #include =20 +const struct software_node ssb_gpio_swnode =3D { + .name =3D "ssb-gpio", +}; +EXPORT_SYMBOL_GPL(ssb_gpio_swnode); + =20 /************************************************** * Shared @@ -232,6 +238,8 @@ static int ssb_gpio_chipco_init(struct ssb_bus *bus) chip->to_irq =3D ssb_gpio_to_irq; #endif chip->ngpio =3D 16; + if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) + chip->fwnode =3D software_node_fwnode(&ssb_gpio_swnode); /* There is just one SoC in one device and its GPIO addresses should be * deterministic to address them more easily. The other buses could get * a random base number. @@ -433,10 +441,12 @@ static int ssb_gpio_extif_init(struct ssb_bus *bus) * deterministic to address them more easily. The other buses could get * a random base number. */ - if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) - chip->base =3D 0; - else - chip->base =3D -1; + if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) { + chip->base =3D 0; + chip->fwnode =3D software_node_fwnode(&ssb_gpio_swnode); + } else { + chip->base =3D -1; + } =20 err =3D ssb_gpio_irq_extif_domain_init(bus); if (err) @@ -464,11 +474,33 @@ static int ssb_gpio_extif_init(struct ssb_bus *bus) =20 int ssb_gpio_init(struct ssb_bus *bus) { + int err =3D 0; + + /* + * Register software node only for the host SoC bus. There is only + * one SoC instance in the system, so there are no concerns with + * registration conflicts. + */ + if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) { + err =3D software_node_register(&ssb_gpio_swnode); + if (err) + return err; + } + if (ssb_chipco_available(&bus->chipco)) - return ssb_gpio_chipco_init(bus); + err =3D ssb_gpio_chipco_init(bus); else if (ssb_extif_available(&bus->extif)) - return ssb_gpio_extif_init(bus); - return -1; + err =3D ssb_gpio_extif_init(bus); + else + err =3D -ENODEV; + + if (err) { + if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) + software_node_unregister(&ssb_gpio_swnode); + return err; + } + + return 0; } =20 int ssb_gpio_unregister(struct ssb_bus *bus) @@ -476,6 +508,8 @@ int ssb_gpio_unregister(struct ssb_bus *bus) if (ssb_chipco_available(&bus->chipco) || ssb_extif_available(&bus->extif)) { gpiochip_remove(&bus->gpio); + if (bus->bustype =3D=3D SSB_BUSTYPE_SSB) + software_node_unregister(&ssb_gpio_swnode); return 0; } return -1; diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h index 7fee9afa9458..67cb66f6f5ed 100644 --- a/include/linux/ssb/ssb.h +++ b/include/linux/ssb/ssb.h @@ -671,4 +671,6 @@ int ssb_pcibios_plat_dev_init(struct pci_dev *dev); int ssb_pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin); #endif /* CONFIG_SSB_EMBEDDED */ =20 +extern const struct software_node ssb_gpio_swnode; + #endif /* LINUX_SSB_H_ */ --=20 2.55.0.795.g602f6c329a-goog From nobody Sat Jul 25 20:47:10 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 8DBB5370D4F for ; Mon, 13 Jul 2026 21:58:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979926; cv=none; b=ENEIvc7Q7zAczqvBG6v4isiBz5RlMYfjIP7kU6RJrMmBKjW1D8l+CQ8xZ92GIjGnUmLKA/xwn34xGm5z8WBFt9CwE7r9hsts5iQgPn0Q4p+DaCwz01VFglGLBt6vURVWvZkr5U8WpG0cTAr/lSGHePoTzuy63rppixf1PBBDWYk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783979926; c=relaxed/simple; bh=st8OCkl2uEVUo+nCeSO035T37xhSKLVGnAsrrqljeB4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Oy/XgVhkJgVzRyjc9yIBvzYiLTn6iWvEzQtTVyRJ2Lew6H7I6OfgK4dAbpTkLRU4EzF/xvOz72/qclNHXYqbAI30JIL1PyXiZH50kIwsEqJlfysgS7Va4GqjSTdcI9O8qE4cdE7qqLDny+ov+st+kG5Rdt2fIwXxBKbatIP78NQ= 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=aDgIpLSy; arc=none smtp.client-ip=209.85.214.181 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="aDgIpLSy" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2cedda2ce6fso8153885ad.1 for ; Mon, 13 Jul 2026 14:58:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1783979913; x=1784584713; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=yshtlaVMWhJIfh0u1M9eE4U25PEVkmE+xpFn1y1nP8A=; b=aDgIpLSyaXuEWM00BHDia2mU55aGZiR/YH38rfpR3oZoJxRmN7HQA6dyqZCa9R6WIV eYbmlQIANpq2bQgxSfFdfb2bJKrrPDb4D/kOuM1vmS6pu1s5xJ46qUh/Ulgn1nTa3nbm MaHGFhAh55fcw/viwP5B19mRoFnGivCa7T2orgWKn3YL1MuyEz7hfpqAyjaJYXmQ+tTd mbccEnupPiEeOpHR/9jtPjBMqrpmft4lewLbr9xLG25XsFpX+b9wkGrN6OwpFYKP8jnc /1uounDHO+o2eruIOXT8Cn3rZfalw690ftGpLldt05EYqnzTmLn+DkpZDmtoChWJabbG +uaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783979913; x=1784584713; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yshtlaVMWhJIfh0u1M9eE4U25PEVkmE+xpFn1y1nP8A=; b=tHCW9lrmfOmGw1C7W8nF7ZqF3MbdAkD+vTbtIf0AE68KGxn7zgH1SCy1f6lcxzyMvS Ys1G6iz2BoNjt9DcDsajyFsOBLbGLJtrH1BDJZ8t+42/3frJl5lSku8nBzRgqdLMkQpS 9iwLxjR+wnrHyLo2y7zU187ONaa0iGEOPy2eBCwoaQEz6aL442ZUeBKoJXuzD+zezSc+ L89VC5jyC+rO8LGmjbUTxMBILVErhjR6OiDY0OBiQQicSwv972F+velL4+vehVIKEZiD BFmKofhcZcpynch+bS7tp7D1gbnv9LnkOU/3bOJgGA3oVoc5D0MsKLFAcbL4smW/SXc7 HJpA== X-Forwarded-Encrypted: i=1; AHgh+Rq7F78z5kbX/hA7lCLb5TosK5SryJ+df05l5Yu+VGk6vV3Um85Rt16Qjl8k6+0a9mnHNrO1kmi+Diq02II=@vger.kernel.org X-Gm-Message-State: AOJu0YwdYCRGCSPV83yfcBtdv4y+U0+n75mJGinxoatMiZF4tWd4CzKu 3yG+G/nThxQQR6Duw/aS7qGh5wV374xBtGNMTfpM1LnjHC5M+MbLgGM/ X-Gm-Gg: AfdE7cm1b6H+wAXquGFBw+S9csCzjGIN6PSrvSZJ5f36Pvq39DVFMp5hpLdP5HVstY2 QYw2JZbZtD0bzYd+A5gGa4xjeE7t5cBWg06hbxy3DwJouf0aiBbHD+vEIhpWH0RDmvPdezL98hX c3debT1GR9FM2Mfqeet5gYNVTTknQd7y9XPyvMC++5N1VQRgHD2qLFgUYsdyyT6KkHTqpZI75Yu v5hY1m+fA2gw4I84Z1XJ14BiKW0KQ01QGnhyH7CcyRY3IPMdwF4UWzYN6P3ziciWLhSf9n+p+30 piXLwqBIvltPnIiFxk6SHOtwAo+CuzSdVe/yaY9kMfM2OgSzl8pwXWRGg806AeMzdhKMHE7HZG4 +lxFOVOH8zmAFA/4a5U7dzpg+y5A9GeMsFhJ4GiLnBXTLsV5/8bB2pX6WxsV1qzxR6uraRt7/qm VzL4E7kFEpPYj4jxVC9uWtMT+Ko+cbxCDufTZOwEkdF54wT9zeApQ8Uy+WLdFl1PWSWuIugKHom UvR X-Received: by 2002:a05:6a20:3d02:b0:3bf:b60b:da95 with SMTP id adf61e73a8af0-3c110f61152mr11557886637.60.1783979912715; Mon, 13 Jul 2026 14:58:32 -0700 (PDT) Received: from dtor-ws.sjc.corp.google.com ([2a00:79e0:2ebe:8:e15f:5d5f:580b:f2e9]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b8a5992c9sm28371487c88.4.2026.07.13.14.58.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Jul 2026 14:58:32 -0700 (PDT) From: Dmitry Torokhov Date: Mon, 13 Jul 2026 14:58:24 -0700 Subject: [PATCH v2 3/3] MIPS: BCM47XX: Convert buttons to software nodes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260713-b4-bcm47xx-swnode-v2-3-2b879f0c193c@gmail.com> References: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> In-Reply-To: <20260713-b4-bcm47xx-swnode-v2-0-2b879f0c193c@gmail.com> To: =?utf-8?q?Rafa=C5=82_Mi=C5=82ecki?= , Michael Buesch , Hauke Mehrtens , Thomas Bogendoerfer Cc: Bartosz Golaszewski , Arnd Bergmann , linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org, Bartosz Golaszewski X-Mailer: b4 0.16-dev-b242f Convert the legacy gpio-keys platform device on BCM47XX boards to use software nodes/properties. This allows us to describe the GPIO keys and their GPIO bindings using software nodes, so that support for platform data can eventually be removed from the gpio-keys driver. Detect the active bus type (BCMA or SSB) and reference the corresponding GPIO controller's software node (bcma_gpio_swnode or ssb_gpio_swnode) in the button properties. Reviewed-by: Bartosz Golaszewski Assisted-by: Antigravity:gemini-3.5-flash Signed-off-by: Dmitry Torokhov Tested-by: Waldemar Brodkorb --- arch/mips/bcm47xx/buttons.c | 442 +++++++++++++++++++++++++---------------= ---- 1 file changed, 255 insertions(+), 187 deletions(-) diff --git a/arch/mips/bcm47xx/buttons.c b/arch/mips/bcm47xx/buttons.c index 46994f9bb821..151a4ee2803f 100644 --- a/arch/mips/bcm47xx/buttons.c +++ b/arch/mips/bcm47xx/buttons.c @@ -1,9 +1,14 @@ // SPDX-License-Identifier: GPL-2.0 #include "bcm47xx_private.h" =20 -#include -#include +#include "linux/err.h" +#include +#include +#include #include +#include +#include + #include #include =20 @@ -11,29 +16,34 @@ * Database **************************************************/ =20 -#define BCM47XX_GPIO_KEY(_gpio, _code) \ - { \ - .code =3D _code, \ - .gpio =3D _gpio, \ - .active_low =3D 1, \ +struct bcm47xx_gpio_key { + u16 code; + u8 pin; + u8 flags; +}; + +#define BCM47XX_GPIO_KEY(_gpio, _code) \ + { \ + .code =3D _code, \ + .pin =3D _gpio, \ + .flags =3D GPIO_ACTIVE_LOW, \ } =20 -#define BCM47XX_GPIO_KEY_H(_gpio, _code) \ - { \ - .code =3D _code, \ - .gpio =3D _gpio, \ +#define BCM47XX_GPIO_KEY_H(_gpio, _code) \ + { \ + .code =3D _code, \ + .pin =3D _gpio, \ + .flags =3D GPIO_ACTIVE_HIGH, \ } =20 /* Asus */ =20 -static const struct gpio_keys_button -bcm47xx_buttons_asus_rtn10u[] __initconst =3D { +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_rtn10u[] __initc= onst =3D { BCM47XX_GPIO_KEY(20, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(21, KEY_RESTART), }; =20 -static const struct gpio_keys_button -bcm47xx_buttons_asus_rtn12[] __initconst =3D { +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_rtn12[] __initco= nst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(1, KEY_RESTART), BCM47XX_GPIO_KEY(4, BTN_0), /* Router mode */ @@ -41,74 +51,73 @@ bcm47xx_buttons_asus_rtn12[] __initconst =3D { BCM47XX_GPIO_KEY(6, BTN_2), /* AP mode */ }; =20 -static const struct gpio_keys_button -bcm47xx_buttons_asus_rtn16[] __initconst =3D { +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_rtn16[] __initco= nst =3D { BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_rtn66u[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(9, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl300g[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl320ge[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl330ge[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl500g[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl500gd[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl500gpv1[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_RESTART), BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl500gpv2[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RESTART), BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl500w[] __initconst =3D { BCM47XX_GPIO_KEY_H(6, KEY_RESTART), BCM47XX_GPIO_KEY_H(7, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl520gc[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RESTART), BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl520gu[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RESTART), BCM47XX_GPIO_KEY(3, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wl700ge[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_POWER), /* Hard disk power switch */ BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), /* EZSetup */ @@ -116,21 +125,21 @@ bcm47xx_buttons_asus_wl700ge[] __initconst =3D { BCM47XX_GPIO_KEY(7, KEY_RESTART), /* Hard reset */ }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_asus_wlhdd[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 /* Huawei */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_huawei_e970[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 /* Belkin */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_belkin_f7d4301[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), @@ -138,44 +147,44 @@ bcm47xx_buttons_belkin_f7d4301[] __initconst =3D { =20 /* Buffalo */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_whr2_a54g54[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_whr_g125[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode switch */ }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_whr_g54s[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY_H(4, KEY_RESTART), BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode switch */ }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_whr_hp_g54[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(5, BTN_0), /* Router / AP mode switch */ }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_wzr_g300n[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_wzr_rs_g54[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(4, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_buffalo_wzr_rs_g54hp[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(4, KEY_RESTART), @@ -183,20 +192,20 @@ bcm47xx_buttons_buffalo_wzr_rs_g54hp[] __initconst = =3D { =20 /* Dell */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_dell_tm2300[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_RESTART), }; =20 /* D-Link */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_dlink_dir130[] __initconst =3D { BCM47XX_GPIO_KEY(3, KEY_RESTART), BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_dlink_dir330[] __initconst =3D { BCM47XX_GPIO_KEY(3, KEY_RESTART), BCM47XX_GPIO_KEY(7, KEY_UNKNOWN), @@ -204,127 +213,127 @@ bcm47xx_buttons_dlink_dir330[] __initconst =3D { =20 /* Linksys */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e1000v1[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e1000v21[] __initconst =3D { BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(10, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e2000v1[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e2500v3[] __initconst =3D { BCM47XX_GPIO_KEY(9, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(10, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e3000v1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e3200v1[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_RESTART), BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_e4200v1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt150nv1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt150nv11[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt160nv1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt160nv3[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt300n_v1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt300nv11[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_UNKNOWN), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt310nv1[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), BCM47XX_GPIO_KEY(8, KEY_UNKNOWN), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt310n_v2[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt320n_v1[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt54g3gv2[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_WIMAX), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt54g_generic[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt610nv1[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), BCM47XX_GPIO_KEY(8, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrt610nv2[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_linksys_wrtsl54gs[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(6, KEY_RESTART), @@ -332,154 +341,154 @@ bcm47xx_buttons_linksys_wrtsl54gs[] __initconst =3D= { =20 /* Luxul */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_abr_4400_v1[] =3D { BCM47XX_GPIO_KEY(14, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xap_310_v1[] =3D { BCM47XX_GPIO_KEY(20, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xap_1210_v1[] =3D { BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xap_1230_v1[] =3D { BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xap_1240_v1[] =3D { BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xap_1500_v1[] =3D { BCM47XX_GPIO_KEY(14, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xbr_4400_v1[] =3D { BCM47XX_GPIO_KEY(14, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xvw_p30_v1[] =3D { BCM47XX_GPIO_KEY(20, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xwr_600_v1[] =3D { BCM47XX_GPIO_KEY(8, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_luxul_xwr_1750_v1[] =3D { BCM47XX_GPIO_KEY(14, KEY_RESTART), }; =20 /* Microsoft */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_microsoft_nm700[] __initconst =3D { BCM47XX_GPIO_KEY(7, KEY_RESTART), }; =20 /* Motorola */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_motorola_we800g[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_motorola_wr850gp[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_motorola_wr850gv2v3[] __initconst =3D { BCM47XX_GPIO_KEY(5, KEY_RESTART), }; =20 /* Netgear */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_r6200_v1[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RFKILL), BCM47XX_GPIO_KEY(3, KEY_RESTART), BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_r6300_v1[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wn2500rp_v1[] __initconst =3D { BCM47XX_GPIO_KEY(12, KEY_RESTART), BCM47XX_GPIO_KEY(31, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wndr3400v1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(8, KEY_RFKILL), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wndr3400_v3[] __initconst =3D { BCM47XX_GPIO_KEY(12, KEY_RESTART), BCM47XX_GPIO_KEY(23, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wndr3700v3[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_RFKILL), BCM47XX_GPIO_KEY(3, KEY_RESTART), BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wndr4500v1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(5, KEY_RFKILL), BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wnr1000_v3[] __initconst =3D { BCM47XX_GPIO_KEY(2, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(3, KEY_RESTART), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wnr3500lv1[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wnr3500lv2[] __initconst =3D { BCM47XX_GPIO_KEY(4, KEY_RESTART), BCM47XX_GPIO_KEY(6, KEY_WPS_BUTTON), BCM47XX_GPIO_KEY(8, KEY_RFKILL), }; =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_netgear_wnr834bv2[] __initconst =3D { BCM47XX_GPIO_KEY(6, KEY_RESTART), }; =20 /* SimpleTech */ =20 -static const struct gpio_keys_button +static const struct bcm47xx_gpio_key bcm47xx_buttons_simpletech_simpleshare[] __initconst =3D { BCM47XX_GPIO_KEY(0, KEY_RESTART), }; @@ -488,31 +497,96 @@ bcm47xx_buttons_simpletech_simpleshare[] __initconst = =3D { * Init **************************************************/ =20 -static struct gpio_keys_platform_data bcm47xx_button_pdata; - -static struct platform_device bcm47xx_buttons_gpio_keys =3D { - .name =3D "gpio-keys", - .dev =3D { - .platform_data =3D &bcm47xx_button_pdata, +static int __init +bcm47xx_buttons_add(const struct bcm47xx_gpio_key *buttons, int nbuttons) +{ + struct platform_device *pdev; + const struct software_node *gpio_swnode; + struct property_entry *p; + int error; + int i; + + switch (bcm47xx_bus_type) { +#ifdef CONFIG_BCM47XX_BCMA + case BCM47XX_BUS_TYPE_BCMA: + gpio_swnode =3D &bcma_gpio_swnode; + break; +#endif +#ifdef CONFIG_BCM47XX_SSB + case BCM47XX_BUS_TYPE_SSB: + gpio_swnode =3D &ssb_gpio_swnode; + break; +#endif + default: + return -ENODEV; } -}; =20 -/* Copy data from __initconst */ -static int __init bcm47xx_buttons_copy(const struct gpio_keys_button *butt= ons, - size_t nbuttons) -{ - size_t size =3D nbuttons * sizeof(*buttons); + /* 1 node for gpio-keys device, 1 node for each button, 1 terminator */ + const struct software_node **node_group __free(kfree) =3D + kcalloc(1 + nbuttons + 1, sizeof(*node_group), GFP_KERNEL); + if (!node_group) + return -ENOMEM; =20 - bcm47xx_button_pdata.buttons =3D kmemdup(buttons, size, GFP_KERNEL); - if (!bcm47xx_button_pdata.buttons) + /* 1 code property, 1 gpio property, 1 terminator */ + struct property_entry *props __free(kfree) =3D + kcalloc(nbuttons * 3, sizeof(*props), GFP_KERNEL); + if (!props) return -ENOMEM; - bcm47xx_button_pdata.nbuttons =3D nbuttons; =20 + /* 1 node for gpio-keys device, 1 node for each button */ + struct software_node *nodes __free(kfree) =3D + kcalloc(1 + nbuttons, sizeof(*nodes), GFP_KERNEL); + if (!nodes) + return -ENOMEM; + + struct software_node_ref_args *ref_args __free(kfree) =3D + kcalloc(nbuttons, sizeof(*ref_args), GFP_KERNEL); + if (!ref_args) + return -ENOMEM; + + /* gpio-keys node */ + nodes[0].name =3D "bcm47xx-gpio-buttons"; + + p =3D props; + for (i =3D 0; i < nbuttons; i++) { + const struct bcm47xx_gpio_key *button =3D &buttons[i]; + struct software_node *node =3D &nodes[1 + i]; + struct software_node_ref_args *ref =3D &ref_args[i]; + + node->parent =3D &nodes[0]; + node->properties =3D p; + + *ref =3D SOFTWARE_NODE_REFERENCE(gpio_swnode, button->pin, button->flags= ); + *p++ =3D PROPERTY_ENTRY_REF("gpios", &ref_args[i]); + *p++ =3D PROPERTY_ENTRY_U32("linux,code", button->code); + p++; + } + + for (i =3D 0; i < nbuttons + 1; i++) + node_group[i] =3D &nodes[i]; + + error =3D software_node_register_node_group(node_group); + if (error) + return error; + + pdev =3D platform_device_register_full(&(struct platform_device_info){ + .name =3D "gpio-keys", + .swnode =3D &nodes[0], + }); + error =3D PTR_ERR_OR_ZERO(pdev); + if (error) { + software_node_unregister_node_group(node_group); + return error; + } + + retain_and_null_ptr(props); + retain_and_null_ptr(nodes); + retain_and_null_ptr(ref_args); return 0; } =20 -#define bcm47xx_copy_bdata(dev_buttons) \ - bcm47xx_buttons_copy(dev_buttons, ARRAY_SIZE(dev_buttons)); +#define bcm47xx_add_bdata(dev_buttons) \ + bcm47xx_buttons_add(dev_buttons, ARRAY_SIZE(dev_buttons)) =20 int __init bcm47xx_buttons_register(void) { @@ -521,52 +595,52 @@ int __init bcm47xx_buttons_register(void) =20 switch (board) { case BCM47XX_BOARD_ASUS_RTN10U: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn10u); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_rtn10u); break; case BCM47XX_BOARD_ASUS_RTN12: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn12); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_rtn12); break; case BCM47XX_BOARD_ASUS_RTN16: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn16); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_rtn16); break; case BCM47XX_BOARD_ASUS_RTN66U: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_rtn66u); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_rtn66u); break; case BCM47XX_BOARD_ASUS_WL300G: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl300g); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl300g); break; case BCM47XX_BOARD_ASUS_WL320GE: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl320ge); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl320ge); break; case BCM47XX_BOARD_ASUS_WL330GE: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl330ge); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl330ge); break; case BCM47XX_BOARD_ASUS_WL500G: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500g); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl500g); break; case BCM47XX_BOARD_ASUS_WL500GD: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gd); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl500gd); break; case BCM47XX_BOARD_ASUS_WL500GPV1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl500gpv1); break; case BCM47XX_BOARD_ASUS_WL500GPV2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500gpv2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl500gpv2); break; case BCM47XX_BOARD_ASUS_WL500W: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl500w); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl500w); break; case BCM47XX_BOARD_ASUS_WL520GC: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gc); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl520gc); break; case BCM47XX_BOARD_ASUS_WL520GU: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl520gu); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl520gu); break; case BCM47XX_BOARD_ASUS_WL700GE: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wl700ge); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wl700ge); break; case BCM47XX_BOARD_ASUS_WLHDD: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_asus_wlhdd); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_asus_wlhdd); break; =20 case BCM47XX_BOARD_BELKIN_F7D3301: @@ -574,193 +648,193 @@ int __init bcm47xx_buttons_register(void) case BCM47XX_BOARD_BELKIN_F7D4301: case BCM47XX_BOARD_BELKIN_F7D4302: case BCM47XX_BOARD_BELKIN_F7D4401: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_belkin_f7d4301); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_belkin_f7d4301); break; =20 case BCM47XX_BOARD_BUFFALO_WHR2_A54G54: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr2_a54g54); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_whr2_a54g54); break; case BCM47XX_BOARD_BUFFALO_WHR_G125: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g125); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_whr_g125); break; case BCM47XX_BOARD_BUFFALO_WHR_G54S: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_g54s); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_whr_g54s); break; case BCM47XX_BOARD_BUFFALO_WHR_HP_G54: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_whr_hp_g54); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_whr_hp_g54); break; case BCM47XX_BOARD_BUFFALO_WZR_G300N: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_g300n); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_wzr_g300n); break; case BCM47XX_BOARD_BUFFALO_WZR_RS_G54: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54); break; case BCM47XX_BOARD_BUFFALO_WZR_RS_G54HP: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54hp); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_buffalo_wzr_rs_g54hp); break; =20 case BCM47XX_BOARD_DELL_TM2300: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_dell_tm2300); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_dell_tm2300); break; =20 case BCM47XX_BOARD_DLINK_DIR130: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir130); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_dlink_dir130); break; case BCM47XX_BOARD_DLINK_DIR330: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_dlink_dir330); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_dlink_dir330); break; =20 case BCM47XX_BOARD_HUAWEI_E970: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_huawei_e970); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_huawei_e970); break; =20 case BCM47XX_BOARD_LINKSYS_E1000V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e1000v1); break; case BCM47XX_BOARD_LINKSYS_E1000V21: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e1000v21); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e1000v21); break; case BCM47XX_BOARD_LINKSYS_E2000V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2000v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e2000v1); break; case BCM47XX_BOARD_LINKSYS_E2500V3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e2500v3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e2500v3); break; case BCM47XX_BOARD_LINKSYS_E3000V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3000v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e3000v1); break; case BCM47XX_BOARD_LINKSYS_E3200V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e3200v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e3200v1); break; case BCM47XX_BOARD_LINKSYS_E4200V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_e4200v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_e4200v1); break; case BCM47XX_BOARD_LINKSYS_WRT150NV1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt150nv1); break; case BCM47XX_BOARD_LINKSYS_WRT150NV11: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt150nv11); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt150nv11); break; case BCM47XX_BOARD_LINKSYS_WRT160NV1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt160nv1); break; case BCM47XX_BOARD_LINKSYS_WRT160NV3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt160nv3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt160nv3); break; case BCM47XX_BOARD_LINKSYS_WRT300N_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300n_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt300n_v1); break; case BCM47XX_BOARD_LINKSYS_WRT300NV11: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt300nv11); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt300nv11); break; case BCM47XX_BOARD_LINKSYS_WRT310NV1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310nv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt310nv1); break; case BCM47XX_BOARD_LINKSYS_WRT310NV2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt310n_v2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt310n_v2); break; case BCM47XX_BOARD_LINKSYS_WRT320N_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt320n_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt320n_v1); break; case BCM47XX_BOARD_LINKSYS_WRT54G3GV2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt54g3gv2); break; case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0101: case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0467: case BCM47XX_BOARD_LINKSYS_WRT54G_TYPE_0708: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt54g_generic); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt54g_generic); break; case BCM47XX_BOARD_LINKSYS_WRT610NV1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt610nv1); break; case BCM47XX_BOARD_LINKSYS_WRT610NV2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrt610nv2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrt610nv2); break; case BCM47XX_BOARD_LINKSYS_WRTSL54GS: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_linksys_wrtsl54gs); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_linksys_wrtsl54gs); break; =20 case BCM47XX_BOARD_LUXUL_ABR_4400_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_abr_4400_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_abr_4400_v1); break; case BCM47XX_BOARD_LUXUL_XAP_310_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_310_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xap_310_v1); break; case BCM47XX_BOARD_LUXUL_XAP_1210_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1210_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xap_1210_v1); break; case BCM47XX_BOARD_LUXUL_XAP_1230_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1230_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xap_1230_v1); break; case BCM47XX_BOARD_LUXUL_XAP_1240_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1240_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xap_1240_v1); break; case BCM47XX_BOARD_LUXUL_XAP_1500_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xap_1500_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xap_1500_v1); break; case BCM47XX_BOARD_LUXUL_XBR_4400_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xbr_4400_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xbr_4400_v1); break; case BCM47XX_BOARD_LUXUL_XVW_P30_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xvw_p30_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xvw_p30_v1); break; case BCM47XX_BOARD_LUXUL_XWR_600_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_600_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xwr_600_v1); break; case BCM47XX_BOARD_LUXUL_XWR_1750_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_luxul_xwr_1750_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_luxul_xwr_1750_v1); break; =20 case BCM47XX_BOARD_MICROSOFT_MN700: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_microsoft_nm700); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_microsoft_nm700); break; =20 case BCM47XX_BOARD_MOTOROLA_WE800G: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_motorola_we800g); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_motorola_we800g); break; case BCM47XX_BOARD_MOTOROLA_WR850GP: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gp); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_motorola_wr850gp); break; case BCM47XX_BOARD_MOTOROLA_WR850GV2V3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_motorola_wr850gv2v3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_motorola_wr850gv2v3); break; =20 case BCM47XX_BOARD_NETGEAR_R6200_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6200_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_r6200_v1); break; case BCM47XX_BOARD_NETGEAR_R6300_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_r6300_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_r6300_v1); break; case BCM47XX_BOARD_NETGEAR_WN2500RP_V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wn2500rp_v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wn2500rp_v1); break; case BCM47XX_BOARD_NETGEAR_WNDR3400V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wndr3400v1); break; case BCM47XX_BOARD_NETGEAR_WNDR3400_V3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3400_v3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wndr3400_v3); break; case BCM47XX_BOARD_NETGEAR_WNDR3700V3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr3700v3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wndr3700v3); break; case BCM47XX_BOARD_NETGEAR_WNDR4500V1: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wndr4500v1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wndr4500v1); break; case BCM47XX_BOARD_NETGEAR_WNR1000_V3: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr1000_v3); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wnr1000_v3); break; case BCM47XX_BOARD_NETGEAR_WNR3500L: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv1); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wnr3500lv1); break; case BCM47XX_BOARD_NETGEAR_WNR3500L_V2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr3500lv2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wnr3500lv2); break; case BCM47XX_BOARD_NETGEAR_WNR834BV2: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_netgear_wnr834bv2); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_netgear_wnr834bv2); break; =20 case BCM47XX_BOARD_SIMPLETECH_SIMPLESHARE: - err =3D bcm47xx_copy_bdata(bcm47xx_buttons_simpletech_simpleshare); + err =3D bcm47xx_add_bdata(bcm47xx_buttons_simpletech_simpleshare); break; =20 default: @@ -769,13 +843,7 @@ int __init bcm47xx_buttons_register(void) } =20 if (err) - return -ENOMEM; - - err =3D platform_device_register(&bcm47xx_buttons_gpio_keys); - if (err) { - pr_err("Failed to register platform device: %d\n", err); return err; - } =20 return 0; } --=20 2.55.0.795.g602f6c329a-goog