From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-dl1-f44.google.com (mail-dl1-f44.google.com [74.125.82.44]) (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 94D2E30C17D for ; Wed, 24 Jun 2026 04:14:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782274478; cv=none; b=MiwOLN3vNZvjgq3R1eKO9psdI/t7OVF3pYGZ5d569wsvjvrwnx47eAGBRcUw2ChZM15qxcZJkYaFrEXv14n2XO41Z345o6LieKYCxDTevNbvp9oCeSJxuZjla/1vek+9W2wkKq9NqnPi/hJZIgs2iQp+n0f9A4I+337iZ9K35P8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782274478; c=relaxed/simple; bh=F64ZVJVMK5lCsBFog81Qx1aMpxm/GHjOMlsLOnzQQqA=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=P8ty0T36XXh4cfZTibqFVg4vw4dGoPC+kH/aZixe0SPrlciwS3xq0eQpiwhRwJsphzagUqVpTpNusUt/mwXe9AWweTplYkyqjQTwCBM5U03UB7QHaTodP7f5JOt6X26yU4VXbz9A9PAuUyqnOuBH0LOpYH+NWkJyqWG3z3Kzhlo= 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=VOJsNLtu; arc=none smtp.client-ip=74.125.82.44 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="VOJsNLtu" Received: by mail-dl1-f44.google.com with SMTP id a92af1059eb24-139986373b8so794640c88.0 for ; Tue, 23 Jun 2026 21:14:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782274476; x=1782879276; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=vKtWlzZGcSqpr4oYtvBHGz8mTHnWwBOUsRR1pMRsq7A=; b=VOJsNLtubLiIPLIseXckT4SbZcCwJDwxC8TCOtv5KVcTPzwz/LLjFKEa5kUEB3CzCa 5+AK24KW+lJ95Ch4lF2Gm82842IKu9P40XGOv7t5gsZcm9E4OI/pkgvrzThlO/OpuzLF zOFz8Tdmb05Idg6EOEBt2Z7HILo7h9g55qnYe/WifeJYOmSHeLo70VulrB9Y97L48FE/ SVcN5Whp4dxNdQxXxbg9dDtEnnyLgUl3/dZLEKkbtqa9VJShuXoRpTsruNXYlHmUy36L BrOszkiPj9IFshUszebcD/b1HW6p5zWyzFRcUUqqpun6E+xS+SJZlVrUAI382k0tosi6 Tz7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782274476; x=1782879276; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vKtWlzZGcSqpr4oYtvBHGz8mTHnWwBOUsRR1pMRsq7A=; b=lf7V3GU4aN68IEIj2wf+yoGN+1gc4EyVkrcj6v4OhxyYpzn+qZ1586YE4Xy9/LjLHG adIKL9YJhywpYc91tUBXTOHDQBEtwdW2WGBuE2fLHZIoAqFIpc/oxSGf3/XbcWOu3Afo 6uQjETZuZY78cbBRNYSSEj3QbjibO2Jg44rdiMPTtN8JxZml9OextQx2YvRPROvcxEpL 1yqEVtMfgVFYvtrP55fX2ixudK0r3dY8bcPGDI7MtZu2+YyhHPzqGadioFMJEvXiTpPh dSklnb2/kFuC+D1DRc8zSmu+wwWlTbL9fSot80XauIYpRYAm9TZ+l6y+CUfLG7+bCpTR JzVw== X-Forwarded-Encrypted: i=1; AFNElJ9bK1wsoLqzfItzx9SFmhisdnLzlZSIUU3qtEzS8jSUxSKGWvFxM49g7EnhHYgGPhuj1+QbsbwmgrLDB7A=@vger.kernel.org X-Gm-Message-State: AOJu0YwPIIJgTM9h1gvmZwVXvIDJA5ShF/ljUvL3Sb86cSGnKqw9hfLi varHr4Hzz6uz4sxnQMgFxzkB9uVV4L2WMBFF/B39cD40l2PyTBzlGfif X-Gm-Gg: AfdE7ck/vIHBQBJPGjF67T63tx2ejdWHkambrC1ahaDgP+EZTKL4sGlsQtzwU+CSJ+H i6p/xX1Jg177dqF8ihjab/LmcLAR51lQsZJXP1RYAFt2OpR4rrWzqd2smPo9DaenyLuGdq+YLr+ f06Foxw6NVrN6OVdwApS/cnEI74OQfX4c4erQtJO5aCCU2LTAVWQWrxltv6Xv/6IowikMJdNMUu nFUvH1v8ZFiApV8vWOBQmH9VxEfQ0Op+jQAhyehXTcPT2UtbaOo1VRmdMz4aOUKp6YuVPumGGyR gm2Ic2DgMKckmng+Oj5urtM+fBT+AScdQ13GPtkgpkfICvtkWzwXoiKqYAOrtCXREJEOK1Vx3Ec u8zolsH3s9pA8XXeLtqifrrnValovvKwjSRV61973uM+k5k2GLLsxmsfzcrjz+GEMA/KneSgp8B YzkhOgwvk5WCO7oLKyXuQwoyXNVuGAtwZ+Vr7DjLLHp2EHKid2lASddA== X-Received: by 2002:a05:7022:128f:b0:138:5049:cb7c with SMTP id a92af1059eb24-139d0cd9467mr1322277c88.36.1782274475590; Tue, 23 Jun 2026 21:14:35 -0700 (PDT) Received: from google.com ([2a00:79e0:2ebe:8:6026:1e6d:4a80:9bd0]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30c1bd8d6edsm20547205eec.14.2026.06.23.21.14.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Jun 2026 21:14:34 -0700 (PDT) Date: Tue, 23 Jun 2026 21:14:31 -0700 From: Dmitry Torokhov To: Rosen Penev Cc: linux-input@vger.kernel.org, Matthias Brugger , AngeloGioacchino Del Regno , "open list:ARM/Mediatek SoC support" , "moderated list:ARM/Mediatek SoC support" , "moderated list:ARM/Mediatek SoC support" Subject: Re: [PATCH] Input: mtk-pmic-keys: Count available keys during probe instead of pre-counting Message-ID: References: <20260528235600.312045-1-rosenp@gmail.com> 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=us-ascii Content-Disposition: inline In-Reply-To: <20260528235600.312045-1-rosenp@gmail.com> Hi Rosen, On Thu, May 28, 2026 at 04:56:00PM -0700, Rosen Penev wrote: > Replace the separate of_get_available_child_count() pre-count and > validation step with a single pass through for_each_child_of_node_scoped(). > Skip unavailable child nodes and bail out if more than > MTK_PMIC_MAX_KEY_COUNT available keys are found. Set nkeys after the > loop so suspend/resume iterate only over initialized entries. > > Also use a key variable in the loop for clarity. > > Use of_device_get_match_data() to fetch the PMIC key register data directly > instead of open-coding an of_match_device() lookup. Please split this out into a separate patch. > > This also lets the driver drop the of_device.h include. > > Assisted-by: OpenCode:BigPickle > Signed-off-by: Rosen Penev > --- > drivers/input/keyboard/mtk-pmic-keys.c | 53 ++++++++++++-------------- > 1 file changed, 24 insertions(+), 29 deletions(-) > > diff --git a/drivers/input/keyboard/mtk-pmic-keys.c b/drivers/input/keyboard/mtk-pmic-keys.c > index c78d9f6d97c4..e34856693ee2 100644 > --- a/drivers/input/keyboard/mtk-pmic-keys.c > +++ b/drivers/input/keyboard/mtk-pmic-keys.c > @@ -16,7 +16,6 @@ > #include > #include > #include > -#include > #include > #include > #include > @@ -147,6 +146,7 @@ struct mtk_pmic_keys { > struct input_dev *input_dev; > struct device *dev; > struct regmap *regmap; > + unsigned int nkeys; > struct mtk_pmic_keys_info keys[MTK_PMIC_MAX_KEY_COUNT]; > }; > > @@ -267,7 +267,7 @@ static int mtk_pmic_keys_suspend(struct device *dev) > struct mtk_pmic_keys *keys = dev_get_drvdata(dev); > int index; > > - for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) { > + for (index = 0; index < keys->nkeys; index++) { > if (keys->keys[index].wakeup) { > enable_irq_wake(keys->keys[index].irq); > if (keys->keys[index].irq_r > 0) > @@ -283,7 +283,7 @@ static int mtk_pmic_keys_resume(struct device *dev) > struct mtk_pmic_keys *keys = dev_get_drvdata(dev); > int index; > > - for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) { > + for (index = 0; index < keys->nkeys; index++) { > if (keys->keys[index].wakeup) { > disable_irq_wake(keys->keys[index].irq); > if (keys->keys[index].irq_r > 0) > @@ -325,24 +325,23 @@ MODULE_DEVICE_TABLE(of, of_mtk_pmic_keys_match_tbl); > static int mtk_pmic_keys_probe(struct platform_device *pdev) > { > int error, index = 0; > - unsigned int keycount; > struct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent); > struct device_node *node = pdev->dev.of_node; > static const char *const irqnames[] = { "powerkey", "homekey" }; > static const char *const irqnames_r[] = { "powerkey_r", "homekey_r" }; > struct mtk_pmic_keys *keys; > const struct mtk_pmic_regs *mtk_pmic_regs; > + struct mtk_pmic_keys_info *key; > struct input_dev *input_dev; > - const struct of_device_id *of_id = > - of_match_device(of_mtk_pmic_keys_match_tbl, &pdev->dev); > > keys = devm_kzalloc(&pdev->dev, sizeof(*keys), GFP_KERNEL); > if (!keys) > return -ENOMEM; > - > keys->dev = &pdev->dev; > keys->regmap = pmic_chip->regmap; > - mtk_pmic_regs = of_id->data; > + mtk_pmic_regs = of_device_get_match_data(&pdev->dev); > + if (!mtk_pmic_regs) > + return -EINVAL; > > keys->input_dev = input_dev = devm_input_allocate_device(keys->dev); > if (!input_dev) { > @@ -356,31 +355,26 @@ static int mtk_pmic_keys_probe(struct platform_device *pdev) > input_dev->id.product = 0x0001; > input_dev->id.version = 0x0001; > > - keycount = of_get_available_child_count(node); > - if (keycount > MTK_PMIC_MAX_KEY_COUNT || > - keycount > ARRAY_SIZE(irqnames)) { > - dev_err(keys->dev, "too many keys defined (%d)\n", keycount); > - return -EINVAL; > - } > + for_each_available_child_of_node_scoped(node, child) { Let's keep using for_each_child_of_node_scoped() and check of_device_is_available() inside the loop. This will allow marking a key as disabled without shifting it's meaning (power key vs home key). In the rest of the driver we should be able to determine if key is set up checking for key->irq > 0. Thanks. -- Dmitry