From patchwork Tue Sep 12 13:44:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 138452 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp698444vqx; Tue, 12 Sep 2023 14:48:46 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHAMxERsEdAhGXTxrOc2EXNwrjG/991qmlLGchvLDqjbi/VP3zL8pMm/wJIsyXdCP4KaFEG X-Received: by 2002:a05:6a00:1d1a:b0:68b:fc76:7dea with SMTP id a26-20020a056a001d1a00b0068bfc767deamr4992760pfx.12.1694555326579; Tue, 12 Sep 2023 14:48:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694555326; cv=none; d=google.com; s=arc-20160816; b=M/cslCsZHDyv5P840YBAljDGQlHM+ZWLoTYBUgntEAQfWteGvIVvT07HxmYxn+Tml2 L0Cjpm06zn3DtcYorGQK+H2BQ2LjYsTrkQiadaoj8q4iKXYKIpqMbO2bIxylVjHOdJUt yKrWx/4RZoMBBAQu04HwWToCIDUnKOm0/5v3oPr/oFd7SDO8udzyiGmSjfh+3b4yDKX5 /jb/rJwlumF7/ggpVhFuiggxCawNR70dO2EN860V8O9EoZrmrlaTqhmN9Kal8NTtl7Q+ 0bSljfg5987xRdMHiZCj1WhNvIUwg0Myeoxx0nACCxSrFaI1uackqXM8junur756ibos VFOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=zr1tndUa8GJ+rpTLKAA728oy8bkiMEVH1LyXXvtzocQ=; fh=vOR+f+ec2RFJcjj3G0dAoFd095oyBG31moK1iVhdblk=; b=VDRI7aYrpOMMieCIR/1RckAfBgw//8uK5cGguioiBvi7DsNK+RmtBozuqNoizqnxGc wdkquIO57r8MTV4e4n00zNOvBsf4v6heMc/n0zH0FElDcIn/9WCyR7F1UWiIgmb8UEWC g9t0m9OgqIl46fnBjuFx1EQfQn2o4nvGPdCzl95eZsx9gAWNZmHdOf0EalHT2c6i5c7x jJpQ8UVzjoWzvTp+NTt7ASFPHqHQFTGxaFeTAk1j3tzKv+POPYZcQb7nGv4DLpVfduec fqto1hGOQ4VmOnMn50rqos68oHmoT6QHngJ5P+PlHf2+gg0XiW5scpBj8HNCMbftDkXX k0EA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ljM6uTY8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id ct5-20020a056a000f8500b0068a692b67b0si8753004pfb.104.2023.09.12.14.48.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 14:48:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ljM6uTY8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id E93DE81CC851; Tue, 12 Sep 2023 06:45:01 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.8 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235678AbjILNor (ORCPT + 37 others); Tue, 12 Sep 2023 09:44:47 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44522 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235656AbjILNoi (ORCPT ); Tue, 12 Sep 2023 09:44:38 -0400 Received: from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com [IPv6:2a00:1450:4864:20::12d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F08E10D9 for ; Tue, 12 Sep 2023 06:44:34 -0700 (PDT) Received: by mail-lf1-x12d.google.com with SMTP id 2adb3069b0e04-502a25ab777so6352543e87.2 for ; Tue, 12 Sep 2023 06:44:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1694526272; x=1695131072; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=zr1tndUa8GJ+rpTLKAA728oy8bkiMEVH1LyXXvtzocQ=; b=ljM6uTY8TLHrVWuTsqAw98/sjye7NvFIIU3xXeOnql3N4k1SPvpvXiwUf8SON2sqnz ITjEEDogB8bX2WuCiSdq0dKuwwLHq8S07PeW4xPVAYg1XoFCH96oN4ikRQDSvpR+epoe SmgcaxYsEPLlL63QynjdtpmnUwOeMz66roO3HYiFupf7iBO1IRejrDuUWVXc0oWhVVbC FtBgrUiWVOl1ZDetmCXhCNNZzpvaYDvuLG+rBRnKV16KlCPkiNVdI4X0nL7WnPwjYNlB qXSKYM7y1HAsRSYN9P1fkBU3f72cPZyl9RtPFw5akLjhapJQlE8pBEYi32lyFSH1utji HdCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694526272; x=1695131072; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zr1tndUa8GJ+rpTLKAA728oy8bkiMEVH1LyXXvtzocQ=; b=Yoo9bSePcEWkx72y5Td8PrgvyrI9hUZjotWyq/Lb/RZDUZasyG37pPbiL3ALCfI2kz foIZVTjI2IrSVoDsoa/v6DBQpKAPbN6mvPfgIan2BRtlHLkUPhxdRH6nhukKMlYNHQGp Z51V2EuiiClAHQbmfZLyjF2/UGK7S7zZsclj6Daqwnc7Dc4UcTO/xClIHl88sNmXSC4d XHnPm5OdhCh9AQ6W15lu+GtI+1aD9fImfm2xqA2y+6zQhF0/pPmnyV1Bda+iOM6IKtnH 04Nok/0QibXoSPjTIj0l60gLD3OkvsuCBr7Jp6so3s9up0mH+VNf7Oggostc0x5tlvq5 58Qw== X-Gm-Message-State: AOJu0YzlWSXa1WyDfW/lhew8Bqz5c/RDnK6zWGIYT9FeIgwG455BbfS/ aZrleoE5r1wc8tzzluzpWPAuiQ== X-Received: by 2002:a05:6512:3082:b0:501:be3d:8a46 with SMTP id z2-20020a056512308200b00501be3d8a46mr12680112lfd.26.1694526272217; Tue, 12 Sep 2023 06:44:32 -0700 (PDT) Received: from [127.0.1.1] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id y6-20020ac255a6000000b00500a2091e30sm1755020lfg.115.2023.09.12.06.44.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 06:44:31 -0700 (PDT) From: Linus Walleij Date: Tue, 12 Sep 2023 15:44:30 +0200 Subject: [PATCH 1/2] dt-bindings: leds: Mention GPIO triggers MIME-Version: 1.0 Message-Id: <20230912-gpio-led-trigger-dt-v1-1-1b50e3756dda@linaro.org> References: <20230912-gpio-led-trigger-dt-v1-0-1b50e3756dda@linaro.org> In-Reply-To: <20230912-gpio-led-trigger-dt-v1-0-1b50e3756dda@linaro.org> To: =?utf-8?q?Jan_Kundr=C3=A1t?= , Pavel Machek , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski Cc: linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Linus Walleij X-Mailer: b4 0.12.3 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Tue, 12 Sep 2023 06:45:02 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776853064778686805 X-GMAIL-MSGID: 1776870046448239865 We reuse the trigger-sources phandle to just point to GPIOs we may want to use as LED triggers. Example: gpio: gpio@0 { compatible "my-gpio"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; #trigger-source-cells = <2>; }; leds { compatible = "gpio-leds"; led-my-gpio { label = "device:blue:myled"; gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; default-state = "off"; linux,default-trigger = "gpio"; trigger-sources = <&gpio 1 GPIO_ACTIVE_HIGH>; }; }; Signed-off-by: Linus Walleij --- Documentation/devicetree/bindings/leds/common.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/leds/common.yaml b/Documentation/devicetree/bindings/leds/common.yaml index 5fb7007f3618..b42950643b9d 100644 --- a/Documentation/devicetree/bindings/leds/common.yaml +++ b/Documentation/devicetree/bindings/leds/common.yaml @@ -191,6 +191,8 @@ properties: each of them having its own LED assigned (assuming they are not hardwired). In such cases this property should contain phandle(s) of related source device(s). + Another example is a GPIO line that will be monitored and mirror the + state of the line (with or without inversion flags) to the LED. In many cases LED can be related to more than one device (e.g. one USB LED vs. multiple USB ports). Each source should be represented by a node in the device tree and be referenced by a phandle and a set of phandle From patchwork Tue Sep 12 13:44:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 138195 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:9ecd:0:b0:3f2:4152:657d with SMTP id t13csp418465vqx; Tue, 12 Sep 2023 06:47:21 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEvZEIU6SYGeaD45VFyLxs+loL63TbVFI6gIKWAmt/d21cguDlOxUFvzXqUmPOxndVCKMrn X-Received: by 2002:a17:90a:b28d:b0:26f:a34c:90e3 with SMTP id c13-20020a17090ab28d00b0026fa34c90e3mr9642342pjr.31.1694526441500; Tue, 12 Sep 2023 06:47:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694526441; cv=none; d=google.com; s=arc-20160816; b=iwaWmi2aM5qE3LFBk4w3U1w7HrLeL3EFb1Z/yP1QVSMPB0CGVCJYHbSNx1oZ5rG5QF t76Zm21uDFaXrugd2kXyrC9OK2+R9OYHzhL2U1I5Q+8M1SJw1rkHgdMRihtQpAvr8Qgb ns1FojwOoqzUAnO6WbU6xv1zQl4EPwJQ7abfQvIo3LrOMuJZtnEA9UPcRR9KR5fH61Cr QRZBFMUXvDStWxruvzcDo5yee1Opid+kshI+gmi/92n+2DzyWRnppIjpOLczsCmfBbNH lKAr/xLt+kdeWo5TYZwPW3lYFlj8GB/IF1q69wf2qUARAqBojRbORlojiMmuiHrWw7SB 49pg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :dkim-signature; bh=hcRqYFKU8stwmYS/VPO0R5cxdC9+AAdNewrnsh3GP6U=; fh=vOR+f+ec2RFJcjj3G0dAoFd095oyBG31moK1iVhdblk=; b=WSyfHxBbEq7aPY8fqwW5PfLjkINUIq0eQWnN3sg6f4UNn8yJLRBeXQBBm4UEdLitpL FuroD13VmGg11v6ayXWZyQ68ZH7AI7WJzv1b9P4rADVMSabjyQ+0ZAcP0fCkL7GhnG83 tXa54xXvQmcrIfjH+rpsRJUH2ZfWtV2o6PHAA7+iISFyb9GGf9J9zuD5NWWRvN5wyq3F 9FwFgUEPWszf5DdvDEisgGjxGuY55+Ixyt2n8ICAxhggqXkOy8JXqEcMM180tDqWeEyI 6Yx95pRlhh+rj2SMG2Q0ap1egpYY9W5v/6pyhCN5RNb7W5Kwu3aRTEnnU5hzvy2JPcDL THtQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BkGqA9W0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id oa9-20020a17090b1bc900b00263c7cadb73si8014803pjb.152.2023.09.12.06.47.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 06:47:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=BkGqA9W0; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id DF08883EB33A; Tue, 12 Sep 2023 06:44:47 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235697AbjILNom (ORCPT + 37 others); Tue, 12 Sep 2023 09:44:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235666AbjILNoi (ORCPT ); Tue, 12 Sep 2023 09:44:38 -0400 Received: from mail-lf1-x135.google.com (mail-lf1-x135.google.com [IPv6:2a00:1450:4864:20::135]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B758C10D0 for ; Tue, 12 Sep 2023 06:44:34 -0700 (PDT) Received: by mail-lf1-x135.google.com with SMTP id 2adb3069b0e04-500b66f8b27so9780342e87.3 for ; Tue, 12 Sep 2023 06:44:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1694526273; x=1695131073; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=hcRqYFKU8stwmYS/VPO0R5cxdC9+AAdNewrnsh3GP6U=; b=BkGqA9W00MRrnnwScpgkBd6OF3+uPZny4j2d7t3y9KfWZHMBFaUBb9y6ahf9vr/c+I ustg5Ib+nbBtydBVL6CQfZ29v14Vg9w7MbuXBHitVfYgOQXz+xXedE70c/VGXbdH7W3I VCVIuqrKzS2192RbTesaxLQkAP+kQscPjmnd56D7vTp9p0qob/WBT6nOCNP1FTxFMgN3 2s5I4EfiQaVfLBxQA6IK8e/m33nOhwxBlLrpXGJBTkKQUjER5jD3C7bWSWij+S1Em9uK W1xZougum30i5OqBc3J7+k8PysXM7GD9XpxC4Q12rHOS2N4r/FXph9/0/AmwZfDMOujZ tcGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694526273; x=1695131073; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hcRqYFKU8stwmYS/VPO0R5cxdC9+AAdNewrnsh3GP6U=; b=HlZas89Ye4GdaYrcq/gTrJBqpc6DnLx80o8m9ou9XptQQWdNxPg51PhGfkMnv+zxhn HXgzTwM4b9JSTq+rmCjX0Sgk0nlttiam2gaO7/mpAn65iGA3vgSzLLEzLPc+F7tuILZA /m9MaoZ9TPFhsL5KbtzX4L4YIMylOflwlykURtYvcN4fMK+IK7pVmeNSZvI8LnnMrXbY SuZjb47mXdUOv93XVnHRamAa3WUiHmRHXR6iOYxqNRzcey02xqh7GqG6uXLUFSVOdBZS 6+CiI9wj/I4UJ9aSfMGAnL4JVs3eXhplpuKBqBXxVPF22vo8gFTF6qMbIaJg1nvJB6t5 9++A== X-Gm-Message-State: AOJu0YyPrsYOSy3CLxtbQbqugFN3CESWZELz5opkps1nQDAioECi62yl C1rx+N+aX7UOsteVQW6dgnVsrA== X-Received: by 2002:a19:435d:0:b0:500:a408:dbd with SMTP id m29-20020a19435d000000b00500a4080dbdmr9094218lfj.55.1694526273069; Tue, 12 Sep 2023 06:44:33 -0700 (PDT) Received: from [127.0.1.1] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id y6-20020ac255a6000000b00500a2091e30sm1755020lfg.115.2023.09.12.06.44.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Sep 2023 06:44:32 -0700 (PDT) From: Linus Walleij Date: Tue, 12 Sep 2023 15:44:31 +0200 Subject: [PATCH 2/2] leds: triggers: gpio: Rewrite to use trigger-sources MIME-Version: 1.0 Message-Id: <20230912-gpio-led-trigger-dt-v1-2-1b50e3756dda@linaro.org> References: <20230912-gpio-led-trigger-dt-v1-0-1b50e3756dda@linaro.org> In-Reply-To: <20230912-gpio-led-trigger-dt-v1-0-1b50e3756dda@linaro.org> To: =?utf-8?q?Jan_Kundr=C3=A1t?= , Pavel Machek , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jacek Anaszewski Cc: linux-leds@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Linus Walleij X-Mailer: b4 0.12.3 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Tue, 12 Sep 2023 06:44:47 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776839758073779973 X-GMAIL-MSGID: 1776839758073779973 By providing a GPIO line as "trigger-sources" in the FWNODE (such as from the device tree) and combining with the GPIO trigger, we can support a GPIO LED trigger in a natural way from the hardware description instead of using the custom sysfs and deprecated global GPIO numberspace. Example: gpio: gpio@0 { compatible "my-gpio"; gpio-controller; #gpio-cells = <2>; interrupt-controller; #interrupt-cells = <2>; #trigger-source-cells = <2>; }; leds { compatible = "gpio-leds"; led-my-gpio { label = "device:blue:myled"; gpios = <&gpio 0 GPIO_ACTIVE_HIGH>; default-state = "off"; linux,default-trigger = "gpio"; trigger-sources = <&gpio 1 GPIO_ACTIVE_HIGH>; }; }; Make this the norm, unmark the driver as broken. Delete the sysfs handling of GPIOs. Since GPIO descriptors inherently can describe inversion, the inversion handling can just be deleted. Signed-off-by: Linus Walleij --- drivers/leds/trigger/Kconfig | 5 +- drivers/leds/trigger/ledtrig-gpio.c | 136 +++++++++++------------------------- 2 files changed, 40 insertions(+), 101 deletions(-) diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig index 2a57328eca20..d11d80176fc0 100644 --- a/drivers/leds/trigger/Kconfig +++ b/drivers/leds/trigger/Kconfig @@ -83,13 +83,10 @@ config LEDS_TRIGGER_ACTIVITY config LEDS_TRIGGER_GPIO tristate "LED GPIO Trigger" depends on GPIOLIB || COMPILE_TEST - depends on BROKEN help This allows LEDs to be controlled by gpio events. It's good when using gpios as switches and triggering the needed LEDs - from there. One use case is n810's keypad LEDs that could - be triggered by this trigger when user slides up to show - keypad. + from there. Triggers are defined as device properties. If unsure, say N. diff --git a/drivers/leds/trigger/ledtrig-gpio.c b/drivers/leds/trigger/ledtrig-gpio.c index 0120faa3dafa..a9caab7998a9 100644 --- a/drivers/leds/trigger/ledtrig-gpio.c +++ b/drivers/leds/trigger/ledtrig-gpio.c @@ -3,12 +3,13 @@ * ledtrig-gio.c - LED Trigger Based on GPIO events * * Copyright 2009 Felipe Balbi + * Copyright 2023 Linus Walleij */ #include #include #include -#include +#include #include #include #include @@ -16,10 +17,8 @@ struct gpio_trig_data { struct led_classdev *led; - unsigned desired_brightness; /* desired brightness when led is on */ - unsigned inverted; /* true when gpio is inverted */ - unsigned gpio; /* gpio that triggers the leds */ + struct gpio_desc *gpiod; /* gpio that triggers the led */ }; static irqreturn_t gpio_trig_irq(int irq, void *_led) @@ -28,10 +27,7 @@ static irqreturn_t gpio_trig_irq(int irq, void *_led) struct gpio_trig_data *gpio_data = led_get_trigger_data(led); int tmp; - tmp = gpio_get_value_cansleep(gpio_data->gpio); - if (gpio_data->inverted) - tmp = !tmp; - + tmp = gpiod_get_value_cansleep(gpio_data->gpiod); if (tmp) { if (gpio_data->desired_brightness) led_set_brightness_nosleep(gpio_data->led, @@ -73,93 +69,8 @@ static ssize_t gpio_trig_brightness_store(struct device *dev, static DEVICE_ATTR(desired_brightness, 0644, gpio_trig_brightness_show, gpio_trig_brightness_store); -static ssize_t gpio_trig_inverted_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - - return sprintf(buf, "%u\n", gpio_data->inverted); -} - -static ssize_t gpio_trig_inverted_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = led_trigger_get_led(dev); - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - unsigned long inverted; - int ret; - - ret = kstrtoul(buf, 10, &inverted); - if (ret < 0) - return ret; - - if (inverted > 1) - return -EINVAL; - - gpio_data->inverted = inverted; - - /* After inverting, we need to update the LED. */ - if (gpio_is_valid(gpio_data->gpio)) - gpio_trig_irq(0, led); - - return n; -} -static DEVICE_ATTR(inverted, 0644, gpio_trig_inverted_show, - gpio_trig_inverted_store); - -static ssize_t gpio_trig_gpio_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - - return sprintf(buf, "%u\n", gpio_data->gpio); -} - -static ssize_t gpio_trig_gpio_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t n) -{ - struct led_classdev *led = led_trigger_get_led(dev); - struct gpio_trig_data *gpio_data = led_trigger_get_drvdata(dev); - unsigned gpio; - int ret; - - ret = sscanf(buf, "%u", &gpio); - if (ret < 1) { - dev_err(dev, "couldn't read gpio number\n"); - return -EINVAL; - } - - if (gpio_data->gpio == gpio) - return n; - - if (!gpio_is_valid(gpio)) { - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = gpio; - return n; - } - - ret = request_threaded_irq(gpio_to_irq(gpio), NULL, gpio_trig_irq, - IRQF_ONESHOT | IRQF_SHARED | IRQF_TRIGGER_RISING - | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); - if (ret) { - dev_err(dev, "request_irq failed with error %d\n", ret); - } else { - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); - gpio_data->gpio = gpio; - /* After changing the GPIO, we need to update the LED. */ - gpio_trig_irq(0, led); - } - - return ret ? ret : n; -} -static DEVICE_ATTR(gpio, 0644, gpio_trig_gpio_show, gpio_trig_gpio_store); - static struct attribute *gpio_trig_attrs[] = { &dev_attr_desired_brightness.attr, - &dev_attr_inverted.attr, - &dev_attr_gpio.attr, NULL }; ATTRIBUTE_GROUPS(gpio_trig); @@ -167,16 +78,47 @@ ATTRIBUTE_GROUPS(gpio_trig); static int gpio_trig_activate(struct led_classdev *led) { struct gpio_trig_data *gpio_data; + struct device *dev = led->dev; + int ret; gpio_data = kzalloc(sizeof(*gpio_data), GFP_KERNEL); if (!gpio_data) return -ENOMEM; - gpio_data->led = led; - gpio_data->gpio = -ENOENT; + /* + * The generic property "trigger-sources" is followed, + * and we hope that this is a GPIO. + */ + gpio_data->gpiod = fwnode_gpiod_get_index(dev->fwnode, + "trigger-sources", + 0, GPIOD_IN, + "led-trigger"); + if (IS_ERR(gpio_data->gpiod)) { + kfree(gpio_data); + return PTR_ERR(gpio_data->gpiod); + } + if (!gpio_data->gpiod) { + dev_err(dev, "no valid GPIO for the trigger\n"); + kfree(gpio_data); + return -EINVAL; + } + gpio_data->led = led; led_set_trigger_data(led, gpio_data); + ret = request_threaded_irq(gpiod_to_irq(gpio_data->gpiod), NULL, gpio_trig_irq, + IRQF_ONESHOT | IRQF_SHARED | IRQF_TRIGGER_RISING + | IRQF_TRIGGER_FALLING, "ledtrig-gpio", led); + if (ret) { + dev_err(dev, "request_irq failed with error %d\n", ret); + gpiod_put(gpio_data->gpiod); + kfree(gpio_data); + return ret; + } + + /* Finally update the LED to initial status */ + gpio_trig_irq(0, led); + return 0; } @@ -184,8 +126,8 @@ static void gpio_trig_deactivate(struct led_classdev *led) { struct gpio_trig_data *gpio_data = led_get_trigger_data(led); - if (gpio_is_valid(gpio_data->gpio)) - free_irq(gpio_to_irq(gpio_data->gpio), led); + free_irq(gpiod_to_irq(gpio_data->gpiod), led); + gpiod_put(gpio_data->gpiod); kfree(gpio_data); }