Message ID | 20231121202835.28152-5-ddrokosov@salutedevices.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2b07:b0:403:3b70:6f57 with SMTP id io7csp898249vqb; Tue, 21 Nov 2023 12:31:38 -0800 (PST) X-Google-Smtp-Source: AGHT+IGEJif97T00VFxWKLuu58mYlwzmXm5NJVGL9HztXIhnVTGzGgTOP/tTP88xzj5cT/KYEKdD X-Received: by 2002:a17:902:dacd:b0:1ce:6630:1585 with SMTP id q13-20020a170902dacd00b001ce66301585mr706904plx.23.1700598698112; Tue, 21 Nov 2023 12:31:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1700598698; cv=none; d=google.com; s=arc-20160816; b=A9nU0Xa1dRhn5PtBZKcT9SVKZD9rE7ysFIpo33vJ1s5qFYS0oUU/AN7STclQv6jQCh KOnk0MgAVU8sa1L4LACjT3NhlgJlTsew+HVLUFPGqxb+/dE0ktjpQod2GOEEMZHZhjRc qXANKA/KQR9rwPA7Rt58TO1VpzJvkRvw8gIh3ObwovqotPaicnWNJsunUVCGBEaGmNfi VXPCLXtA0TwO7jgUeucr6cMt1sCOWuoUsmt0PsC04yelyTXZJp6RDx/pEAXF1GPcvOXn XVq4KlFxCGeZcyXUNCB7PTwv9B5o7L086q+ShsXMQPFdMMbnAKhhtX25ftjptCERVm/D Txqg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-filter; bh=Uld1PRLw163IbfjdCAxAA+QDPnnc9y5jXDdioK9+6Pw=; fh=sORWI5m16YEVk6NuaHBH7AzDgvChSOROlmEzxQvCLqs=; b=fHrQGDqR4offYn0NB2p5+SZ4P0tJ/cakb51YYm4c2PFMeUSrvLKRlTgkvdaNwGxDaM MxwAkK2Mj6NRSECLYn8Bu7quSza09zs5mz4AKHNdMPcShnNzolTwiB5pMBj5MiuC4D4x W5GfgkQzaSIUwA6RpXdcJDCuW/Oc2KcwN798ONXHX+7dpNWzZMcYuaPxQXS3ZOgRQbhq XN4riNA0c6jNAisODQM7AyhZYsyUP6IKKJupoKeL0iJxYSy8R45hpBpaT3jg8ZVNvHNj g0B9UD9bu0RcxGFR5z2CyMtUPNlZqC4Rvh2JdgV9aiJMycSybWDrUQwuichtUesbN2g7 u9bA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@salutedevices.com header.s=mail header.b="nXfnA/jK"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=salutedevices.com Received: from groat.vger.email (groat.vger.email. [2620:137:e000::3:5]) by mx.google.com with ESMTPS id j10-20020a17090276ca00b001bbca0a8393si10798862plt.56.2023.11.21.12.31.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 21 Nov 2023 12:31:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) client-ip=2620:137:e000::3:5; Authentication-Results: mx.google.com; dkim=pass header.i=@salutedevices.com header.s=mail header.b="nXfnA/jK"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:5 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=salutedevices.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by groat.vger.email (Postfix) with ESMTP id 884FF80740C4; Tue, 21 Nov 2023 12:30:53 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at groat.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234483AbjKUU3P (ORCPT <rfc822;ouuuleilei@gmail.com> + 99 others); Tue, 21 Nov 2023 15:29:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229597AbjKUU3A (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Tue, 21 Nov 2023 15:29:00 -0500 Received: from mx1.sberdevices.ru (mx2.sberdevices.ru [45.89.224.132]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B70BC1BB; Tue, 21 Nov 2023 12:28:52 -0800 (PST) Received: from p-infra-ksmg-sc-msk02 (localhost [127.0.0.1]) by mx1.sberdevices.ru (Postfix) with ESMTP id 63D8812005D; Tue, 21 Nov 2023 23:28:51 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.sberdevices.ru 63D8812005D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=salutedevices.com; s=mail; t=1700598531; bh=Uld1PRLw163IbfjdCAxAA+QDPnnc9y5jXDdioK9+6Pw=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type:From; b=nXfnA/jKjnnlEbJiRoz3z361AoHnSpagl0oX1EM4KRc6FbOYeleghtPvBW9b6/QzY BMmk7omyc4d9Mjr+H3A7RJ2XdMZZub05YtVBNO5WXk3Gxgo8OjfWN8uF40NZURdL7g cfjOXtJpf/oofRbg4RzyGagGQaewE95nSuCNwjTDcCtzq4Y34+WtpbXEXsNJHRx1V5 vPSJzpgO1a/OAHq/CZhyo75XcVjYE94b6GjnoVKBvxe/vjTwCgI0YpfhjOKQcp9KAC fVYqA26tVhB/FH49ucwKdlB8vH9ekNl4tHX6YdnFWMLwpzikl8VTTpfJLvBbiWo6bp uL7AuZoQx5cOQ== Received: from p-i-exch-sc-m01.sberdevices.ru (p-i-exch-sc-m01.sberdevices.ru [172.16.192.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.sberdevices.ru (Postfix) with ESMTPS; Tue, 21 Nov 2023 23:28:51 +0300 (MSK) Received: from localhost.localdomain (100.64.160.123) by p-i-exch-sc-m01.sberdevices.ru (172.16.192.107) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.40; Tue, 21 Nov 2023 23:28:50 +0300 From: Dmitry Rokosov <ddrokosov@salutedevices.com> To: <lee@kernel.org>, <pavel@ucw.cz>, <robh+dt@kernel.org>, <krzysztof.kozlowski+dt@linaro.org>, <conor+dt@kernel.org>, <andy.shevchenko@gmail.com> CC: <kernel@sberdevices.ru>, <rockosov@gmail.com>, <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-leds@vger.kernel.org>, George Stark <gnstark@salutedevices.com>, Dmitry Rokosov <ddrokosov@salutedevices.com> Subject: [PATCH v4 04/11] leds: aw200xx: calculate dts property display_rows in the driver Date: Tue, 21 Nov 2023 23:28:28 +0300 Message-ID: <20231121202835.28152-5-ddrokosov@salutedevices.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20231121202835.28152-1-ddrokosov@salutedevices.com> References: <20231121202835.28152-1-ddrokosov@salutedevices.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [100.64.160.123] X-ClientProxiedBy: p-i-exch-sc-m01.sberdevices.ru (172.16.192.107) To p-i-exch-sc-m01.sberdevices.ru (172.16.192.107) X-KSMG-Rule-ID: 10 X-KSMG-Message-Action: clean X-KSMG-AntiSpam-Lua-Profiles: 181514 [Nov 21 2023] X-KSMG-AntiSpam-Version: 6.0.0.2 X-KSMG-AntiSpam-Envelope-From: ddrokosov@salutedevices.com X-KSMG-AntiSpam-Rate: 0 X-KSMG-AntiSpam-Status: not_detected X-KSMG-AntiSpam-Method: none X-KSMG-AntiSpam-Auth: dkim=none X-KSMG-AntiSpam-Info: LuaCore: 3 0.3.3 e5c6a18a9a9bff0226d530c5b790210c0bd117c8, {Tracking_from_domain_doesnt_match_to}, 100.64.160.123:7.1.2;127.0.0.199:7.1.2;p-i-exch-sc-m01.sberdevices.ru:5.0.1,7.1.1;salutedevices.com:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1, FromAlignment: s, ApMailHostAddress: 100.64.160.123 X-MS-Exchange-Organization-SCL: -1 X-KSMG-AntiSpam-Interceptor-Info: scan successful X-KSMG-AntiPhishing: Clean X-KSMG-LinksScanning: Clean X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.0.1.6960, bases: 2023/11/21 17:47:00 #22495004 X-KSMG-AntiVirus-Status: Clean, skipped X-Spam-Status: No, score=-0.9 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on groat.vger.email Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (groat.vger.email [0.0.0.0]); Tue, 21 Nov 2023 12:30:54 -0800 (PST) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1783206980533822430 X-GMAIL-MSGID: 1783206980533822430 |
Series |
leds: aw200xx: several driver updates
|
|
Commit Message
Dmitry Rokosov
Nov. 21, 2023, 8:28 p.m. UTC
From: George Stark <gnstark@salutedevices.com> Get rid of device tree property "awinic,display-rows". The property value actually means number of current switches and depends on how leds are connected to the device. It should be calculated manually by max used led number. In the same way it is computed automatically now. Max used led is taken from led definition subnodes. Signed-off-by: George Stark <gnstark@salutedevices.com> Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> --- drivers/leds/leds-aw200xx.c | 39 +++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-)
Comments
On Tue, 21 Nov 2023, Dmitry Rokosov wrote: > From: George Stark <gnstark@salutedevices.com> > > Get rid of device tree property "awinic,display-rows". The property > value actually means number of current switches and depends on how leds Nit: LEDs > are connected to the device. It should be calculated manually by max > used led number. In the same way it is computed automatically now. As above - I won't mention this again. > Max used led is taken from led definition subnodes. > > Signed-off-by: George Stark <gnstark@salutedevices.com> > Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> > --- > drivers/leds/leds-aw200xx.c | 39 +++++++++++++++++++++++++------------ > 1 file changed, 27 insertions(+), 12 deletions(-) > > diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c > index 7762b3a132ac..4bce5e7381c0 100644 > --- a/drivers/leds/leds-aw200xx.c > +++ b/drivers/leds/leds-aw200xx.c > @@ -379,6 +379,30 @@ static void aw200xx_disable(const struct aw200xx *const chip) > return gpiod_set_value_cansleep(chip->hwen, 0); > } > > +static bool aw200xx_probe_get_display_rows(struct device *dev, struct aw200xx *chip) > +{ > + struct fwnode_handle *child; > + u32 max_source = 0; > + > + device_for_each_child_node(dev, child) { > + u32 source; > + int ret; > + > + ret = fwnode_property_read_u32(child, "reg", &source); > + if (ret || source >= chip->cdef->channels) Shouldn't the second clause fail instantly? > + continue; > + > + max_source = max(max_source, source); > + } > + > + if (!max_source) Since max_source is an integer, please use an '== 0' comparison. > + return false; > + > + chip->display_rows = max_source / chip->cdef->display_size_columns + 1; > + > + return true; > +} > + > static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) > { > struct fwnode_handle *child; > @@ -386,18 +410,9 @@ static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) > int ret; > int i; > > - ret = device_property_read_u32(dev, "awinic,display-rows", > - &chip->display_rows); > - if (ret) > - return dev_err_probe(dev, ret, > - "Failed to read 'display-rows' property\n"); > - > - if (!chip->display_rows || > - chip->display_rows > chip->cdef->display_size_rows_max) { > - return dev_err_probe(dev, ret, > - "Invalid leds display size %u\n", > - chip->display_rows); > - } > + if (!aw200xx_probe_get_display_rows(dev, chip)) Function calls in side if() statements in general is rough. Please break it out and use 'ret' as we usually do. > + return dev_err_probe(dev, -EINVAL, Make this the return value from aw200xx_probe_get_display_rows() and use 'ret' instead. > + "No valid led definitions found\n"); > > current_max = aw200xx_imax_from_global(chip, AW200XX_IMAX_MAX_uA); > current_min = aw200xx_imax_from_global(chip, AW200XX_IMAX_MIN_uA); > -- > 2.36.0 >
On Thu, Nov 23, 2023 at 04:32:52PM +0000, Lee Jones wrote: > On Tue, 21 Nov 2023, Dmitry Rokosov wrote: > > > From: George Stark <gnstark@salutedevices.com> > > > > Get rid of device tree property "awinic,display-rows". The property > > value actually means number of current switches and depends on how leds > > Nit: LEDs > > > are connected to the device. It should be calculated manually by max > > used led number. In the same way it is computed automatically now. > > As above - I won't mention this again. > > > Max used led is taken from led definition subnodes. > > > > Signed-off-by: George Stark <gnstark@salutedevices.com> > > Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> > > --- > > drivers/leds/leds-aw200xx.c | 39 +++++++++++++++++++++++++------------ > > 1 file changed, 27 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c > > index 7762b3a132ac..4bce5e7381c0 100644 > > --- a/drivers/leds/leds-aw200xx.c > > +++ b/drivers/leds/leds-aw200xx.c > > @@ -379,6 +379,30 @@ static void aw200xx_disable(const struct aw200xx *const chip) > > return gpiod_set_value_cansleep(chip->hwen, 0); > > } > > > > +static bool aw200xx_probe_get_display_rows(struct device *dev, struct aw200xx *chip) > > +{ > > + struct fwnode_handle *child; > > + u32 max_source = 0; > > + > > + device_for_each_child_node(dev, child) { > > + u32 source; > > + int ret; > > + > > + ret = fwnode_property_read_u32(child, "reg", &source); > > + if (ret || source >= chip->cdef->channels) > > Shouldn't the second clause fail instantly? > We already have such logic in the aw200xx_probe_fw() function, which skips the LED node with the wrong reg value too. Furthermore, we have strict reg constraints in the dt-bindings parts (in the current patch series), so we assume that the DT developer will not create an LED with the wrong reg value. > > + continue; > > + > > + max_source = max(max_source, source); > > + } > > + > > + if (!max_source) > > Since max_source is an integer, please use an '== 0' comparison. > Okay > > + return false; > > + > > + chip->display_rows = max_source / chip->cdef->display_size_columns + 1; > > + > > + return true; > > +} > > + > > static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) > > { > > struct fwnode_handle *child; > > @@ -386,18 +410,9 @@ static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) > > int ret; > > int i; > > > > - ret = device_property_read_u32(dev, "awinic,display-rows", > > - &chip->display_rows); > > - if (ret) > > - return dev_err_probe(dev, ret, > > - "Failed to read 'display-rows' property\n"); > > - > > - if (!chip->display_rows || > > - chip->display_rows > chip->cdef->display_size_rows_max) { > > - return dev_err_probe(dev, ret, > > - "Invalid leds display size %u\n", > > - chip->display_rows); > > - } > > + if (!aw200xx_probe_get_display_rows(dev, chip)) > > Function calls in side if() statements in general is rough. > > Please break it out and use 'ret' as we usually do. > > > + return dev_err_probe(dev, -EINVAL, > > Make this the return value from aw200xx_probe_get_display_rows() and use > 'ret' instead. > No problem, I'll prepare a new version. > > + "No valid led definitions found\n"); > > > > current_max = aw200xx_imax_from_global(chip, AW200XX_IMAX_MAX_uA); > > current_min = aw200xx_imax_from_global(chip, AW200XX_IMAX_MIN_uA); > > -- > > 2.36.0 > > > > -- > Lee Jones [李琼斯]
On Fri, 24 Nov 2023, Dmitry Rokosov wrote: > On Thu, Nov 23, 2023 at 04:32:52PM +0000, Lee Jones wrote: > > On Tue, 21 Nov 2023, Dmitry Rokosov wrote: > > > > > From: George Stark <gnstark@salutedevices.com> > > > > > > Get rid of device tree property "awinic,display-rows". The property > > > value actually means number of current switches and depends on how leds > > > > Nit: LEDs > > > > > are connected to the device. It should be calculated manually by max > > > used led number. In the same way it is computed automatically now. > > > > As above - I won't mention this again. > > > > > Max used led is taken from led definition subnodes. > > > > > > Signed-off-by: George Stark <gnstark@salutedevices.com> > > > Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> > > > --- > > > drivers/leds/leds-aw200xx.c | 39 +++++++++++++++++++++++++------------ > > > 1 file changed, 27 insertions(+), 12 deletions(-) > > > > > > diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c > > > index 7762b3a132ac..4bce5e7381c0 100644 > > > --- a/drivers/leds/leds-aw200xx.c > > > +++ b/drivers/leds/leds-aw200xx.c > > > @@ -379,6 +379,30 @@ static void aw200xx_disable(const struct aw200xx *const chip) > > > return gpiod_set_value_cansleep(chip->hwen, 0); > > > } > > > > > > +static bool aw200xx_probe_get_display_rows(struct device *dev, struct aw200xx *chip) > > > +{ > > > + struct fwnode_handle *child; > > > + u32 max_source = 0; > > > + > > > + device_for_each_child_node(dev, child) { > > > + u32 source; > > > + int ret; > > > + > > > + ret = fwnode_property_read_u32(child, "reg", &source); > > > + if (ret || source >= chip->cdef->channels) > > > > Shouldn't the second clause fail instantly? > > > > We already have such logic in the aw200xx_probe_fw() function, which > skips the LED node with the wrong reg value too. Furthermore, we have > strict reg constraints in the dt-bindings parts (in the current patch > series), so we assume that the DT developer will not create an LED with > the wrong reg value. Why is it being checked again then?
Lee, Thank you for the quick reply! On Mon, Nov 27, 2023 at 08:57:55AM +0000, Lee Jones wrote: > On Fri, 24 Nov 2023, Dmitry Rokosov wrote: > > > On Thu, Nov 23, 2023 at 04:32:52PM +0000, Lee Jones wrote: > > > On Tue, 21 Nov 2023, Dmitry Rokosov wrote: > > > > > > > From: George Stark <gnstark@salutedevices.com> > > > > > > > > Get rid of device tree property "awinic,display-rows". The property > > > > value actually means number of current switches and depends on how leds > > > > > > Nit: LEDs > > > > > > > are connected to the device. It should be calculated manually by max > > > > used led number. In the same way it is computed automatically now. > > > > > > As above - I won't mention this again. > > > > > > > Max used led is taken from led definition subnodes. > > > > > > > > Signed-off-by: George Stark <gnstark@salutedevices.com> > > > > Signed-off-by: Dmitry Rokosov <ddrokosov@salutedevices.com> > > > > --- > > > > drivers/leds/leds-aw200xx.c | 39 +++++++++++++++++++++++++------------ > > > > 1 file changed, 27 insertions(+), 12 deletions(-) > > > > > > > > diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c > > > > index 7762b3a132ac..4bce5e7381c0 100644 > > > > --- a/drivers/leds/leds-aw200xx.c > > > > +++ b/drivers/leds/leds-aw200xx.c > > > > @@ -379,6 +379,30 @@ static void aw200xx_disable(const struct aw200xx *const chip) > > > > return gpiod_set_value_cansleep(chip->hwen, 0); > > > > } > > > > > > > > +static bool aw200xx_probe_get_display_rows(struct device *dev, struct aw200xx *chip) > > > > +{ > > > > + struct fwnode_handle *child; > > > > + u32 max_source = 0; > > > > + > > > > + device_for_each_child_node(dev, child) { > > > > + u32 source; > > > > + int ret; > > > > + > > > > + ret = fwnode_property_read_u32(child, "reg", &source); > > > > + if (ret || source >= chip->cdef->channels) > > > > > > Shouldn't the second clause fail instantly? > > > > > > > We already have such logic in the aw200xx_probe_fw() function, which > > skips the LED node with the wrong reg value too. Furthermore, we have > > strict reg constraints in the dt-bindings parts (in the current patch > > series), so we assume that the DT developer will not create an LED with > > the wrong reg value. > > Why is it being checked again then? Hmmm, aw200xx_probe_get_display_rows() executes before the old implementation... So we need to check it again. Do you think it should be reworked? I've already sent a new patchset. Could you please take a look at the other fixes?
diff --git a/drivers/leds/leds-aw200xx.c b/drivers/leds/leds-aw200xx.c index 7762b3a132ac..4bce5e7381c0 100644 --- a/drivers/leds/leds-aw200xx.c +++ b/drivers/leds/leds-aw200xx.c @@ -379,6 +379,30 @@ static void aw200xx_disable(const struct aw200xx *const chip) return gpiod_set_value_cansleep(chip->hwen, 0); } +static bool aw200xx_probe_get_display_rows(struct device *dev, struct aw200xx *chip) +{ + struct fwnode_handle *child; + u32 max_source = 0; + + device_for_each_child_node(dev, child) { + u32 source; + int ret; + + ret = fwnode_property_read_u32(child, "reg", &source); + if (ret || source >= chip->cdef->channels) + continue; + + max_source = max(max_source, source); + } + + if (!max_source) + return false; + + chip->display_rows = max_source / chip->cdef->display_size_columns + 1; + + return true; +} + static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) { struct fwnode_handle *child; @@ -386,18 +410,9 @@ static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) int ret; int i; - ret = device_property_read_u32(dev, "awinic,display-rows", - &chip->display_rows); - if (ret) - return dev_err_probe(dev, ret, - "Failed to read 'display-rows' property\n"); - - if (!chip->display_rows || - chip->display_rows > chip->cdef->display_size_rows_max) { - return dev_err_probe(dev, ret, - "Invalid leds display size %u\n", - chip->display_rows); - } + if (!aw200xx_probe_get_display_rows(dev, chip)) + return dev_err_probe(dev, -EINVAL, + "No valid led definitions found\n"); current_max = aw200xx_imax_from_global(chip, AW200XX_IMAX_MAX_uA); current_min = aw200xx_imax_from_global(chip, AW200XX_IMAX_MIN_uA);