Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp132913ybz; Tue, 21 Apr 2020 06:11:54 -0700 (PDT) X-Google-Smtp-Source: APiQypLXuaikeYbNIEa/kYJYC716KR6RJUPYNokNMObsZa76R+5wCyJFNVgj0+N2KXz06MaDWnVT X-Received: by 2002:a17:906:16ca:: with SMTP id t10mr21715868ejd.122.1587474714242; Tue, 21 Apr 2020 06:11:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587474714; cv=none; d=google.com; s=arc-20160816; b=fxCfq//YABUmShZa1UkHSIt+s/EhD5Ex8S8NmLdKKgf4a+kJv/KP6GSJRrcJ+ZgLi2 hIj8uSfXJ86iw72x62XWEMFSYJ7jkeN3yPgEMYiTqMrtBz1tzm8EXD2gqjgN41Otihva hJ/c9YJlnu78VwVRsMDO9gB/bCO5jUq9ZVyTZSnQIO4fBErk61O4mw9ccQlMIpmL5LBZ rQcAXQ62UZnd5HC7qWmp99NEtNf/2u+T8xwLxxnzbkz4QSvXWG75Pqd4QZ+8Funn48Ep RhafCoTB9ripOBP5OMWvwC9NKLMyt2ZhSjUZoD1e7RaUUd9JpgkBqYzhCDLp64u/3Z8Q ahEQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from:ironport-sdr :dkim-signature; bh=zRUgyXu1kqYpvoWiFCfYpyPH1jtDSi8EfGfZh/C0Zl4=; b=zu8/IRRPqH4ff4QpD6HDU1OfvqGv4tHxwVFRHhI+eWjNwipi/b6eG9Q0tsnB6op0X1 jr7+dutIxq+KMIBqOXMmHc0P+Z85aDcuR979aMxOEwP+iOVIKinDwaBm+pfk1Ti9kZn3 yTczwawUXJalB5H7UtGhMHbIR8P6/z1Xl0NlXlnALbhS2emorokCxAKj87ZCtdNXFj7N 4wI02KZQWj6lw6DbPOcrpohuMjJKo+AXGBm11yLQ2BAYtLdTYRYRyH4CJoiVT2Wx1TNX teX7y+JLDB/deg7Un61Kd0eFlTForbqHwaKcELiSjv4DTs4pgD+snDhy9GF74nn77Zck 3g5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail (test mode) header.i=@diehl.com header.s=default header.b=VpXGl8Zj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f26si1569883edj.20.2020.04.21.06.11.31; Tue, 21 Apr 2020 06:11:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail (test mode) header.i=@diehl.com header.s=default header.b=VpXGl8Zj; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728337AbgDUNJw (ORCPT + 99 others); Tue, 21 Apr 2020 09:09:52 -0400 Received: from enterprise01.smtp.diehl.com ([193.201.238.219]:14101 "EHLO enterprise01.smtp.diehl.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728878AbgDUNJr (ORCPT ); Tue, 21 Apr 2020 09:09:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=diehl.com; i=@diehl.com; q=dns/txt; s=default; t=1587474585; x=1619010585; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=AHfHaIhBE3pINRzw08uLgGJsllJoDvSSX2nJpBKqOCg=; b=VpXGl8ZjjT3+1JnBfUbT4125DuFJnsng2bWBwFllU35DNyS89OGNjZVx pdE7go8e8juOHa41WyP2kDfirMKg61Egk1kFMoCVqH5/1pXlf0dbmPq50 IdMrxCYRlXiwa/QHvCG6A7JvdRO40lE6kGZYI2FxAQwvsYsB8dpWGFvDq 2drwl748vLu6m3CQ5kzDewNRNZvTuDTFRoEbbc9X8T9e6rW4h7fSyIzOx GbnxtM+GNPILeKhYvnExJ8xngTmEUHRJMvGnN5uLmYhxCncCnsvRPwnCI AacrZQRC7dp/fw0R0Kt4lcd5DMREQqormmv/6HFU455p++nFs+rH+r1AD w==; IronPort-SDR: m/D2+G8uvw09Crqdaipyxtnyk3cd6wYxLNTbR7Tp5IraqfRuQ8jUtH77MX0otl6HG8x6lCM7ss npdiExKoX2rg== From: Denis Osterland-Heim To: "dmurphy@ti.com" , "pavel@ucw.cz" , "jacek.anaszewski@gmail.com" CC: "linux-kernel@vger.kernel.org" , "Denis Osterland-Heim" , "linux-leds@vger.kernel.org" , "robh+dt@kernel.org" , "devicetree@vger.kernel.org" Subject: [PATCH v5 2/3] leds: pwm: add support for default-state device property Thread-Topic: [PATCH v5 2/3] leds: pwm: add support for default-state device property Thread-Index: AQHWF94OqlLslpUgKkSqRQxJq3wL1Q== Date: Tue, 21 Apr 2020 13:09:14 +0000 Message-ID: <20200421130644.16059-3-Denis.Osterland@diehl.com> References: <20200421130644.16059-1-Denis.Osterland@diehl.com> In-Reply-To: <20200421130644.16059-1-Denis.Osterland@diehl.com> Accept-Language: de-DE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: Evolution 3.28.5-0ubuntu0.18.04.2 x-ms-exchange-messagesentrepresentingtype: 1 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-TrailerSkip: 1 X-GBS-PROC: byQFdw3ukCM+zy1/poiPc5jn58Xuz5PjrByvaI+9Wpm8OchGK4Zr2IYZ9xDMTQFo Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds support for =22default-state=22 devicetree property, whic= h allows to defer pwm init to first use of led. This allows to configure the PWM early in bootloader to let the LED blink until an application in Linux userspace sets something different. Signed-off-by: Denis Osterland-Heim --- drivers/leds/leds-pwm.c | 54 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index ef7b91bd2064..7b199c151768 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c @@ -18,10 +18,15 @@ #include #include =20 +#define LEDS_PWM_DEFSTATE_OFF 0 +#define LEDS_PWM_DEFSTATE_ON 1 +#define LEDS_PWM_DEFSTATE_KEEP 2 + struct led_pwm { const char *name; const char *default_trigger; u8 active_low; + u8 default_state; unsigned int max_brightness; }; =20 @@ -88,7 +93,30 @@ static int led_pwm_add(struct device *dev, struct led_= pwm_priv *priv, =20 led_data->cdev.brightness_set_blocking =3D led_pwm_set; =20 - pwm_init_state(led_data->pwm, &led_data->pwmstate); + /* init PWM state */ + if (led->default_state =3D=3D LEDS_PWM_DEFSTATE_KEEP) { + pwm_get_state(led_data->pwm, &led_data->pwmstate); + if (!led_data->pwmstate.period) { + led->default_state =3D LEDS_PWM_DEFSTATE_OFF; + dev_warn(dev, + =22failed to read period for %s, default to off=22, + led->name); + } + } + if (led->default_state !=3D LEDS_PWM_DEFSTATE_KEEP) + pwm_init_state(led_data->pwm, &led_data->pwmstate); + + /* set brightness */ + if (led->default_state =3D=3D LEDS_PWM_DEFSTATE_ON) + led_data->cdev.brightness =3D led->max_brightness; + else if (led->default_state =3D=3D LEDS_PWM_DEFSTATE_KEEP) { + uint64_t brightness; + + brightness =3D led->max_brightness; + brightness *=3D led_data->pwmstate.duty_cycle; + do_div(brightness, led_data->pwmstate.period); + led_data->cdev.brightness =3D brightness; + } =20 ret =3D devm_led_classdev_register(dev, &led_data->cdev); if (ret) { @@ -97,11 +125,13 @@ static int led_pwm_add(struct device *dev, struct le= d_pwm_priv *priv, return ret; } =20 - ret =3D led_pwm_set(&led_data->cdev, led_data->cdev.brightness); - if (ret) { - dev_err(dev, =22failed to set led PWM value for %s: %d=22, - led->name, ret); - return ret; + if (led->default_state !=3D LEDS_PWM_DEFSTATE_KEEP) { + ret =3D led_pwm_set(&led_data->cdev, led_data->cdev.brightness); + if (ret) { + dev_err(dev, =22failed to set led PWM value for %s: %d=22, + led->name, ret); + return ret; + } } =20 priv->num_leds++; @@ -117,6 +147,8 @@ static int led_pwm_create_fwnode(struct device *dev, = struct led_pwm_priv *priv) memset(&led, 0, sizeof(led)); =20 device_for_each_child_node(dev, fwnode) { + const char *state =3D NULL; + ret =3D fwnode_property_read_string(fwnode, =22label=22, &led.name); if (ret && is_of_node(fwnode)) led.name =3D to_of_node(fwnode)->name; @@ -134,6 +166,16 @@ static int led_pwm_create_fwnode(struct device *dev,= struct led_pwm_priv *priv) fwnode_property_read_u32(fwnode, =22max-brightness=22, &led.max_brightness); =20 + if (!fwnode_property_read_string(fwnode, =22default-state=22, + &state)) { + if (!strcmp(state, =22keep=22)) + led.default_state =3D LEDS_PWM_DEFSTATE_KEEP; + else if (!strcmp(state, =22on=22)) + led.default_state =3D LEDS_PWM_DEFSTATE_ON; + else + led.default_state =3D LEDS_PWM_DEFSTATE_OFF; + } + ret =3D led_pwm_add(dev, priv, &led, fwnode); if (ret) { fwnode_handle_put(fwnode); --=20 2.26.2 Diehl Connectivity Solutions GmbH Gesch=E4ftsf=FChrung: Horst Leonberger Sitz der Gesellschaft: N=FCrnberg - Registergericht: Amtsgericht N=FCrnberg: HRB 32315 _________________________________________________________________________= __________________________ Der Inhalt der vorstehenden E-Mail ist nicht rechtlich bindend. Diese E-M= ail enthaelt vertrauliche und/oder rechtlich geschuetzte Informationen. Informieren Sie uns bitte, wenn Sie diese E-Mail faelschlicherweise erhal= ten haben. Bitte loeschen Sie in diesem Fall die Nachricht. Jede unerlaubte Form der Reproduktion, Bekanntgabe, Aenderung, Verteilung= und/oder Publikation dieser E-Mail ist strengstens untersagt. - Informationen zum Datenschutz, insbesondere zu Ihren Rechten, erhalten = Sie unter https://www.diehl.com/group/de/transparenz-und-informationspfli= chten/ The contents of the above mentioned e-mail is not legally binding. This e= -mail contains confidential and/or legally protected information. Please = inform us if you have received this e-mail by mistake and delete it in such a case. Each unauthorized reproduction, dis= closure, alteration, distribution and/or publication of this e-mail is st= rictly prohibited.=20 - For general information on data protection and your respective rights p= lease visit https://www.diehl.com/group/en/transparency-and-information-o= bligations/