From nobody Fri Oct 2 06:18:47 2026 Received: from mail.andi.de1.cc (mail.andi.de1.cc [178.238.236.174]) (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 2AB363D411A; Tue, 4 Aug 2026 13:35:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=178.238.236.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785850512; cv=none; b=OBb6wvGxoBs7BlIopbpGVIE2jFJ+W2m3H+FTXlk2NQMk/CAsCBjXdJ5XBm38U6ijrmjJDP39+6tstMcjyHOvnH2Nw2AKePy+wMs3kYNSNfGBPlnZYonGUNB/Hweo/QJhSWFC+x3zq0F3IjmH6gcLiL5boVK2G4xytAKhQqq6+WM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785850512; c=relaxed/simple; bh=d8XagGACG09Cjlr5NxcDIsqck9AIt9BGcrzXBfbJRxM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=toYn5aeELFLshZQT3VLBTruxRF/09Ejcy5nDO6sLptqCoqpYbCWt+xJUg0dRdQAQ0ID55WZ30Z1UtH3GvDKHV3mAlsTqjfcg51D1PcMp/YtDqptTH1Smv96DRBV5Ehhs2QtXamK3X9oCEtNbhJu7Z6hesrpSusnXGbUcy2oXXqE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=kemnade.info; spf=pass smtp.mailfrom=kemnade.info; dkim=pass (2048-bit key) header.d=kemnade.info header.i=@kemnade.info header.b=EHoyJErx; arc=none smtp.client-ip=178.238.236.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=kemnade.info Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kemnade.info Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kemnade.info header.i=@kemnade.info header.b="EHoyJErx" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kemnade.info; s=20220719; h=Cc:To:Subject:From:Reply-To:Content-ID: Content-Description:In-Reply-To:References; bh=hHjiFq/M4O9iu1JuePDSxDZgLfVpfuQSu3TRjFiDmig=; t=1785850511; x=1787060111; b=EHoyJErxBeroozXJXl66HQWrZcXF7tfnlp9JcURiSlgAMnkOKl121POUP01b3rkHiR1BziG0g0M T1URp36nLE3PVdsYuYngpR7+MA3X7TxLe6r1ujmlE6Gmfhra7c9QHknTWjuyUl9sL6nJCASD7ZsMt Zrl9kAcHj6zrN8qDnboFeii9wKPtDy/f1yGZMyEvXzYkgzNNocp4xw9mQyHY6Gzr7Fcp9gLeQcYjq WjAICK8hjrYXSvv/xveQwVE0sjFunbAXJJikmsQBvDNNwe80M7GQ357+1dPBiFeaUCykww1YONjZV UDJu5tkq9YwfT//zhMA4nubm/zleCT2c9Kbw==; From: Andreas Kemnade Date: Tue, 04 Aug 2026 15:34:44 +0200 Subject: [PATCH v3] leds: is31fl319x: modernize registration 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: <20260804-led-modern-v3-1-297720eec19f@kemnade.info> X-B4-Tracking: v=1; b=H4sIAHPqcWoC/22NwQ7CIBAFf8XsWQzQhqon/8N4wO5iUQsGKtE0/ XehXtR4nOTNvBEiBUsRtosRAiUbrXcZquUC2k67EzGLmUFyqXjDJbsSst4jBcewlg0hF8KsK8j CLZCxjzm2P7w53o9naodSKIvOxsGH5/yWRNn9DSfBBNO1NpI2WqPiuwv1TiOtrDMeSjvJT7v6s mW2kTeIHBW1yvzY0zS9ANhUMFf3AAAA X-Change-ID: 20260702-led-modern-d427ed011f83 To: Lee Jones , Pavel Machek Cc: linux-leds@vger.kernel.org, hns@goldelico.com, linux-kernel@vger.kernel.org, Andreas Kemnade X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5232; i=andreas@kemnade.info; h=from:subject:message-id; bh=d8XagGACG09Cjlr5NxcDIsqck9AIt9BGcrzXBfbJRxM=; b=owGbwMvMwCUm/rzkS6lq2x3G02pJDFmFr+r+80Wfin2xKtJlk8qX2SVXzpg2frGOZc2tvMzvY OIsttero5SFQYyLQVZMkeWXtYLbJ5VnucFTI+xh5rAygQxh4OIUgImsOcfw32mnrdfdpm5DlnUK BVzH5jOy2t3ey72Yl83AXP/NtC1tExj+h3fyTtPfHqYouePyqn723KcM1zbbZHgnPLOe9WSycDQ fMwA= X-Developer-Key: i=andreas@kemnade.info; a=openpgp; fpr=EEC0DB858E66C0DA70620AC07DBD6AC74DE29324 Use _ext version to have properties parsed to avoid needing to parse them in the driver itself. More modern properties are recognized and the leds can be referenced via phandle. Due to the maximum current mechanics, leds are not registered right in the first iteration over the nodes. Signed-off-by: Andreas Kemnade --- Changes in v3: - fix typo (Sashiko) - check availability of device match data (Sashiko) - Link to v2: https://patch.msgid.link/20260703-led-modern-v2-1-d07dd0d6ec6= f@kemnade.info Changes in v2: - put node free action after cdef is initialized (Sashiko) - Link to v1: https://patch.msgid.link/20260702-led-modern-v1-1-a4af2e9aad6= 0@kemnade.info To: Lee Jones To: Pavel Machek Cc: linux-leds@vger.kernel.org Cc: linux-kernel@vger.kernel.org --- drivers/leds/leds-is31fl319x.c | 61 +++++++++++++++++++++-----------------= ---- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/drivers/leds/leds-is31fl319x.c b/drivers/leds/leds-is31fl319x.c index 80f38dba0fba..83cb769d8cb4 100644 --- a/drivers/leds/leds-is31fl319x.c +++ b/drivers/leds/leds-is31fl319x.c @@ -98,7 +98,7 @@ struct is31fl319x_chip { struct is31fl319x_chip *chip; struct led_classdev cdev; u32 max_microamp; - bool configured; + struct fwnode_handle *fwnode; } leds[IS31FL319X_MAX_LEDS]; }; =20 @@ -363,31 +363,17 @@ static const struct of_device_id of_is31fl319x_match[= ] =3D { }; MODULE_DEVICE_TABLE(of, of_is31fl319x_match); =20 -static int is31fl319x_parse_child_fw(const struct device *dev, - const struct fwnode_handle *child, - struct is31fl319x_led *led, - struct is31fl319x_chip *is31) +static void is31_free_fwnode(void *data) { - struct led_classdev *cdev =3D &led->cdev; - int ret; - - if (fwnode_property_read_string(child, "label", &cdev->name)) - cdev->name =3D fwnode_get_name(child); + struct is31fl319x_chip *is31 =3D data; + int i; =20 - ret =3D fwnode_property_read_string(child, "linux,default-trigger", &cdev= ->default_trigger); - if (ret < 0 && ret !=3D -EINVAL) /* is optional */ - return ret; + for (i =3D 0; i < is31->cdef->num_leds; i++) { + if (is31->leds[i].fwnode) + fwnode_handle_put(is31->leds[i].fwnode); =20 - led->max_microamp =3D is31->cdef->current_default; - ret =3D fwnode_property_read_u32(child, "led-max-microamp", &led->max_mic= roamp); - if (!ret) { - if (led->max_microamp < is31->cdef->current_min) - return -EINVAL; /* not supported */ - led->max_microamp =3D min(led->max_microamp, - is31->cdef->current_max); + is31->leds[i].fwnode =3D NULL; } - - return 0; } =20 static int is31fl319x_parse_fw(struct device *dev, struct is31fl319x_chip = *is31) @@ -402,6 +388,12 @@ static int is31fl319x_parse_fw(struct device *dev, str= uct is31fl319x_chip *is31) "Failed to get shutdown gpio\n"); =20 is31->cdef =3D device_get_match_data(dev); + if (!is31->cdef) + return -ENODEV; + + ret =3D devm_add_action_or_reset(dev, is31_free_fwnode, is31); + if (ret) + return ret; =20 count =3D 0; device_for_each_child_node_scoped(dev, child) @@ -427,14 +419,20 @@ static int is31fl319x_parse_fw(struct device *dev, st= ruct is31fl319x_chip *is31) =20 led =3D &is31->leds[reg - 1]; =20 - if (led->configured) + if (led->fwnode) return dev_err_probe(dev, -EINVAL, "led %u is already configured\n", re= g); =20 - ret =3D is31fl319x_parse_child_fw(dev, child, led, is31); - if (ret) - return dev_err_probe(dev, ret, "led %u DT parsing failed\n", reg); + led->max_microamp =3D is31->cdef->current_default; + ret =3D fwnode_property_read_u32(child, "led-max-microamp", &led->max_mi= croamp); + if (!ret) { + if (led->max_microamp < is31->cdef->current_min) + return dev_err_probe(dev, -EINVAL, "invalid maximum current\n"); + + led->max_microamp =3D min(led->max_microamp, + is31->cdef->current_max); + } =20 - led->configured =3D true; + led->fwnode =3D fwnode_handle_get(child); } =20 is31->audio_gain_db =3D 0; @@ -531,7 +529,7 @@ static int is31fl319x_probe(struct i2c_client *client) */ aggregated_led_microamp =3D is31->cdef->current_max; for (i =3D 0; i < is31->cdef->num_leds; i++) - if (is31->leds[i].configured && + if (is31->leds[i].fwnode && is31->leds[i].max_microamp < aggregated_led_microamp) aggregated_led_microamp =3D is31->leds[i].max_microamp; =20 @@ -545,14 +543,17 @@ static int is31fl319x_probe(struct i2c_client *client) =20 for (i =3D 0; i < is31->cdef->num_leds; i++) { struct is31fl319x_led *led =3D &is31->leds[i]; + struct led_init_data init_data =3D {}; =20 - if (!led->configured) + if (!led->fwnode) continue; =20 + init_data.fwnode =3D led->fwnode; + led->chip =3D is31; led->cdev.brightness_set_blocking =3D is31->cdef->brightness_set; =20 - err =3D devm_led_classdev_register(&client->dev, &led->cdev); + err =3D devm_led_classdev_register_ext(&client->dev, &led->cdev, &init_d= ata); if (err < 0) return err; } --- base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482 change-id: 20260702-led-modern-d427ed011f83 Best regards, -- =20 Andreas Kemnade