From patchwork Fri Mar 14 09:01:59 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?b?THUgVGFuZyAo5rGk55KQKQ==?= X-Patchwork-Id: 14016501 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A7448C282EC for ; Fri, 14 Mar 2025 09:06:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version: Content-Transfer-Encoding:Content-Type:In-Reply-To:References:Message-ID:Date :Subject:CC:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=hvYJNqnssyfAcGWx2DWYO9amUoI59R31CM/9En2uaOk=; b=UdpEue0so44/w/So59liUW9IlR cA+GKM44BNy6cbOkC+xRUJchTPDV6T0sRTo0acqXuokMHzCbUxOXWmWQWZTuBw7YLWTwKhG7cbkTH wkXXnpQSeQDVxOYl/gcQOuMwibOL6MZNNrQMlU1e3co45Qv9ZPMFqr1ZF/MXbNxommjD34KU/enfM q+B3CVSHNN03sVLz5zDwvU9EL1iPc6iWy2KDKZL0VzpJqjqAIefriXAj8i/ZPGhrmYgVJRVQTu43i p13QHvIkaj+YHWZ9zLCxk7Qc+JKZlduUeHYcN916lnO5mPVtnWI/yMc8oUfhiBiYG7kYIQwd05588 KvSqs0ug==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tt0zv-0000000Dc9u-2V9a; Fri, 14 Mar 2025 09:06:31 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tt0vi-0000000DbMz-1OM7; Fri, 14 Mar 2025 09:02:12 +0000 X-UUID: 005981f200b311f0a1e849db4cc18d44-20250314 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=MIME-Version:Content-Transfer-Encoding:Content-Type:In-Reply-To:References:Message-ID:Date:Subject:CC:To:From; bh=hvYJNqnssyfAcGWx2DWYO9amUoI59R31CM/9En2uaOk=; b=WQtCJup9dM57Cx88v9/WwvKgxjHBuxo32BVFsjqq5GvpRXMxhba1eJKR1UzgHfLZlJlrSfFmQ4gcLatA6fHfMPOTULoUTRNlybmRU8Z8PChU4n5VF2WF5iinUKkEDxYYnLH1+3osi5NCNOY4aGCeBp3V9M8W/iYOXCaxQ4fI42Y=; X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.2.1,REQID:539c8566-12a5-4d1f-a9a1-efcc538eec58,IP:0,UR L:0,TC:0,Content:0,EDM:0,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION:r elease,TS:0 X-CID-META: VersionHash:0ef645f,CLOUDID:19345f8c-f5b8-47d5-8cf3-b68fe7530c9a,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:80|81|82|83|102,TC:nil,Content:0|52, EDM:-3,IP:nil,URL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OS A:0,AV:0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 1,FCT|NGT X-CID-BAS: 1,FCT|NGT,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-UUID: 005981f200b311f0a1e849db4cc18d44-20250314 Received: from mtkmbs13n1.mediatek.inc [(172.21.101.193)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1925829152; Fri, 14 Mar 2025 02:02:05 -0700 Received: from mtkmbs10n1.mediatek.inc (172.21.101.34) by mtkmbs13n2.mediatek.inc (172.21.101.108) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1258.28; Fri, 14 Mar 2025 17:02:02 +0800 Received: from HK2PR02CU002.outbound.protection.outlook.com (172.21.101.237) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server id 15.2.1258.28 via Frontend Transport; Fri, 14 Mar 2025 17:02:02 +0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KS4R2E8KRUrOUtKtY/6W+LSvqbqFEO6b7oBHdL2yeWYV2KmoIioE8/j3dc5/7rpU4pXODIP8ly145JsW+nXeCa3ArtteEihoo3IveDJ7QN8ZQEgx+6iEIZV004LEjDTlIPtgPwB/cDUgZEq5GlHhBy9y+deCNkQaGeLl80b2PlPTF7/uwkunxEj8hoRCdteM4R/+msTWpGqsggHhuso5Zrva8b1UCQNWRsC7E1vPM/l7CV+vtU+mUgD4/ETL+kiPXkn4v68lXKKQQ7+S6onYtQAg+xDKUinODdZ3GVJlScyf4bWTfNSSkyHN1bMuKO3nSJPhcBIyzICZFj4GVjxc3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=hvYJNqnssyfAcGWx2DWYO9amUoI59R31CM/9En2uaOk=; b=bKQWUnoEmW9i8FNuRoqtJuBV0GgwNwFRM44zvjMie+HFJjV1zq5UVK4J7OgIxjP60OhkSkw/jBT9RUSm7RgVHKZFJEMh3lZVH+PPvb+uIHwCG7I8djLVyfkBTox+QYayiCHm3n8WZepA4Z5djntFA/+Ln2ke2+BE5yDxNMYzH6zfxcYLMkqrko8Lz7iXFH7atsT8Br4Lz7PPH41y1ReBPweST2vIe+DWGpvUZZ5jKY7N4BlF6bhOH07QoYrZFBXLYzb+VTLaON20E9ZvMIa/o5chn80/K8SXWlLnfT2jGGLRSW2DB4YdOoS3lnpkzTgPSp0O82GoY5oaLTKo+DPq6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=mediatek.com; dmarc=pass action=none header.from=mediatek.com; dkim=pass header.d=mediatek.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mediateko365.onmicrosoft.com; s=selector2-mediateko365-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=hvYJNqnssyfAcGWx2DWYO9amUoI59R31CM/9En2uaOk=; b=IzElAviMiyVQQMkao9oM5vTZkEKI6avBVS8eIIYP4ITPi8WGZH+79TpWBe5S/3Esbnw/jqSjCBQnuMfYEsur7mIGW4SLEjIdHImJxmzfdbMJ9OJj2r9wtJ1Nox7YZxYOnT2eCGrW7cvq6eDi1mjvFcyAoEZtOgnNahnUvq0W0VA= Received: from SEZPR03MB6891.apcprd03.prod.outlook.com (2603:1096:101:a2::5) by SEYPR03MB7010.apcprd03.prod.outlook.com (2603:1096:101:b0::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8511.27; Fri, 14 Mar 2025 09:01:59 +0000 Received: from SEZPR03MB6891.apcprd03.prod.outlook.com ([fe80::579a:f8c2:b6e5:c2b9]) by SEZPR03MB6891.apcprd03.prod.outlook.com ([fe80::579a:f8c2:b6e5:c2b9%2]) with mapi id 15.20.8511.026; Fri, 14 Mar 2025 09:01:59 +0000 From: =?utf-8?b?THUgVGFuZyAo5rGk55KQKQ==?= To: =?utf-8?b?THUgVGFuZyAo5rGk55KQKQ==?= , "Jonathan Cameron" , Lars-Peter Clausen , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Dmitry Torokhov , Lee Jones , Matthias Brugger , "AngeloGioacchino Del Regno" , Sean Wang , Linus Walleij , "Liam Girdwood" , Mark Brown , Stephen Boyd , =?utf-8?b?Q2hlbiBaaG9uZyAo6ZKf6L6wKQ==?= , =?utf-8?b?U2VuIENodSAo5YKo5qOuKQ==?= CC: "linux-iio@vger.kernel.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "linux-input@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-mediatek@lists.infradead.org" , "linux-gpio@vger.kernel.org" , Project_Global_Chrome_Upstream_Group Subject: =?utf-8?b?5Zue5aSNOiBbUEFUQ0ggMy81XSBwbWljOiBtZWRpYXRlazogQWRkIHNw?= =?utf-8?b?bWkgcG1pYyBtZmQgZHJpdmVy?= Thread-Topic: [PATCH 3/5] pmic: mediatek: Add spmi pmic mfd driver Thread-Index: AQHblLaQJASsk9FGI0OYvDYXjljq/bNyVgKQ Date: Fri, 14 Mar 2025 09:01:59 +0000 Message-ID: References: <20250314073307.25092-1-Lu.Tang@mediatek.com> <20250314073307.25092-4-Lu.Tang@mediatek.com> In-Reply-To: <20250314073307.25092-4-Lu.Tang@mediatek.com> Accept-Language: zh-CN, en-US Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-dg-ref: PG1ldGE+PGF0IG5tPSJib2R5LnR4dCIgcD0iYzpcdXNlcnNcbXRrMjQ5NjdcYXBwZGF0YVxyb2FtaW5nXDA5ZDg0OWI2LTMyZDMtNGE0MC04NWVlLTZiODRiYTI5ZTM1Ylxtc2dzXG1zZy1mYTk1NmY1My0wMGIyLTExZjAtYTlmNy1kOGJiYzEyN2VkNjJcYW1lLXRlc3RcZmE5NTZmNTUtMDBiMi0xMWYwLWE5ZjctZDhiYmMxMjdlZDYyYm9keS50eHQiIHN6PSI4MTQwOCIgdD0iMTMzODY0MTY1MTcxNDQzNDA0IiBoPSJJV0k5eGZBL1gwd2ZpY21FKzB5K1hlbW0wVTQ9IiBpZD0iIiBibD0iMCIgYm89IjEiLz48L21ldGE+ x-dg-rorf: true authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=mediatek.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SEZPR03MB6891:EE_|SEYPR03MB7010:EE_ x-ms-office365-filtering-correlation-id: cf13c319-c340-495b-d772-08dd62d6e123 x-ld-processed: a7687ede-7a6b-4ef6-bace-642f677fbe31,ExtAddr x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|7416014|376014|366016|1800799024|921020|38070700018; x-microsoft-antispam-message-info: =?utf-8?q?U0+JgAsdoIOW5fRU1hq2Dlk4NVdC5Ls?= =?utf-8?q?gwXvtFRljdxp53SUJP+vF+laqzJW1RMdVqsQ6/Gc2z9JfpISJSnzUk3vkt0DkBNcO?= =?utf-8?q?3V24K797lkBSQX/9zD8q3BI2rJ6uYXoCBzQBrLDn5LcIPP6qPpFWun5A4pg/gvWOP?= =?utf-8?q?xSL34U2FkF3wmqCQS0YGuWzY/1OcywsKdcJHFZklnTjMLyXYrGEMgNcWiuHiZglm3?= =?utf-8?q?6WNAxAGT5LfmkJEIILG+E7miAmi4AoqH/qUlD9J5qXBwym6gGyTQeCtvqPJumCac0?= =?utf-8?q?Y+NDdCHoW1dIgo9+UDN20vLgLbb56WMgfI9V6kA+6vY3WtG0vJS99iRF3Gb3Gsnk1?= =?utf-8?q?laHejpbuNjfHaskr0TZer7ClRhYV6EWeZivXpGjc44loC0FC5bhFowauq+X7H9wRL?= =?utf-8?q?l0GA0GGetQz8Tw4PKwHGM0wHZ8/rDfJ3YCRs92pe4PPG/kVQa8nMJQ2OHeozj/D5j?= =?utf-8?q?xLC0FANKPVekkslvqILar3RTfvrMnOy59vyAzJZ9sHdc4mokW2IDTZ889O1V6LPre?= =?utf-8?q?3Tt6l5ECib7NdrdS+kVo4TyMr2dXMzy+WENXoooG3XLQFGtCgoexSK9eIjj4428OE?= =?utf-8?q?6HBR6kTElL7O1soSNJqRzAP7m3nmhdnRlknUn5UC1ykrhUir5AeLJMyFqeJpAsJC/?= =?utf-8?q?zeZDGPtlJlN7KVsUaHrS9YyD3mIw5AqYB1gXpaprnFKP/4Em38wY1oBF2al+EKBB+?= =?utf-8?q?fINZ7RbWLsfYZm1Tvw6NkmI3VgoFeHtlkcXFkwo7rLjZbXsdw25i5FKVN44fAT3DU?= =?utf-8?q?CtryxoQGefTcLoeg5LFfEJPhQVHIk98pzZgn9/jJwdajVJouW6Xc+F35YRaZQfHv0?= =?utf-8?q?LB7/z/c/cHpmC03iV/XTmjRus5a6gXoBbIPhkTx1xD4per+H83BlaW2sOfnGAvKGF?= =?utf-8?q?E7ZrBFD7FUwzFfT2wfrsVPpervWbK5tupola0BOO/li9/hyRd7jfLy7oqCIGHo1uV?= =?utf-8?q?OPV14iyJixgHvwxJWUWoeVuuoN17ONC2lYDmYLykWFl+XkQcxJfEf6eXtY5ufQako?= =?utf-8?q?ic2zl41+hl0pKaVvJvqcEGxKdkgdS2vkIWTeNx10IXrYGg6rT0Hk+Dg16XSyEgCT8?= =?utf-8?q?lguU9jLQ6890bpn8fF6EJd3qmXu7bmBYKOyQRPyggAyA4VhvQ08FiaFx+5j7QA7r9?= =?utf-8?q?TD2kjAI/5XIWNDV3RFLfs8F8cU09K/4pUJj9gewOvsA1064Xk/STvPQQRyRcpct6Z?= =?utf-8?q?uQOu188U9l9T1UE2lWiNyf6FPbSNoMh2X31x6b36q2TGyEc5zcnWrDB6gdw9nRGUc?= =?utf-8?q?9a91cfjcL5hPOFz+XACMwW3BZcv8dbhc7BUUJa+TxqIdPrVeWekJV1Qf8ryRIAQU+?= =?utf-8?q?xgHgbrBncSdVPceRJx7SgEbQr5sPohDo8aQg6ZcgVPTzBDuX5KPTFThfupUuFfor6?= =?utf-8?q?Si72hTnE4hz10Ks8TG2qM/KRtWbLHWwgg=3D=3D?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:zh-cn;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SEZPR03MB6891.apcprd03.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(366016)(1800799024)(921020)(38070700018);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?q?YAKnvlPuHz7oR+yMdSYuEfu0X5n7?= =?utf-8?q?v8/RP+oMwY0V9mSVvSE6cmYZfKRIMtmphhdwAMywmRVpDyotYEbqM5uIyEPOF26Cf?= =?utf-8?q?Ojke30LzrdJr6kKdBQmxxMz6oGn18BglC8Cfo6ZRUZ6gj5sRzV13XqNa+h7dr8dnM?= =?utf-8?q?bOuYBHRogMFXcgwyquweFOwShAj/1c0Xp8Spmsr+RhN80oArB0cUb0/kTX0wrK1LL?= =?utf-8?q?Ch7sCBp/g072nqe4tXnnX+KQB2RAEsdrHLMgDZ/QUIfGrcGFaFrKDJj1L8TB12Uyf?= =?utf-8?q?U3f18IBYg86DI/4OhQ0idoh0NTmPibtPMRmZFtncuExtITq5QAfbHueu/P2uOWaxA?= =?utf-8?q?2uQPKC+y9LYPs7C7pxcMJ1NH8B7qZRiZOEvngjIknao4u/FjIGppGgxd2c8CLxnjV?= =?utf-8?q?AEwiT+pyWoo6Ptx15vCf+17UVw4gD0b+3gJqhv2kLTG9OngnwlDr0sP9R/C2Xl+gQ?= =?utf-8?q?jQf4xHVNaVCZGqwXFgQx8oKudqmZA46RT7ff8pkX3cSx6xhJrn7S7tEj7g9y84MsG?= =?utf-8?q?PQxq176YKhx0bDV8+fz7GwgsE21WDbYi91zcGutqPsYvzSWvuDB0OzNLioxGGHSxe?= =?utf-8?q?DvaCKiGOZZSQsh2KQ2D4KQrXGmB2Do2C9eM3i3KHnYt3FikA5sZZy2LaxpusxP/bJ?= =?utf-8?q?TziN7izZ0oRqIr6ED1HUn8vtLA/7EjMtx5zCQVOC1uJbzzzzGbQeMIq/FKCi93rJL?= =?utf-8?q?59QUa7G1OPzG+gTNwzH72jC1Jyty0fzxRLWJM18wEbugO2B9CeA1be2mTFSzuLN3Q?= =?utf-8?q?U3RN02+cLsz5vLiB5eJiggu5XNVHGKFcuehJcPTCc3Cgbrls7NPx8bRm5feicPN19?= =?utf-8?q?IruGjaRdmr9FeFoP1gFewvMaJmlbeABkARnSi1NpyugGvzbux8xg3dhxrYIa1TX7G?= =?utf-8?q?u/dbftOazCurnmfkmArmgpVfNQGu1dvlHqw1MopDTxc0cs2PbxvG2jXmi+S08Eeb8?= =?utf-8?q?b0WsZcMDAjCwhX8oBRBYaHsdun9mPkyyOWS5mBZi5cAJPPB/k0XdvHXqSa2YZI3sX?= =?utf-8?q?jLym0sG0ovVYWWEdg7RnMPljW/lO0HbIIYIxacAEx0cK+dDYdoxOhQY2G26UaBMrl?= =?utf-8?q?SErciVwVT9Cb3SyXsVXOesni/kSXHz9HgmWxoVXpEUAUzRjtLzf5vquzip4PtyPFj?= =?utf-8?q?aJZ444LArMwWlFaeZG5vsKYybTszLEtLyQ4SKpY3f1wsHOjRVWNlpUOWX3YtbqYmd?= =?utf-8?q?qvMneUWEPjwtiB/uEmzMls78VdN1w5TipE1li7z9CcDQx05TdAJ4sdEGhZbDeGBW8?= =?utf-8?q?rT69U4724Wrzr3uKhaXtoXnBdDHXoBnLNjqJubyX+7B4qXy94p1QKoAJLSuAsR7+t?= =?utf-8?q?pzLU3BaL3y+Rro+06P/XhyhhnfUqmJOnCXrTuIol9pbbPL5SJtNrG7qPFQ+SW0vcj?= =?utf-8?q?RALSOSfA1ZHIlGymh1hpeU2zHFxo9D0rocFfklbE8AB0lKBvxUUNPOi5fpw7AHnKt?= =?utf-8?q?+LCSyHBV6nrZKTSH7UHwOr4a57INEbkIgBRMWCEh+oN3tPgqysOVnXtU=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SEZPR03MB6891.apcprd03.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: cf13c319-c340-495b-d772-08dd62d6e123 X-MS-Exchange-CrossTenant-originalarrivaltime: 14 Mar 2025 09:01:59.5948 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a7687ede-7a6b-4ef6-bace-642f677fbe31 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 09DQmJbPW9SnqU5e2qFGFyx/xOU7FIBM1XiZgYzm32/oORp4mLuNArDOd7Tu15BSMewArC7Vl5EpTefnc1XCmA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SEYPR03MB7010 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250314_020210_408269_364CFBCE X-CRM114-Status: UNSURE ( 9.25 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Update email address -----邮件原件----- 发件人: Lu.Tang 发送时间: 2025年3月14日 15:32 收件人: Jonathan Cameron ; Lars-Peter Clausen ; Rob Herring ; Krzysztof Kozlowski ; Conor Dooley ; Dmitry Torokhov ; Lee Jones ; Matthias Brugger ; AngeloGioacchino Del Regno ; Sean Wang ; Linus Walleij ; Liam Girdwood ; Mark Brown ; Stephen Boyd ; Chen Zhong (钟辰) ; Sen Chu 抄送: linux-iio@vger.kernel.org; devicetree@vger.kernel.org; linux-kernel@vger.kernel.org; linux-input@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-mediatek@lists.infradead.org; linux-gpio@vger.kernel.org; Project_Global_Chrome_Upstream_Group ; Lu Tang (汤璐) 主题: [PATCH 3/5] pmic: mediatek: Add spmi pmic mfd driver From: "Lu.Tang" Add spmi pmic mfd driver for mt8196 Signed-off-by: Lu Tang --- drivers/mfd/Kconfig | 26 ++ drivers/mfd/Makefile | 2 + drivers/mfd/mt6685-core.c | 83 +++++ drivers/mfd/mtk-spmi-pmic.c | 518 +++++++++++++++++++++++++++ include/linux/mfd/mt6363/core.h | 134 +++++++ include/linux/mfd/mt6363/registers.h | 168 +++++++++ include/linux/mfd/mt6373/core.h | 94 +++++ include/linux/mfd/mt6373/registers.h | 53 +++ 8 files changed, 1078 insertions(+) create mode 100644 drivers/mfd/mt6685-core.c create mode 100644 drivers/mfd/mtk-spmi-pmic.c create mode 100644 include/linux/mfd/mt6363/core.h create mode 100644 include/linux/mfd/mt6363/registers.h create mode 100644 include/linux/mfd/mt6373/core.h create mode 100644 include/linux/mfd/mt6373/registers.h -- 2.46.0 diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index d44c69bb3dfd..a62625566893 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1030,6 +1030,32 @@ config MFD_MT6397 accessing the device; additional drivers must be enabled in order to use the functionality of the device. +config MFD_MT6685 + tristate "MT6685 SPMI PMIC" + depends on OF + depends on SPMI + select REGMAP_SPMI + select REGMAP_IRQ + help + This enables support for the Mediatek SPMI PMICs. + These PMICs are currently used with the Mediatek series of + SoCs. Note, that this will only be useful paired with descriptions + of the independent functions as children nodes in the device tree. + +config MFD_MTK_SPMI_PMIC + tristate "Mediatek SPMI PMICs" + depends on OF + depends on SPMI + select REGMAP_SPMI + help + This enables support for the Mediatek SPMI PMICs. + These PMICs are currently used with the MT63xx series of + SoCs. Note, that this will only be useful paired with descriptions + of the independent functions as children nodes in the device tree. + + Say M here if you want to include support for the SPMI PMIC + series as a module. The module will be called "mtk-spmi-pmic". + config MFD_MENF21BMC tristate "MEN 14F021P00 Board Management Controller Support" depends on I2C diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index 9220eaf7cf12..b8cb34284e56 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -182,6 +182,8 @@ obj-$(CONFIG_MFD_MT6360) += mt6360-core.o obj-$(CONFIG_MFD_MT6370) += mt6370.o mt6397-objs := mt6397-core.o mt6397-irq.o mt6358-irq.o obj-$(CONFIG_MFD_MT6397) += mt6397.o +obj-$(CONFIG_MFD_MT6685) += mt6685-core.o +obj-$(CONFIG_MFD_MTK_SPMI_PMIC) += mtk-spmi-pmic.o pcf50633-objs := pcf50633-core.o pcf50633-irq.o obj-$(CONFIG_MFD_PCF50633) += pcf50633.o diff --git a/drivers/mfd/mt6685-core.c b/drivers/mfd/mt6685-core.c new file mode 100644 index 000000000000..c71008184666 --- /dev/null +++ b/drivers/mfd/mt6685-core.c @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2023 MediaTek Inc. + * + */ + +#include +#include +#include +#include +#include +#include + +static const struct mfd_cell mt6685_devs[] = { + { + .name = "mt6685-clkbuf", + .of_compatible = "mediatek,mt6685-clkbuf", + }, { + .name = "mt6685-tb-clkbuf", + .of_compatible = "mediatek,mt6685-tb-clkbuf", + }, { + .name = "mt6685-rtc", + .of_compatible = "mediatek,mt6685-rtc", + }, { + .name = "mt6685-audclk", + .of_compatible = "mediatek,mt6685-audclk", + }, { + .name = "mt6685-consys", + .of_compatible = "mediatek,mt6685-consys", + }, { + .name = "mt6685-gps", + .of_compatible = "mediatek,mt6685-gps", + } +}; + +static const struct regmap_config spmi_regmap_config = { + .reg_bits = 16, + .val_bits = 8, + .max_register = 0x2000, + .fast_io = true, + .use_single_read = true, + .use_single_write = true +}; + +static int mt6685_spmi_probe(struct spmi_device *sdev) { + int ret; + struct regmap *regmap; + + regmap = devm_regmap_init_spmi_ext(sdev, &spmi_regmap_config); + if (IS_ERR(regmap)) { + dev_err(&sdev->dev, "Failed to init mt6685 regmap: %ld\n", PTR_ERR(regmap)); + return PTR_ERR(regmap); + } + + ret = devm_mfd_add_devices(&sdev->dev, -1, mt6685_devs, + ARRAY_SIZE(mt6685_devs), NULL, 0, NULL); + if (ret) { + dev_err(&sdev->dev, "Failed to add child devices: %d\n", ret); + return ret; + } + + return 0; +} + +static const struct of_device_id mt6685_id_table[] = { + { .compatible = "mediatek,mt6685", }, + { } +}; +MODULE_DEVICE_TABLE(of, mt6685_id_table); + +static struct spmi_driver mt6685_spmi_driver = { + .probe = mt6685_spmi_probe, + .driver = { + .name = "mt6685", + .of_match_table = mt6685_id_table, + }, +}; +module_spmi_driver(mt6685_spmi_driver); + +MODULE_DESCRIPTION("Mediatek SPMI MT6685 Clock IC driver"); +MODULE_AUTHOR("Lu Tang "); MODULE_LICENSE("GPL"); diff --git a/drivers/mfd/mtk-spmi-pmic.c b/drivers/mfd/mtk-spmi-pmic.c new file mode 100644 index 000000000000..4c4bed5e991a --- /dev/null +++ b/drivers/mfd/mtk-spmi-pmic.c @@ -0,0 +1,518 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2024 MediaTek Inc. + */ + +#include +#include +#include +#include #include + #include +#include #include #include + #include #include + #include #include + +#define MTK_SPMI_PMIC_REG_WIDTH 8 +#define PMIC_SWCID 0xB +#define PMIC_MT6316_SWCID 0x20B +#define RCS_INT_DONE 0x41B + +struct irq_top_t { + int hwirq_base; + unsigned int num_int_regs; + unsigned int en_reg; + unsigned int en_reg_shift; + unsigned int sta_reg; + unsigned int sta_reg_shift; + unsigned int top_offset; +}; + +struct mtk_spmi_pmic_data { + const struct mfd_cell *cells; + int cell_size; + unsigned int num_top; + unsigned int num_pmic_irqs; + unsigned short top_int_status_reg; + struct irq_top_t *pmic_ints; + unsigned int cid_addr; +}; + +struct pmic_core { + struct device *dev; + struct spmi_device *sdev; + struct regmap *regmap; + u16 chip_id; + int irq; + bool *enable_hwirq; + bool *cache_hwirq; + struct mutex irqlock; + struct irq_domain *irq_domain; + const struct mtk_spmi_pmic_data *chip_data; }; + +static const struct resource mt6363_regulators_resources[] = { + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VCN15_OC, "VCN15"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VCN13_OC, "VCN13"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VRF09_OC, "VRF09"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VRF12_OC, "VRF12"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VRF13_OC, "VRF13"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VRF18_OC, "VRF18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VRFIO18_OC, "VRFIO18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VSRAM_MDFE_OC, "VSRAM_MDFE"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VTREF18_OC, "VTREF18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VSRAM_APU_OC, "VSRAM_APU"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VAUX18_OC, "VAUX18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VEMC_OC, "VEMC"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VUFS12_OC, "VUFS12"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VUFS18_OC, "VUFS18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VIO18_OC, "VIO18"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VIO075_OC, "VIO075"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VA12_1_OC, "VA12_1"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VA12_2_OC, "VA12_2"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VA15_OC, "VA15"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_VM18_OC, "VM18"), }; + +static const struct resource mt6363_keys_resources[] = { + DEFINE_RES_IRQ(MT6363_IRQ_PWRKEY), + DEFINE_RES_IRQ(MT6363_IRQ_HOMEKEY), + DEFINE_RES_IRQ(MT6363_IRQ_PWRKEY_R), + DEFINE_RES_IRQ(MT6363_IRQ_HOMEKEY_R), +}; + +static const struct resource mt6363_lvsys_notify_resources[] = { + /* MT6363 LVSYS interrupt name is contrary, + * we name LVSYS_R to MT6363_IRQ_NI_LVSYS_INT_FALLING; + * LVSYS_F to MT6363_IRQ_NI_LVSYS_INT_RISING + */ + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_NI_LVSYS_INT_FALLING, "LVSYS_R"), + DEFINE_RES_IRQ_NAMED(MT6363_IRQ_NI_LVSYS_INT_RISING, "LVSYS_F"), }; + +static const struct resource mt6373_regulators_resources[] = { + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VUSB_OC, "VUSB"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VAUX18_OC, "VAUX18"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VRF13_AIF_OC, "VRF13_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VRF18_AIF_OC, "VRF18_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VRFIO18_AIF_OC, "VRFIO18_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VCN33_1_OC, "VCN33_1"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VCN33_2_OC, "VCN33_2"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VCN33_3_OC, "VCN33_3"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VCN18IO_OC, "VCN18IO"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VRF09_AIF_OC, "VRF09_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VRF12_AIF_OC, "VRF12_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VANT18_OC, "VANT18"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VSRAM_DIGRF_AIF_OC, "VSRAM_DIGRF_AIF"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VEFUSE_OC, "VEFUSE"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VMCH_OC, "VMCH"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VMC_OC, "VMC"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VIBR_OC, "VIBR"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VIO28_OC, "VIO28"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VFP_OC, "VFP"), + DEFINE_RES_IRQ_NAMED(MT6373_IRQ_VTP_OC, "VTP"), }; + +static const struct mfd_cell mt6363_devs[] = { + { + .name = "mt6363-auxadc", + .of_compatible = "mediatek,mt6363-auxadc", + }, { + .name = "mtk-dynamic-loading-throttling", + .of_compatible = "mediatek,mt6363-dynamic_loading_throttling", + }, { + .name = "mt6363-efuse", + .of_compatible = "mediatek,mt6363-efuse", + }, { + .name = "mt6363-regulator", + .num_resources = ARRAY_SIZE(mt6363_regulators_resources), + .resources = mt6363_regulators_resources, + .of_compatible = "mediatek,mt6363-regulator", + }, { + .name = "mtk-pmic-keys", + .num_resources = ARRAY_SIZE(mt6363_keys_resources), + .resources = mt6363_keys_resources, + .of_compatible = "mediatek,mt6363-keys" + }, { + .name = "mt6363-consys", + .of_compatible = "mediatek,mt6363-consys", + }, { + .name = "mt6363-lvsys-notify", + .num_resources = ARRAY_SIZE(mt6363_lvsys_notify_resources), + .resources = mt6363_lvsys_notify_resources, + .of_compatible = "mediatek,mt6363-lvsys-notify", + }, { + .name = "mt6363-pinctrl", + .of_compatible = "mediatek,mt6363-pinctrl", + }, +}; + +static const struct mfd_cell mt6373_devs[] = { + { + .name = "mt6373-regulator", + .num_resources = ARRAY_SIZE(mt6373_regulators_resources), + .resources = mt6373_regulators_resources, + .of_compatible = "mediatek,mt6373-regulator", + }, { + .name = "mt6373-auxadc", + .of_compatible = "mediatek,mt6373-auxadc", + }, { + .name = "mt6373-efuse", + .of_compatible = "mediatek,mt6373-efuse", + }, { + .name = "mt6373-consys", + .of_compatible = "mediatek,mt6373-consys", + }, { + .name = "mt6373-pinctrl", + .of_compatible = "mediatek,mt6373-pinctrl", + }, +}; + +static struct irq_top_t mt6363_ints[] = { + MT6363_TOP_GEN(BUCK), + MT6363_TOP_GEN(LDO), + MT6363_TOP_GEN(PSC), + MT6363_TOP_GEN(MISC), + MT6363_TOP_GEN(HK), + MT6363_TOP_GEN(BM), +}; + + +static struct irq_top_t mt6373_ints[] = { + MT6373_TOP_GEN(BUCK), + MT6373_TOP_GEN(LDO), + MT6373_TOP_GEN(MISC), +}; + +static const struct mtk_spmi_pmic_data mt6316_data = { + .num_pmic_irqs = 0, + .cid_addr = PMIC_MT6316_SWCID, +}; + +static const struct mtk_spmi_pmic_data mt6363_data = { + .cells = mt6363_devs, + .cell_size = ARRAY_SIZE(mt6363_devs), + .num_top = ARRAY_SIZE(mt6363_ints), + .num_pmic_irqs = MT6363_IRQ_NR, + .top_int_status_reg = MT6363_TOP_INT_STATUS1, + .pmic_ints = mt6363_ints, +}; + +static const struct mtk_spmi_pmic_data mt6373_data = { + .cells = mt6373_devs, + .cell_size = ARRAY_SIZE(mt6373_devs), + .num_top = ARRAY_SIZE(mt6373_ints), + .num_pmic_irqs = MT6373_IRQ_NR, + .top_int_status_reg = MT6373_TOP_INT_STATUS1, + .pmic_ints = mt6373_ints, +}; + +static void mtk_spmi_pmic_irq_enable(struct irq_data *data) { + unsigned int hwirq = irqd_to_hwirq(data); + struct pmic_core *core = irq_data_get_irq_chip_data(data); + + core->enable_hwirq[hwirq] = true; +} + +static void mtk_spmi_pmic_irq_disable(struct irq_data *data) { + unsigned int hwirq = irqd_to_hwirq(data); + struct pmic_core *core = irq_data_get_irq_chip_data(data); + + core->enable_hwirq[hwirq] = false; +} + +static void mtk_spmi_pmic_irq_lock(struct irq_data *data) { + struct pmic_core *core = irq_data_get_irq_chip_data(data); + + mutex_lock(&core->irqlock); +} + +static void mtk_spmi_pmic_irq_sync_unlock(struct irq_data *data) { + unsigned int i, top_gp, gp_offset, en_reg, int_regs, shift; + struct irq_top_t *pmic_int; + struct pmic_core *core = irq_data_get_irq_chip_data(data); + const struct mtk_spmi_pmic_data *chip_data = core->chip_data; + + for (i = 0; i < chip_data->num_pmic_irqs; i++) { + if (core->enable_hwirq[i] == core->cache_hwirq[i]) + continue; + + /* Find out the IRQ group */ + top_gp = 0; + while ((top_gp + 1) < chip_data->num_top && + i >= chip_data->pmic_ints[top_gp + 1].hwirq_base) + top_gp++; + + pmic_int = &(chip_data->pmic_ints[top_gp]); + /* Find the IRQ registers */ + gp_offset = i - pmic_int->hwirq_base; + int_regs = gp_offset / MTK_SPMI_PMIC_REG_WIDTH; + shift = gp_offset % MTK_SPMI_PMIC_REG_WIDTH; + en_reg = pmic_int->en_reg + (pmic_int->en_reg_shift * int_regs); + + regmap_update_bits(core->regmap, en_reg, BIT(shift), + core->enable_hwirq[i] << shift); + core->cache_hwirq[i] = core->enable_hwirq[i]; + } + mutex_unlock(&core->irqlock); +} + +static struct irq_chip mtk_spmi_pmic_irq_chip = { + .name = "spmi-pmic-irq", + .flags = IRQCHIP_SKIP_SET_WAKE, + .irq_enable = mtk_spmi_pmic_irq_enable, + .irq_disable = mtk_spmi_pmic_irq_disable, + .irq_bus_lock = mtk_spmi_pmic_irq_lock, + .irq_bus_sync_unlock = mtk_spmi_pmic_irq_sync_unlock, }; + +static void mtk_spmi_pmic_irq_sp_handler(struct pmic_core *core, + unsigned int top_gp) +{ + unsigned int irq_status = 0, sta_reg, status; + unsigned int hwirq, virq; + int ret, i, j; + struct irq_top_t *pmic_int; + const struct mtk_spmi_pmic_data *chip_data = core->chip_data; + + for (i = 0; i < chip_data->pmic_ints[top_gp].num_int_regs; i++) { + pmic_int = &(chip_data->pmic_ints[top_gp]); + sta_reg = pmic_int->sta_reg + (pmic_int->sta_reg_shift * i); + + ret = regmap_read(core->regmap, sta_reg, &irq_status); + if (ret) { + dev_err(core->dev, + "Failed to read irq status: %d\n", ret); + return; + } + + if (!irq_status) + continue; + + status = irq_status; + do { + j = __ffs(status); + + hwirq = pmic_int->hwirq_base + MTK_SPMI_PMIC_REG_WIDTH * i + j; + + virq = irq_find_mapping(core->irq_domain, hwirq); + dev_info(core->dev, "[%x]Reg[0x%x]=0x%x,hwirq=%d\n", + core->chip_id, sta_reg, irq_status, hwirq); + if (virq) + handle_nested_irq(virq); + + status &= ~BIT(j); + } while (status); + + regmap_write(core->regmap, sta_reg, irq_status); + } +} + +static irqreturn_t mtk_spmi_pmic_irq_handler(int irq, void *data) { + int ret; + unsigned int bit, i, top_irq_status = 0; + struct pmic_core *core = data; + const struct mtk_spmi_pmic_data *chip_data = core->chip_data; + + ret = regmap_read(core->regmap, chip_data->top_int_status_reg, + &top_irq_status); + if (ret) { + dev_err(core->dev, + "Failed to read status from the device, ret=%d\n", ret); + return IRQ_NONE; + } + + dev_info(core->dev, "top_irq_sts:0x%x\n", top_irq_status); + for (i = 0; i < chip_data->num_top; i++) { + bit = BIT(chip_data->pmic_ints[i].top_offset); + if (top_irq_status & bit) + mtk_spmi_pmic_irq_sp_handler(core, i); + } + + ret = regmap_write(core->regmap, RCS_INT_DONE, 1); + if (ret) { + dev_err(core->dev, + "Failed to clear RCS flag, ret=%d\n", ret); + return IRQ_NONE; + } + + return IRQ_HANDLED; +} + +static int mtk_spmi_pmic_irq_domain_map(struct irq_domain *d, unsigned int irq, + irq_hw_number_t hw) +{ + struct pmic_core *core = d->host_data; + + irq_set_chip_data(irq, core); + irq_set_chip_and_handler(irq, &mtk_spmi_pmic_irq_chip, + handle_level_irq); + irq_set_nested_thread(irq, 1); + irq_set_noprobe(irq); + + return 0; +} + +static const struct irq_domain_ops pmic_irq_domain_ops = { + .map = mtk_spmi_pmic_irq_domain_map, + .xlate = irq_domain_xlate_twocell, +}; + +static int mtk_spmi_pmic_irq_init(struct pmic_core *core) { + int i, j, ret; + unsigned int en_reg, sta_reg; + const struct mtk_spmi_pmic_data *chip_data = core->chip_data; + + mutex_init(&core->irqlock); + core->enable_hwirq = devm_kcalloc(core->dev, + chip_data->num_pmic_irqs, + sizeof(bool), GFP_KERNEL); + if (!core->enable_hwirq) + return -ENOMEM; + + core->cache_hwirq = devm_kcalloc(core->dev, + chip_data->num_pmic_irqs, + sizeof(bool), GFP_KERNEL); + if (!core->cache_hwirq) + return -ENOMEM; + + /* Disable all interrupt for initializing */ + for (i = 0; i < chip_data->num_top; i++) { + for (j = 0; j < chip_data->pmic_ints[i].num_int_regs; j++) { + en_reg = chip_data->pmic_ints[i].en_reg + + chip_data->pmic_ints[i].en_reg_shift * j; + regmap_write(core->regmap, en_reg, 0); + sta_reg = chip_data->pmic_ints[i].sta_reg + + chip_data->pmic_ints[i].sta_reg_shift * j; + regmap_write(core->regmap, sta_reg, 0xFF); + } + } + regmap_write(core->regmap, RCS_INT_DONE, 1); + + core->irq_domain = irq_domain_add_linear(core->dev->of_node, + chip_data->num_pmic_irqs, + &pmic_irq_domain_ops, + core); + if (!core->irq_domain) { + dev_err(core->dev, "Could not create IRQ domain\n"); + return -ENODEV; + } + + ret = devm_request_threaded_irq(core->dev, core->irq, NULL, + mtk_spmi_pmic_irq_handler, IRQF_ONESHOT, + mtk_spmi_pmic_irq_chip.name, core); + if (ret) { + dev_err(core->dev, "Failed to register IRQ=%d, ret=%d\n", + core->irq, ret); + return ret; + } + + enable_irq_wake(core->irq); + return ret; +} + +static const struct regmap_config spmi_regmap_config = { + .reg_bits = 16, + .val_bits = 8, + .max_register = 0xffff, + .fast_io = true, +}; + +static int mtk_spmi_pmic_probe(struct spmi_device *sdev) { + int ret; + unsigned int id; + struct device_node *np = sdev->dev.of_node; + struct pmic_core *core; + const struct mtk_spmi_pmic_data *chip_data; + + core = devm_kzalloc(&sdev->dev, sizeof(*core), GFP_KERNEL); + if (!core) + return -ENOMEM; + + core->sdev = sdev; + core->dev = &sdev->dev; + chip_data = (struct mtk_spmi_pmic_data *)of_device_get_match_data(&sdev->dev); + if (!chip_data) + return -ENODEV; + + core->chip_data = chip_data; + core->regmap = devm_regmap_init_spmi_ext(sdev, &spmi_regmap_config); + if (IS_ERR(core->regmap)) + return PTR_ERR(core->regmap); + if (chip_data->cid_addr) + ret = regmap_read(core->regmap, chip_data->cid_addr, &id); + else + ret = regmap_read(core->regmap, PMIC_SWCID, &id); + if (ret || id == 0) { + dev_err(&sdev->dev, "Failed to read chip id: %d\n", ret); + return ret; + } + + core->chip_id = id; + + if (chip_data->num_pmic_irqs) { + core->irq = of_irq_get(np, 0); + if (core->irq < 0) + dev_err(&sdev->dev, "Failed to get irq(%d)\n", core->irq); + + ret = mtk_spmi_pmic_irq_init(core); + if (ret) + dev_err(&sdev->dev, "IRQ_init failed(%d)\n", core->irq); + + ret = devm_mfd_add_devices(&sdev->dev, -1, chip_data->cells, + chip_data->cell_size, NULL, 0, + core->irq_domain); + if (ret) { + irq_domain_remove(core->irq_domain); + dev_err(&sdev->dev, "Failed to add mfd devices: %d\n", ret); + return ret; + } + } else { + ret = devm_of_platform_populate(&sdev->dev); + if (ret) { + dev_err(&sdev->dev, "Failed to platform populate: %d\n", ret); + return ret; + } + } + + device_init_wakeup(&sdev->dev, true); + + dev_dbg(&sdev->dev, "probe chip id=0x%x done\n", core->chip_id); + + return ret; +} + +static const struct of_device_id mtk_spmi_pmic_of_match[] = { + { .compatible = "mediatek,mt6316", .data = &mt6316_data, }, + { .compatible = "mediatek,mt6363", .data = &mt6363_data, }, + { .compatible = "mediatek,mt6373", .data = &mt6373_data, }, + { } +}; +MODULE_DEVICE_TABLE(of, mtk_spmi_pmic_of_match); + +static struct spmi_driver mtk_spmi_pmic_driver = { + .driver = { + .name = "mtk-spmi-pmic", + .of_match_table = of_match_ptr(mtk_spmi_pmic_of_match), + }, + .probe = mtk_spmi_pmic_probe, +}; +module_spmi_driver(mtk_spmi_pmic_driver); + +MODULE_DESCRIPTION("Mediatek SPMI PMIC driver"); +MODULE_ALIAS("spmi:spmi-pmic"); MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Argus Lin "); +MODULE_AUTHOR("Jeter Chen "); +MODULE_AUTHOR("Lu Tang "); diff --git a/include/linux/mfd/mt6363/core.h b/include/linux/mfd/mt6363/core.h new file mode 100644 index 000000000000..3243a52da34d --- /dev/null +++ b/include/linux/mfd/mt6363/core.h @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. + */ + +#ifndef __MFD_MT6363_CORE_H__ +#define __MFD_MT6363_CORE_H__ + +#define MT6363_REG_WIDTH 8 + +enum mt6363_irq_top_status_shift { + MT6363_BUCK_TOP = 0, + MT6363_LDO_TOP, + MT6363_PSC_TOP, + MT6363_MISC_TOP, + MT6363_HK_TOP, + MT6363_SCK_TOP, + MT6363_BM_TOP, + MT6363_AUD_TOP, +}; + +enum mt6363_irq_numbers { + MT6363_IRQ_VS2_OC = 0, + MT6363_IRQ_VBUCK1_OC, + MT6363_IRQ_VBUCK2_OC, + MT6363_IRQ_VBUCK3_OC, + MT6363_IRQ_VBUCK4_OC, + MT6363_IRQ_VBUCK5_OC, + MT6363_IRQ_VBUCK6_OC, + MT6363_IRQ_VBUCK7_OC, + MT6363_IRQ_VS1_OC, + MT6363_IRQ_VS3_OC, + MT6363_IRQ_VCN15_OC = 16, + MT6363_IRQ_VCN13_OC, + MT6363_IRQ_VRF09_OC, + MT6363_IRQ_VRF12_OC, + MT6363_IRQ_VRF13_OC, + MT6363_IRQ_VRF18_OC, + MT6363_IRQ_VRFIO18_OC, + MT6363_IRQ_VSRAM_DIGRF_OC, + MT6363_IRQ_VSRAM_MDFE_OC, + MT6363_IRQ_VSRAM_MODEM_OC, + MT6363_IRQ_VTREF18_OC, + MT6363_IRQ_VSRAM_CPUB_OC, + MT6363_IRQ_VSRAM_CPUM_OC, + MT6363_IRQ_VSRAM_CPUL_OC, + MT6363_IRQ_VSRAM_APU_OC, + MT6363_IRQ_VAUX18_OC, + MT6363_IRQ_VEMC_OC, + MT6363_IRQ_VUFS12_OC, + MT6363_IRQ_VUFS18_OC, + MT6363_IRQ_VIO18_OC, + MT6363_IRQ_VIO075_OC, + MT6363_IRQ_VA12_1_OC, + MT6363_IRQ_VA12_2_OC, + MT6363_IRQ_VA15_OC, + MT6363_IRQ_VM18_OC, + MT6363_IRQ_PWRKEY = 48, + MT6363_IRQ_HOMEKEY, + MT6363_IRQ_HOMEKEY_2, + MT6363_IRQ_PWRKEY_R, + MT6363_IRQ_HOMEKEY_R, + MT6363_IRQ_HOMEKEY_2_R, + MT6363_IRQ_NI_LVSYS_INT_FALLING, + MT6363_IRQ_NI_LVSYS_INT_RISING, + MT6363_IRQ_CHRDET_LEVEL, + MT6363_IRQ_CHRDET_EDGE, + MT6363_IRQ_RCS0 = 64, + MT6363_IRQ_SPMI_CMD_ALERT, + MT6363_IRQ_BM_PROTREG = 70, + MT6363_IRQ_BUCK_PROTREG = 72, + MT6363_IRQ_LDO_PROTREG, + MT6363_IRQ_PSC_PROTREG, + MT6363_IRQ_PLT_PROTREG, + MT6363_IRQ_HK_PROTREG, + MT6363_IRQ_TOP_PROTREG = 79, + MT6363_IRQ_BAT_H, + MT6363_IRQ_BAT_L, + MT6363_IRQ_BAT2_H, + MT6363_IRQ_BAT2_L, + MT6363_IRQ_BAT_TEMP_H, + MT6363_IRQ_BAT_TEMP_L, + MT6363_IRQ_THR_H, + MT6363_IRQ_THR_L, + MT6363_IRQ_AUXADC_IMP, + MT6363_IRQ_NAG_C_DLTV, + MT6363_IRQ_FG_BAT_H = 88, + MT6363_IRQ_FG_BAT_L, + MT6363_IRQ_FG_CUR_H, + MT6363_IRQ_FG_CUR_L, + MT6363_IRQ_FG_ZCV, + MT6363_IRQ_FG_N_CHARGE_L = 95, + MT6363_IRQ_FG_IAVG_H, + MT6363_IRQ_FG_IAVG_L, + MT6363_IRQ_FG_DISCHARGE = 99, + MT6363_IRQ_FG_CHARGE, + MT6363_IRQ_BATON_LV = 104, + MT6363_IRQ_BATON_BAT_IN = 106, + MT6363_IRQ_BATON_BAT_OUT, + MT6363_IRQ_NR = 108, +}; + +#define MT6363_IRQ_BUCK_BASE MT6363_IRQ_VS2_OC #define +MT6363_IRQ_LDO_BASE MT6363_IRQ_VCN15_OC #define MT6363_IRQ_PSC_BASE +MT6363_IRQ_PWRKEY #define MT6363_IRQ_MISC_BASE MT6363_IRQ_RCS0 #define +MT6363_IRQ_HK_BASE MT6363_IRQ_BAT_H #define MT6363_IRQ_BM_BASE +MT6363_IRQ_FG_BAT_H + +#define MT6363_IRQ_BUCK_BITS \ + (MT6363_IRQ_VS3_OC - MT6363_IRQ_BUCK_BASE + 1) #define +MT6363_IRQ_LDO_BITS \ + (MT6363_IRQ_VM18_OC - MT6363_IRQ_LDO_BASE + 1) #define +MT6363_IRQ_PSC_BITS \ + (MT6363_IRQ_CHRDET_EDGE - MT6363_IRQ_PSC_BASE + 1) #define +MT6363_IRQ_MISC_BITS \ + (MT6363_IRQ_TOP_PROTREG - MT6363_IRQ_MISC_BASE + 1) #define +MT6363_IRQ_HK_BITS \ + (MT6363_IRQ_NAG_C_DLTV - MT6363_IRQ_HK_BASE + 1) #define +MT6363_IRQ_BM_BITS \ + (MT6363_IRQ_BATON_BAT_OUT - MT6363_IRQ_BM_BASE + 1) + +#define MT6363_TOP_GEN(sp) \ +{ \ + .hwirq_base = MT6363_IRQ_##sp##_BASE, \ + .num_int_regs = ((MT6363_IRQ_##sp##_BITS - 1) / MT6363_REG_WIDTH) + 1, \ + .en_reg = MT6363_##sp##_TOP_INT_CON0, \ + .en_reg_shift = 0x3, \ + .sta_reg = MT6363_##sp##_TOP_INT_STATUS0, \ + .sta_reg_shift = 0x1, \ + .top_offset = MT6363_##sp##_TOP, \ +} + +#endif /* __MFD_MT6363_CORE_H__ */ diff --git a/include/linux/mfd/mt6363/registers.h b/include/linux/mfd/mt6363/registers.h new file mode 100644 index 000000000000..e22ca686a7d0 --- /dev/null +++ b/include/linux/mfd/mt6363/registers.h @@ -0,0 +1,168 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. + */ + + +#ifndef __MFD_MT6363_REGISTERS_H__ +#define __MFD_MT6363_REGISTERS_H__ + +/* PMIC Registers */ +#define MT6363_TOPSTATUS (0x1e) +#define MT6363_MISC_TOP_INT_CON0 (0x37) +#define MT6363_MISC_TOP_INT_STATUS0 (0x43) +#define MT6363_TOP_INT_STATUS1 (0x4e) +#define MT6363_PSC_TOP_INT_CON0 (0x90f) +#define MT6363_PSC_TOP_INT_STATUS0 (0x91b) +#define MT6363_STRUP_CON11 (0xa0e) +#define MT6363_STRUP_CON12 (0xa0f) +#define MT6363_PCHR_VREF_ANA_CON1 (0xa89) +#define MT6363_PCHR_VREF_ANA_CON2 (0xa8a) +#define MT6363_BM_TOP_INT_CON0 (0xc24) +#define MT6363_BM_TOP_INT_STATUS0 (0xc36) +#define MT6363_HK_TOP_INT_CON0 (0xf92) +#define MT6363_HK_TOP_INT_STATUS0 (0xf9e) +#define MT6363_BUCK_TOP_INT_CON0 (0x1411) +#define MT6363_BUCK_TOP_INT_STATUS0 (0x141d) +#define MT6363_LDO_TOP_INT_CON0 (0x1b11) +#define MT6363_LDO_TOP_INT_STATUS0 (0x1b29) + +/* voter */ +#define MT6363_BUCK_VS2_VOTER_CON0 (0x149a) +#define MT6363_BUCK_VS2_VOTER_CON0_SET (0x149b) +#define MT6363_BUCK_VS2_VOTER_CON0_CLR (0x149c) +#define MT6363_BUCK_VS2_VOTER_CON1 (0x149d) +#define MT6363_BUCK_VS2_VOTER_CON1_SET (0x149e) +#define MT6363_BUCK_VS2_VOTER_CON1_CLR (0x149f) +#define MT6363_BUCK_VS2_VOTER_CFG (0x14a0) +#define MT6363_BUCK_VS1_VOTER_CON0 (0x189a) +#define MT6363_BUCK_VS1_VOTER_CON0_SET (0x189b) +#define MT6363_BUCK_VS1_VOTER_CON0_CLR (0x189c) +#define MT6363_BUCK_VS1_VOTER_CON1 (0x189d) +#define MT6363_BUCK_VS1_VOTER_CON1_SET (0x189e) +#define MT6363_BUCK_VS1_VOTER_CON1_CLR (0x189f) +#define MT6363_BUCK_VS1_VOTER_CFG (0x18a0) +#define MT6363_BUCK_VS3_VOTER_CON0 (0x191a) +#define MT6363_BUCK_VS3_VOTER_CON0_SET (0x191b) +#define MT6363_BUCK_VS3_VOTER_CON0_CLR (0x191c) +#define MT6363_BUCK_VS3_VOTER_CON1 (0x191d) +#define MT6363_BUCK_VS3_VOTER_CON1_SET (0x191e) +#define MT6363_BUCK_VS3_VOTER_CON1_CLR (0x191f) +#define MT6363_BUCK_VS3_VOTER_CFG (0x1920) + +#define MT6363_CHRDET_DEB_ADDR MT6363_TOPSTATUS +#define MT6363_CHRDET_DEB_MASK (0x1) +#define MT6363_CHRDET_DEB_SHIFT (2) +#define MT6363_RG_VBB_UVLO_VTHL_ADDR MT6363_PCHR_VREF_ANA_CON1 +#define MT6363_RG_VBB_UVLO_VTHL_MASK (0xF) +#define MT6363_RG_VBB_UVLO_VTHL_SHIFT (0) +#define MT6363_RG_VSYS_UVLO_VTHL_ADDR MT6363_PCHR_VREF_ANA_CON2 +#define MT6363_RG_VSYS_UVLO_VTHL_MASK (0xF) +#define MT6363_RG_VSYS_UVLO_VTHL_SHIFT (0) + +#define MT6363_AUXADC_ADC0_L (0x1088) +#define MT6363_AUXADC_ADC3_L (0x108e) +#define MT6363_AUXADC_ADC4_L (0x1090) +#define MT6363_AUXADC_ADC11_L (0x109e) +#define MT6363_AUXADC_ADC38_L (0x10c4) +#define MT6363_AUXADC_ADC39_L (0x10c6) +#define MT6363_AUXADC_ADC40_L (0x10c8) +#define MT6363_AUXADC_ADC_CH12_L (0x10d2) +#define MT6363_AUXADC_ADC_CH14_L (0x10d8) +#define MT6363_AUXADC_ADC42_L (0x10dc) +#define MT6363_AUXADC_RQST0 (0x1108) +#define MT6363_AUXADC_RQST1 (0x1109) +#define MT6363_AUXADC_RQST3 (0x110c) +#define MT6363_SDMADC_RQST0 (0x110e) +#define MT6363_SDMADC_CON0 (0x11c4) +#define MT6363_AUXADC_IMP0 (0x1208) +#define MT6363_AUXADC_IMP1 (0x1209) + +/* voter */ +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_ADDR \ + MT6363_BUCK_VS2_VOTER_CON0 +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_MASK (0xFF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_SET_ADDR \ + MT6363_BUCK_VS2_VOTER_CON0_SET +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_SET_MASK (0xFF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_CLR_ADDR \ + MT6363_BUCK_VS2_VOTER_CON0_CLR +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_CLR_MASK (0xFF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_LO_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_ADDR \ + MT6363_BUCK_VS2_VOTER_CON1 +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_MASK (0xF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_SET_ADDR \ + MT6363_BUCK_VS2_VOTER_CON1_SET +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_SET_MASK (0xF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_CLR_ADDR \ + MT6363_BUCK_VS2_VOTER_CON1_CLR +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_CLR_MASK (0xF) +#define MT6363_RG_BUCK_VS2_VOTER_EN_HI_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS2_VOTER_VOSEL_ADDR \ + MT6363_BUCK_VS2_VOTER_CFG +#define MT6363_RG_BUCK_VS2_VOTER_VOSEL_MASK (0xFF) +#define MT6363_RG_BUCK_VS2_VOTER_VOSEL_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_ADDR \ + MT6363_BUCK_VS1_VOTER_CON0 +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_MASK (0xFF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_SET_ADDR \ + MT6363_BUCK_VS1_VOTER_CON0_SET +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_SET_MASK (0xFF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_CLR_ADDR \ + MT6363_BUCK_VS1_VOTER_CON0_CLR +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_CLR_MASK (0xFF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_LO_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_ADDR \ + MT6363_BUCK_VS1_VOTER_CON1 +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_MASK (0xF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_SET_ADDR \ + MT6363_BUCK_VS1_VOTER_CON1_SET +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_SET_MASK (0xF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_CLR_ADDR \ + MT6363_BUCK_VS1_VOTER_CON1_CLR +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_CLR_MASK (0xF) +#define MT6363_RG_BUCK_VS1_VOTER_EN_HI_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS1_VOTER_VOSEL_ADDR \ + MT6363_BUCK_VS1_VOTER_CFG +#define MT6363_RG_BUCK_VS1_VOTER_VOSEL_MASK (0xFF) +#define MT6363_RG_BUCK_VS1_VOTER_VOSEL_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_ADDR \ + MT6363_BUCK_VS3_VOTER_CON0 +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_MASK (0xFF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_SET_ADDR \ + MT6363_BUCK_VS3_VOTER_CON0_SET +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_SET_MASK (0xFF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_CLR_ADDR \ + MT6363_BUCK_VS3_VOTER_CON0_CLR +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_CLR_MASK (0xFF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_LO_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_ADDR \ + MT6363_BUCK_VS3_VOTER_CON1 +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_MASK (0xF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_SET_ADDR \ + MT6363_BUCK_VS3_VOTER_CON1_SET +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_SET_MASK (0xF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_SET_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_CLR_ADDR \ + MT6363_BUCK_VS3_VOTER_CON1_CLR +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_CLR_MASK (0xF) +#define MT6363_RG_BUCK_VS3_VOTER_EN_HI_CLR_SHIFT (0) +#define MT6363_RG_BUCK_VS3_VOTER_VOSEL_ADDR \ + MT6363_BUCK_VS3_VOTER_CFG +#define MT6363_RG_BUCK_VS3_VOTER_VOSEL_MASK (0xFF) +#define MT6363_RG_BUCK_VS3_VOTER_VOSEL_SHIFT (0) + +#endif /* __MFD_MT6363_REGISTERS_H__ */ + diff --git a/include/linux/mfd/mt6373/core.h b/include/linux/mfd/mt6373/core.h new file mode 100644 index 000000000000..dd77d8cf29a2 --- /dev/null +++ b/include/linux/mfd/mt6373/core.h @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. + */ + +#ifndef __MFD_MT6373_CORE_H__ +#define __MFD_MT6373_CORE_H__ + +#define MT6373_REG_WIDTH 8 + +enum mt6373_irq_top_status_shift { + MT6373_BUCK_TOP = 0, + MT6373_LDO_TOP, + MT6373_PSC_TOP, + MT6373_MISC_TOP, + MT6373_HK_TOP, + MT6373_SCK_TOP, + MT6373_BM_TOP, + MT6373_AUD_TOP, +}; + +enum mt6373_irq_numbers { + MT6373_IRQ_VBUCK0_OC, + MT6373_IRQ_VBUCK1_OC, + MT6373_IRQ_VBUCK2_OC, + MT6373_IRQ_VBUCK3_OC, + MT6373_IRQ_VBUCK4_OC, + MT6373_IRQ_VBUCK5_OC, + MT6373_IRQ_VBUCK6_OC, + MT6373_IRQ_VBUCK7_OC, + MT6373_IRQ_VBUCK8_OC, + MT6373_IRQ_VBUCK9_OC, + MT6373_IRQ_VAUD18_OC = 16, + MT6373_IRQ_VUSB_OC, + MT6373_IRQ_VAUX18_OC, + MT6373_IRQ_VRF13_AIF_OC, + MT6373_IRQ_VRF18_AIF_OC, + MT6373_IRQ_VRFIO18_AIF_OC, + MT6373_IRQ_VCN33_1_OC, + MT6373_IRQ_VCN33_2_OC, + MT6373_IRQ_VCN33_3_OC, + MT6373_IRQ_VCN18IO_OC, + MT6373_IRQ_VRF09_AIF_OC, + MT6373_IRQ_VRF12_AIF_OC, + MT6373_IRQ_VANT18_OC, + MT6373_IRQ_VSRAM_DIGRF_AIF_OC, + MT6373_IRQ_VMDDR_OC, + MT6373_IRQ_VEFUSE_OC, + MT6373_IRQ_VMCH_OC, + MT6373_IRQ_VMC_OC, + MT6373_IRQ_VIBR_OC, + MT6373_IRQ_VIO28_OC, + MT6373_IRQ_VFP_OC, + MT6373_IRQ_VTP_OC, + MT6373_IRQ_VSIM1_OC, + MT6373_IRQ_VSIM2_OC, + MT6373_IRQ_RCS0 = 56, + MT6373_IRQ_SPMI_CMD_ALERT, + MT6373_IRQ_BM_PROTREG = 62, + MT6373_IRQ_VRC_PROTREG, + MT6373_IRQ_BUCK_PROTREG = 64, + MT6373_IRQ_LDO_PROTREG, + MT6373_IRQ_PSC_PROTREG, + MT6373_IRQ_PLT_PROTREG, + MT6373_IRQ_HK_PROTREG, + MT6373_IRQ_SCK_PROTREG, + MT6373_IRQ_XPP_PROTREG, + MT6373_IRQ_TOP_PROTREG, + MT6373_IRQ_NR = 72, +}; + +#define MT6373_IRQ_BUCK_BASE MT6373_IRQ_VBUCK0_OC #define +MT6373_IRQ_LDO_BASE MT6373_IRQ_VAUD18_OC #define MT6373_IRQ_MISC_BASE +MT6373_IRQ_RCS0 + +#define MT6373_IRQ_BUCK_BITS \ + (MT6373_IRQ_VBUCK9_OC - MT6373_IRQ_BUCK_BASE + 1) #define +MT6373_IRQ_LDO_BITS \ + (MT6373_IRQ_VSIM2_OC - MT6373_IRQ_LDO_BASE + 1) #define +MT6373_IRQ_MISC_BITS \ + (MT6373_IRQ_TOP_PROTREG - MT6373_IRQ_MISC_BASE + 1) + +#define MT6373_TOP_GEN(sp) \ +{ \ + .hwirq_base = MT6373_IRQ_##sp##_BASE, \ + .num_int_regs = ((MT6373_IRQ_##sp##_BITS - 1) / MT6373_REG_WIDTH) + 1, \ + .en_reg = MT6373_##sp##_TOP_INT_CON0, \ + .en_reg_shift = 0x3, \ + .sta_reg = MT6373_##sp##_TOP_INT_STATUS0, \ + .sta_reg_shift = 0x1, \ + .top_offset = MT6373_##sp##_TOP, \ +} + +#endif /* __MFD_MT6373_CORE_H__ */ diff --git a/include/linux/mfd/mt6373/registers.h b/include/linux/mfd/mt6373/registers.h new file mode 100644 index 000000000000..05aef78abfdf --- /dev/null +++ b/include/linux/mfd/mt6373/registers.h @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright (c) 2021 MediaTek Inc. + */ + + +#ifndef __MFD_MT6373_REGISTERS_H__ +#define __MFD_MT6373_REGISTERS_H__ + +/* PMIC Registers */ +#define MT6373_TOPSTATUS 0x1e +#define MT6373_MISC_TOP_INT_CON0 0x3c +#define MT6373_MISC_TOP_INT_CON1 0x3f +#define MT6373_MISC_TOP_INT_STATUS0 0x48 +#define MT6373_MISC_TOP_INT_STATUS1 0x49 +#define MT6373_TOP_INT_MASK_CON0 0x4c +#define MT6373_TOP_INT_MASK_CON0_SET 0x4d +#define MT6373_TOP_INT_MASK_CON0_CLR 0x4e +#define MT6373_TOP_INT_MASK_CON1 0x4f +#define MT6373_TOP_INT_MASK_CON1_SET 0x50 +#define MT6373_TOP_INT_MASK_CON1_CLR 0x51 +#define MT6373_TOP_INT_STATUS0 0x52 +#define MT6373_TOP_INT_STATUS1 0x53 +#define MT6373_HK_TOP_INT_CON0 0xf92 +#define MT6373_HK_TOP_INT_CON1 0xf95 +#define MT6373_HK_TOP_INT_STATUS0 0xf9e +#define MT6373_HK_TOP_INT_STATUS1 0xf9f +#define MT6373_AUXADC_ADC4_L 0x1090 +#define MT6373_AUXADC_ADC38_L 0x10c4 +#define MT6373_AUXADC_ADC39_L 0x10c6 +#define MT6373_AUXADC_ADC40_L 0x10c8 +#define MT6373_AUXADC_ADC_CH12_L 0x10d2 +#define MT6373_AUXADC_ADC_CH12_H 0x10d3 +#define MT6373_AUXADC_RQST0 0x1108 +#define MT6373_AUXADC_RQST1 0x1109 +#define MT6373_AUXADC_RQST3 0x110c +#define MT6373_SDMADC_RQST0 0x110e +#define MT6373_SDMADC_CON0 0x11c4 +#define MT6373_BUCK_TOP_INT_CON0 0x1411 +#define MT6373_BUCK_TOP_INT_CON1 0x1414 +#define MT6373_BUCK_TOP_INT_STATUS0 0x141d +#define MT6373_BUCK_TOP_INT_STATUS1 0x141e +#define MT6373_LDO_TOP_INT_CON0 0x1b10 +#define MT6373_LDO_TOP_INT_CON1 0x1b13 +#define MT6373_LDO_TOP_INT_CON2 0x1b16 +#define MT6373_LDO_TOP_INT_STATUS0 0x1b22 +#define MT6373_LDO_TOP_INT_STATUS1 0x1b23 +#define MT6373_LDO_TOP_INT_STATUS2 0x1b24 +#define MT6373_LDO_VMCH_CON0 0x1cb1 +#define MT6373_LDO_VMCH_CON1 0x1cb2 +#define MT6373_LDO_VMCH_CON2 0x1cb3 + +#endif /* __MFD_MT6373_REGISTERS_H__ */