From nobody Sun May 10 06:27:19 2026 Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) (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 96E7D171C9; Mon, 30 Dec 2024 10:03:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735553010; cv=none; b=V4+JPt0SOHpI7vHev3lHRX+QP3ylsky73U2GWMWhUogGgOovP3JjFG5B/q0exIaJJffF0WT0aFRxRJ0aS4BQaSKhWlASyrqlfwWR9x6Mgd5tNAM/EgyLHfO6fQNzraGfodkG20x0QuSkaGz0BD1YZjSdhvwDhVhMTHQlFr6GRd0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735553010; c=relaxed/simple; bh=8JLII4z2SucnC1ToeznGC9TylfiYT5yoHZV9TZlUGZg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FsKchtg4v1xcMXM+esrsVtYvuC863GaR449ADgw5FHtLjYg2pyskud74qRK4HOJYMrb2GTVoYX/EIAZQhWOx3ut45mPaT+6/ViANc+CHux61wRVKSW52xcIKkh+HcPVKNS5GXArYtq0Q2o/52742sZ7KOKGF4zI5y375NRyFv50= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ZqPDk5I4; arc=none smtp.client-ip=209.85.214.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ZqPDk5I4" Received: by mail-pl1-f195.google.com with SMTP id d9443c01a7336-2163b0c09afso113287095ad.0; Mon, 30 Dec 2024 02:03:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735553006; x=1736157806; 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=4c3g69ZSa0la5kSxDKHdJ117EiliQemTUGhd6iDU1Yw=; b=ZqPDk5I4cZYRajTbzaqy9WjZiRHnY3Vk7KxXmOv3yDjPb83xCKrr/ckoNmeC78ffn0 WYfkutDhx4JsUly1WbFl8TJSOgZRWwUde9TZVdfE8Dj83kfppQLXK6ZVRWPVtKihCYnv 822nXFVh5TZsNQfKX3L4/tn6FrSxVy3+xNqN5qEeYMFIjy9Tnq8xefljLdP7YyR05l/e Aak7oBbtb1JB1jS6sUdbtpbLqEkB0UoqpbRflkMATMO7FDCy7bW5ndDajuRzV+ip3jsK xFx1ZqhYKiM1iUNdQzw0+YGtkpee41jHGWQjNpQamJ5/UCGE5AQ0pqlNoL+ME/RYdKMj RCLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735553006; x=1736157806; 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=4c3g69ZSa0la5kSxDKHdJ117EiliQemTUGhd6iDU1Yw=; b=OD8M09F6Fd93DZPs3gG+Xt3EZfCSfiLbDkipD3nmErhI7UETWhEP5YCvlKVHIpm5Dt walzPNGV+/D6okTLL/edu8DMSO8tcuLCO6BLsDSnuDC2aVO6P/6o3nvkxwcJqOwpKvhE ge6iHTin4eWRsLq9+OCx/x1YuMDqi9llwfN//2W6X26PH7L7d/nDQsvs5E0D8l3FeWrB 1wesYJmG3TBNQuypp5aQkaVkIB1cWBpwzy/9rpcx/H0mQe42Sr6k8pGyeN7YhSrkAGk4 bjVekXO6fMw8FFuKTRVBgQh9dUJWUfI+INHJbUuMIcK+8eeMa+vd7naNA/FSpoeZF6B7 /xNg== X-Forwarded-Encrypted: i=1; AJvYcCVbhXB6Rx3AgGEkGlZtr0YfPGRqzzGMd/Y4Hfv30tVfhtX0B07LF1CY8mDOfgxycXuDmv7qIWcIQgfebW6W@vger.kernel.org, AJvYcCX5Q9oMJkCelhSEp/pBQdAy6dodEI9ouJGxZdyfYIqHPuWXNrAGII9JHmyB6S8DbY3juDLTEHMDG7Xc@vger.kernel.org X-Gm-Message-State: AOJu0YxkuLZokqhqa917vEBVSZkuVR62Ra8u0wuUj08Q03scrdbfogfs UGmdBM5TwPdg+D1U4VIFUcNStn5VTCphvUB1LHpumMOvj4zC0v05 X-Gm-Gg: ASbGncssR6Lk7j6sZhIoifEue5eqj6zLMgKRotFfSQCQM+Qo2kyyzcS8FvAa5Dv1bfC FG3Gdy6YaZgcUkjIBd1oKwSar3oIwsMi+I8PlKL3xTVJj7bfiDLRQmjO4NwQtpNG8WVSFEcQQCb ewecoksDipOxOLlmL5uIwICPSIb/OeSHVYZ2cKW27kfavq2qAL9eOdx8kCAtXALIYUmK5c2CyXn DpBKgon1NZqxuUGSQAkdpOOmIkVp25tb0U1GbpM6TfAjJhFxbSibBrGm3fd+vp+ X-Google-Smtp-Source: AGHT+IEw4XPb30qBmp7nC44LPta4cKntFtZNSr+9XWLhHYQ36TJJBBUHxIe7pbgP26S5y6Gy+BMaJQ== X-Received: by 2002:a05:6a21:328d:b0:1e0:f495:50bb with SMTP id adf61e73a8af0-1e5e084326emr51372052637.44.1735553005740; Mon, 30 Dec 2024 02:03:25 -0800 (PST) Received: from [127.0.1.1] ([106.114.236.41]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842aba72f71sm17328587a12.9.2024.12.30.02.03.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Dec 2024 02:03:25 -0800 (PST) From: Troy Mitchell X-Google-Original-From: Troy Mitchell Date: Mon, 30 Dec 2024 18:02:05 +0800 Subject: [PATCH 1/2] dt-bindings: mfd: add support for P1 from SpacemiT Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241230-k1-p1-v1-1-aa4e02b9f993@gmail.com> References: <20241230-k1-p1-v1-0-aa4e02b9f993@gmail.com> In-Reply-To: <20241230-k1-p1-v1-0-aa4e02b9f993@gmail.com> To: Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Troy Mitchell Cc: linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1735552935; l=4220; i=TroyMitchell988@gmail.com; h=from:subject:message-id; bh=8JLII4z2SucnC1ToeznGC9TylfiYT5yoHZV9TZlUGZg=; b=C4IyeA7vaYcAEgfyfJN3nXsJIdXlKkLeKM6rZ5H5GnqGHfBA/lPhcXhJAZ6mnvGY6/5U+BFoi SeePIFD4hDrBcDDoB01W2W2rBLXlLPnPWoqxKgBxu+2llkORC7Q3CYC X-Developer-Key: i=TroyMitchell988@gmail.com; a=ed25519; pk=2spEMGBd/Wkpd36N1aD9KFWOk0aHrhVxZQt+jxLXVC0= P1 PMIC contains of regulator, pinctrl, pwrkey and rtc. P1 contains a load switch, which allows you to control whether a device is powered on (such as a MIPI screen) Signed-off-by: Troy Mitchell --- .../devicetree/bindings/mfd/spacemit,p1.yaml | 153 +++++++++++++++++= ++++ 1 file changed, 153 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml b/Docum= entation/devicetree/bindings/mfd/spacemit,p1.yaml new file mode 100644 index 0000000000000000000000000000000000000000..7475d403aeb3d0e72ffa9b6fbcb= b6545d5bc429f --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/spacemit,p1.yaml @@ -0,0 +1,153 @@ +# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/spacemit,p1.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: P1 Power Management Integrated Circuit + +maintainers: + - Troy Mitchell + +description: + PMIC chip P1 produced by SpacemiT. The device consists of I2C controlled= MFD, + which contains regulator, pinctrl, pwrkey and rtc. + +properties: + compatible: + const: spacemit,p1-pmic + + reg: + maxItems: 1 + + interrupts: + maxItems: 1 + + regulators: + type: object + + properties: + compatible: + const: pmic,p1-regulator + + required: + - compatible + + patternProperties: + "^(dcdc-reg[1-6]|aldo-reg[1-4]|dldo-reg[1-7]|switch)$": + type: object + $ref: /schemas/regulator/regulator.yaml# + unevaluatedProperties: false + + unevaluatedProperties: false + + pinctrl: + type: object + + properties: + compatible: + const: pmic,p1-pinctrl + + "#gpio-cells": + const: 2 + + gpio-controller: true + + required: + - compatible + - "#gpio-cells" + - gpio-controller + + unevaluatedProperties: false + + pwrkey: + type: object + $ref: /schemas/input/input.yaml# + + properties: + compatible: + const: pmic,p1-pwrkey + + required: + - compatible + + unevaluatedProperties: false + + rtc: + type: object + $ref: /schemas/rtc/rtc.yaml# + + properties: + compatible: + const: pmic,p1-rtc + + required: + - compatible + + unevaluatedProperties: false + + +required: + - compatible + - reg + - interrupts + +unevaluatedProperties: false + +examples: + - | + i2c { + #address-cells =3D <1>; + #size-cells =3D <0>; + + pmic@41 { + compatible =3D "spacemit,p1"; + reg =3D <0x41>; + interrupt-parent =3D <&intc>; + interrupts =3D <64>; + + regulators { + compatible =3D "pmic,p1-regulator"; + + dcdc-reg1 { + regulator-name =3D "dcdc1"; + regulator-min-microvolt =3D <500000>; + regulator-max-microvolt =3D <3450000>; + regulator-ramp-delay =3D <5000>; + regulator-always-on; + }; + + aldo-reg1 { + regulator-name =3D "aldo1"; + regulator-min-microvolt =3D <500000>; + regulator-max-microvolt =3D <3400000>; + regulator-boot-on; + }; + + dldo-reg1 { + regulator-name =3D "dldo1"; + regulator-min-microvolt =3D <500000>; + regulator-max-microvolt =3D <3400000>; + regulator-boot-on; + }; + + switch { + regulator-name =3D "switch"; + }; + }; + + pinctrl { + compatible =3D "pmic,p1-pinctrl"; + gpio-controller; + #gpio-cells =3D <2>; + }; + + pwrkey { + compatible =3D "pmic,p1-pwrkey"; + }; + + rtc { + compatible =3D "pmic,p1-rtc"; + }; + }; + }; --=20 2.34.1 From nobody Sun May 10 06:27:19 2026 Received: from mail-pl1-f193.google.com (mail-pl1-f193.google.com [209.85.214.193]) (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 A17831A725A; Mon, 30 Dec 2024 10:03:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.193 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735553012; cv=none; b=RRUuyhGqzCb93ak8+QfhvG1D99nFRIu+WK2E84W3cdOxubgPocvD1Prkok1FeB3chnimuGkkTuIUVz0e7F7lagKE6Hd8fDMhxFqfQyOzNZd29kqkJSYZL5cqH1cqvTAs/69XYbU4UaEMcAS8cgqW1GaNrT1k9kzWItPC1SwkRxw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1735553012; c=relaxed/simple; bh=ZfO8/DhT31tH7tz+lxK41Chh1i9Nq/kiwPw3d+UmuUw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ev9C9YwSsF6ryUmnpDTNhlL3e9J6G15OwtjzNg73Con+169vfUHLSDtb6h+DRb5gheHeN/G6aRs0/qkDnjjbONdALII/3rSBdgnyCDEinuuFro/+vpeiHfAUdmr1A2gjIyqS7M7W0+00xcGk7fm/UJI28C2+V5bFYZ0ggeMRk4o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Goxk28YW; arc=none smtp.client-ip=209.85.214.193 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Goxk28YW" Received: by mail-pl1-f193.google.com with SMTP id d9443c01a7336-2165cb60719so116831585ad.0; Mon, 30 Dec 2024 02:03:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735553010; x=1736157810; 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=VjpzyyDnSg2qnvK3aocr7ogCaV/w73iZ8OTPqTUfFXI=; b=Goxk28YWi1XUslmV4YOMXD7M+hfPVE/Wdc0MSVQ0bk6CCJON3nOEYLJgBJHdgEI9jC vthCECETjoSPZmKi9xezEBSvGOXwIGQFRf6ziWRKKqsjBxn3ci7NPpqoNHK1m6SIXxUh mBtq17UQMp0oiXq7rw2MRnQqeb0g3EjTeeq8feZmiJ07bZJorszxChF4uhEvwUUSKIkp 4RATdu54iRCRWzgSKQzBt+KuOqHgZFfSh4OjZYrR8e3K+iImpioHaxrQSGeFIa8PyhTl nm+zNSjwXzFta25a5uG0OKvDvO1OxgqE5JAM1SATyoK6t2XHTotEsVJcZybS+G0eACQf YXeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735553010; x=1736157810; 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=VjpzyyDnSg2qnvK3aocr7ogCaV/w73iZ8OTPqTUfFXI=; b=ftj2cu1Dtf9s2e+oiihBaIfWjnIoPNKnXBEiH/7UyF2io2aEJdJi8Hj7tOg9/i2KWZ T4MMPBTTQSW7dx2m+mXA8nLw3d/fEMreL7wogV+v0PgsZ8mVQqtHPOlqiSLk62kRE/J9 NlP7D4qYBPXoklaBdYXzq4GH3oQJ+dmjO1a0nGTb7fKNngNP4KgXpbXBmwZLvXtikmHl EA48tlJRfQCI7mHl4IE3bU3hXY94MNT3vpGjueXalqyEO6124SdS1NRbvG2/q4sJq/ch B/2MO1g9gRwIwz27v12+8j18/3kagy7w+JYnS4y8+Gd/sYYiHkEJY7eZ3fIKgZ076dAu 3Uyw== X-Forwarded-Encrypted: i=1; AJvYcCVNcUnShbU/oW6zVRZYIe7h4nVkacO3OSfPBV56tdO2Q8aJ8kX1Z/WOeopbVHaVAgc6MWA39NVG7VnXopUo@vger.kernel.org, AJvYcCW6cUZJYWAv420Mb+Mu69q/uReE06XkaNGiykj+QXpFLRMD5C851TRx+ILyEdLegiS92UkLcsfaloXl@vger.kernel.org X-Gm-Message-State: AOJu0YwSh0zDu3Ic2wjQd/fmgemwJ9ogyW9b4n8YrSHXQM++DB/UyqZw 04s9t4bDTfGocyKOZtZdUgeSPZkYcVQRzPSQEEOk/Yx2EaINjrpC X-Gm-Gg: ASbGnctP/f0jR54nYnZLPBFq0h0O1E2tsYyS+o3aYlcB3FcucozQupH+NzH0i9E/g2K XDxE3LUxfOXW5ulab2SbFjMpkR/QbS0gwh7FTbPOpFeA53+xpoBOhUWkyAYXBbsvfNCiPd4Dvv0 LJl0T7pr0GbLnwpawjG12FoayD6w94S7PQwWSVx90OeGLkm2+QoJQkClhwMGKCAoIQEaSCkzAE0 PZGIkJsZDtPIk7WtpZ70/4VPbQp4J98KGydHzFGvy9S2xBgWELkUUpGu8QUADmM X-Google-Smtp-Source: AGHT+IEt6e4HucvzBlHuuMkjls02jjS05kC9Gqjrp5xozzKdwvKnOcBYdrnRFpHbtQEV2OcYtnIa+w== X-Received: by 2002:a05:6a20:a127:b0:1e1:aa24:2e56 with SMTP id adf61e73a8af0-1e5e07ffd4bmr60461961637.30.1735553009734; Mon, 30 Dec 2024 02:03:29 -0800 (PST) Received: from [127.0.1.1] ([106.114.236.41]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-842aba72f71sm17328587a12.9.2024.12.30.02.03.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Dec 2024 02:03:29 -0800 (PST) From: Troy Mitchell X-Google-Original-From: Troy Mitchell Date: Mon, 30 Dec 2024 18:02:06 +0800 Subject: [PATCH 2/2] mfd: add new driver for P1 PMIC from SpacemiT Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20241230-k1-p1-v1-2-aa4e02b9f993@gmail.com> References: <20241230-k1-p1-v1-0-aa4e02b9f993@gmail.com> In-Reply-To: <20241230-k1-p1-v1-0-aa4e02b9f993@gmail.com> To: Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Troy Mitchell Cc: linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Troy Mitchell X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1735552935; l=20096; i=TroyMitchell988@gmail.com; h=from:subject:message-id; bh=ZfO8/DhT31tH7tz+lxK41Chh1i9Nq/kiwPw3d+UmuUw=; b=KBQTI/7crlVhxujHe12fwoagE3ECEsspEIftF3dyrAiHA+P/DEbJWUws1ws+OpV48U2OnZP9Q rVapH0e60hwAIJs3i7s6BX25Uw+uhSgq5kbZ9ZI9qAaForXmwkuf41J X-Developer-Key: i=TroyMitchell988@gmail.com; a=ed25519; pk=2spEMGBd/Wkpd36N1aD9KFWOk0aHrhVxZQt+jxLXVC0= Add the core MFD driver for P1 PMIC. I define four sub-devices for which the drivers will be added in subsequent patches. For this patch, It supports `reboot` and `shutdown`. Signed-off-by: Troy Mitchell --- drivers/mfd/Kconfig | 14 + drivers/mfd/Makefile | 1 + drivers/mfd/spacemit-pmic.c | 159 ++++++++++ include/linux/mfd/spacemit/spacemit-p1.h | 491 +++++++++++++++++++++++++= ++++ include/linux/mfd/spacemit/spacemit-pmic.h | 39 +++ 5 files changed, 704 insertions(+) diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index ae23b317a64e49f0cb529ae6bd1becbb90b7c282..c062bf6b11fd23d420a6d5f6ee5= 1b3ec97f9fcbb 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -1173,6 +1173,20 @@ config MFD_QCOM_RPM Say M here if you want to include support for the Qualcomm RPM as a module. This will build a module called "qcom_rpm". =20 +config MFD_SPACEMIT_PMIC + tristate "SpacemiT PMIC" + depends on ARCH_SPACEMIT || COMPILE_TEST + depends on I2C && OF + select MFD_CORE + select REGMAP_I2C + select REGMAP_IRQ + help + If this option is turned on, the P1 chip produced by SpacemiT will + be supported. + + This driver can also be compiled as a module. If you choose to build + it as a module, the resulting kernel module will be named `spacemit-pmi= c`. + config MFD_SPMI_PMIC tristate "Qualcomm SPMI PMICs" depends on ARCH_QCOM || COMPILE_TEST diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index e057d6d6faef5c1d639789e2560f336fa26cd872..284dbb8fe2ef83bdd994a598504= fe315f2eabbdf 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -266,6 +266,7 @@ obj-$(CONFIG_MFD_SUN4I_GPADC) +=3D sun4i-gpadc.o obj-$(CONFIG_MFD_STM32_LPTIMER) +=3D stm32-lptimer.o obj-$(CONFIG_MFD_STM32_TIMERS) +=3D stm32-timers.o obj-$(CONFIG_MFD_MXS_LRADC) +=3D mxs-lradc.o +obj-$(CONFIG_MFD_SPACEMIT_PMIC) +=3D spacemit-pmic.o obj-$(CONFIG_MFD_SC27XX_PMIC) +=3D sprd-sc27xx-spi.o obj-$(CONFIG_RAVE_SP_CORE) +=3D rave-sp.o obj-$(CONFIG_MFD_ROHM_BD71828) +=3D rohm-bd71828.o diff --git a/drivers/mfd/spacemit-pmic.c b/drivers/mfd/spacemit-pmic.c new file mode 100644 index 0000000000000000000000000000000000000000..d9f6785cecbd405821dead13cdf= 8d1f9fd64e508 --- /dev/null +++ b/drivers/mfd/spacemit-pmic.c @@ -0,0 +1,159 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2024 Troy Mitchell + */ + +#include +#include +#include +#include +#include +#include +#include + +P1_REGMAP_CONFIG; +P1_IRQS_DESC; +P1_IRQ_CHIP_DESC; +P1_POWER_KEY_RESOURCES_DESC; +P1_RTC_RESOURCES_DESC; +P1_MFD_CELL; +P1_MFD_MATCH_DATA; + +static int spacemit_pmic_shutdown(struct sys_off_data *data) +{ + int ret; + struct spacemit_pmic *pmic =3D data->cb_data; + + ret =3D regmap_update_bits(pmic->regmap, + pmic->match_data->shutdown.reg, + pmic->match_data->shutdown.bit, + pmic->match_data->shutdown.bit); + if (ret) + dev_err(data->dev, "failed to reboot device!"); + + return NOTIFY_DONE; +} + +static int spacemit_pmic_restart(struct sys_off_data *data) +{ + int ret; + struct spacemit_pmic *pmic =3D data->cb_data; + + ret =3D regmap_update_bits(pmic->regmap, + pmic->match_data->reboot.reg, + pmic->match_data->reboot.bit, + pmic->match_data->reboot.bit); + if (ret) + dev_err(data->dev, "failed to reboot device!"); + + return NOTIFY_DONE; +} + +static int spacemit_pmic_probe(struct i2c_client *client) +{ + const struct spacemit_pmic_match_data *match_data; + const struct mfd_cell *cells; + struct spacemit_pmic *pmic; + int nr_cells, ret; + + if (!client->irq) + return dev_err_probe(&client->dev, -ENXIO, "no interrupt supported"); + + match_data =3D of_device_get_match_data(&client->dev); + if (WARN_ON(!match_data)) + return -EINVAL; + + pmic =3D devm_kzalloc(&client->dev, sizeof(*pmic), GFP_KERNEL); + if (!pmic) + return -ENOMEM; + + cells =3D match_data->mfd_cells; + nr_cells =3D match_data->nr_cells; + + pmic->regmap_cfg =3D match_data->regmap_cfg; + pmic->regmap_irq_chip =3D match_data->regmap_irq_chip; + pmic->i2c =3D client; + pmic->match_data =3D match_data; + pmic->regmap =3D devm_regmap_init_i2c(client, pmic->regmap_cfg); + if (IS_ERR(pmic->regmap)) + return dev_err_probe(&client->dev, + PTR_ERR(pmic->regmap), + "regmap initialization failed"); + + regcache_cache_bypass(pmic->regmap, true); + + i2c_set_clientdata(client, pmic); + + if (pmic->regmap_irq_chip) { + ret =3D regmap_add_irq_chip(pmic->regmap, client->irq, IRQF_ONESHOT, -1, + pmic->regmap_irq_chip, &pmic->irq_data); + if (ret) + return dev_err_probe(&client->dev, ret, "failed to add irqchip"); + } + + dev_pm_set_wake_irq(&client->dev, client->irq); + device_init_wakeup(&client->dev, true); + + ret =3D devm_mfd_add_devices(&client->dev, PLATFORM_DEVID_NONE, + cells, nr_cells, NULL, 0, + regmap_irq_get_domain(pmic->irq_data)); + if (ret) + return dev_err_probe(&client->dev, ret, "failed to add MFD devices"); + + if (match_data->shutdown.reg) { + ret =3D devm_register_sys_off_handler(&client->dev, + SYS_OFF_MODE_POWER_OFF_PREPARE, + SYS_OFF_PRIO_HIGH, + &spacemit_pmic_shutdown, + pmic); + if (ret) + return dev_err_probe(&client->dev, + ret, + "failed to register restart handler"); + + } + + if (match_data->reboot.reg) { + ret =3D devm_register_sys_off_handler(&client->dev, + SYS_OFF_MODE_RESTART, + SYS_OFF_PRIO_HIGH, + &spacemit_pmic_restart, + pmic); + if (ret) + return dev_err_probe(&client->dev, + ret, + "failed to register restart handler"); + } + + return 0; +} + +static const struct of_device_id spacemit_pmic_of_match[] =3D { + { .compatible =3D "spacemit,p1", .data =3D &pmic_p1_match_data }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, spacemit_pmic_of_match); + +static struct i2c_driver spacemit_pmic_i2c_driver =3D { + .driver =3D { + .name =3D "spacemit-pmic", + .of_match_table =3D spacemit_pmic_of_match, + }, + .probe =3D spacemit_pmic_probe, +}; + +static int __init spacemit_pmic_init(void) +{ + return platform_driver_register(&spacemit_pmic_i2c_driver); +} + +static void __exit spacemit_pmic_exit(void) +{ + platform_driver_unregister(&spacemit_pmic_i2c_driver); +} + +module_init(spacemit_pmic_init); +module_exit(spacemit_pmic_exit); + +MODULE_LICENSE("GPL"); +MODULE_DESCRIPTION("mfd core driver for the SpacemiT PMIC"); diff --git a/include/linux/mfd/spacemit/spacemit-p1.h b/include/linux/mfd/s= pacemit/spacemit-p1.h new file mode 100644 index 0000000000000000000000000000000000000000..6d4d5126b79d6b887d23dea097e= c585ecca5e758 --- /dev/null +++ b/include/linux/mfd/spacemit/spacemit-p1.h @@ -0,0 +1,491 @@ +/* SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2024 Troy Mitchell + */ +#ifndef __SPACEMIT_P1_H__ +#define __SPACEMIT_P1_H__ + +enum p1_reg { + P1_ID_DCDC1, + P1_ID_DCDC2, + P1_ID_DCDC3, + P1_ID_DCDC4, + P1_ID_DCDC5, + P1_ID_DCDC6, + P1_ID_LDO1, + P1_ID_LDO2, + P1_ID_LDO3, + P1_ID_LDO4, + P1_ID_LDO5, + P1_ID_LDO6, + P1_ID_LDO7, + P1_ID_LDO8, + P1_ID_LDO9, + P1_ID_LDO10, + P1_ID_LDO11, + P1_ID_SWITCH1, +}; + +enum p1_irq_line { + /* reg: 0x91 */ + P1_E_GPI0, + P1_E_GPI1, + P1_E_GPI2, + P1_E_GPI3, + P1_E_GPI4, + P1_E_GPI5, + + /* reg: 0x92 */ + P1_E_ADC_TEMP, + P1_E_ADC_EOC, + P1_E_ADC_EOS, + P1_E_WDT_TO, + P1_E_ALARM, + P1_E_TICK, + + /* reg: 0x93 */ + P1_E_LDO_OV, + P1_E_LDO_UV, + P1_E_LDO_SC, + P1_E_SW_SC, + P1_E_TEMP_WARN, + P1_E_TEMP_SEVERE, + P1_E_TEMP_CRIT, + + /* reg: 0x94 */ + P1_E_BUCK1_OV, + P1_E_BUCK2_OV, + P1_E_BUCK3_OV, + P1_E_BUCK4_OV, + P1_E_BUCK5_OV, + P1_E_BUCK6_OV, + + /* reg: 0x95 */ + P1_E_BUCK1_UV, + P1_E_BUCK2_UV, + P1_E_BUCK3_UV, + P1_E_BUCK4_UV, + P1_E_BUCK5_UV, + P1_E_BUCK6_UV, + + /* reg: 0x96 */ + P1_E_BUCK1_SC, + P1_E_BUCK2_SC, + P1_E_BUCK3_SC, + P1_E_BUCK4_SC, + P1_E_BUCK5_SC, + P1_E_BUCK6_SC, + + /* reg: 0x97 */ + P1_E_PWRON_RINTR, + P1_E_PWRON_FINTR, + P1_E_PWRON_SINTR, + P1_E_PWRON_LINTR, + P1_E_PWRON_SDINTR, + P1_E_VSYS_OV, +}; + +#define P1_MAX_REG 0xA8 + +#define P1_BUCK_VSEL_MASK 0xff +#define P1_BUCK_EN_MASK 0x1 + +#define P1_BUCK1_CTRL_REG 0x47 +#define P1_BUCK2_CTRL_REG 0x4a +#define P1_BUCK3_CTRL_REG 0x4d +#define P1_BUCK4_CTRL_REG 0x50 +#define P1_BUCK5_CTRL_REG 0x53 +#define P1_BUCK6_CTRL_REG 0x56 + +#define P1_BUCK1_VSEL_REG 0x48 +#define P1_BUCK2_VSEL_REG 0x4b +#define P1_BUCK3_VSEL_REG 0x4e +#define P1_BUCK4_VSEL_REG 0x51 +#define P1_BUCK5_VSEL_REG 0x54 +#define P1_BUCK6_VSEL_REG 0x57 + +#define P1_ALDO1_CTRL_REG 0x5b +#define P1_ALDO2_CTRL_REG 0x5e +#define P1_ALDO3_CTRL_REG 0x61 +#define P1_ALDO4_CTRL_REG 0x64 + +#define P1_ALDO1_VOLT_REG 0x5c +#define P1_ALDO2_VOLT_REG 0x5f +#define P1_ALDO3_VOLT_REG 0x62 +#define P1_ALDO4_VOLT_REG 0x65 + +#define P1_ALDO_EN_MASK 0x1 +#define P1_ALDO_VSEL_MASK 0x7f + +#define P1_DLDO1_CTRL_REG 0x67 +#define P1_DLDO2_CTRL_REG 0x6a +#define P1_DLDO3_CTRL_REG 0x6d +#define P1_DLDO4_CTRL_REG 0x70 +#define P1_DLDO5_CTRL_REG 0x73 +#define P1_DLDO6_CTRL_REG 0x76 +#define P1_DLDO7_CTRL_REG 0x79 + +#define P1_DLDO1_VOLT_REG 0x68 +#define P1_DLDO2_VOLT_REG 0x6b +#define P1_DLDO3_VOLT_REG 0x6e +#define P1_DLDO4_VOLT_REG 0x71 +#define P1_DLDO5_VOLT_REG 0x74 +#define P1_DLDO6_VOLT_REG 0x77 +#define P1_DLDO7_VOLT_REG 0x7a + +#define P1_DLDO_EN_MASK 0x1 +#define P1_DLDO_VSEL_MASK 0x7f + +#define P1_SWITCH_CTRL_REG 0x59 +#define P1_SWTICH_EN_MASK 0x1 + +#define P1_PWR_CTRL2 0x7e +#define P1_SW_SHUTDOWN_BIT_MSK 0x4 +#define P1_SW_RESET_BIT_MSK 0x2 + +#define P1_E_GPI0_MSK BIT(0) +#define P1_E_GPI1_MSK BIT(1) +#define P1_E_GPI2_MSK BIT(2) +#define P1_E_GPI3_MSK BIT(3) +#define P1_E_GPI4_MSK BIT(4) +#define P1_E_GPI5_MSK BIT(5) + +#define P1_E_ADC_TEMP_MSK BIT(0) +#define P1_E_ADC_EOC_MSK BIT(1) +#define P1_E_ADC_EOS_MSK BIT(2) +#define P1_E_WDT_TO_MSK BIT(3) +#define P1_E_ALARM_MSK BIT(4) +#define P1_E_TICK_MSK BIT(5) + +#define P1_E_LDO_OV_MSK BIT(0) +#define P1_E_LDO_UV_MSK BIT(1) +#define P1_E_LDO_SC_MSK BIT(2) +#define P1_E_SW_SC_MSK BIT(3) +#define P1_E_TEMP_WARN_MSK BIT(4) +#define P1_E_TEMP_SEVERE_MSK BIT(5) +#define P1_E_TEMP_CRIT_MSK BIT(6) + +#define P1_E_BUCK1_OV_MSK BIT(0) +#define P1_E_BUCK2_OV_MSK BIT(1) +#define P1_E_BUCK3_OV_MSK BIT(2) +#define P1_E_BUCK4_OV_MSK BIT(3) +#define P1_E_BUCK5_OV_MSK BIT(4) +#define P1_E_BUCK6_OV_MSK BIT(5) + +#define P1_E_BUCK1_UV_MSK BIT(0) +#define P1_E_BUCK2_UV_MSK BIT(1) +#define P1_E_BUCK3_UV_MSK BIT(2) +#define P1_E_BUCK4_UV_MSK BIT(3) +#define P1_E_BUCK5_UV_MSK BIT(4) +#define P1_E_BUCK6_UV_MSK BIT(5) + +#define P1_E_BUCK1_SC_MSK BIT(0) +#define P1_E_BUCK2_SC_MSK BIT(1) +#define P1_E_BUCK3_SC_MSK BIT(2) +#define P1_E_BUCK4_SC_MSK BIT(3) +#define P1_E_BUCK5_SC_MSK BIT(4) +#define P1_E_BUCK6_SC_MSK BIT(5) + +#define P1_E_PWRON_RINTR_MSK BIT(0) +#define P1_E_PWRON_FINTR_MSK BIT(1) +#define P1_E_PWRON_SINTR_MSK BIT(2) +#define P1_E_PWRON_LINTR_MSK BIT(3) +#define P1_E_PWRON_SDINTR_MSK BIT(4) +#define P1_E_VSYS_OV_MSK BIT(5) + +#define P1_E_STATUS_REG_BASE 0x91 +#define P1_E_EN_REG_BASE 0x98 + +#define P1_REGMAP_CONFIG \ + static const struct regmap_config p1_regmap_config =3D { \ + .reg_bits =3D 8, \ + .val_bits =3D 8, \ + .max_register =3D P1_MAX_REG, \ + .cache_type =3D REGCACHE_RBTREE, \ + } + +#define P1_IRQS_DESC \ +static const struct regmap_irq p1_irqs[] =3D { \ + [P1_E_GPI0] =3D { \ + .mask =3D P1_E_GPI0_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_GPI1] =3D { \ + .mask =3D P1_E_GPI1_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_GPI2] =3D { \ + .mask =3D P1_E_GPI2_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_GPI3] =3D { \ + .mask =3D P1_E_GPI3_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_GPI4] =3D { \ + .mask =3D P1_E_GPI4_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_GPI5] =3D { \ + .mask =3D P1_E_GPI5_MSK, \ + .reg_offset =3D 0, \ + }, \ + \ + [P1_E_ADC_TEMP] =3D { \ + .mask =3D P1_E_ADC_TEMP_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_ADC_EOC] =3D { \ + .mask =3D P1_E_ADC_EOC_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_ADC_EOS] =3D { \ + .mask =3D P1_E_ADC_EOS_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_WDT_TO] =3D { \ + .mask =3D P1_E_WDT_TO_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_ALARM] =3D { \ + .mask =3D P1_E_ALARM_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_TICK] =3D { \ + .mask =3D P1_E_TICK_MSK, \ + .reg_offset =3D 1, \ + }, \ + \ + [P1_E_LDO_OV] =3D { \ + .mask =3D P1_E_LDO_OV_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_LDO_UV] =3D { \ + .mask =3D P1_E_LDO_UV_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_LDO_SC] =3D { \ + .mask =3D P1_E_LDO_SC_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_SW_SC] =3D { \ + .mask =3D P1_E_SW_SC_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_TEMP_WARN] =3D { \ + .mask =3D P1_E_TEMP_WARN_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_TEMP_SEVERE] =3D { \ + .mask =3D P1_E_TEMP_SEVERE_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_TEMP_CRIT] =3D { \ + .mask =3D P1_E_TEMP_CRIT_MSK, \ + .reg_offset =3D 2, \ + }, \ + \ + [P1_E_BUCK1_OV] =3D { \ + .mask =3D P1_E_BUCK1_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK2_OV] =3D { \ + .mask =3D P1_E_BUCK2_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK3_OV] =3D { \ + .mask =3D P1_E_BUCK3_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK4_OV] =3D { \ + .mask =3D P1_E_BUCK4_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK5_OV] =3D { \ + .mask =3D P1_E_BUCK5_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK6_OV] =3D { \ + .mask =3D P1_E_BUCK6_OV_MSK, \ + .reg_offset =3D 3, \ + }, \ + \ + [P1_E_BUCK1_UV] =3D { \ + .mask =3D P1_E_BUCK1_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK2_UV] =3D { \ + .mask =3D P1_E_BUCK2_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK3_UV] =3D { \ + .mask =3D P1_E_BUCK3_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK4_UV] =3D { \ + .mask =3D P1_E_BUCK4_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK5_UV] =3D { \ + .mask =3D P1_E_BUCK5_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK6_UV] =3D { \ + .mask =3D P1_E_BUCK6_UV_MSK, \ + .reg_offset =3D 4, \ + }, \ + \ + [P1_E_BUCK1_SC] =3D { \ + .mask =3D P1_E_BUCK1_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_BUCK2_SC] =3D { \ + .mask =3D P1_E_BUCK2_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_BUCK3_SC] =3D { \ + .mask =3D P1_E_BUCK3_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_BUCK4_SC] =3D { \ + .mask =3D P1_E_BUCK4_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_BUCK5_SC] =3D { \ + .mask =3D P1_E_BUCK5_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_BUCK6_SC] =3D { \ + .mask =3D P1_E_BUCK6_SC_MSK, \ + .reg_offset =3D 5, \ + }, \ + \ + [P1_E_PWRON_RINTR] =3D { \ + .mask =3D P1_E_PWRON_RINTR_MSK, \ + .reg_offset =3D 6, \ + }, \ + \ + [P1_E_PWRON_FINTR] =3D { \ + .mask =3D P1_E_PWRON_FINTR_MSK, \ + .reg_offset =3D 6, \ + }, \ + \ + [P1_E_PWRON_SINTR] =3D { \ + .mask =3D P1_E_PWRON_SINTR_MSK, \ + .reg_offset =3D 6, \ + }, \ + \ + [P1_E_PWRON_LINTR] =3D { \ + .mask =3D P1_E_PWRON_LINTR_MSK, \ + .reg_offset =3D 6, \ + }, \ + \ + [P1_E_PWRON_SDINTR] =3D { \ + .mask =3D P1_E_PWRON_SDINTR_MSK, \ + .reg_offset =3D 6, \ + }, \ + \ + [P1_E_VSYS_OV] =3D { \ + .mask =3D P1_E_VSYS_OV_MSK, \ + .reg_offset =3D 6, \ + }, \ +} + +#define P1_IRQ_CHIP_DESC \ +static const struct regmap_irq_chip p1_irq_chip =3D { \ + .name =3D "p1", \ + .irqs =3D p1_irqs, \ + .num_irqs =3D ARRAY_SIZE(p1_irqs), \ + .num_regs =3D 7, \ + .status_base =3D P1_E_STATUS_REG_BASE, \ + .mask_base =3D P1_E_EN_REG_BASE, \ + .ack_base =3D P1_E_STATUS_REG_BASE, \ + .init_ack_masked =3D true, \ +} + +#define P1_POWER_KEY_RESOURCES_DESC \ +static const struct resource p1_pwrkey_resources[] =3D { \ + DEFINE_RES_IRQ(P1_E_PWRON_RINTR), \ + DEFINE_RES_IRQ(P1_E_PWRON_FINTR), \ + DEFINE_RES_IRQ(P1_E_PWRON_SINTR), \ + DEFINE_RES_IRQ(P1_E_PWRON_LINTR), \ +} + +#define P1_RTC_RESOURCES_DESC \ +static const struct resource p1_rtc_resources[] =3D { \ + DEFINE_RES_IRQ(P1_E_ALARM), \ +} + +#define P1_MFD_CELL \ + static const struct mfd_cell p1[] =3D { \ + { \ + .name =3D "spacemit-regulator@p1", \ + .of_compatible =3D "pmic,p1-regulator", \ + }, \ + { \ + .name =3D "spacemit-pinctrl@p1", \ + .of_compatible =3D "pmic,p1-pinctrl", \ + }, \ + { \ + .name =3D "spacemit-pwrkey@p1", \ + .of_compatible =3D "pmic,p1-pwrkey", \ + .num_resources =3D ARRAY_SIZE(p1_pwrkey_resources), \ + .resources =3D &p1_pwrkey_resources[0], \ + }, \ + { \ + .name =3D "spacemit-rtc@p1", \ + .of_compatible =3D "pmic,p1-rtc", \ + .num_resources =3D ARRAY_SIZE(p1_rtc_resources), \ + .resources =3D &p1_rtc_resources[0], \ + }, \ + } + +#define P1_MFD_MATCH_DATA \ +static struct spacemit_pmic_match_data pmic_p1_match_data =3D { \ + .regmap_cfg =3D &p1_regmap_config, \ + .regmap_irq_chip =3D &p1_irq_chip, \ + .mfd_cells =3D p1, \ + .nr_cells =3D ARRAY_SIZE(p1), \ + .name =3D "p1", \ + .shutdown =3D { \ + .reg =3D P1_PWR_CTRL2, \ + .bit =3D P1_SW_SHUTDOWN_BIT_MSK, \ + }, \ + .reboot =3D { \ + .reg =3D P1_PWR_CTRL2, \ + .bit =3D P1_SW_RESET_BIT_MSK, \ + }, \ +} + +#endif // __SPACEMIT_P1_H__ diff --git a/include/linux/mfd/spacemit/spacemit-pmic.h b/include/linux/mfd= /spacemit/spacemit-pmic.h new file mode 100644 index 0000000000000000000000000000000000000000..808bbf1883c4ba019e552ffca94= a10e46036ad3a --- /dev/null +++ b/include/linux/mfd/spacemit/spacemit-pmic.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0-only + * + * Copyright (C) 2024 Troy Mitchell + */ +#ifndef __SPACEMIT_PMIC_H__ +#define __SPACEMIT_PMIC_H__ + +#include +#include +#include + +struct spacemit_pmic_match_data { + const struct regmap_config *regmap_cfg; + const struct regmap_irq_chip *regmap_irq_chip; + const struct mfd_cell *mfd_cells; + int nr_cells; + const char *name; + + struct { + unsigned char reg; + unsigned char bit; + } shutdown; + + struct { + unsigned int reg; + unsigned char bit; + } reboot; +}; + +struct spacemit_pmic { + struct i2c_client *i2c; + struct regmap_irq_chip_data *irq_data; + struct regmap *regmap; + const struct regmap_config *regmap_cfg; + const struct regmap_irq_chip *regmap_irq_chip; + const struct spacemit_pmic_match_data *match_data; +}; + +#endif // __SPACEMIT_PMIC_H__ --=20 2.34.1