From nobody Sat Feb 7 06:55:17 2026 Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) (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 9290F23EABA for ; Fri, 23 Jan 2026 19:05:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.67.36.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195117; cv=none; b=ijA9duuJCWbfqlqg6BrNgtNUZ+/ycqpG47uFW3w+2KI1wW2Ll+Yy7xzGTIjQYCNvCYTbE072EAdFRV2M/ENd5xeohI8jHiJEiw1v+ooS91jNn73tJIWYlQVfd0XCPF/r3krjNasW3yOxVL5tk38EU0dkriNY6iqQ5UAT68U31ZE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195117; c=relaxed/simple; bh=NTXD2dcEzWIMhNd3dWb85Qxfc5baEhubK3Fr0N/cMl4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n7BYEr54HE3RMKtba2bhn7MRj4k1PM+P4bgyoRM+gS05cMe7cyGoWk/ZsvV72doV2ztnWR9YMKXx4ecnPeqUXaPC70GH4dvg1rEAHt8ms06Uqj4QLk+oOecXEOx8X2N1BNXx4F/2alrl+D56otrNxCcjGWt2vOL6WVGEyKxj4sI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de; spf=pass smtp.mailfrom=posteo.de; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b=MusFJj2H; arc=none smtp.client-ip=185.67.36.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=posteo.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b="MusFJj2H" Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id E03DC240103 for ; Fri, 23 Jan 2026 20:05:05 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.de; s=2017; t=1769195105; bh=eR+mCvij9lfyPAlc5P6O/K+lwN3cH0GPU/UHog51yF0=; h=From:Date:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-Id:To:Cc:Autocrypt:OpenPGP:From; b=MusFJj2HgXL3cvgX+9dHmjBMTd3I9OFQ9YbMQL9QRb8bQn8k2UmGfVKz7jlrmYWLA rwhW3qZpt4K4G78vIitqivGSj/jYxzgTkcXD+WKHF7VY4K/l+GFyrsGHIT+0VimIyN 1urDltytqUO1iiW11b4lgQop5fSuURhqTELnJftQPEyb3+DyQVD8wvyZdxrkYVhCNP 5QleNweYOk6JVCGRlDm1FtKl7T69Ig9kLb9Bjc7yWybok8Ld6Fxd9G9gdmkN57L0nZ AsIbLSK88owE+UaZGMRem5zNyBta2bDo8GFns9pKk9Zw3L+gg71BhXpQxrp4la7wkn VOzzuMw1C/0nQ== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4dyS6l2lG3z9rxN; Fri, 23 Jan 2026 20:05:03 +0100 (CET) From: Markus Probst Date: Fri, 23 Jan 2026 19:05:05 +0000 Subject: [PATCH RFC 1/4] leds: dt-bindings: add disk trigger led pattern 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: <20260123-ledtrig_disk_-v1-1-07004756467b@posteo.de> References: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> In-Reply-To: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski , Damien Le Moal , Niklas Cassel , John Garry , Jason Yan , "James E.J. Bottomley" , "Martin K. Petersen" Cc: Pavel Machek , linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, Markus Probst X-Developer-Signature: v=1; a=openpgp-sha256; l=1225; i=markus.probst@posteo.de; h=from:subject:message-id; bh=NTXD2dcEzWIMhNd3dWb85Qxfc5baEhubK3Fr0N/cMl4=; b=owEBiQJ2/ZANAwAIATR2H/jnrUPSAcsmYgBpc8ZUJyVTI3wgCmX8cgUF/vrC3l1nvDXjBSPkp wXIpfTPwbmJAk8EAAEIADkWIQSCdBjE9KxY53IwxHM0dh/4561D0gUCaXPGVBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQNHYf+OetQ9Jzug/9HI3turLaHDuw44TYXNP2JNrRmBluex0 Yl39vwUJKJ1QcDp6/CUTLenB5PmqP+53xLkGdbpVZUAxk9qvgnOvcbaqlL0fM4+E9a4I9BckzPb qF+FF4C7e6Ew2zicXW3gwKdouNwhdakTJqB+LGQ2vb65BTY4oE/4CzgNgwfouLxdZCp8abFwOIs PjZTdTnYr3stZfzHYtkd6dWBHceTgBIbBTztJp6eurLoZeiYP3+GXq33Vd4BKOYRG2Jl+nc3GUH RESI/BdG0CazUgzcUP6k22B6+1HRc9pSHgxwYcjwa9pBrn4rJBszA/hlFyzY851YfzmzT6s2Mhq K6j5EO+hTOBYXICvB6K6Y4c5bevuWuYHRKkYkZX8D/wUkaaNhKl68JDECcFy76Bt707JuWlDn76 vQKMxdwU5wemZm5bNVYyb+dFbqXodClpJieflPJ1Og+ekqwfkOxGPYqZybMysf6w5HrEAlRoERC 43ycqrxMBuelFQ6Nuc39zQTDvUGpBCCtVoIIO/zKT5oHmEcYWNYkhdh5wSCMkKFCW5rnf4E1bV2 wILHSzWZC4EpRV50Y/1j8/P6tCRutTS26B/2m15zkq9KLP4HQzwrN5vY7QcOvGa523X3WrpRA/a Ws2pQDHLBWgd+8NuOqx9T8zgH68uN9jI6rj8kJlOnEDtNACuczcY= X-Developer-Key: i=markus.probst@posteo.de; a=openpgp; fpr=827418C4F4AC58E77230C47334761FF8E7AD43D2 Autocrypt: addr=markus.probst@posteo.de; prefer-encrypt=mutual; keydata=xsFNBGiDvXgBEADAXUceKafpl46S35UmDh2wRvvx+UfZbcTjeQOlSwKP7YVJ4JOZrVs93qReNLkO WguIqPBxR9blQ4nyYrqSCV+MMw/3ifyXIm6Pw2YRUDg+WTEOjTixRCoWDgUj1nOsvJ9tVAm76Ww+ /pAnepVRafMID0rqEfD9oGv1YrfpeFJhyE2zUw3SyyNLIKWD6QeLRhKQRbSnsXhGLFBXCqt9k5JA RhgQof9zvztcCVlT5KVvuyfC4H+HzeGmu9201BVyihJwKdcKPq+n/aY5FUVxNTgtI9f8wIbmfAja oT1pjXSp+dszakA98fhONM98pOq723o/1ZGMZukyXFfsDGtA3BB79HoopHKujLGWAGskzClwTjRQ xBqxh/U/lL1pc+0xPWikTNCmtziCOvv0KA0arDOMQlyFvImzX6oGVgE4ksKQYbMZ3Ikw6L1Rv1J+ FvN0aNwOKgL2ztBRYscUGcQvA0Zo1fGCAn/BLEJvQYShWKeKqjyncVGoXFsz2AcuFKe1pwETSsN6 OZncjy32e4ktgs07cWBfx0v62b8md36jau+B6RVnnodaA8++oXl3FRwiEW8XfXWIjy4umIv93tb8 8ekYsfOfWkTSewZYXGoqe4RtK80ulMHb/dh2FZQIFyRdN4HOmB4FYO5sEYFr9YjHLmDkrUgNodJC XCeMe4BO4iaxUQARAQABzRdtYXJrdXMucHJvYnN0QHBvc3Rlby5kZcLBkQQTAQgAOxYhBIJ0GMT0 rFjncjDEczR2H/jnrUPSBQJog714AhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEDR2 H/jnrUPSgdkQAISaTk2D345ehXEkn5z2yUEjaVjHIE7ziqRaOgn/QanCgeTUinIv6L6QXUFvvIfH 1OLPwQ1hfvEg9NnNLyFezWSy6jvoVBTIPqicD/r3FkithnQ1IDkdSjrarPMxJkvuh3l7XZHo49GV HQ8i5zh5w4YISrcEtE99lJisvni2Jqx7we5tey9voQFDyM8jxlSWv3pmoUTCtBkX/eKHJXosgsuS B4TGDCVPOjla/emI5c9MhMG7O4WEEmoSdPbmraPw66YZD6uLyhV4DPHbiDWRzXWnClHSyjB9rky9 lausFxogvu4l9H+KDsXIadNDWdLdu1/enS/wDd9zh5S78rY2jeXaG4mnf4seEKamZ7KQ6FIHrcyP ezdDzssPQcTQcGRMQzCn6wP3tlGk7rsfmyHMlFqdRoNNv+ZER/OkmZFPW655zRfbMi0vtrqK2Awm 9ggobb1oktfd9PPNXMUY+DNVlgR2G7jLnenSoQausLUm0pHoNE8TWFv851Y6SOYnvn488sP1Tki5 F3rKwclawQFHUXTCQw+QSh9ay8xgnNZfH+u9NY7w3gPoeKBOAFcBc2BtzcgekeWS8qgEmm2/oNFV G0ivPQbRx8FjRKbuF7g3YhgNZZ0ac8FneuUtJ2PkSIFTZhaAiC0utvxk0ndmWFiW4acEkMZGrLaM L2zWNjrqwsD2zsFNBGiDvXgBEADCXQy1n7wjRxG12DOVADawjghKcG+5LtEf31WftHKLFbp/HArj BhkT6mj+CCI1ClqY+FYU5CK/s0ScMfLxRGLZ0Ktzawb78vOgBVFT3yB1yWBTewsAXdqNqRooaUNo 8cG/NNJLjhccH/7PO/FWX5qftOVUJ/AIsAhKQJ18Tc8Ik73v427EDxuKb9mTAnYQFA3Ev3hAiVbO 6Rv39amVOfJ8sqwiSUGidj2Fctg2aB5JbeMln0KCUbTD1LhEFepeKypfofAXQbGwaCjAhmkWy/q3 IT1mUrPxOngbxdRoOx1tGUC0HCMUW1sFaJgQPMmDcR0JGPOpgsKnitsSnN7ShcCr1buel7vLnUMD +TAZ5opdoF6HjAvAnBQaijtK6minkrM0seNXnCg0KkV8xhMNa6zCs1rq4GgjNLJue2EmuyHooHA4 7JMoLVHcxVeuNTp6K2+XRx0Pk4e2Lj8IVy9yEYyrywEOC5XRW37KJjsiOAsumi1rkvM7QREWgUDe Xs0+RpxI3QrrANh71fLMRo7LKRF3Gvw13NVCCC9ea20P4PwhgWKStkwO2NO+YJsAoS1QycMi/vKu 0EHhknYXamaSV50oZzHKmX56vEeJHTcngrM8R1SwJCYopCx9gkz90bTVYlitJa5hloWTYeMD7FNj Y6jfVSzgM/K4gMgUNDW/PPGeMwARAQABwsF2BBgBCAAgFiEEgnQYxPSsWOdyMMRzNHYf+OetQ9IF AmiDvXgCGwwACgkQNHYf+OetQ9LHDBAAhk+ab8+WrbS/b1/gYW3q1KDiXU719nCtfkUVXKidW5Ec Idlr5HGt8ilLoxSWT2Zi368iHCXS0WenGgPwlv8ifvB7TOZiiTDZROZkXjEBmU4nYjJ7GymawpWv oQwjMsPuq6ysbzWtOZ7eILx7cI0FjQeJ/Q2baRJub0uAZNwBOxCkAS6lpk5Fntd2u8CWmDQo4SYp xeuQ+pwkp0yEP30RhN2BO2DXiBEGSZSYh+ioGbCHQPIV3iVj0h6lcCPOqopZqyeCfigeacBI0nvN jHWz/spzF3+4OS+3RJvoHtAQmProxyGib8iVsTxgZO3UUi4TSODeEt0i0kHSPY4sCciOyXfAyYoD DFqhRjOEwBBxhr+scU4C1T2AflozvDwq3VSONjrKJUkhd8+WsdXxMdPFgBQuiKKwUy11mz6KQfcR wmDehF3UaUoxa+YIhWPbKmycxuX/D8SvnqavzAeAL1OcRbEI/HsoroVlEFbBRNBZLJUlnTPs8ZcU 4+8rq5YX1GUrJL3jf6SAfSgO7UdkEET3PdcKFYtS+ruV1Cp5V0q4kCfI5jk25iiz8grM2wOzVSsc l1mEkhiEPH87HP0whhb544iioSnumd3HJKL7dzhRegsMizatupp8D65A2JziW0WKopa1iw9fti3A aBeNN4ijKZchBXHPgVx+YtWRHfcm4l8= OpenPGP: url=https://posteo.de/keys/markus.probst@posteo.de.asc; preference=encrypt Document the disk trigger led pattern. Signed-off-by: Markus Probst --- Documentation/devicetree/bindings/leds/common.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/leds/common.yaml b/Documenta= tion/devicetree/bindings/leds/common.yaml index f4e44b33f56d..d0f2fee7622c 100644 --- a/Documentation/devicetree/bindings/leds/common.yaml +++ b/Documentation/devicetree/bindings/leds/common.yaml @@ -144,6 +144,8 @@ properties: Each trigger may parse this property differently: - one-shot : two numbers specifying delay on and delay off (in ms), - timer : two numbers specifying delay on and delay off (in ms), + - disk : three numbers specifying delay on, delay off (in ms) + and invert (0 or 1), - pattern : the pattern is given by a series of tuples, of brightness and duration (in ms). The exact format is described in: @@ -151,7 +153,7 @@ properties: $ref: /schemas/types.yaml#/definitions/uint32-matrix items: minItems: 2 - maxItems: 2 + maxItems: 3 =20 led-max-microamp: description: --=20 2.52.0 From nobody Sat Feb 7 06:55:17 2026 Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) (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 C48BD2652A2 for ; Fri, 23 Jan 2026 19:05:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.67.36.66 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195118; cv=none; b=nm90+okDsKE5mH3YMU0GYBvH27ofYmPf2AX/UqAxVhZ4Fvvv4AbdPL2f1CpF/73GpBZ/h4VjXxzb2SvBFz3O7VWIxa1kTb3QgwKcaDMVQM4iZN2GmzPE2mrmig0KoAkqT6fP5u74nH7nD3UOusqM9g44/AKmtTf7sHChtqI4CA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195118; c=relaxed/simple; bh=vJx339Ptvd6Q5seAb2UMkuQR2g1wHB5bKZGiaTR8zJU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cxp8b0q8JYKWdzH/1I5204zHwZCXCAnqKfZTY2i+3orme6Hb2K4JicPIm1wfkWGctYSg88mEajjn+fIYxeqz2upknSqpTVt+m90qNHP5EwCru9TJc34304CcIP7IQJ8Y74H/v1HpV+7zDJ1MROcHreHWkD0msFvNNfjnZih/GTk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de; spf=pass smtp.mailfrom=posteo.de; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b=cyuPjdTf; arc=none smtp.client-ip=185.67.36.66 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=posteo.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b="cyuPjdTf" Received: from submission (posteo.de [185.67.36.169]) by mout02.posteo.de (Postfix) with ESMTPS id AAA59240103 for ; Fri, 23 Jan 2026 20:05:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.de; s=2017; t=1769195107; bh=3PwA9Be/c+sx6J+yRmqghf0UKZNH9XiqJmvIn3+haiw=; h=From:Date:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-Id:To:Cc:Autocrypt:OpenPGP:From; b=cyuPjdTfSUK2citue4Pa2YeNMaIEsxhdRC481ac371gMEZ5Q/K+3AhaQzf7573wUr 29hsVDCVptXRdNY7VrD7+jQAJ7/Y2E2wWEJzhwK9pDajOlxSH9L1UpW1hy7gVxArrz YALc/DV4QpX9GC+7F8WkTV4ykbEdwKKvAnWsBMlc0+eyr4/DMCx5FFIP+b9efqkVoU mbPF1gH4NwYJ3KtvOnXEpNMZ0SSxDsg1nJ9InawXpKrUIOSiY5EtgoMI+A1k8isucd 1HheVBKmflm+iMtcQA0H3R5xDtmtzqLT7Iiq0kTIpXgYT//UuDD9FWJ9Oy9MlOewO1 fVgeTjoKYoz/g== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4dyS6n1qTFz9rxD; Fri, 23 Jan 2026 20:05:05 +0100 (CET) From: Markus Probst Date: Fri, 23 Jan 2026 19:05:06 +0000 Subject: [PATCH RFC 2/4] leds: dt-bindings: add disk trigger for each ata port 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: <20260123-ledtrig_disk_-v1-2-07004756467b@posteo.de> References: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> In-Reply-To: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski , Damien Le Moal , Niklas Cassel , John Garry , Jason Yan , "James E.J. Bottomley" , "Martin K. Petersen" Cc: Pavel Machek , linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, Markus Probst X-Developer-Signature: v=1; a=openpgp-sha256; l=1066; i=markus.probst@posteo.de; h=from:subject:message-id; bh=vJx339Ptvd6Q5seAb2UMkuQR2g1wHB5bKZGiaTR8zJU=; b=owEBiQJ2/ZANAwAIATR2H/jnrUPSAcsmYgBpc8ZWtlbOWbS5hsTqlnvVj2v7vNUp7PZ2LZjiO +ABaSuq9WiJAk8EAAEIADkWIQSCdBjE9KxY53IwxHM0dh/4561D0gUCaXPGVhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQNHYf+OetQ9LzQw/8DfqEIKdxy51MSLnBaF8SLYMeYmvrLhW 7nTwXHjGZ3BT9Z3rWQOl3GCgLCOtUvtqnMTqb2Q7EzGOoiG4vDOU/PeR5wnsAzxXAJPF0459w8n nnO/89iO3rOc8ENWpHjqp0A0VguB7uAEZUYhdvu3ZVjWLak7oRHUgET1wtwhody0MqjpYr8kHQA qqIU5itLDZOPpmQtLV4QFNXOj/YQATTKbO8mIlKuVgM5xXC/NFlWPzdf8W/NzvkMggYA+jqLfIi KGJfeKljMgQtaMYiVjbgpylit6bWdiJixKjLvrse6Cp457e5kgTWmnNYSV0ZYKI262ZVblBQhMJ /yW9/4239A0uVHPrsVJsQ0UObvQ8qIr+7l2Rro0h2GC9mksn248DJvVHMrOhTWunWFlPjTsnFtg NCvvu4eef7stz87GeKQhuSzd3pbuj0eMVcA9Bpc2T88YZU8t1UOd+nOnsnWXb8/Yvz3S8VDFwr4 ue8+IPHJMlUqQBw6oXHISIf/BJ8xduvDkUSTIo/R2jX85NSk6xkBhdShFoF1eOSm8p1bgoogyRW Br4UpR+ka5WL+3o/aNczR6AD6OjGvyQ8TkMDM5ccl+nqbw9friYqMvDt9ku5/kOOa9uyntVF0z+ CoIxaZXzE1ErPS9kkFJVXtr4/0rqBRS4nXP4gd0vcaXePB4Ir3Pk= X-Developer-Key: i=markus.probst@posteo.de; a=openpgp; fpr=827418C4F4AC58E77230C47334761FF8E7AD43D2 Autocrypt: addr=markus.probst@posteo.de; prefer-encrypt=mutual; keydata=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 aBeNN4ijKZchBXHPgVx+YtWRHfcm4l8= OpenPGP: url=https://posteo.de/keys/markus.probst@posteo.de.asc; preference=encrypt Document disk trigger showing only disk activity for one specific ata port. Signed-off-by: Markus Probst --- Documentation/devicetree/bindings/leds/common.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/common.yaml b/Documenta= tion/devicetree/bindings/leds/common.yaml index d0f2fee7622c..ca51eeadfad0 100644 --- a/Documentation/devicetree/bindings/leds/common.yaml +++ b/Documentation/devicetree/bindings/leds/common.yaml @@ -136,6 +136,12 @@ properties: - pattern: "^mmc[0-9]+$" # LED is triggered by WLAN activity - pattern: "^phy[0-9]+tx$" + # LED indicates disk activity for a specific ata port + - pattern: "^.*-ata[0-9]+-disk-activity$" + # LED indicates disk read activity for a specific ata port + - pattern: "^.*-ata[0-9]+-disk-read$" + # LED indicates disk write activity for a specific ata port + - pattern: "^.*-ata[0-9]+-disk-write$" =20 led-pattern: description: | --=20 2.52.0 From nobody Sat Feb 7 06:55:17 2026 Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) (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 22A3823BD1D for ; Fri, 23 Jan 2026 19:05:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.67.36.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195119; cv=none; b=IPqLQJDwBKEMn/JmcXdGqVzZR4SCva+RoLlUMxW3YyU920MnjX1wc8EYfFHvhHwBSc60ngwPaBPX6QscF/72Cw4Q1Gi47wO3N1eArhHg3sWx64Lfey6cCZwsI7E6w0IIz/Z2deHBPd3cNYmh3QftIIgMdUBNRAge1fNX+MJyfc0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195119; c=relaxed/simple; bh=ODz8ncLmCsNqsZxfTe8GooISjKiG+okr6st5hrKOOTM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oQOusBSn5LGKnqV1FxsugdMfjPnVuPbFpJVBKbbV/b1W20ensYVnH6jqVd7Z/U0bbXLf236SDbRjLZOoV6w6w1uYoF7yVhLMzo8elto/r14C281MIqbNEP8LxB+cfqHU+9O2b+r2ux80Qu21iI6t+/E+xDX/vMLp1CUA2mWUpqs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de; spf=pass smtp.mailfrom=posteo.de; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b=gqjUnrdf; arc=none smtp.client-ip=185.67.36.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=posteo.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b="gqjUnrdf" Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 7ED2B240027 for ; Fri, 23 Jan 2026 20:05:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.de; s=2017; t=1769195109; bh=DCJCsmVs7zPkbt9Qd39SgzPBMeFXDWwMJcLHezKPmqE=; h=From:Date:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-Id:To:Cc:Autocrypt:OpenPGP:From; b=gqjUnrdfyzBP6JRzrEvRadLzO/JiLHUSWkfAKkNFq3P4BJ6KE70Iku6LsZS7Zc2gC 2eH3qZ/j7zwbnXhMfh0yPfFcpylLCGCck02/Paus7PiXCJIEMgJGGXzvDUyRf2fcjY nUspAkSh7FRBJ52XFO7uXVs54233k3e+mhLZAADuWZ3eOvn6PN5gz9NhA6ibNM/0F9 E2pJ0t6QslxAZTAMXdBkzR2hc/9husPoODAOaOTkEqMcxJJ+i0NdY6VoSqYFW1wJzd NUmPgrSFAQ5JnUMaS2RQ2T0qt3si/jSJQ4WX/XXz+7/C6fFQJw6PlfagXC9410hBl0 wIia2V7hijdZA== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4dyS6p6nMcz9rxM; Fri, 23 Jan 2026 20:05:06 +0100 (CET) From: Markus Probst Date: Fri, 23 Jan 2026 19:05:08 +0000 Subject: [PATCH RFC 3/4] leds: add delay_on, delay_off and invert attributes to disk trigger 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: <20260123-ledtrig_disk_-v1-3-07004756467b@posteo.de> References: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> In-Reply-To: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski , Damien Le Moal , Niklas Cassel , John Garry , Jason Yan , "James E.J. Bottomley" , "Martin K. Petersen" Cc: Pavel Machek , linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, Markus Probst X-Developer-Signature: v=1; a=openpgp-sha256; l=6628; i=markus.probst@posteo.de; h=from:subject:message-id; bh=ODz8ncLmCsNqsZxfTe8GooISjKiG+okr6st5hrKOOTM=; b=owEBiQJ2/ZANAwAIATR2H/jnrUPSAcsmYgBpc8ZYMDkrYNhe896XM9Iuw4ttMEZEt2iKXxYky M5UrfrXrjyJAk8EAAEIADkWIQSCdBjE9KxY53IwxHM0dh/4561D0gUCaXPGWBsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQNHYf+OetQ9K4hw/+J5eHm48CkUqLgJU52DgEZ6pH/AqAqjk /WgURvz5O/3Hwtwb3b0/fzgDg92/ew619EECAcmdMi8SqjAxsyenM0VGTbmqlKaRT4e8Fl7GhM9 vZkANj5fmGds8wsmIqtZ5Pv+yzdqwwNNT6GiKLARRL0MmNwbh2bUGw9+5x17FkfkMUQfnIvK3hh ydlDopjVY4Ds9Z69W3iPSt6nDDFNRqD81rwt0yhR+96txWhH8t7tm+Wlt8w5Hqk6jVwj7biPdxb KqwjXP5GhBK6I6+tzx7qYesAb/OGeGszpqpgDpd2LoPQdt0cABMk3uQu9YHtXxYMfuFd/5wemiw C10EQ/JeTbCe6QKwquBWU7n4FQEepso6aJd56oIc5+A37kn4ebeO+zOM+6AwJPpA8SbwIwrL3z0 beZhDEPmE8PZouEje4HUlPieYLZGaZ+o0OF2cJIkHP8iCriNgB7igiJFQkJ6NMfjqpLxeAKq60F dT9p6TvXl+ME8foaNDvkqTlvOZ8vROfLbr6pBH722hG0m2f7wEBvw6Blvm3odbaWImbM2pxJCbf g+yddPRv6AuIZJTCMxS2nLeWO6niETADyiIKbDxCzvbjIgYM3s3rsVgt2NDXAJljok8x5YqMw5B H0AOtVXXszF0OexPy22GCT1MBWvWgA4o0neuTfKS/R3gkr+dtN4I= X-Developer-Key: i=markus.probst@posteo.de; a=openpgp; fpr=827418C4F4AC58E77230C47334761FF8E7AD43D2 Autocrypt: addr=markus.probst@posteo.de; prefer-encrypt=mutual; keydata=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 aBeNN4ijKZchBXHPgVx+YtWRHfcm4l8= OpenPGP: url=https://posteo.de/keys/markus.probst@posteo.de.asc; preference=encrypt Add delay_on, delay_off and invert device attributes to leds using the disk trigger. Signed-off-by: Markus Probst --- drivers/leds/trigger/ledtrig-disk.c | 194 ++++++++++++++++++++++++++++++++= +--- 1 file changed, 182 insertions(+), 12 deletions(-) diff --git a/drivers/leds/trigger/ledtrig-disk.c b/drivers/leds/trigger/led= trig-disk.c index e9b87ee944f2..ed5ef83a5b35 100644 --- a/drivers/leds/trigger/ledtrig-disk.c +++ b/drivers/leds/trigger/ledtrig-disk.c @@ -9,31 +9,201 @@ =20 #include #include +#include #include +#include "../leds.h" =20 -#define BLINK_DELAY 30 +#define DEFAULT_BLINK_DELAY 30 =20 -DEFINE_LED_TRIGGER(ledtrig_disk); -DEFINE_LED_TRIGGER(ledtrig_disk_read); -DEFINE_LED_TRIGGER(ledtrig_disk_write); +struct ledtrig_disk_data { + unsigned long delay_on; + unsigned long delay_off; + unsigned int invert; +}; + +static ssize_t led_delay_on_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev =3D led_trigger_get_led(dev); + struct ledtrig_disk_data *disk_data =3D led_get_trigger_data(led_cdev); + + return sprintf(buf, "%lu\n", disk_data->delay_on); +} + +static ssize_t led_delay_on_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct led_classdev *led_cdev =3D led_trigger_get_led(dev); + struct ledtrig_disk_data *disk_data =3D led_get_trigger_data(led_cdev); + unsigned long state; + ssize_t ret; + + ret =3D kstrtoul(buf, 10, &state); + if (ret) + return ret; + + disk_data->delay_on =3D state; + + return size; +} + +static ssize_t led_delay_off_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev =3D led_trigger_get_led(dev); + struct ledtrig_disk_data *disk_data =3D led_get_trigger_data(led_cdev); + + return sprintf(buf, "%lu\n", disk_data->delay_off); +} + +static ssize_t led_delay_off_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct led_classdev *led_cdev =3D led_trigger_get_led(dev); + struct ledtrig_disk_data *disk_data =3D led_get_trigger_data(led_cdev); + unsigned long state; + ssize_t ret; + + ret =3D kstrtoul(buf, 10, &state); + if (ret) + return ret; + + disk_data->delay_off =3D state; + + return size; +} + +static ssize_t led_invert_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ledtrig_disk_data *disk_data =3D + led_trigger_get_drvdata(dev); + + return sprintf(buf, "%u\n", disk_data->invert); +} + +static ssize_t led_invert_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct led_classdev *led_cdev =3D led_trigger_get_led(dev); + struct ledtrig_disk_data *disk_data =3D led_get_trigger_data(led_cdev); + unsigned long state; + int ret; + + ret =3D kstrtoul(buf, 0, &state); + if (ret) + return ret; + + led_set_brightness_nosleep(led_cdev, state ? LED_FULL : LED_OFF); + disk_data->invert =3D !!state; + + return size; +} + +static DEVICE_ATTR(delay_on, 0644, led_delay_on_show, led_delay_on_store); +static DEVICE_ATTR(delay_off, 0644, led_delay_off_show, led_delay_off_stor= e); +static DEVICE_ATTR(invert, 0644, led_invert_show, led_invert_store); + +static struct attribute *ledtrig_disk_attrs[] =3D { + &dev_attr_delay_on.attr, + &dev_attr_delay_off.attr, + &dev_attr_invert.attr, + NULL +}; +ATTRIBUTE_GROUPS(ledtrig_disk); + +static void pattern_init(struct led_classdev *led_cdev, struct ledtrig_dis= k_data *disk_data) +{ + unsigned int size =3D 0; + + u32 *pattern __free(kfree) =3D led_get_default_pattern(led_cdev, &size); + if (!pattern) + return; + + if (size !=3D 3) { + dev_warn(led_cdev->dev, + "Expected 3 but got %u values for delays + invert pattern\n", + size); + return; + } + + disk_data->delay_on =3D pattern[0]; + disk_data->delay_off =3D pattern[1]; + disk_data->invert =3D !!pattern[2]; +} + +static int ledtrig_disk_activate(struct led_classdev *led_cdev) +{ + struct ledtrig_disk_data *disk_data; + + disk_data =3D kzalloc(sizeof(*disk_data), GFP_KERNEL); + if (!disk_data) + return -ENOMEM; + + disk_data->delay_on =3D DEFAULT_BLINK_DELAY; + disk_data->delay_off =3D DEFAULT_BLINK_DELAY; + + led_set_trigger_data(led_cdev, disk_data); + + if (led_cdev->flags & LED_INIT_DEFAULT_TRIGGER) { + pattern_init(led_cdev, disk_data); + /* + * Mark as initialized even on pattern_init() error because + * any consecutive call to it would produce the same error. + */ + led_cdev->flags &=3D ~LED_INIT_DEFAULT_TRIGGER; + } + + led_set_brightness_nosleep(led_cdev, disk_data->invert ? LED_FULL : LED_O= FF); + + return 0; +} + +static struct led_trigger ledtrig_disk =3D { + .name =3D "disk-activity", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, +}; +static struct led_trigger ledtrig_disk_read =3D { + .name =3D "disk-read", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, +}; +static struct led_trigger ledtrig_disk_write =3D { + .name =3D "disk-write", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, +}; + +static void ledtrig_disk_blink_oneshot(struct led_trigger *trig) +{ + struct led_classdev *led_cdev; + struct ledtrig_disk_data *disk_data; + + rcu_read_lock(); + list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) { + disk_data =3D led_get_trigger_data(led_cdev); + led_blink_set_oneshot(led_cdev, &disk_data->delay_on, &disk_data->delay_= off, + disk_data->invert); + } + rcu_read_unlock(); +} =20 void ledtrig_disk_activity(bool write) { - led_trigger_blink_oneshot(ledtrig_disk, BLINK_DELAY, BLINK_DELAY, 0); + ledtrig_disk_blink_oneshot(&ledtrig_disk); if (write) - led_trigger_blink_oneshot(ledtrig_disk_write, - BLINK_DELAY, BLINK_DELAY, 0); + ledtrig_disk_blink_oneshot(&ledtrig_disk_write); else - led_trigger_blink_oneshot(ledtrig_disk_read, - BLINK_DELAY, BLINK_DELAY, 0); + ledtrig_disk_blink_oneshot(&ledtrig_disk_read); } EXPORT_SYMBOL(ledtrig_disk_activity); =20 static int __init ledtrig_disk_init(void) { - led_trigger_register_simple("disk-activity", &ledtrig_disk); - led_trigger_register_simple("disk-read", &ledtrig_disk_read); - led_trigger_register_simple("disk-write", &ledtrig_disk_write); + led_trigger_register(&ledtrig_disk); + led_trigger_register(&ledtrig_disk_read); + led_trigger_register(&ledtrig_disk_write); =20 return 0; } --=20 2.52.0 From nobody Sat Feb 7 06:55:17 2026 Received: from mout01.posteo.de (mout01.posteo.de [185.67.36.65]) (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 D4D4C280CD2 for ; Fri, 23 Jan 2026 19:05:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.67.36.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195121; cv=none; b=CA77Lz0RX5/7el6+vH/bRWLAMJ98bFmzbPZn9dOBZryC2CuA+dJP5VZhrkjZvW4OdXYgVyuZ3mshFm57DTUSaneu+KcMaHPFSFD1fd/t6Tul6ETKJf+iuIdr0U77HJ05ssKT6sejYanu5r/NrrAjhotzP6ba4q56p+G3hWiqoiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769195121; c=relaxed/simple; bh=yHrnIhZKWe4aGD+KAtqFNtnxQQuW2y+OccQYipFK/7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iVwZPrvKL6KwrbTk8TRugzxrCuEgfzxOSbBID+A4bZ8CGUJMzUtUSPQCqQ6Z8XB1YO586CjOFrsyAfkhNnnh4CTSco6MICHi32nGSn5B1ZdAkW9tvtQ+fHbjDOaZs5ksRKfjOj8EAivM3/yDuDCMbYfcDvrbAdrdYk5+ZVVSZBI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de; spf=pass smtp.mailfrom=posteo.de; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b=Uo7L9vAw; arc=none smtp.client-ip=185.67.36.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=posteo.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=posteo.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=posteo.de header.i=@posteo.de header.b="Uo7L9vAw" Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id 396F624002B for ; Fri, 23 Jan 2026 20:05:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=posteo.de; s=2017; t=1769195111; bh=rGNtFbWYd64mUfi+ig+LOirZBXBy+lx6XwWx6CydM4I=; h=From:Date:Subject:MIME-Version:Content-Type: Content-Transfer-Encoding:Message-Id:To:Cc:Autocrypt:OpenPGP:From; b=Uo7L9vAwSMoxyAKYyh9SHIoaO3zJA5Q8J0XI3Yv390lKrlM6xQA3D9lWsz4hDpkzR JWc8crxB2qnmtSg7GGTPotWOxy8mMjWCJqqYazW3xgdJ6WFKvgQq0G71h3GPj3cZa3 prFBqevNirydIwpR7TwStZye3hYRf906004my9q3x1vC4KFvvDZr8iDmQ8wMuJUzg/ 8Yvwy+EuvgySgKYVQmJZyVJIGnGDZeImcG+dumfkzjgjJ6jnF1M2Sh7eBNNS0slTTv lrdnYsX6p0Pvh8zIOcSawerTkijEzA0Yreu8pCI4QWaERh7Do5G0wQBdHq7ezlakZH vytgA1fafJwfQ== Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4dyS6r5DVYz9rxG; Fri, 23 Jan 2026 20:05:08 +0100 (CET) From: Markus Probst Date: Fri, 23 Jan 2026 19:05:10 +0000 Subject: [PATCH RFC 4/4] leds: add disk trigger for each ata port 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: <20260123-ledtrig_disk_-v1-4-07004756467b@posteo.de> References: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> In-Reply-To: <20260123-ledtrig_disk_-v1-0-07004756467b@posteo.de> To: Lee Jones , Pavel Machek , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski , Damien Le Moal , Niklas Cassel , John Garry , Jason Yan , "James E.J. Bottomley" , "Martin K. Petersen" Cc: Pavel Machek , linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ide@vger.kernel.org, linux-scsi@vger.kernel.org, Markus Probst X-Developer-Signature: v=1; a=openpgp-sha256; l=10395; i=markus.probst@posteo.de; h=from:subject:message-id; bh=yHrnIhZKWe4aGD+KAtqFNtnxQQuW2y+OccQYipFK/7I=; b=owEBiQJ2/ZANAwAIATR2H/jnrUPSAcsmYgBpc8ZaPwsoDdqRRAKFR+lVPd/tLwEGbvuG7GXz0 bvv9OS6Sc+JAk8EAAEIADkWIQSCdBjE9KxY53IwxHM0dh/4561D0gUCaXPGWhsUgAAAAAAEAA5t YW51MiwyLjUrMS4xMSwyLDIACgkQNHYf+OetQ9Ij0hAAqypk3zrACIIaIXHLmkRxaSAH163Chhu siD1Rli4m3YMcxnNm1gX2VT3jGiAGYitcNHYtU8FwxePRpAlnBhnhf5aF0ANZ81U/iOVc91FG53 rm9SDymDK0lH+CeHa0NBIN9Ww1K/71T3XMvjInDCSUaLFWdSivQtkKUbixlXa/gFSe7+e117IxU wObiOCPprT39M87K+YgQWnlfwUqSk4sm/6hZnn1+qaEE+zyjIDW4QYu7vZNA6YcCEo4yIODpw0P t7cm0WzXU4rSuaNXkZ+nuMwfmombRCkxUVp7nnVv/zYudct/huhkxYBDs2gu34qP6hQToIM4wMm yO+A0vemQJ3rx78dJTy+sfXkNsRki+a63oSsJYtnV/Jph2c8t2EnEUwRvTQ5XKMUTyFxT8EHy/k qntNIbl20GAy7tAvsNWAhgK/6tqFK82QODZLT3k0LvUUOP7tO+9vdIZi8C73ntriDw3R5VtbP7Y pl8JiIHp7oK/oFme/7NO93NkAmAHDyGaWRGAYSdCGZcWsH+iU7LLWJWHZiklSjyF8wVW1NeRabr PS5D9cYHO3UxQSev+5PngXhGEKogYiUlnwGnuOPkX8YldlmWmLXxJuZKeyKGeNYBDa+Ivykc9lh Q0wnaoJZgc7auaK/sDpTGiLiWjR1PntdKxMmKSMO+t7NR/C0ntBo= X-Developer-Key: i=markus.probst@posteo.de; a=openpgp; fpr=827418C4F4AC58E77230C47334761FF8E7AD43D2 Autocrypt: addr=markus.probst@posteo.de; prefer-encrypt=mutual; keydata=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 aBeNN4ijKZchBXHPgVx+YtWRHfcm4l8= OpenPGP: url=https://posteo.de/keys/markus.probst@posteo.de.asc; preference=encrypt Register a disk trigger for each ata port. This trigger will only show the activity for the ata port it has been registered for. This allows individual leds to be mapped to one ata port. This is especially useful for NAS devices, which have an own led for each disk slot. Signed-off-by: Markus Probst --- drivers/ata/libata-core.c | 22 +++++- drivers/leds/trigger/ledtrig-disk.c | 144 ++++++++++++++++++++++++++++++--= ---- drivers/scsi/libsas/sas_ata.c | 3 +- include/linux/leds.h | 16 +++- include/linux/libata.h | 6 +- 5 files changed, 161 insertions(+), 30 deletions(-) diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 09d8c035fcdf..796c46449298 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4921,8 +4921,10 @@ void ata_qc_complete(struct ata_queued_cmd *qc) struct ata_device *dev =3D qc->dev; struct ata_eh_info *ehi =3D &dev->link->eh_info; =20 +#ifdef CONFIG_LEDS_TRIGGER_DISK /* Trigger the LED (if available) */ - ledtrig_disk_activity(!!(qc->tf.flags & ATA_TFLAG_WRITE)); + ledtrig_disk_activity(ap->led_trigger, !!(qc->tf.flags & ATA_TFLAG_WRITE)= ); +#endif =20 /* * In order to synchronize EH with the regular execution path, a qc that @@ -5538,10 +5540,13 @@ int sata_link_init_spd(struct ata_link *link) * LOCKING: * Inherited from calling layer (may sleep). */ -struct ata_port *ata_port_alloc(struct ata_host *host) +struct ata_port *ata_port_alloc(struct ata_host *host, int port_no) { struct ata_port *ap; int id; +#ifdef CONFIG_LEDS_TRIGGER_DISK + char name[32]; +#endif =20 ap =3D kzalloc(sizeof(*ap), GFP_KERNEL); if (!ap) @@ -5557,6 +5562,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host) ap->print_id =3D id; ap->host =3D host; ap->dev =3D host->dev; + ap->port_no =3D port_no; =20 mutex_init(&ap->scsi_scan_mutex); INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug); @@ -5579,6 +5585,11 @@ struct ata_port *ata_port_alloc(struct ata_host *hos= t) =20 ata_force_pflags(ap); =20 +#ifdef CONFIG_LEDS_TRIGGER_DISK + if (snprintf(name, sizeof(name), "%s-ata%d", dev_name(host->dev), port_no= ) < sizeof(name)) + ap->led_trigger =3D ledtrig_disk_trigger_register(name); +#endif + return ap; } EXPORT_SYMBOL_GPL(ata_port_alloc); @@ -5588,6 +5599,10 @@ void ata_port_free(struct ata_port *ap) if (!ap) return; =20 +#ifdef CONFIG_LEDS_TRIGGER_DISK + ledtrig_disk_trigger_unregister(ap->led_trigger); +#endif + kfree(ap->pmp_link); kfree(ap->slave_link); ida_free(&ata_ida, ap->print_id); @@ -5690,11 +5705,10 @@ struct ata_host *ata_host_alloc(struct device *dev,= int n_ports) for (i =3D 0; i < n_ports; i++) { struct ata_port *ap; =20 - ap =3D ata_port_alloc(host); + ap =3D ata_port_alloc(host, i); if (!ap) goto err_out; =20 - ap->port_no =3D i; host->ports[i] =3D ap; } =20 diff --git a/drivers/leds/trigger/ledtrig-disk.c b/drivers/leds/trigger/led= trig-disk.c index ed5ef83a5b35..fd25b4e45fb4 100644 --- a/drivers/leds/trigger/ledtrig-disk.c +++ b/drivers/leds/trigger/ledtrig-disk.c @@ -159,20 +159,22 @@ static int ledtrig_disk_activate(struct led_classdev = *led_cdev) return 0; } =20 -static struct led_trigger ledtrig_disk =3D { - .name =3D "disk-activity", - .activate =3D ledtrig_disk_activate, - .groups =3D ledtrig_disk_groups, -}; -static struct led_trigger ledtrig_disk_read =3D { - .name =3D "disk-read", - .activate =3D ledtrig_disk_activate, - .groups =3D ledtrig_disk_groups, -}; -static struct led_trigger ledtrig_disk_write =3D { - .name =3D "disk-write", - .activate =3D ledtrig_disk_activate, - .groups =3D ledtrig_disk_groups, +static struct ledtrig_disk_trigger ledtrig_disk =3D { + .all =3D { + .name =3D "disk-activity", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, + }, + .read =3D { + .name =3D "disk-read", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, + }, + .write =3D { + .name =3D "disk-write", + .activate =3D ledtrig_disk_activate, + .groups =3D ledtrig_disk_groups, + }, }; =20 static void ledtrig_disk_blink_oneshot(struct led_trigger *trig) @@ -189,21 +191,121 @@ static void ledtrig_disk_blink_oneshot(struct led_tr= igger *trig) rcu_read_unlock(); } =20 -void ledtrig_disk_activity(bool write) +static void ledtrig_disk_trigger_activity(struct ledtrig_disk_trigger *tri= g, bool write) { - ledtrig_disk_blink_oneshot(&ledtrig_disk); + if (IS_ERR_OR_NULL(trig)) + return; + ledtrig_disk_blink_oneshot(&trig->all); if (write) - ledtrig_disk_blink_oneshot(&ledtrig_disk_write); + ledtrig_disk_blink_oneshot(&trig->write); else - ledtrig_disk_blink_oneshot(&ledtrig_disk_read); + ledtrig_disk_blink_oneshot(&trig->read); +} + +void ledtrig_disk_activity(struct ledtrig_disk_trigger *port, bool write) +{ + ledtrig_disk_trigger_activity(&ledtrig_disk, write); + ledtrig_disk_trigger_activity(port, write); } EXPORT_SYMBOL(ledtrig_disk_activity); =20 +struct ledtrig_disk_trigger *ledtrig_disk_trigger_register(const char *nam= e) +{ + struct ledtrig_disk_trigger *trigger =3D kzalloc(sizeof(*trigger), GFP_KE= RNEL); + int ret, n; + + if (!trigger) + return ERR_PTR(-ENOMEM); + + trigger->all.name =3D kzalloc(TRIG_NAME_MAX, GFP_KERNEL); + if (!trigger->all.name) { + ret =3D -ENOMEM; + goto err1; + } + + n =3D snprintf((char *)trigger->all.name, TRIG_NAME_MAX, "%s-disk-activit= y", name); + if (n >=3D TRIG_NAME_MAX) { + ret =3D -E2BIG; + goto err1; + } + + trigger->all.activate =3D ledtrig_disk_activate; + trigger->all.groups =3D ledtrig_disk_groups; + + ret =3D led_trigger_register(&trigger->all); + if (ret) + goto err1; + + trigger->read.name =3D kzalloc(TRIG_NAME_MAX, GFP_KERNEL); + if (!trigger->read.name) { + ret =3D -ENOMEM; + goto err2; + } + + n =3D snprintf((char *)trigger->read.name, TRIG_NAME_MAX, "%s-disk-read",= name); + if (n >=3D TRIG_NAME_MAX) { + ret =3D -E2BIG; + goto err2; + } + + trigger->read.activate =3D ledtrig_disk_activate; + trigger->read.groups =3D ledtrig_disk_groups; + + ret =3D led_trigger_register(&trigger->read); + if (ret) + goto err2; + + trigger->write.name =3D kzalloc(TRIG_NAME_MAX, GFP_KERNEL); + if (!trigger->write.name) { + ret =3D -ENOMEM; + goto err3; + } + + n =3D snprintf((char *)trigger->write.name, TRIG_NAME_MAX, "%s-disk-write= ", name); + if (n >=3D TRIG_NAME_MAX) { + ret =3D -E2BIG; + goto err3; + } + + trigger->write.activate =3D ledtrig_disk_activate; + trigger->write.groups =3D ledtrig_disk_groups; + + ret =3D led_trigger_register(&trigger->write); + if (ret) + goto err3; + + return trigger; + +err3: + led_trigger_unregister(&trigger->read); +err2: + led_trigger_unregister(&trigger->all); +err1: + kfree(trigger->all.name); + kfree(trigger->read.name); + kfree(trigger->write.name); + kfree(trigger); + + return ERR_PTR(ret); +} +EXPORT_SYMBOL(ledtrig_disk_trigger_register); + +void ledtrig_disk_trigger_unregister(struct ledtrig_disk_trigger *trig) +{ + if (IS_ERR_OR_NULL(trig)) + return; + + led_trigger_unregister(&trig->all); + led_trigger_unregister(&trig->read); + led_trigger_unregister(&trig->write); +} +EXPORT_SYMBOL(ledtrig_disk_trigger_unregister); + static int __init ledtrig_disk_init(void) { - led_trigger_register(&ledtrig_disk); - led_trigger_register(&ledtrig_disk_read); - led_trigger_register(&ledtrig_disk_write); + led_trigger_register(&ledtrig_disk.all); + led_trigger_register(&ledtrig_disk.read); + led_trigger_register(&ledtrig_disk.write); =20 return 0; } diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c index bcecb4911da9..8841850684f7 100644 --- a/drivers/scsi/libsas/sas_ata.c +++ b/drivers/scsi/libsas/sas_ata.c @@ -587,14 +587,13 @@ int sas_ata_init(struct domain_device *found_dev) =20 ata_host_init(ata_host, ha->dev, &sas_sata_ops); =20 - ap =3D ata_port_alloc(ata_host); + ap =3D ata_port_alloc(ata_host, 0); if (!ap) { pr_err("ata_port_alloc failed.\n"); rc =3D -ENODEV; goto free_host; } =20 - ap->port_no =3D 0; ap->pio_mask =3D ATA_PIO4; ap->mwdma_mask =3D ATA_MWDMA2; ap->udma_mask =3D ATA_UDMA6; diff --git a/include/linux/leds.h b/include/linux/leds.h index b16b803cc1ac..3221be97e9c0 100644 --- a/include/linux/leds.h +++ b/include/linux/leds.h @@ -619,10 +619,22 @@ enum led_trigger_netdev_modes { }; =20 /* Trigger specific functions */ +struct ledtrig_disk_trigger { + struct led_trigger all; + struct led_trigger read; + struct led_trigger write; +}; #ifdef CONFIG_LEDS_TRIGGER_DISK -void ledtrig_disk_activity(bool write); +struct ledtrig_disk_trigger *ledtrig_disk_trigger_register(const char *nam= e); +void ledtrig_disk_trigger_unregister(struct ledtrig_disk_trigger *trig); +void ledtrig_disk_activity(struct ledtrig_disk_trigger *port, bool write); #else -static inline void ledtrig_disk_activity(bool write) {} +static inline struct ledtrig_disk_trigger *ledtrig_disk_trigger_register(c= onst char *name) +{ + return ERR_PTR(-EOPNOTSUPP); +} +static inline void ledtrig_disk_trigger_unregister(struct ledtrig_disk_tri= gger *trig) {} +static inline void ledtrig_disk_activity(struct ledtrig_disk_trigger *port= , bool write) {} #endif =20 #ifdef CONFIG_LEDS_TRIGGER_MTD diff --git a/include/linux/libata.h b/include/linux/libata.h index 39534fafa36a..50124d170d13 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -940,6 +940,10 @@ struct ata_port { #ifdef CONFIG_ATA_ACPI struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */ #endif + +#ifdef CONFIG_LEDS_TRIGGER_DISK + struct ledtrig_disk_trigger *led_trigger; +#endif }; =20 /* The following initializer overrides a method to NULL whether one of @@ -1307,7 +1311,7 @@ extern int sata_link_scr_lpm(struct ata_link *link, e= num ata_lpm_policy policy, bool spm_wakeup); extern int ata_slave_link_init(struct ata_port *ap); extern void ata_port_probe(struct ata_port *ap); -extern struct ata_port *ata_port_alloc(struct ata_host *host); +extern struct ata_port *ata_port_alloc(struct ata_host *host, int port_no); extern void ata_port_free(struct ata_port *ap); extern int ata_tport_add(struct device *parent, struct ata_port *ap); extern void ata_tport_delete(struct ata_port *ap); --=20 2.52.0