From nobody Thu Dec 18 18:50:18 2025 Received: from mail-ed1-f67.google.com (mail-ed1-f67.google.com [209.85.208.67]) (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 5D8B832D0C8 for ; Wed, 17 Dec 2025 18:14:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.67 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765995276; cv=none; b=fIikRvgUJvCO83Ws9cdroQ8no7UQi0JfIlMicuKWOUe2KtMgtzkCyS3h+C35Zh6nsVyDwXO1RNiIwG+TYaNZTbOY0FaMiiGzBw6CZUVjZIVi+D6hBaVTQDJNgSWP8X67nMorYRWQE2vihXwXBG1T+DBlM34Fyg7X/n3aVgcUN2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1765995276; c=relaxed/simple; bh=K15nuZjaTiUBVKSXtUhPDvjMT3AwbGOD/SO+UT+RLk0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=UwoAk+PjzvUOscwWVQQLsAV/6xbZWhxo4GTPYFk+7duXdSObf+T+LhL3vcqMDNQZ9GpzvtR8O9CisZ8K5rOpoPb2kJbfXxRYY5dA5rl7qYeq7wRzkTOHoWZQOZM1AJR2mnZkVSQ7suoAfB9g+jxh3JS2PyuyVPm1XX14pum2PoA= 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=O7pS1ZSW; arc=none smtp.client-ip=209.85.208.67 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="O7pS1ZSW" Received: by mail-ed1-f67.google.com with SMTP id 4fb4d7f45d1cf-64198771a9bso9068117a12.2 for ; Wed, 17 Dec 2025 10:14:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1765995273; x=1766600073; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=VbVikF+2G1b3d7XO038cFmze5WHGBBZWgyB+3vlCP44=; b=O7pS1ZSWIOJDyPqRS1/ZKwWa/vaVFBZb1quTM0M1/jn69zG7HtnJd1CzSEJl52lORy ZaUmsvYsJ5v8ePHhxs/GQfQ2aRkplv+xXb3WT92vASgI/crapJ3ouzzE/SM+iETl+GaJ 9gtr8ec+MkRObbofkmQjwwjZYokrynXgj5HZz048WqbguUz2yt4Vb3+NWU47o60ZROxZ 0tGABTOrMxj1jJM7bPwZpqRo3iH7e1ElglEqJdMGIhuUnOWW7vAq4Pf9Qb5ern2wwh6z Qx7navV4pumQfi+p8MKG9XlLNdSNnmAWYmeQnU0xyPxk06PjKb0dNLIFDmhZDCyfgj5d PErA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1765995273; x=1766600073; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=VbVikF+2G1b3d7XO038cFmze5WHGBBZWgyB+3vlCP44=; b=jwnKQ9YdsSg3SSOLc0GwDmd7Atqn8nBWSNdu5XdJ32vkvN0eDr/p2yDuGL5bKrIi+w PBHOb4oE9a/rfbohlv4nela2TqgrFvbCjHdXhmUrSuSX9ZY0WTIgyaD44LYBtvAPORHI 87U6VSelJOniYd7+VQif+a2NQn5UVj1X8M890Btoeh0vOgWS+87JGPcgdwxOYGXchlpw /NaEip1NNt86qOET/YB+J2704JRV3p0LXRu+gDXzcdCZyQSjoVmI+OM47hPTHNNVxdQg zYpimf3Ci5UYTKkHHT9CroQ+AFA90QbldRl1Iex3628CvwzgXpUuUyKGbK2uxqtRoOxw fJUQ== X-Forwarded-Encrypted: i=1; AJvYcCVKt2Bl6wWsVBwBLXfJKRc1YBX4rui6otSyfDdmateRhwUVt3rhW+bCARabV+ruGbAXSeYZGxbIYNHnkgA=@vger.kernel.org X-Gm-Message-State: AOJu0YwFnu3kEIQqc418Vazf7B/Otu0nyqNA8Fi+flNyoYEUbd5c6a0Y JMPHg8adP9lZxO8369iD1oF/SxVeSiLZm0ZnK03N6fAH+/LZemrS80f5 X-Gm-Gg: AY/fxX7bKa1Jfqzdp1fc6wnkv7zbWWd2n4fOMM/g74ntuA5vo7UXdlPkJ6csS57NFHD nbmMK/KtS8B0xTW1we7IIQUG5vD7jcNPGP0Kqhpnq2/9z60bjmjjiHIVXPSdp+hoX0nr9B5S9bD 81IWyjs1GqIci0eehXeJ0ObQ7jHeFXaWHyiNgpJ5RJ34/WUnCoy/WsLqtCA0OgeVcwHO51FuHOv +tvnNYA4pjF1nALHxxhPDRMh78rwujxec6iKw8V2wV9sqt2dnEzit4gswueWsgTBoFmJmlVynvF +iSpLcNNPysFyBapThKBG502JtPBojE1OTaJ1WZV7lW+Sc/N+yINTShLx0tAdodZSQ67UGl5v5W FvoW6WM7PHwDhPugXEFrqRZ6dmzPc23jROgA7jR3uM16/jMhsos99a119MT1pXcr/Iwssoue9Hv yMVm6sLYw23sAaxO/mPytAwc43CX4OqKSUIaTJELkRkcWVXxHbz6k4FsLtoufVWWF1 X-Google-Smtp-Source: AGHT+IFj3TCyaBMkYZdzStRuIRqQZOLqF7ec/I58OPcphVai+0kRlE2QbnpuALvqaq35kB4vGBD2QQ== X-Received: by 2002:a05:6402:1446:b0:640:3210:6e48 with SMTP id 4fb4d7f45d1cf-6499b16a78emr16792502a12.4.1765995272511; Wed, 17 Dec 2025 10:14:32 -0800 (PST) Received: from Radijator.localdomain (93-140-155-17.adsl.net.t-com.hr. [93.140.155.17]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-64b5886d3d4sm152344a12.19.2025.12.17.10.14.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Dec 2025 10:14:30 -0800 (PST) From: =?utf-8?q?Duje_Mihanovi=C4=87?= Date: Wed, 17 Dec 2025 19:14:23 +0100 Subject: [PATCH v2] leds: expresswire: Fix chip state breakage 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: <20251217-expresswire-fix-v2-1-4a02b10acd96@dujemihanovic.xyz> X-B4-Tracking: v=1; b=H4sIAP7yQmkC/3WOTQ6CMBCFr0JmbQ1tQ4OuvIdhUaeDjIlgWq0g6 d0d2bv83sv7WSFRZEpwrFaIlDnxNAqYXQU4+PFKioMwmNo0dWsOiuZHpJTeHEn1PCvnbNAXi9Z 4D5ISV+St8dwJD5yeU1y2gax/6v+urJVWfYstOh8cNv0pvG50ZzkyZcb9vHygK6V8AXq18CK2A AAA X-Change-ID: 20250829-expresswire-fix-663d1b3c32aa To: Lee Jones , Pavel Machek , Linus Walleij , Daniel Thompson Cc: Karel Balej , David Wronek , phone-devel@vger.kernel.org, ~postmarketos/upstreaming@lists.sr.ht, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Duje_Mihanovi=C4=87?= X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=4518; i=duje@dujemihanovic.xyz; s=20240706; h=from:subject:message-id; bh=88T4mkMcx1ShNFI4rFzfnyovyPLWzXoaZQkJnadZHJY=; b=owGbwMvMwCW21nBykGv/WmbG02pJDJlOn1kPXbT4s1472WKZyw3dpe2Jh4qWaE3qW/nhToHIL ZWPHlK7O0pZGMS4GGTFFFly/zte4/0ssnV79jIDmDmsTCBDGLg4BWAiV84zMjx5bX7ygW2PwbN7 CVXdOkYWfIssXnzmXPvG6OtWsSSFOdMYGRasKVkneSLe1OvV9r8rfQ4u/ik/4QurQUNA1+KpJfe 9mTkB X-Developer-Key: i=duje@dujemihanovic.xyz; a=openpgp; fpr=6DFF41D60DF314B5B76BA630AD319352458FAD03 From: Duje Mihanovi=C4=87 It is possible to put the KTD2801 chip in an unknown/undefined state by changing the brightness very rapidly (for example, with a brightness slider). When this happens, the brightness is stuck on max and cannot be changed until the chip is power cycled. Fix this by disabling interrupts while talking to the chip. While at it, make expresswire_power_off() use fsleep() and also unexport some functions meant to be internal. Fixes: 1368d06dd2c9 ("leds: Introduce ExpressWire library") Tested-by: Karel Balej Signed-off-by: Duje Mihanovi=C4=87 --- Changes in v2: - Update trailers - Rebase on v6.19-rc1 - Reword commit message (fix grammar errors, simplify text) - Add Fixes: tag - Link to v1: https://lore.kernel.org/r/20250829-expresswire-fix-v1-1-f8c8c= 6ad6c5f@dujemihanovic.xyz --- drivers/leds/leds-expresswire.c | 24 +++++++++++++++++------- include/linux/leds-expresswire.h | 3 --- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/drivers/leds/leds-expresswire.c b/drivers/leds/leds-expresswir= e.c index bb69be228a6d..25c6b159a6ee 100644 --- a/drivers/leds/leds-expresswire.c +++ b/drivers/leds/leds-expresswire.c @@ -9,6 +9,7 @@ #include #include #include +#include #include =20 #include @@ -16,37 +17,41 @@ void expresswire_power_off(struct expresswire_common_props *props) { gpiod_set_value_cansleep(props->ctrl_gpio, 0); - usleep_range(props->timing.poweroff_us, props->timing.poweroff_us * 2); + fsleep(props->timing.poweroff_us); } EXPORT_SYMBOL_NS_GPL(expresswire_power_off, "EXPRESSWIRE"); =20 void expresswire_enable(struct expresswire_common_props *props) { + unsigned long flags; + + local_irq_save(flags); + gpiod_set_value(props->ctrl_gpio, 1); udelay(props->timing.detect_delay_us); gpiod_set_value(props->ctrl_gpio, 0); udelay(props->timing.detect_us); gpiod_set_value(props->ctrl_gpio, 1); + + local_irq_restore(flags); } EXPORT_SYMBOL_NS_GPL(expresswire_enable, "EXPRESSWIRE"); =20 -void expresswire_start(struct expresswire_common_props *props) +static void expresswire_start(struct expresswire_common_props *props) { gpiod_set_value(props->ctrl_gpio, 1); udelay(props->timing.data_start_us); } -EXPORT_SYMBOL_NS_GPL(expresswire_start, "EXPRESSWIRE"); =20 -void expresswire_end(struct expresswire_common_props *props) +static void expresswire_end(struct expresswire_common_props *props) { gpiod_set_value(props->ctrl_gpio, 0); udelay(props->timing.end_of_data_low_us); gpiod_set_value(props->ctrl_gpio, 1); udelay(props->timing.end_of_data_high_us); } -EXPORT_SYMBOL_NS_GPL(expresswire_end, "EXPRESSWIRE"); =20 -void expresswire_set_bit(struct expresswire_common_props *props, bool bit) +static void expresswire_set_bit(struct expresswire_common_props *props, bo= ol bit) { if (bit) { gpiod_set_value(props->ctrl_gpio, 0); @@ -60,13 +65,18 @@ void expresswire_set_bit(struct expresswire_common_prop= s *props, bool bit) udelay(props->timing.short_bitset_us); } } -EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, "EXPRESSWIRE"); =20 void expresswire_write_u8(struct expresswire_common_props *props, u8 val) { + unsigned long flags; + + local_irq_save(flags); + expresswire_start(props); for (int i =3D 7; i >=3D 0; i--) expresswire_set_bit(props, val & BIT(i)); expresswire_end(props); + + local_irq_restore(flags); } EXPORT_SYMBOL_NS_GPL(expresswire_write_u8, "EXPRESSWIRE"); diff --git a/include/linux/leds-expresswire.h b/include/linux/leds-expressw= ire.h index a422921f4159..7f8c4795f69f 100644 --- a/include/linux/leds-expresswire.h +++ b/include/linux/leds-expresswire.h @@ -30,9 +30,6 @@ struct expresswire_common_props { =20 void expresswire_power_off(struct expresswire_common_props *props); void expresswire_enable(struct expresswire_common_props *props); -void expresswire_start(struct expresswire_common_props *props); -void expresswire_end(struct expresswire_common_props *props); -void expresswire_set_bit(struct expresswire_common_props *props, bool bit); void expresswire_write_u8(struct expresswire_common_props *props, u8 val); =20 #endif /* _LEDS_EXPRESSWIRE_H */ --- base-commit: 8f0b4cce4481fb22653697cced8d0d04027cb1e8 change-id: 20250829-expresswire-fix-663d1b3c32aa Best regards, --=20 Duje Mihanovi=C4=87