From nobody Fri Sep 25 22:18:52 2026 Received: from mail-pz2-f43.google.com (mail-pz2-f43.google.com [74.125.228.43]) (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 C46F510F2 for ; Sat, 19 Sep 2026 00:13:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.228.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789776817; cv=none; b=dr/RY85EKlRmIsq6HD34ZaNMJyHFpdVrOZe+u7i9zzqWZJMNVoZ4hFTiRVhNBsmJLX9ZVKaHNv7JCnABCga4bUc4JkOKWxb3PVGosfDm6EiHqzJ+MDQ3Lzcyhx7dZCqRb8/yDkNhQ6L0McnZ9rLErztHyeYMOBlTZys0UF39JGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789776817; c=relaxed/simple; bh=yxdU8yxNR0ibBUviMecbMTWgSTRnUEjAQ13FWmuxr8E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=YqD84Ke8KK5kCP6N4EhwV8hyduSEHcX5yIBX5AYsHUZQXc0sTJzb/5Jk8hP+okoTHrypYNKAWPMGgRWO05ozYQmlQG4zWWRqyddTocvUKvUmjuWwQhf7WOjVeldcNVmyFp8A9sbzVHYE8I8Tz3h1Gwa+SpJ9N1etBP1MjCG89aE= 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=funxL8Eh; arc=none smtp.client-ip=74.125.228.43 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="funxL8Eh" Received: by mail-pz2-f43.google.com with SMTP id d2e1a72fcca58-8686f46e4adso1145989b3a.0 for ; Fri, 18 Sep 2026 17:13:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789776815; x=1790381615; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=jclCYy7RtirFkygzbMPjnT2XKmcP25jJ49O0tev6J4Y=; b=funxL8EhRylkpEJtz7RiDGfwPcGwKqk3qkvQ5PPKs9wfHpMiK0JqXKaforWUzNhDjt 02eJWQLvoOIBEdZcw66IXr3eBCE2vs+m8VGJhXHU+WQJJwUttZaRSB8NqH+8OKI/rFVm 0Ltn1OSXHJI+sOycmfQ3mxRkyT0pfhdygCwBo2uNkqw0LmKTJrtmgwepBPqIPz6NnMsB /K07C+IpRzf41sENtvLODfcVoPqf0C9NoyV4ONAmgJoCkAK5SMbRn9VjwmylT/SrFxQx mS/44wcwKHwCkrPPcE8jJ2kV89Jq23q3AvaCtZ4cw0CvuQ16+++dt8/wXTTLVtnqgTkz o8RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789776815; x=1790381615; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=jclCYy7RtirFkygzbMPjnT2XKmcP25jJ49O0tev6J4Y=; b=F9LnagOn7QYb/aZ0eCsjhAruhjtN3XBPBmIvVmpCS6Q2xIgoZHbabsOmdUQ6W0mdl8 9w2X8XjnOf+d8SWVf+R4Xi3bIkOcZIWd1OUrM4wZih8GSzvaelSMy7NXQFkgomjRJhVE 1ifjcXNfXP2Qt4siPqujYEsrO93OX7LQ/yB8WLAFQyYd0H01ZQ3gwkilscSoPKGsmomq aRpCiE6C3HaqDinTiX+okwDKwfQfddj3HnoiwHuctU/OR6T/84m22F5TCmD9M5DrfRuB sTAHdpHux0hY6onFd/eGum2XAbmk0PjeopqQXqE6JD85RKZUA0ucdpJH7QRK9Qm6ouYO 13Fg== X-Forwarded-Encrypted: i=1; AKwUvBy1uips/LRdSPT1BFanTCgO8ILO/bt4EyuUsHmMKsScGi4fSa6hCHpj4zopAADTcf176Bx7Ok2jkw3nIS4=@vger.kernel.org X-Gm-Message-State: AFuF++nmAK+CQJsb5mkYdOywZz+VjWFxLVR9ahlqp+o1WE1q7fsKTAqT Lzd3XJ3a0IaxhCyph6GbItiXj4pVZa//QsEjGim2+UDxGhPD2T4zMjTY X-Gm-Gg: AYBFou1GU56WEw5jUuUo/Xx2vE6zKUi6aWWGU/CbwWVWDaI7vwL3od1q1hKVRNbS5wi rbL1zFkP6Zrf+Q/RuEj5aIRP+WhFEssdBtlaF0W7BVqlX3lY63mZiq4gXVegNePQIl3a9rJIR4H OJGhhO4HD6pw9aB27t1g4lB7h0cYPzjY56kjG/EgNt8r+dTZ+un90BmpM3FN90MoqjV6HBKZqEu hZVv/Of0zAzo/1OTGYjQtXyXEV3qUbB1z9ofIvLSUM7HfFnDlHQy276HIsHz9glxyEIX4VdAiG6 XK5uCemSq6xc+nMg1oYuE23awoSGTXKsOBbBNMIE5Z++m2I2gZhjUH/QS0uB9aMbQ+zwYqtlLv2 jIxbA82y9QK0ucKyYSw5pHZrv26jY9+jo02Jbi5wUxdjJWU5fG0x6zLvaEUwisIU4XQCa3wtR1g w8d+irqBEtOhOKTOzC/wzIlf1Uj8MfeEbxis9sWB++TAI4mqvxcUZOHQludvoC0yayx/tHcnQf0 PiImU2xnCuGXUJXdUr/Z803+VNQJsuRdUYkPVdoK4YONIaIzYhzyGtk4/c4R7auyWUjNR6KH6/Q XmW8Se6iiIOzpqSZVDisUv60l3P7qWEnhg0gk/1GMlEv3xcP X-Received: by 2002:a05:6a00:1a8b:b0:848:4754:28e5 with SMTP id d2e1a72fcca58-874dd6fef50mr7423397b3a.16.1789776815018; Fri, 18 Sep 2026 17:13:35 -0700 (PDT) Received: from ryzen.lan ([2601:644:8000:7a86::e35]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-877a94f4fefsm382611b3a.25.2026.09.18.17.13.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Sep 2026 17:13:32 -0700 (PDT) From: Rosen Penev To: linux-leds@vger.kernel.org Cc: Lee Jones , Pavel Machek , linux-kernel@vger.kernel.org (open list) Subject: [PATCHv2] leds: rgb: qcom-lpg: Use fwnode APIs for LED parsing Date: Fri, 18 Sep 2026 17:13:31 -0700 Message-ID: <20260919001331.720072-1-rosenp@gmail.com> X-Mailer: git-send-email 2.55.0 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" Convert LED and channel parsing in lpg_add_led() and lpg_parse_channel() from DT-specific helpers to the fwnode API. The probe loop now uses device_for_each_child_node_scoped(), dropping explicit node lifetime handling. Behaviour is unchanged for device tree: fwnode_get_child_node_count() and both child iteration helpers skip unavailable children on OF, and the fwnode handle is passed straight to LED registration. cdev->default_trigger is only assigned when fwnode_property_read_string() succeeds, so an absent linux,default-trigger property no longer yields an uninitialized pointer. Assisted-by: LLM Signed-off-by: Rosen Penev --- v2: assign i to led->mcdev.num_colors drivers/leds/rgb/leds-qcom-lpg.c | 38 ++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-= lpg.c index d7d6518de30f..24ffe079f221 100644 --- a/drivers/leds/rgb/leds-qcom-lpg.c +++ b/drivers/leds/rgb/leds-qcom-lpg.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -1342,7 +1343,7 @@ static int lpg_add_pwm(struct lpg *lpg) return ret; } =20 -static int lpg_parse_channel(struct lpg *lpg, struct device_node *np, +static int lpg_parse_channel(struct lpg *lpg, struct fwnode_handle *fw, struct lpg_channel **channel) { struct lpg_channel *chan; @@ -1350,17 +1351,18 @@ static int lpg_parse_channel(struct lpg *lpg, struc= t device_node *np, u32 reg; int ret; =20 - ret =3D of_property_read_u32(np, "reg", ®); + ret =3D fwnode_property_read_u32(fw, "reg", ®); if (ret || !reg || reg > lpg->num_channels) - return dev_err_probe(lpg->dev, -EINVAL, "invalid \"reg\" of %pOFn\n", np= ); + return dev_err_probe(lpg->dev, -EINVAL, + "invalid \"reg\" of %s\n", fwnode_get_name(fw)); =20 chan =3D &lpg->channels[reg - 1]; chan->in_use =3D true; =20 - ret =3D of_property_read_u32(np, "color", &color); + ret =3D fwnode_property_read_u32(fw, "color", &color); if (ret < 0 && ret !=3D -EINVAL) return dev_err_probe(lpg->dev, ret, - "failed to parse \"color\" of %pOF\n", np); + "failed to parse \"color\" of %s\n", fwnode_get_name(fw)); =20 chan->color =3D color; =20 @@ -1369,25 +1371,26 @@ static int lpg_parse_channel(struct lpg *lpg, struc= t device_node *np, return 0; } =20 -static int lpg_add_led(struct lpg *lpg, struct device_node *np) +static int lpg_add_led(struct lpg *lpg, struct fwnode_handle *fw) { struct led_init_data init_data =3D {}; struct led_classdev *cdev; struct mc_subled *info; struct lpg_led *led; + const char *trigger; const char *state; int num_channels; u32 color =3D 0; int ret; int i; =20 - ret =3D of_property_read_u32(np, "color", &color); + ret =3D fwnode_property_read_u32(fw, "color", &color); if (ret < 0 && ret !=3D -EINVAL) return dev_err_probe(lpg->dev, ret, - "failed to parse \"color\" of %pOF\n", np); + "failed to parse \"color\" of %s\n", fwnode_get_name(fw)); =20 if (color =3D=3D LED_COLOR_ID_RGB || color =3D=3D LED_COLOR_ID_MULTI) - num_channels =3D of_get_available_child_count(np); + num_channels =3D fwnode_get_child_node_count(fw); else num_channels =3D 1; =20 @@ -1403,7 +1406,7 @@ static int lpg_add_led(struct lpg *lpg, struct device= _node *np) if (!info) return -ENOMEM; i =3D 0; - for_each_available_child_of_node_scoped(np, child) { + fwnode_for_each_available_child_node_scoped(fw, child) { ret =3D lpg_parse_channel(lpg, child, &led->channels[i]); if (ret < 0) return ret; @@ -1414,7 +1417,7 @@ static int lpg_add_led(struct lpg *lpg, struct device= _node *np) } =20 led->mcdev.subled_info =3D info; - led->mcdev.num_colors =3D num_channels; + led->mcdev.num_colors =3D i; =20 cdev =3D &led->mcdev.led_cdev; cdev->brightness_set_blocking =3D lpg_brightness_mc_set; @@ -1426,7 +1429,7 @@ static int lpg_add_led(struct lpg *lpg, struct device= _node *np) cdev->pattern_clear =3D lpg_pattern_mc_clear; } } else { - ret =3D lpg_parse_channel(lpg, np, &led->channels[0]); + ret =3D lpg_parse_channel(lpg, fw, &led->channels[0]); if (ret < 0) return ret; =20 @@ -1441,14 +1444,15 @@ static int lpg_add_led(struct lpg *lpg, struct devi= ce_node *np) } } =20 - cdev->default_trigger =3D of_get_property(np, "linux,default-trigger", NU= LL); + if (!fwnode_property_read_string(fw, "linux,default-trigger", &trigger)) + cdev->default_trigger =3D trigger; =20 if (lpg->lpg_chan_sdam) cdev->max_brightness =3D PPG_MAX_LED_BRIGHTNESS; else cdev->max_brightness =3D LPG_RESOLUTION_9BIT - 1; =20 - if (!of_property_read_string(np, "default-state", &state) && + if (!fwnode_property_read_string(fw, "default-state", &state) && !strcmp(state, "on")) cdev->brightness =3D cdev->max_brightness; else @@ -1456,7 +1460,7 @@ static int lpg_add_led(struct lpg *lpg, struct device= _node *np) =20 cdev->brightness_set_blocking(cdev, cdev->brightness); =20 - init_data.fwnode =3D of_fwnode_handle(np); + init_data.fwnode =3D fw; =20 if (color =3D=3D LED_COLOR_ID_RGB || color =3D=3D LED_COLOR_ID_MULTI) ret =3D devm_led_classdev_multicolor_register_ext(lpg->dev, &led->mcdev,= &init_data); @@ -1638,8 +1642,8 @@ static int lpg_probe(struct platform_device *pdev) if (ret < 0) return ret; =20 - for_each_available_child_of_node_scoped(pdev->dev.of_node, np) { - ret =3D lpg_add_led(lpg, np); + device_for_each_child_node_scoped(&pdev->dev, child) { + ret =3D lpg_add_led(lpg, child); if (ret) return ret; } --=20 2.55.0