From nobody Sat Jun 20 09:28:25 2026 Received: from sonic301-20.consmr.mail.gq1.yahoo.com (sonic301-20.consmr.mail.gq1.yahoo.com [98.137.64.146]) (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 97B4831D375 for ; Fri, 17 Apr 2026 05:25:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=98.137.64.146 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776403554; cv=none; b=YCFnSvse411qTI4rSxdO3CEd4zPpkSjD4f/P5Z+VN4y8n1mYJzxL7vKBo2/sXlRZZkMCo67u1KfNvoHmQzwO0K7b3h7hPZIn3FHN1cKSwOCVJG80OEo62lIKpR3++2bhZs40rQfsiDrHW0gKRw5W0ykU+PlQn5kvylECTNIY/gg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776403554; c=relaxed/simple; bh=1J7MwF8rPlG88VoS8a0IxHCnCg1K6SzG/2NtEPqqUWE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BH+dwPaNbve+n5gSIi+0cQAQ9oQOBKo76IJpyiuzydMoDsSzBO+AaHT54Lstyiyq4mmJsL/OpvQ81lFTFHJEPP/HEvxZmAUoLJvSkihL0nXp+Fedb0qY/KaPgJPo8yMHALzy2bCg4iLKyZeIhARP6wVyT0Ac90U6jWVtaYs7Yjc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com; spf=pass smtp.mailfrom=yahoo.com; dkim=pass (2048-bit key) header.d=yahoo.com header.i=@yahoo.com header.b=sVCE+UFr; arc=none smtp.client-ip=98.137.64.146 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yahoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yahoo.com header.i=@yahoo.com header.b="sVCE+UFr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1776403553; bh=9vTObqX85QaCEXwY5LKFK7LitXf1Ajy/mqo2ml1SXtY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=sVCE+UFrYTsrzMNQz6kMSQclQf+DWIUwkPqENgTM1wmNmTcnOkF0e2+ofa8l+oTgkYb98TD2Jw5dYKJSTmXZthobDcx1LLrTZwPsdWXedczulZuxwOS/8JLPmt64UeltrBJmhSIP+U+jV+l0tzqpl59uhr49EYavfBqLKlRUhV2Naj+qzJWpdAqZT7Yl4bQplulW9HiuQsRZT4B7zFttK216agUdfxHF6s50ImWZ+2XTGTJ+zmgW+G1gi0YFG8aQxbj0l27znMGVF6vUQaGW3dZ2ivW9lDLDETRm0LgqFqAZlyizpbbySply7ACsGyQ3yPiS/8v9VbM9VwauzDFCzw== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1776403553; bh=wnzQedxQPKCytp+vrnLr7BNFX2ZzBhw6+mSBAfRSbXI=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=dk9twg/VZ1fsteZzhsafEGj/5aFTzWK1WZ16/0HpRuTkRHx74rVm26Uho0DhIiYGZ5PkBqenPAOuaxOUEXVqBYX5JVbmVHkJ9uH+Vs5uFtv0LLl5KFsiiVbR9q2b8fHxyhcJepUMEXFbM6FI4oEHWKDmacUiXtQdNM+srZfyzEQjk8HrsHEaji76z5UEmab8k5rYiE41AbULjbUwLezPf0rQ4xiSIXx0X4Gqp9t4E//xcPef09ozQrdEuENiP8x2Ye8gfsR4xWqLaEmmisE5nFDvgSj2I5Gxd45eFHNOThYjS6ZbiGwWsBy3cH93Lh0KA1f/zy0mZowW/WfhdiblLw== X-YMail-OSG: ki2x4k8VM1mGyvGkuUOl3vQaC3My0fRbHGspnr1i6ybHJw2GQMdV7ah8qihgiK8 MDn_8nknJbHvHf_FdYaYhBQr.6np7zukT9_nuHM.pJPdp8vuRaP5zV7uCZgxOPpK2v_XHeDqzqVw itRQW9KkV9Z8NjvxxMt5sBIP4vZioTJEqgv3VNXUkvajsPUsc.DKsrSios9ln_qvcYEEvo8QWjO7 GIKIvtBLUvezghjolWhuvx5wDag2AoF8kIZWU2c9lDjvjKh3_j5lBndxObwX9Y26ojw1Hy6_dEPR JdNpEZqzDkavRrxoafVEH0Y99IE2mpoyN1Dwze1j01firUd2FMiCbO.6ogRfq0a6hhl2vGcRethS xJjyoDAlVECpCM.QaICciJtW3Va8UfYUAS2ro41Dx5er2tQ2MB7tZ7c9WoVwBFSE7dtxm0HU0pFG wM_AAyMWUmyH7O79KKWiHb727Qdm1J9vNbPM4KokQaPl2uOzJzyPHgHgOWpL1eJa70FfCBEFXdRh 327SSVzhZzIKEIfI0RkqfllLwwgasKA0_QIZYKD.iLqxrZnoarT3gTWWVx8Fm3E1YAdwv.A9zuvr uyyQKzbCSHwcUvN37UBr0Ze1iJBHeITTjCrptgouK86TK3jz3SipA11CDZz6wSGOs2XGRsvr1ngI 0wxyJG6sGdY9AQRm.5YNBczmuSC4ZiVr2_zngI9VKKXQG08CYSgAq9GF4KiPE8_aQe9lBqI3Jh02 jL3UbbZjd1sy3v2tpgG5YetKpK.04y5nOKxu4zacRbqpUsHT4xNb_3yqzPCHGnDVfG1Id9USmZoY xPLPjT4uGoQpl46aIvjTYnhO0ijPMe8TA_ruYzvEO1kjk7JLJpW5WBizX60voGOOehLDxeVWMttT hPCG6ItX0PGbdHxKBw0G4R_y3pYRjWPK.f7jSG4UUECQauByWkPc9xMAViucTjI9KLLgFKPI7dpE 5VEgOjlINGWwkIRQ2gDlfmuMGfLmJOjr4ojNnywmGdACWWHitScV.ObJkjVvvkATRKU8HKe4jnvJ 5IZJyYpezv_vc7hC2bIju8MtpRoztVcX4zlF5fPtpcr9QADzKxNlbQvDTbia3QmMhtvUYd6xa99R 3zxIdHRRiZLCHz3ClU2U3BF4DBIwA0ZcnlCKewINJDo2kaMPoGNjm3sGzgIhp.XPpsVv93di9.gu vwplwG462qiCIx7LOqgPxgKZhRHw_bHxho6gmFTCDkkPkXqMlgOPq7eJqOiNoEkP5TJ16fFbmTC4 ra4Acn_7WXIINEfZCYEtvjaDNMfQkEpll5gaD17nX6h1irUJhbIZ_NxAscQ6mbu0XGR3HrFHAsMj n.PCd9SqFIsL7hx.gT4p.CeSvLkmnr9sNKLBrCGP8.BoAHlmTuwyQa5KYKRqxEekbDQiXV5TAplQ xVNovlmjlbDOuoTBeVWjckR34emVqVKsEdyJpoFhUBINq6LBBjeAtGYHACbn.qZLI5qdB0LUMI2H UVLjGMtPoTmsbvWCiD4kiyZ28VCid2KLfyCwl9weXTQkqgkbq2ekf6aU1qKJwIxj0im._pXtVmGp i9QYmmN2ctsLV2wh13HAfndq8rEIke.EsAPR4H4T94jVD_KMzv3Bvwd92w9kQvrAVwCbgFbrD.gh gmQhyKABwXaI6v.GS.hWNURmQelPP99N.xEvqocBydmvhA_1RyJa6kawHz__kiKsDT5hgZpJ0J9w THs5toU3maQt71LuUVt3W7C6iNrayvoGsMKTKQ1hiw0TN4XVO43a8Z6Uyncdr0gYA78VhD0Cv_6e gnhv7JkYR63NVZK1JNZG_t4Z41ouEZZrtAXqqg1jLVi2uLGD6y3sNepdOMbJVl0nUkoq_rDoVg77 Su1eT7n8f0jWZFMraayxwq3So30wR4WA_7SrcUMKSiVmitE7mdMF8edLEMtt_R755KcMl85pbTgT OgpJwILA4AJGK7fKeKVOFxJwqXRp3hgaVs0N7QMNCGoAJE_wBG2CT4MQFv1EJGFeKzuoLJTXKnP. hDSB61Ga1pjdaLsFlUaolvPb0C22XuS8cRgGjpoubeWCoWzIvq6MIl5HB8LFfLLb7cFysvH5NEgE txjBxrvXlPWiWqc7ROLC76FRDQLKf7Uzh2Xb0lwzlgp.aQJ7KiQqeZ884fOqs0D_67jkCxzYaNXs SO0HQNr73xDiaKiRyblti7gdLr9B_wXBwikw4ddWsJbqwJQ101FUz6p2JhWDzpPnYUovbbdKRmi0 f.qMXsay2ftfqs_j0i2leeNVm2kcZfFAGGY_yKkSpjtCHvPX9_8hzwqFX0iasgfTpWcOxfs0gWZh c3tY- X-Sonic-MF: X-Sonic-ID: f7439bbd-de34-4375-9a4d-aa8b8bec4a41 Received: from sonic.gate.mail.ne1.yahoo.com by sonic301.consmr.mail.gq1.yahoo.com with HTTP; Fri, 17 Apr 2026 05:25:53 +0000 Received: by hermes--production-ne1-555c74f9db-j2jxh (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 05d4cf41444c4727275ccaeea87724bf; Fri, 17 Apr 2026 05:25:48 +0000 (UTC) From: Harpreet Saini To: Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: David Lechner , Harpreet Saini , devicetree@vger.kernel.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 1/2] dt-bindings: input: Add PixArt PAJ7620 gesture sensor Date: Fri, 17 Apr 2026 01:25:26 -0400 Message-ID: <20260417052527.62535-2-sainiharpreet29@yahoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260417052527.62535-1-sainiharpreet29@yahoo.com> References: <20260417052527.62535-1-sainiharpreet29@yahoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Harpreet Saini --- .../bindings/input/pixart,paj7620.yaml | 70 +++++++++++++++++++ .../devicetree/bindings/vendor-prefixes.yaml | 2 + 2 files changed, 72 insertions(+) create mode 100644 Documentation/devicetree/bindings/input/pixart,paj7620.= yaml diff --git a/Documentation/devicetree/bindings/input/pixart,paj7620.yaml b/= Documentation/devicetree/bindings/input/pixart,paj7620.yaml new file mode 100644 index 000000000000..d4f58b712810 --- /dev/null +++ b/Documentation/devicetree/bindings/input/pixart,paj7620.yaml @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org +$schema: http://devicetree.org + +title: PixArt PAJ7620 Gesture Sensor + +maintainers: + - Harpreet Saini + +description: | + The PixArt PAJ7620 is a gesture recognition sensor with an integrated + infrared LED and CMOS array. It communicates over an I2C interface and + provides gesture data via a dedicated interrupt pin. + +properties: + compatible: + const: pixart,paj7620 + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + vdd-supply: + description: Main power supply. + + vbus-supply: + description: I/O and I2C bus power supply. + + vled-supply: + description: Power for the integrated IR LED. + + # Added per reviewer request for completeness + gpio-controller: true + + "#gpio-cells": + const: 2 + +required: + - compatible + - reg + - interrupts + - vdd-supply + - vbus-supply + - vled-supply + +additionalProperties: false + +examples: + - | + #include + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + gesture@73 { + compatible =3D "pixart,paj7620"; + reg =3D <0x73>; + interrupt-parent =3D <&gpio>; + interrupts =3D <4 IRQ_TYPE_EDGE_FALLING>; + vdd-supply =3D <®_3v3>; + vbus-supply =3D <®_1v8>; + vled-supply =3D <®_3v3>; + gpio-controller; + #gpio-cells =3D <2>; + }; + }; diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Docum= entation/devicetree/bindings/vendor-prefixes.yaml index ee7fd3cfe203..d73a0bf62b62 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -1273,6 +1273,8 @@ patternProperties: description: Pine64 "^pineriver,.*": description: Shenzhen PineRiver Designs Co., Ltd. + "^pixart,.*": + description: PixArt Imaging Inc. "^pixcir,.*": description: PIXCIR MICROELECTRONICS Co., Ltd "^plantower,.*": --=20 2.43.0 From nobody Sat Jun 20 09:28:25 2026 Received: from sonic312-25.consmr.mail.gq1.yahoo.com (sonic312-25.consmr.mail.gq1.yahoo.com [98.137.69.206]) (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 91AD92DFA3A for ; Fri, 17 Apr 2026 05:46:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=98.137.69.206 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776404807; cv=none; b=ucA3KvGGe96kekHIANdTFrXFc65Tpdu+PM5eddiEm8kWa87i2zYwlFBldkVdWGe9kOUWWk3g9PDZbZ2tjEDiO7XDNwqrylCqSxCtKsPkOblUHfgeTRRLF3jys8Yor1ft55zc9zdE2FxdB0mrKOnMXd1l3YRnuKqEkIAf3J+z+Lg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776404807; c=relaxed/simple; bh=k2frjHOxLYnqUc+JwEo9/mX2lBoayK0/kTT+3HzJMyU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rKjwQhj6npgM+3StvF5b2We0r9yUM9+bsscz8S/pl40uh66S2vN6iH3LttbFs+I6PUmTSoZRx4/QiikvRyL5KL5w/oUcdjb+y2hDcq74b8iyU21sX8scgFeDG5C0OXt5Ok9beBltD9L/w/DoQLPsPn4sGuizVfZLYC2q8zvoT/8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com; spf=pass smtp.mailfrom=yahoo.com; dkim=pass (2048-bit key) header.d=yahoo.com header.i=@yahoo.com header.b=VU/EPf89; arc=none smtp.client-ip=98.137.69.206 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=yahoo.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=yahoo.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=yahoo.com header.i=@yahoo.com header.b="VU/EPf89" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1776404799; bh=wExSW9EgWKsvnWWgtDmagUrH5VnNEv3N8LLMKs0+BqI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=VU/EPf89a6yZ/KcPBK6xYbGAcRhXrMVjHPClFmOukfbeFgKrVZhxjjxqv67P2AEYQ8mklzcV+eZOrs6ZbmdyppwFQGpdfaWdquA5MUolzxLjJHY5dJz+h13Zp0sxtWxyCjvudSglj95lCiUNoC15vHouEVpeb7d+6+Z7LJLiidadefUOJytUhwpYgMxn1GMyNaR0gxws6D1K7do3sZeGFrT563qAtYh9qYQjYMyzhPbB9iHF/mRc5jXL6LNB1LtxWKshUwalaf0+x6nhnrimZi2t1ZSxT4ZSj1pQDPHBfo8xn7/RAHh9t7l1/YMj814vTVp3OK+nXJVzED+MB9F43Q== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1776404799; bh=+KVmceZMlbvDDJGdXjvMGvTy8PhyZo+xfi6phAot4Ql=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=M8nxokMqOAb9Z8uuAgvHrrd977vtFgLrk7sQmA+/LlqFuKQg+r49pljKk1VQQjwp/IXzVmTZO1o2VmhQeGeQM3Qfkn3YGdcIVZJLrn4Iv+FGGZTXIGIAOlGM8FH9vE358gpDAC1XjtmaBZ9XHip6wYsEsn9ZyTWCBoO1RrC/iejwHOD5TEucr+pqL10+FgVnt26ny6u5CRK0xgxCFjaiD7sorfE4LwSPhb2SXRwVMYUbliw5NU4BQESSiUfC6rH9iXay+sxUBvEup/Ov5qQ7MZrlx09PEgSxmCje8DtwVUCLbQ/dCHw7IuepRc2I2L8a1y5I6aq7ZVxWcC03IA1PYw== X-YMail-OSG: KAAe8X0VM1mE0NXQCvlHQYXo.HLwl9H_oeyOuyfPGW1nO6whKLFIjcdZPulB686 VZLPRT0vWsMorhtfUt5AKrh4XZQsmddHfFkJrltnb0ng2WvBSFc3DfwmNU7qK7U581EGjLDKqLC1 Wip8Zx5pQHUxP4WTPCRzc6qNp3i2gL8WPIlIHvr1Tic0Fi7KX37q1co6z7pHZ2LJEKhKSQpF6PfF 7TQYOWyl0wDv9hEalJRJuNLjCaK8F8KsFMKDtymLbgaNhauKC_YXGlQLDcBw975.TCykrGzxVbXw a_GFonhFDVr.gpO.usTQh67YWpjMQnX4unwLfFG0yoH7CUBHgkjt7pbnB5JOfYV5w1LuQWmDPMAL oySr3TPPjPjn.gKRqoQmDCR6Ph0Q0kKI7j.dkb9NP1HsNn2XXYnQD7wFXHoukeMkLsHSsxl8EDeJ yCuHB5__79BrWbe9DsxdCnIeSjxzdP52DaXuviBQBz_AigN2yucoHvUm_yUWNY.PhifxppRr3m8H t_droHn4I5td9eYJEL3lA5JOQHh7XMrZ0Ds9b2RQuB2WGH.gaUX16OH3r50tn6kSd3sHXDMnddwy A4aOxVNdvImP4zTAe2NqZ7YCwIXosd99Nsn74iextImttJ8bAIAl.Zrq_wKXfVt6YaN9JF6oDAih ZGa.6kAEPY.9GP5nn9wsgRlPzCMNb17aNWTLQST3L._V_FtPEgulCQkYkpEy9LfndYxM8c25e0w3 W5SE6AX8jcoQH5io_kHeECdA24gs90Q0yAdSsFB4x84vTFwqAbdN4KlYxQLGfHxXgCKYoObdCDwj 71eRXG6uESvnew6bVeIE38eA1qYydq0Q0MrYnsuJUZ_rRp2hj8vLmdwjY_OEwVI5yeLGyvBKl5h0 NeI_rKou8RKVRoKAnOrWfIlO9X0PIsWAUJzx4gxhNOXRIhfJXZmpPBLlhxCb8VgiNlf5Iv3pXym2 CmdfHqEFDuDtCpawlMEf7jNQBocFsuhpftufnBzRQZ7tQpBPr5tPV2B3ghdz.NLZ7Ndbfk1uYfdC btgj.xxpdUepng0xChob0WTkA2MSutd71paMXMQBOk3_.FnQPI3nuJ13RDiRu7n2aPOw4TRokq6L CEhxc4.ItYZ7lpo3vouF1bXQSYhYP9LTqBbKQNzedoChqTZcXagdfBr4YpXVJk_QcXqPfW.les.v irgeeSPRVkZ89j_gRrRHcGZF5rRoxNTOmEPdzLZxPPULJy7ML__Rdb5bi1JFCWiVrIlySH241PFd iJm7k5whYW43qlFcLjASndEwqrMwgw0mZEHLsb96tn3b34hKX3wwqx0w1HQSKaVLBa.NEY67GBmV P8OlGArG6WWdFA.Lqkod1B0GjfMTSr_KAEKOkWkwGDNf6mLmLvjyKcbVI5dZ.VRH3wVkK6ugOJaM UbLb6USz4kSXM9L_..gj5Bk6HEmeTbq4KIRmpBE0q8Y7nsWGNdDcNnN79KIA_5VzF6ep4ngJtnYS Uq50ZKN3HXuRZ1FixhTPYS_ZWmBlwIXRwS4x3ez2eD8I0k1cZnyCrUXSlkIDCxhB0WlUdEb2qFQ4 RUaBEzHHD09YLxc_NrlcUw.2TFoDvJf59xxbELGjTfVTampEELQVJRvRzvqZPnbGbfA5we7x7bp0 EUoXd5V0jHq0BfLqgzE7bvePZne0PUhnyliUtseTrqsSi7eRjhapz5TlUtOW3kwcpyIkKtQy92ys OqXAfYwG8vd7cFDhAy0bgMPvzJr1FZUOBksrSErBJET1XhzGy5t10YRO1EA2rCKxDlnv.lYUe4Hh 3SMuAFoPec3JnO1FSATjrYJp1u8tJEcFM5MR5ojzdFd7POsyrFpyMPXaomqlDBj2n1HaE6GeqQZs PbOpmbgfcajc1cS16oC3OPZOOcxfEaxiFGCt9TY7bgEUNYva4bi4k_9DsgstOMtoBmWZ6ZB378ch u22Fka4FExzdUtosUDU8vDuEixGtMx0956v.9X_fv_oihbzW6DO4DVqa23aXJXZDq1e.I_.HnvLS LFLB4HyxWIGBlg8wUH8t.YVHj6qVX72M3qxF4KePNhpa5nYViaO1T5G6vtd6LkG0sXTqxyH8KQ0_ QAC0eVUwMDr2lO1riexvw26o_u2i7O7_TzPAt.ctOqHyH5LxSinUU3pxwzUpoxylhWeDjWmL32Uq CDUoS9ljU3ixuuUKCjd6.HV_6qoSTWlIs8LXiuC3UKH7Hfb9SBTGRw3AsqEbKhYpF5.ilDCbsSbu C5eklx3n2mdGJvwMAqqPx9rd_d3.CTWZtwYTdIXPYT9054W76OJnSESGyGVsPPEUqijUeFz2fM5t zsbxXqJY- X-Sonic-MF: X-Sonic-ID: 352db566-56dd-4450-a521-8e62e487c8a2 Received: from sonic.gate.mail.ne1.yahoo.com by sonic312.consmr.mail.gq1.yahoo.com with HTTP; Fri, 17 Apr 2026 05:46:39 +0000 Received: by hermes--production-bf1-697f88457-t7j8c (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 3c2bb0bd53f21136eb796b7edd82f0f5; Fri, 17 Apr 2026 05:25:56 +0000 (UTC) From: Harpreet Saini To: Dmitry Torokhov , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: David Lechner , Harpreet Saini , devicetree@vger.kernel.org, linux-input@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] input: misc: Add PixArt PAJ7620 gesture sensor driver Date: Fri, 17 Apr 2026 01:25:27 -0400 Message-ID: <20260417052527.62535-3-sainiharpreet29@yahoo.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260417052527.62535-1-sainiharpreet29@yahoo.com> References: <20260417052527.62535-1-sainiharpreet29@yahoo.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This driver adds support for the PixArt PAJ7620 gesture sensor. It implements hand gesture recognition (up, down, left, right, etc.) and reports them as standard input key events. The driver includes power management support via Runtime PM. Signed-off-by: Harpreet Saini --- drivers/input/misc/Kconfig | 12 ++ drivers/input/misc/Makefile | 1 + drivers/input/misc/paj7620.c | 350 +++++++++++++++++++++++++++++++++++ 3 files changed, 363 insertions(+) create mode 100644 drivers/input/misc/paj7620.c diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 94a753fcb64f..de4206c297f2 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -453,6 +453,18 @@ config INPUT_KXTJ9 To compile this driver as a module, choose M here: the module will be called kxtj9. =20 +config INPUT_PAJ7620 + tristate "PixArt PAJ7620 Gesture Sensor" + depends on I2C + select REGMAP_I2C + help + Say Y here if you want to support the PixArt PAJ7620 gesture + sensor. This sensor supports 9 hand gestures and communicates + over the I2C bus. + + To compile this driver as a module, choose M here: the + module will be called paj7620. + config INPUT_POWERMATE tristate "Griffin PowerMate and Contour Jog support" depends on USB_ARCH_HAS_HCD diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index 415fc4e2918b..dec8b8d0cdf4 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -67,6 +67,7 @@ obj-$(CONFIG_INPUT_PF1550_ONKEY) +=3D pf1550-onkey.o obj-$(CONFIG_INPUT_PM8941_PWRKEY) +=3D pm8941-pwrkey.o obj-$(CONFIG_INPUT_PM8XXX_VIBRATOR) +=3D pm8xxx-vibrator.o obj-$(CONFIG_INPUT_PMIC8XXX_PWRKEY) +=3D pmic8xxx-pwrkey.o +obj-$(CONFIG_INPUT_PAJ7620) +=3D paj7620.o obj-$(CONFIG_INPUT_POWERMATE) +=3D powermate.o obj-$(CONFIG_INPUT_PWM_BEEPER) +=3D pwm-beeper.o obj-$(CONFIG_INPUT_PWM_VIBRA) +=3D pwm-vibra.o diff --git a/drivers/input/misc/paj7620.c b/drivers/input/misc/paj7620.c new file mode 100644 index 000000000000..632a77ce4085 --- /dev/null +++ b/drivers/input/misc/paj7620.c @@ -0,0 +1,350 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * PixArt PAJ7620 Gesture Sensor - Input driver + * + * Copyright (C) 2026 Harpreet Saini + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Registers */ +#define PAJ7620_REG_BANK_SEL 0xEF +#define PAJ7620_REG_GES_RESULT1 0x43 +#define PAJ7620_REG_GES_RESULT2 0x44 +#define PAJ7620_REG_SLEEP_BANK0 0x65 +#define PAJ7620_REG_SLEEP_BANK1 0x05 +#define PAJ7620_REG_AUTO_STANDBY 0x073 + +/* Gesture bits */ +#define PAJ_UP BIT(0) +#define PAJ_DOWN BIT(1) +#define PAJ_LEFT BIT(2) +#define PAJ_RIGHT BIT(3) +#define PAJ_FORWARD BIT(4) +#define PAJ_BACKWARD BIT(5) +#define PAJ_CLOCKWISE BIT(6) +#define PAJ_ANTICLOCK BIT(7) +#define PAJ_WAVE BIT(8) + +struct paj7620_data { + struct i2c_client *client; + struct regmap *regmap; + struct input_dev *idev; + struct regulator_bulk_data supplies[3]; +}; + +/* + * The following arrays contain undocumented register sequences required to + * initialize the sensor's internal DSP and gesture engine. + * These were derived from vendor reference code and verified via testing. + */ +static const struct reg_sequence Init_Register[] =3D { + { 0xEF, 0x00 }, { 0x37, 0x07 }, { 0x38, 0x17 }, { 0x39, 0x06 }, + { 0x41, 0x00 }, { 0x42, 0x00 }, { 0x46, 0x2D }, { 0x47, 0x0F }, + { 0x48, 0x3C }, { 0x49, 0x00 }, { 0x4A, 0x1E }, { 0x4C, 0x20 }, + { 0x51, 0x10 }, { 0x5E, 0x10 }, { 0x60, 0x27 }, { 0x80, 0x42 }, + { 0x81, 0x44 }, { 0x82, 0x04 }, { 0x8B, 0x01 }, { 0x90, 0x06 }, + { 0x95, 0x0A }, { 0x96, 0x0C }, { 0x97, 0x05 }, { 0x9A, 0x14 }, + { 0x9C, 0x3F }, { 0xA5, 0x19 }, { 0xCC, 0x19 }, { 0xCD, 0x0B }, + { 0xCE, 0x13 }, { 0xCF, 0x64 }, { 0xD0, 0x21 }, { 0xEF, 0x01 }, + { 0x02, 0x0F }, { 0x03, 0x10 }, { 0x04, 0x02 }, { 0x25, 0x01 }, + { 0x27, 0x39 }, { 0x28, 0x7F }, { 0x29, 0x08 }, { 0x3E, 0xFF }, + { 0x5E, 0x3D }, { 0x65, 0x96 }, { 0x67, 0x97 }, { 0x69, 0xCD }, + { 0x6A, 0x01 }, { 0x6D, 0x2C }, { 0x6E, 0x01 }, { 0x72, 0x01 }, + { 0x73, 0x35 }, { 0x74, 0x00 }, { 0x77, 0x01 }, +}; + +/* + * Specific configuration overrides required to enable the internal + * 8-gesture state machine. + */ +static const struct reg_sequence Init_Gesture_Array[] =3D { + { 0xEF, 0x00 }, { 0x41, 0x00 }, { 0x42, 0x00 }, { 0xEF, 0x00 }, + { 0x48, 0x3C }, { 0x49, 0x00 }, { 0x51, 0x10 }, { 0x83, 0x20 }, + { 0x9F, 0xF9 }, { 0xEF, 0x01 }, { 0x01, 0x1E }, { 0x02, 0x0F }, + { 0x03, 0x10 }, { 0x04, 0x02 }, { 0x41, 0x40 }, { 0x43, 0x30 }, + { 0x65, 0x96 }, { 0x66, 0x00 }, { 0x67, 0x97 }, { 0x68, 0x01 }, + { 0x69, 0xCD }, { 0x6A, 0x01 }, { 0x6B, 0xB0 }, { 0x6C, 0x04 }, + { 0x6D, 0x2C }, { 0x6E, 0x01 }, { 0x74, 0x00 }, { 0xEF, 0x00 }, + { 0x41, 0xFF }, { 0x42, 0x01 }, +}; + +static void paj7620_report_keys(struct input_dev *idev, int gesture) +{ + static const struct { int bit; int key; } map[] =3D { + { PAJ_UP, KEY_UP }, + { PAJ_DOWN, KEY_DOWN }, + { PAJ_LEFT, KEY_LEFT }, + { PAJ_RIGHT, KEY_RIGHT }, + { PAJ_FORWARD, KEY_ENTER }, + { PAJ_BACKWARD, KEY_BACK }, + { PAJ_CLOCKWISE, KEY_NEXT }, + { PAJ_ANTICLOCK, KEY_PREVIOUS }, + { PAJ_WAVE, KEY_MENU }, + }; + // gesture mode does not support key hold, so pulse event + for (int i =3D 0; i < ARRAY_SIZE(map); i++) { + if (gesture & map[i].bit) { + input_report_key(idev, map[i].key, 1); + input_sync(idev); + input_report_key(idev, map[i].key, 0); + input_sync(idev); + } + } +} + +static irqreturn_t paj7620_irq_thread(int irq, void *ptr) +{ + struct paj7620_data *data =3D ptr; + unsigned int g1, g2; + int ret; + + /* 2. RUNTIME PM: Force awake to read registers */ + pm_runtime_get_sync(&data->client->dev); + + regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0); + ret =3D regmap_read(data->regmap, PAJ7620_REG_GES_RESULT1, &g1); + ret |=3D regmap_read(data->regmap, PAJ7620_REG_GES_RESULT2, &g2); + + if (!ret && (g1 || g2)) + paj7620_report_keys(data->idev, (g2 << 8) | g1); + + pm_runtime_mark_last_busy(&data->client->dev); + pm_runtime_put_autosuspend(&data->client->dev); + + return IRQ_HANDLED; +} + +static int paj7620_init(struct paj7620_data *data) +{ + int state =3D 0, ret, i; + + /* 1. Wake-up sequence: Read register 0x00 until it returns 0x20 */ + for (i =3D 0; i < 10; i++) { + ret =3D regmap_read(data->regmap, 0x00, &state); + if (ret >=3D 0 && state =3D=3D 0x20) + break; + usleep_range(1000, 2000); + } + + if (state !=3D 0x20) { + dev_err(&data->client->dev, "Sensor wake-up failed (0x%02x)\n", state); + return -ENODEV; + } + + /* 2. Blast full register array into PAJ7620 instantly */ + ret =3D regmap_multi_reg_write(data->regmap, Init_Register, + ARRAY_SIZE(Init_Register)); + if (ret < 0) { + dev_err(&data->client->dev, "Multi-reg write failed (%d)\n", ret); + return ret; + } + + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x00); + if (ret < 0) + return ret; + + ret =3D regmap_multi_reg_write(data->regmap, Init_Gesture_Array, + ARRAY_SIZE(Init_Gesture_Array)); + if (ret < 0) { + dev_err(&data->client->dev, "Multi-reg write failed (%d)\n", ret); + return ret; + } + + dev_info(&data->client->dev, "Gesture Sensor Registers Initialized\n"); + return 0; +} + +static int paj7620_power_down(struct paj7620_data *data) +{ + int ret; + /* Deep sleep sequence */ + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x00); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_SLEEP_BANK0, 0x01); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x01); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_SLEEP_BANK1, 0x01); + if (ret) + return ret; + + return 0; +} + +static int paj7620_runtime_suspend(struct device *dev) +{ + int ret; + struct paj7620_data *data =3D dev_get_drvdata(dev); + + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x01); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_AUTO_STANDBY, 0x30); + if (ret) + return ret; + + return 0; +} + +static int paj7620_runtime_resume(struct device *dev) +{ + int ret; + struct paj7620_data *data =3D dev_get_drvdata(dev); + + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x01); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_AUTO_STANDBY, 0x00); + if (ret) + return ret; + + ret =3D regmap_write(data->regmap, PAJ7620_REG_BANK_SEL, 0x00); + if (ret) + return ret; + + usleep_range(1000, 2000); // Stabilization delay (1ms minimum) + return 0; +} + +static const struct dev_pm_ops paj7620_pm_ops =3D { + SET_RUNTIME_PM_OPS(paj7620_runtime_suspend, paj7620_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume) +}; + +static const struct regmap_config paj7620_reg_config =3D { + .reg_bits =3D 8, .val_bits =3D 8, .max_register =3D 0xEF, +}; + +static int paj7620_probe(struct i2c_client *client) +{ + struct paj7620_data *data; + int ret; + + data =3D devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->client =3D client; + i2c_set_clientdata(client, data); + + data->supplies[0].supply =3D "vdd"; + data->supplies[1].supply =3D "vbus"; + data->supplies[2].supply =3D "vled"; + + ret =3D devm_regulator_bulk_get(&client->dev, ARRAY_SIZE(data->supplies),= data->supplies); + if (ret) + return dev_err_probe(&client->dev, ret, "Failed to get regulators\n"); + + ret =3D regulator_bulk_enable(ARRAY_SIZE(data->supplies), data->supplies); + if (ret) + return ret; + + data->regmap =3D devm_regmap_init_i2c(client, &paj7620_reg_config); + if (IS_ERR(data->regmap)) + return PTR_ERR(data->regmap); + + ret =3D paj7620_init(data); + if (ret) + goto err_reg; + + data->idev =3D devm_input_allocate_device(&client->dev); + if (!data->idev) { + ret =3D -ENOMEM; goto err_reg; + } + + data->idev->name =3D "PAJ7620 Gesture Sensor"; + data->idev->id.bustype =3D BUS_I2C; + + input_set_capability(data->idev, EV_KEY, KEY_UP); + input_set_capability(data->idev, EV_KEY, KEY_DOWN); + input_set_capability(data->idev, EV_KEY, KEY_LEFT); + input_set_capability(data->idev, EV_KEY, KEY_RIGHT); + input_set_capability(data->idev, EV_KEY, KEY_ENTER); + input_set_capability(data->idev, EV_KEY, KEY_BACK); + input_set_capability(data->idev, EV_KEY, KEY_NEXT); + input_set_capability(data->idev, EV_KEY, KEY_PREVIOUS); + input_set_capability(data->idev, EV_KEY, KEY_MENU); + + ret =3D input_register_device(data->idev); + if (ret) + goto err_reg; + + pm_runtime_set_active(&client->dev); + pm_runtime_enable(&client->dev); + pm_runtime_set_autosuspend_delay(&client->dev, 2000); + pm_runtime_use_autosuspend(&client->dev); + + ret =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, + paj7620_irq_thread, IRQF_ONESHOT, + "paj7620", data); + if (ret) + goto err_reg; + + dev_info(&client->dev, "Gesture Sensor Initialized\n"); + return 0; + +err_reg: + dev_err_probe(&client->dev, ret, "%s: failed with error %d\n", __func__, = ret); + if (pm_runtime_enabled(&client->dev)) { + pm_runtime_disable(&client->dev); + pm_runtime_dont_use_autosuspend(&client->dev); + } + regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies); + return ret; +} + +static void paj7620_remove(struct i2c_client *client) +{ + int ret; + struct paj7620_data *data =3D i2c_get_clientdata(client); + + pm_runtime_get_sync(&client->dev); + pm_runtime_disable(&client->dev); + pm_runtime_dont_use_autosuspend(&client->dev); + pm_runtime_put_noidle(&client->dev); + + ret =3D paj7620_power_down(data); + if (ret) + dev_err(&data->client->dev, "Sensor power down failed\n"); + + ret =3D regulator_bulk_disable(ARRAY_SIZE(data->supplies), data->supplies= ); + if (ret) + dev_err(&data->client->dev, "Sensor regulator disable failed\n"); +} + +static const struct of_device_id paj7620_of_match[] =3D { + { .compatible =3D "pixart,paj7620" }, + { } +}; +MODULE_DEVICE_TABLE(of, paj7620_of_match); + +static struct i2c_driver paj7620_driver =3D { + .driver =3D { + .name =3D "paj7620", + .of_match_table =3D paj7620_of_match, + .pm =3D &paj7620_pm_ops, + }, + .probe =3D paj7620_probe, + .remove =3D paj7620_remove, +}; +module_i2c_driver(paj7620_driver); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Harpreet Saini"); +MODULE_DESCRIPTION("PAJ7620 Gesture Input Driver"); --=20 2.43.0