From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 392A132C31C; Tue, 19 Aug 2025 11:48:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604096; cv=none; b=l/DLH52TeyDlpEvSzUlVTlKy0Vppx+lWVw66p18yHMQMzWJZ8CkUerdwjG1i39B0zwyMzClaauGSieMyq3f5UaD+6dDLqYF2LUzSfHsxXeb24mf8JBfH+tn84KxLofYMKSBm3CdMlUOX3mWj7dgSp8uHZNPWeEXoc2v28RM+m4A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604096; c=relaxed/simple; bh=HRZjz/PDQepfTTL+nFEADTvkRMXX9VLy0qMaACyKeNA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TUip0kpscSjS89+d26s8Nj4qXPs640KFqMadUV/NVfwjorkOtDjpmxjlxQJwj2L0zhro/XsJCdiiz9b0z5cjR6qSUpcuWkENe6qXAXxY+nioO5Gi396CSFejfT13cRWdkHywDupQiwFl3t4Hh7CbaOpxN2QShlI8kru3ttbgr0o= 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=jk0HNHsS; arc=none smtp.client-ip=209.85.210.179 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="jk0HNHsS" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-76e2e6038cfso6155837b3a.0; Tue, 19 Aug 2025 04:48:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604094; x=1756208894; 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=FBxHD5/WjVJ+H6FOdZLWHLUBELVzL67VAq9dX93Pcug=; b=jk0HNHsSPD55xOQPoJcSHffRN+UXKk6K4rX5pZLmXHoEOhZiHyFm0z2fIpXyXG4Kav 14mlqnA1Xann5jwf7p0NMnCuZLtFaY/cCKBs4g/eD5akXPc+QyWdlXBdsGZBt782goB1 o9MCEbKviFSlLoXnvDwyd6//XGjj1piyJ6jYNVA7v/N6xzwUja9Sls9q1M0Vg7xOscEM hKPxV2zb6v2MvEHNZ8TivPqirQjWdLuH2rYsZXwTxs6i2xprt784pSAwEs489prQTed4 tgsnhLiy89FaC/k8JzZKh6acaGpixb5YyVajBq4WQcWttiQ71mtY1Ctg0ZSknQmvPeSw AEWA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604094; x=1756208894; 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=FBxHD5/WjVJ+H6FOdZLWHLUBELVzL67VAq9dX93Pcug=; b=dVsvFXfK3r/8TLQ2MTbnhlhpGEA6x21jFmgOisQ7S+WJMmFh0RbV+xwyKf38l8PzMV uOKnKnY7CmiBhUK943dDu/Ugn+oMqMKFIN/6DJhuOkEcjeguiQH5Mo4feg7Xe4XT5FfB BVop8l6ylz7UO1XbYzURB7G4QDX6l75rwaipRZBRcCKP7Hz3SbrVDU2cjRfxFrArOSjX oYIGsfaO3C2cMl50jMBGeniObAQo09+YZgfnuWc+0dGqvtay/c1Lb7nM/k5Q3lWIqYYy EhhBWvEjdeug4xMH7lJcjm148wmiLnbi+PvKmeL5LDb7plkqWJI5NnWbkEbbS39bTQAS 4gaA== X-Forwarded-Encrypted: i=1; AJvYcCUruxYn3Q3gwNtPhcE1RGB6y/Y0MkoY1msAgI3C4YdroW99gM3+WEZTbe2D1TDDLZpC9y2djrtEO5nM@vger.kernel.org, AJvYcCUukHlACeLOmF+4zdXWycvFzLZgKTwQaUAGwMSmw9pNFf9bELmrYcL+pxiWdXToh+w9t8JbPp0I/2Cuh6U=@vger.kernel.org, AJvYcCVpjoj3e5IqjliiIntL/WJNgEuTxCQs4GeXoEUzJqfiXgbo2MAAFRk8WGiKTMwbGyY1ZOybVpbL7Beo@vger.kernel.org, AJvYcCVsHpb97lx6NiCMiH7WGtYpa2nTYbvCTMIMhqNGdNYAviE/0GLS/CKmCajpqu7lf9c4TSk03qZN6hVcLn8r@vger.kernel.org, AJvYcCW9ta2NPW5BiC+PiIxTQYxd2UHpoSImc6bGHRcSjo51WujONVwW07b3HtPaIQIdnw1ni71Jf15L0Psql7A=@vger.kernel.org X-Gm-Message-State: AOJu0YywdXBNvqldCz1w+s4fnn7UooMs0WVMzz4BTwFy5OIZUX2HM19F aOWHPR6/B4rxaD3ABy/LwIqqZBg3te//VcywoG4O5PW0LUpQU20Qf6tS X-Gm-Gg: ASbGnctKd/zHwUc5KjVRCzlgxJfaJbHUlE59AfTcY5Zgyne4pvoHAij0a0smefplTkF Tp6EJHu8dco7Bdvbbbiy0vYvPuJEUsrCRS1ACjHx98cBfMGtj8RmJ7afO9L737QKoTs18CdWbDI qxZg1x2f6jJt9OF44oDFVIdDwspwNdT5wp3IB6tBVY9w0jaQwLaYg5zc8xMWqD/8Upbc9TuM80N c4/bYdylnNX1ra/YxDN7KCTWpFjOVDfOnF9qrtcaKYqBg+LY1B/HwxaFLUfgYnvEe9wGlVrNCkd UyHDaoDVtWBhKs+ObIaqbqNCulSdueynKIREZ4wu1M0eOj53DtqkZCnlanbAPoCPzcS8j9pHODY Y0cteuGG4+wkYQQx6uk5FIwnnwgSNbvw5HmJQGnmOCIs6KPblJ4/2ZU9RtGNBQdwz0SJEOrkJNC x1OOtcB1AUlCPsfw8= X-Google-Smtp-Source: AGHT+IFjTYI7L8+Tc1wo47L6JKf/YYDxT3E6ajTWF/Wb72qSoljfkLbdAWqppksKIyFsvHI6OufsKg== X-Received: by 2002:a05:6a20:e02:b0:243:15b9:7662 with SMTP id adf61e73a8af0-24315b97a4fmr453322637.60.1755604094461; Tue, 19 Aug 2025 04:48:14 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:14 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:53 +1000 Subject: [PATCH 1/8] dt-bindings: rtc: Add Apple SMC RTC 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: <20250819-macsmc-subdevs-v1-1-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros , Mark Kettenis X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3470; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=qrLflRK+GGZAbgfPL/rFlU+6xRQThTOb/YM9H8lO9nI=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvLW/t9TY3X828uY+j3N4tfaNPs36lVfYtfSUT/vz aUtnny4o5SFQYyLQVZMkWVDk5DHbCO2m/0ilXth5rAygQxh4OIUgIlcnsbwi9lA+FqsqeAjBbeZ BrLPr01d/llLcuo8Nj1Wk7Ub5VyfODIyTOup3rVm68M7nlNTVf5xK6zZPSf11ynGC3bdnmIcSq7 buAA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Sven Peter Apple Silicon Macs (M1, etc.) have an RTC that is part of the PMU IC, but most of the PMU functionality is abstracted out by the SMC. An additional RTC offset stored inside NVMEM is required to compute the current date/time. Reviewed-by: Mark Kettenis Reviewed-by: Neal Gompa Signed-off-by: Sven Peter Signed-off-by: James Calligeros Reviewed-by: Rob Herring (Arm) --- .../bindings/mfd/apple,smc.yaml | 9 +++++++ .../bindings/rtc/apple,smc-rtc.yaml | 35 +++++++++++++++++++++++++ MAINTAINERS | 1 + 3 files changed, 45 insertions(+) diff --git a/Documentation/devicetree/bindings/mfd/apple,smc.yaml b/Documen= tation/devicetree/bindings/mfd/apple,smc.yaml index 8a10e270d421ecd703848f64af597de351fcfd74..38f077867bdeedba8a486a63e36= 6e9c943a75681 100644 --- a/Documentation/devicetree/bindings/mfd/apple,smc.yaml +++ b/Documentation/devicetree/bindings/mfd/apple,smc.yaml @@ -41,6 +41,9 @@ properties: reboot: $ref: /schemas/power/reset/apple,smc-reboot.yaml =20 + rtc: + $ref: /schemas/rtc/apple,smc-rtc.yaml + additionalProperties: false =20 required: @@ -75,5 +78,11 @@ examples: nvmem-cell-names =3D "shutdown_flag", "boot_stage", "boot_error_count", "panic_count"; }; + + rtc { + compatible =3D "apple,smc-rtc"; + nvmem-cells =3D <&rtc_offset>; + nvmem-cell-names =3D "rtc_offset"; + }; }; }; diff --git a/Documentation/devicetree/bindings/rtc/apple,smc-rtc.yaml b/Doc= umentation/devicetree/bindings/rtc/apple,smc-rtc.yaml new file mode 100644 index 0000000000000000000000000000000000000000..607b610665a28b3ea2e86bd90cb= 5f3f28ebac726 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/apple,smc-rtc.yaml @@ -0,0 +1,35 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/rtc/apple,smc-rtc.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Apple SMC RTC + +description: + Apple Silicon Macs (M1, etc.) have an RTC that is part of the PMU IC, + but most of the PMU functionality is abstracted out by the SMC. + An additional RTC offset stored inside NVMEM is required to compute + the current date/time. + +maintainers: + - Sven Peter + +properties: + compatible: + const: apple,smc-rtc + + nvmem-cells: + items: + - description: 48bit RTC offset, specified in 32768 (2^15) Hz clock = ticks + + nvmem-cell-names: + items: + - const: rtc_offset + +required: + - compatible + - nvmem-cells + - nvmem-cell-names + +additionalProperties: false diff --git a/MAINTAINERS b/MAINTAINERS index fe168477caa45799dfe07de2f54de6d6a1ce0615..aaef8634985b35f54de1123ebb4= 176602066d177 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2397,6 +2397,7 @@ F: Documentation/devicetree/bindings/pinctrl/apple,pi= nctrl.yaml F: Documentation/devicetree/bindings/power/apple* F: Documentation/devicetree/bindings/power/reset/apple,smc-reboot.yaml F: Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml +F: Documentation/devicetree/bindings/rtc/apple,smc-rtc.yaml F: Documentation/devicetree/bindings/spi/apple,spi.yaml F: Documentation/devicetree/bindings/spmi/apple,spmi.yaml F: Documentation/devicetree/bindings/watchdog/apple,wdt.yaml --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) (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 83C8B32C33B; Tue, 19 Aug 2025 11:48:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604104; cv=none; b=qH/jr1ViBPW+pB2Fxb6bvrKt13JzrtbJ6wwB5q9tDcRktmnMKb88AF+nc0gKUURQKgcITU0waAbvhPQ85Ep8HyUmXqJI18SVXKJNRN/n9xWey34ywRaUuLmH0+a0geCwHTo2JcPejSImQX77QXuFDAuI5k6K9U1kZUl4fLArBAE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604104; c=relaxed/simple; bh=mWy0xB+bKrtovuPUjduB4hi+a8nic/uPZscLfs9cSFk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GbHK+bzFxPdF/LXS8gnzvsMhdiWBnGsVyU/m+1lBuny5rkXoaBJ0wz6q92xprGxEolUbc3nxk8pUXW+MPBcnT8gN5eCcbsn8wuCCsdiwQq4jpzIQHb5R6RpIZtDtpwYlTZFa26cHzBUS5XretN4pa363U5fWZMEiECWruEb6D+I= 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=B0/OK+Gj; arc=none smtp.client-ip=209.85.210.182 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="B0/OK+Gj" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-76e2ea94c7cso4504484b3a.2; Tue, 19 Aug 2025 04:48:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604102; x=1756208902; 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=t/M+gZUFdVQachQlxFfSGPq/1I6HrXBG3slBhmGAHqo=; b=B0/OK+GjHsQs/hX/W7uKs2WTW4uAdDWer6zfb0pqW0nCqn4TK1yLgfHPPLdPaFsRlU qy22BjIJNu4hzf/LF8HTZertLiQ4kPkA1B+ZwksCdxnzoNXzULBEcz2cNnYH3QG/XA17 CKWYPpfMIMAZnjW07G7Y8wAt37kIElYfOzzTfOFvY6vlmh+1O0/GKlm4TFwoGtktUAD6 7ArWjgAhNI4vTGbjVMNxTUmS04Z0UIWSeYr9q+NTRrfkrzwiYkwAWFUhfLkcPO8Wt4Ep 0feeinQTZwDFUkTLfgFrLbeZNld8Z5MwaT67hhcF2izebnu1ZTF3YP6CkR4XUJdhrPfD IoiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604102; x=1756208902; 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=t/M+gZUFdVQachQlxFfSGPq/1I6HrXBG3slBhmGAHqo=; b=vDFArmpiS+9csYF5Ypi+gbt7CXpD+lcyBl4YeRYO02fgd1tPDcbZi0+Q3zyNHKDyD/ X/jVKurSebLga4oPLmm5hlJSdHbwi7ulxiJ7BObCcmQsSuJWXxvePyB4MKb7tMptk8Ny +/3T4HZm43nxAtlOuMv09RKc4kRfr8j9gYrPUke4ZCEMW1Ly7WMIobQpbq7CG9Vx1Qpb asTX8160ymX4puu8CsTaAE6nZiYjsp09hyKZpmq+OIfllc5xvngaiTSkkRWtnG3DcOvg Q0ksQRXAEtFGrZ7D4oFcCP06MGFDtLyaTag3avXZzrFa7GPOiIm4nwF/SR8rNHeb8lxv SNyQ== X-Forwarded-Encrypted: i=1; AJvYcCUAfCNjqFqhxLW/Z7pPw7B2aDNTxWz4aA9Pby4ziSHKrgdzjNRgFZlX4BbbctcPtcrJ3ol/w0xJ73J1@vger.kernel.org, AJvYcCVQMqKzmrmcoHrvcxTgamXO25YsIuOmiq0vxbWCtQnOF8XZ500/SY7F7HrKnN0rzwI3ZbwyeCtlhCr/@vger.kernel.org, AJvYcCXGUsU5ULHByIo5ta+7W9pdD1ZO9lOpr3rSqIPtXOvbN9/QQtDbNRLBRvfK1MBbkBrMI+xib+bn29HPgY0T@vger.kernel.org, AJvYcCXHHsynh2E1uWWHgJSWX7ymppLgSwMk3mxjmBYSMqYK4/IWrfb3wT6Mw8y/L7LWM3gCi6MOhlUjWSgeDH8=@vger.kernel.org, AJvYcCXzylAaq3CA2YgELNrF/NapuchRZ1P52ahM2bmwu80rT9LM3XcFhDJsxV+fJ6JwzNSyqmhcNmI8jm5V+04=@vger.kernel.org X-Gm-Message-State: AOJu0YzFdC+m5lzoSTeGGnxDEdW+pGV4+Mm9D8N5DUUViT5wY3X4ynLy KUXhV1yulHqEjNx+Z38mktWoYYbNpz3qzgY5gqoG4bxCWlkHr0HN3rJu X-Gm-Gg: ASbGncuPokgc89eETzhUWelx7Q1KafwsFiJKB3Pg8Ll35UjCZYwQRpYCFDY7Vofixt0 2lqvtmk9HK5thvNOw9FtdvMMw0+nBGhOp9TdLvQ/4NKBkcctdZZo37Igjo5gF9C/3TeaCZPOVm4 mrZjVMzrGUqPscEpHS7VjaBMbKxLzcuAnp9aPgNN36ir9E+dMUs0gDRn80J0QwM24fEcY6/r4mO DNLYGqGYKEs0cmqX//huPbcx9QuhYzUKtjC75ircJVqXOKbOovFrqL5xS5hwqUW6dLckmGw1VQe 9iCP6t3MqNZPEAGTjUKCnF6XLLVCeCe5+c9O6GQ5p/njGaaXIhWUg5yAMOLBghsB1NzENTz15hj aHNgwp23MVk/M/FuqNhUQ+H/aN8JD1FqJVbCCaKsGQKkWPB/liZ2iPydWI1ruc7GgVlu1svxzk4 vZsMv9yAkVBDziP73uAsfmDMM+Yw== X-Google-Smtp-Source: AGHT+IGNwhXnpLzY7G6aLzH7VonJ1EWLqph7nLjWaYiYNpFDS/pCs74uzWF5/Mdp1b2iNa2DcyRi+A== X-Received: by 2002:a05:6a20:9150:b0:240:489:be9a with SMTP id adf61e73a8af0-2430d3792f6mr3408076637.23.1755604101545; Tue, 19 Aug 2025 04:48:21 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:21 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:54 +1000 Subject: [PATCH 2/8] dt-bindings: hwmon: add Apple System Management Controller hwmon schema 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: <20250819-macsmc-subdevs-v1-2-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9287; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=mWy0xB+bKrtovuPUjduB4hi+a8nic/uPZscLfs9cSFk=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvLmfFgwfZ3CwRNyj5Y1i6Ws51gas4qh9Nzt3d/Pt q9KluC70VHKwiDGxSArpsiyoUnIY7YR281+kcq9MHNYmUCGMHBxCsBErB8xMjyKfTSrIdNo44ll WfGvP3zZUX//VMgn+aXHWb/nsBulfc1n+Cv34IeTp5CJnr9AyOpjTLdddXqfnD1eMEettp/vig3 TE14A X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 Apple Silicon devices integrate a vast array of sensors, monitoring current, power, temperature, and voltage across almost every part of the system. The sensors themselves are all connected to the System Management Controller (SMC). The SMC firmware exposes the data reported by these sensors via its standard FourCC-based key-value API. The SMC is also responsible for monitoring and controlling any fans connected to the system, exposing them in the same way. For reasons known only to Apple, each device exposes its sensors with an almost totally unique set of keys. This is true even for devices which share an SoC. An M1 Mac mini, for example, will report its core temperatures on different keys to an M1 MacBook Pro. Worse still, the SMC does not provide a way to enumerate the available keys at runtime, nor do the keys follow any sort of reasonable or consistent naming rules that could be used to deduce their purpose. We must therefore know which keys are present on any given device, and which function they serve, ahead of time. Add a schema so that we can describe the available sensors for a given Apple Silicon device in the Devicetree. Signed-off-by: James Calligeros --- .../bindings/hwmon/apple,smc-hwmon.yaml | 148 +++++++++++++++++++++++++ .../bindings/mfd/apple,smc.yaml | 45 ++++++++ 2 files changed, 193 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml b= /Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3ebc0463be4e1ce54005418feaa= 87ec7254dab6e --- /dev/null +++ b/Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml @@ -0,0 +1,148 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/hwmon/apple,smc-hwmon.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Apple SMC Hardware Monitoring + +description: + Apple's System Management Controller (SMC) exposes a vast array of + hardware monitoring sensors, including temperature probes, current and + voltage sense, power meters, and fan speeds. It also provides endpoints + to manually control the speed of each fan individually. Each Apple + Silicon device exposes a different set of endpoints via SMC keys. This + is true even when two machines share an SoC. The CPU core temperature + sensor keys on an M1 Mac mini are different to those on an M1 MacBook + Pro, for example. + +maintainers: + - James Calligeros + +properties: + compatible: + const: apple,smc-hwmon + + current: + description: SMC current sense endpoints + type: object + additionalProperties: false + patternProperties: + "^current-[A-Za-z0-9]{4}": + type: object + additionalProperties: false + required: + - apple,key-id + properties: + apple,key-id: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The SMC FourCC key of the desired current sensor. + Should match the node's suffix, but doesn't have to. + label: + $ref: /schemas/types.yaml#/definitions/string + description: Human-readable name for the sensor + + fan: + description: SMC fan control endpoints. A fan is made up of five + SMC keys - the fan's current speed, its minimum speed, its maximum + speed, a writeable target speed, and a writeable mode. The SMC will + automatically manage system fans unless a 1 is written to the fan's + mode key. + type: object + additionalProperties: false + patternProperties: + "^fan-[A-Za-z0-9]{4}": + type: object + additionalProperties: false + required: + - apple,key-id + properties: + apple,key-id: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The SMC FourCC key of the desired fan. This is the + main key, which reports the fan's current speed. Sould match + the node's suffix, but doesn't have to. + apple,fan-minimum: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The minimum speed the current fan can run at + apple,fan-maximum: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The maximum speed the current fan can run at + apple,fan-target: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: Writeable endpoint for setting desired fan speed + apple,fan-mode: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: Writeable endpoint to enable/disable manual fan + control + label: + $ref: /schemas/types.yaml#/definitions/string + description: Human-readable name for the sensor + + power: + description: SMC power meter endpoints + type: object + additionalProperties: false + patternProperties: + "^power-[A-Za-z0-9]{4}": + type: object + additionalProperties: false + required: + - apple,key-id + properties: + apple,key-id: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The SMC FourCC key of the desired power meter. + Should match the node's suffix, but doesn't have to. + label: + $ref: /schemas/types.yaml#/definitions/string + description: Human-readable name for the sensor + + temperature: + description: SMC temperature sensor endpoints + type: object + additionalProperties: false + patternProperties: + "^temperature-[A-Za-z0-9]{4}": + type: object + additionalProperties: false + required: + - apple,key-id + properties: + apple,key-id: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The SMC FourCC key of the desired temperature + sensor. Should match the node's suffix, but doesn't have to. + label: + $ref: /schemas/types.yaml#/definitions/string + description: Human-readable name for the sensor + + voltage: + description: SMC voltage sensor endpoints + type: object + additionalProperties: false + patternProperties: + "^voltage-[A-Za-z0-9]{4}": + type: object + additionalProperties: false + required: + - apple,key-id + properties: + apple,key-id: + $ref: /schemas/types.yaml#/definitions/string + pattern: "^[A-Za-z0-9]{4}" + description: The SMC FourCC key of the desired voltage + sensor. Should match the node's suffix, but doesn't have to. + label: + $ref: /schemas/types.yaml#/definitions/string + description: Human-readable name for the sensor + +additionalProperties: false diff --git a/Documentation/devicetree/bindings/mfd/apple,smc.yaml b/Documen= tation/devicetree/bindings/mfd/apple,smc.yaml index 38f077867bdeedba8a486a63e366e9c943a75681..370928bb42010edca17839faf0b= da4630611a7a2 100644 --- a/Documentation/devicetree/bindings/mfd/apple,smc.yaml +++ b/Documentation/devicetree/bindings/mfd/apple,smc.yaml @@ -44,6 +44,9 @@ properties: rtc: $ref: /schemas/rtc/apple,smc-rtc.yaml =20 + hwmon: + $ref: /schemas/hwmon/apple,smc-hwmon.yaml + additionalProperties: false =20 required: @@ -84,5 +87,47 @@ examples: nvmem-cells =3D <&rtc_offset>; nvmem-cell-names =3D "rtc_offset"; }; + + hwmon { + compatible =3D "apple,smc-hwmon"; + current { + current-ID0R { + apple,key-id =3D "ID0R"; + label =3D "AC Input Current"; + }; + }; + + fan { + fan-F0Ac { + apple,key-id =3D "F0Ac"; + apple,fan-minimum =3D "F0Mn"; + apple,fan-maximum =3D "F0Mx"; + apple,fan-target =3D "F0Tg"; + apple,fan-mode =3D "F0Md"; + label =3D "Fan 1"; + }; + }; + + power { + power-PSTR { + apple,key-id =3D "PSTR"; + label =3D "Total System Power"; + }; + }; + + temperature { + temperature-TW0P { + apple,key-id =3D "TW0P"; + label =3D "WiFi/BT Module Temperature"; + }; + }; + + voltage { + voltage-VD0R { + apple,key-id =3D "VD0R"; + label =3D "AC Input Voltage"; + }; + }; + }; }; }; --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (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 90F48335BA5; Tue, 19 Aug 2025 11:48:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604111; cv=none; b=DsKaNmXmM0CWToR+eCogUlx8tTpGDWAs68XoDrzzHiHLH0BqbLEZvXyAp+hL/Bc6LawzAvgOsc3zo61rILs0KJ9t54MaWEo2vDST5Mvlz4jlsSw5t//mbMmyECdnigw/D6I0q4GxPhfeYBtj53CoVWFbNaKgRT4hHje6xJwDmIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604111; c=relaxed/simple; bh=pX3l+comaf19sKydYjNQBjkS+qk6cZSHNtN2Sn3yVXw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OlqVy1RpK2Q8ft1/OzT7dbIH8sXNvGkG3D6pSKrbhN7ux2LiEEzuw8ruW1ye8LMnbc/PZk4HOOqWddxmzaFvbHT3ezGEcs7Aw1Zc8jKkBiiFr4kjHU8ddluhA9k7ryESI6Mg35R4i8NILus7/XYoVF27n2JOu3Q508oOeovpcX4= 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=fflq0caU; arc=none smtp.client-ip=209.85.216.50 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="fflq0caU" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-323266d2d9eso3851940a91.0; Tue, 19 Aug 2025 04:48:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604109; x=1756208909; 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=QxpNKKpp8zELIGdlUPJtYD+1S9kFQUpZJC758Xcu4Jg=; b=fflq0caUFQV+d2DO8LpGRD3p8Tw+IOhofWfB6k0CkgfL/1hvJLmF2wPNAuwf0eXqhK rV8a6XHYAnVSFcVaa92kSX1uzX4DxiP9BapQOGBAopGvfYo6L2E++34cYGaSb65XoJeI LtYhly0MuaENgB3TGCJWrtOi2vvdoKw2OKZGAA+B8Up5k6H0OAAWgSUBeWtWW1/X2INx irpA3SJNZfLrbqtZMcYnRLeeyoZlCqiPbDpI0MVRLL2CnyWg+1jidlAeQiYHyVaUXIqZ MFX0UbYTI7EnfpAOtRUtEZUvINTDmqBer577IA1vnaf87McGRh69MZEv3ZF9FB2ZQes2 dF5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604109; x=1756208909; 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=QxpNKKpp8zELIGdlUPJtYD+1S9kFQUpZJC758Xcu4Jg=; b=rZsiWY2HjQ5nHzWcwbQUBk12CUMKo3bfKvr8edzImMlQGx1eijwoW2NeVo/pscWYnU 7K733NmrVloN4Bn//RfORaGlTTIMNzi+cUYMLrRx/9pTiNjBnFcyX6kDdghP+RlMngtX D0yERNHU2oxje9C7PuugRAf06FTfnobfaBqxLUhJiUrPBy7Ge6osEXZmxeGj59KbY+rG GUZNawtKu+wgUkMeIevo9tumIfaVf3xlaphmI6XxV3g4AYONO9B3m2L7sNDIzKEvu/nU K8i8ZSpyOeZ6BWiM1vYPwt9dts2QhCd6k8xkVQG2gvemEpjis3OUxAC5WKebsdLHKoWX JyVA== X-Forwarded-Encrypted: i=1; AJvYcCVGl/ybJWObaXD6s4VoJ8uSaREMsF1ZMfSrnAd1okIxMurpKo7MRUfekSYtTkPZ247SXZfwsLzz9DB5@vger.kernel.org, AJvYcCWpBzFkEdpfiD+aV5mCuc4zMFvkybKY1wWsCpIoWeJzRXsn0teW4sYq5qPMfUs7MXvRrcxuky2kkA2pRbI+@vger.kernel.org, AJvYcCXQpwphd/+PnuStKk++a6rQU0Ud+ywEBJ0567LX+zkIlzb92SBvOcKxCPNKO8FbVgx9mqqZRp8BTedDcLs=@vger.kernel.org, AJvYcCXRxSR7rM6baj2eaNUeTuYgHFbuC4SjiPPdWFNjiVcj4FUy4T+/6H9b0Oda4Pfxg6RnVXgOUBWT65kltp8=@vger.kernel.org, AJvYcCXi127NIqFyTg4sF4WiQNDbb/my91F/WdsjS+9UoAgzc5lZrPPOB2OHh3bjAeJEF8h0B4NQ/vKfoijP@vger.kernel.org X-Gm-Message-State: AOJu0Yy6M2tPolZJnniWt8ZyXVK1XrOO0g/1Be1qeY9id8MO0y2kFQmw Rcb91ynw2QKK+xKHoZAbXY24FnpFPYB8NWmgdnU88eeWuThoi3tfRfa/ X-Gm-Gg: ASbGncs1rIQnQ+nVND5OREpT9pzWlw9aZKpfp4CYSjSiaVi+NB20+8B8U4TMYCrsoZb 0q5QfWo94yRmJq1D7H+IrIguUcHafUsE1U3+m6kLxCJJGJ3E50uMY4lNJvNgxw+FdWQMKxjmTVc poPqgcgKYw6YqelPmkm2wq7xnjQKnIXu+UCfS5JPsaHn9ANmCq8ReGvGqs7b4GleqEk8l9QvJou Gphj6YBX0+zU4I0HXeHnfMOTy6Vy4zQFhgIUbCl+UbbMepqwEvu5LGct7xCNn3gVgAtGj0hi6bc Z+NBze5keLpO3ExRnU0GBjwjB05qGjZSSCiNSyB7l70IfVAef7y38tx38G+GH0sqtbLv0XNRm+/ Dq8KzWnTUbznyORcRGvau+jLw1XBtct3BDLmkHL+sePP0jgKrmxWm21Y06zj0Xs52X9P7qE0YoJ w6R+alOs1fChM9ioQ= X-Google-Smtp-Source: AGHT+IGt4tZ3YizxmVlqLRL267iJJCoryKal9Swp4n/XAD46vspja1eGN8YTJcwrNfmlCxQ7ezZ3sg== X-Received: by 2002:a17:902:e413:b0:242:fc4f:9fe3 with SMTP id d9443c01a7336-245e049d597mr18379525ad.37.1755604108731; Tue, 19 Aug 2025 04:48:28 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:28 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:55 +1000 Subject: [PATCH 3/8] rtc: Add new rtc-macsmc driver for Apple Silicon Macs 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: <20250819-macsmc-subdevs-v1-3-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros , Hector Martin X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7724; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=aql9A5L2WO/MLIrJ+0awvsv3si3YNnYd6gxS7CPu6co=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvI3fDr4J2KH7IYtl0xnn9mrvvdU4jnzA2yfQj73J 6nrTnGc3lHKwiDGxSArpsiyoUnIY7YR281+kcq9MHNYmUCGMHBxCsBEUo8zMvRt1JjRejFRXdDS WkRk6q22eA6p0ukdBxunaArkzmVbls7I8N6y+PHb3wf/LD0SbHF4qez3MvGkjLVrI85ceLR6tjn PTG4A X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Hector Martin Apple Silicon Macs (M1, etc.) have an RTC that is part of the PMU IC, but most of the PMU functionality is abstracted out by the SMC. On T600x machines, the RTC counter must be accessed via the SMC to get full functionality, and it seems likely that future machines will move towards making SMC handle all RTC functionality. The SMC RTC counter access is implemented on all current machines as of the time of this writing, on firmware 12.x. However, the RTC offset (needed to set the time) is still only accessible via direct PMU access. To handle this, we expose the RTC offset as an NVMEM cell from the SPMI PMU device node, and this driver consumes that cell and uses it to compute/set the current time. Reviewed-by: Neal Gompa Signed-off-by: Hector Martin Signed-off-by: Sven Peter Signed-off-by: James Calligeros --- MAINTAINERS | 1 + drivers/mfd/macsmc.c | 1 + drivers/rtc/Kconfig | 11 ++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-macsmc.c | 141 +++++++++++++++++++++++++ 5 files changed, 155 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index aaef8634985b35f54de1123ebb4176602066d177..029117b921ea97d1276f5496ea0= 6a3f918929b20 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2421,6 +2421,7 @@ F: drivers/nvmem/apple-spmi-nvmem.c F: drivers/pinctrl/pinctrl-apple-gpio.c F: drivers/power/reset/macsmc-reboot.c F: drivers/pwm/pwm-apple.c +F: drivers/rtc/rtc-macsmc.c F: drivers/soc/apple/* F: drivers/spi/spi-apple.c F: drivers/spmi/spmi-apple-controller.c diff --git a/drivers/mfd/macsmc.c b/drivers/mfd/macsmc.c index 870c8b2028a8fc0e905c8934c2636824cbe5d527..59be894460d33afa75492763088= 1532b548b7ad8 100644 --- a/drivers/mfd/macsmc.c +++ b/drivers/mfd/macsmc.c @@ -47,6 +47,7 @@ static const struct mfd_cell apple_smc_devs[] =3D { MFD_CELL_OF("macsmc-gpio", NULL, NULL, 0, 0, "apple,smc-gpio"), MFD_CELL_OF("macsmc-reboot", NULL, NULL, 0, 0, "apple,smc-reboot"), + MFD_CELL_OF("macsmc-rtc", NULL, NULL, 0, 0, "apple,smc-rtc"), }; =20 static int apple_smc_cmd_locked(struct apple_smc *smc, u64 cmd, u64 arg, diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 64f6e9756aff4a1f6f6c50f9b4fc2140f66a8578..d28a46a89c85e6b30b402aec155= e8972ed2aaa8e 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -2068,6 +2068,17 @@ config RTC_DRV_WILCO_EC This can also be built as a module. If so, the module will be named "rtc_wilco_ec". =20 +config RTC_DRV_MACSMC + tristate "Apple Mac System Management Controller RTC" + depends on MFD_MACSMC + help + If you say yes here you get support for RTC functions + inside Apple SPMI PMUs accessed through the SoC's + System Management Controller + + To compile this driver as a module, choose M here: the + module will be called rtc-macsmc. + config RTC_DRV_MSC313 tristate "MStar MSC313 RTC" depends on ARCH_MSTARV7 || COMPILE_TEST diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 789bddfea99d8fcd024566891c37ee73e527cf93..bcb43b5878a562454986cbb9ab8= cc45cec248dda 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -93,6 +93,7 @@ obj-$(CONFIG_RTC_DRV_M48T35) +=3D rtc-m48t35.o obj-$(CONFIG_RTC_DRV_M48T59) +=3D rtc-m48t59.o obj-$(CONFIG_RTC_DRV_M48T86) +=3D rtc-m48t86.o obj-$(CONFIG_RTC_DRV_MA35D1) +=3D rtc-ma35d1.o +obj-$(CONFIG_RTC_DRV_MACSMC) +=3D rtc-macsmc.o obj-$(CONFIG_RTC_DRV_MAX31335) +=3D rtc-max31335.o obj-$(CONFIG_RTC_DRV_MAX6900) +=3D rtc-max6900.o obj-$(CONFIG_RTC_DRV_MAX6902) +=3D rtc-max6902.o diff --git a/drivers/rtc/rtc-macsmc.c b/drivers/rtc/rtc-macsmc.c new file mode 100644 index 0000000000000000000000000000000000000000..05e360277f630f3368b2856aade= f1f2b96426c37 --- /dev/null +++ b/drivers/rtc/rtc-macsmc.c @@ -0,0 +1,141 @@ +// SPDX-License-Identifier: GPL-2.0-only OR MIT +/* + * Apple SMC RTC driver + * Copyright The Asahi Linux Contributors + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* 48-bit RTC */ +#define RTC_BYTES 6 +#define RTC_BITS (8 * RTC_BYTES) + +/* 32768 Hz clock */ +#define RTC_SEC_SHIFT 15 + +struct macsmc_rtc { + struct device *dev; + struct apple_smc *smc; + struct rtc_device *rtc_dev; + struct nvmem_cell *rtc_offset; +}; + +static int macsmc_rtc_get_time(struct device *dev, struct rtc_time *tm) +{ + struct macsmc_rtc *rtc =3D dev_get_drvdata(dev); + u64 ctr =3D 0, off =3D 0; + time64_t now; + void *p_off; + size_t len; + int ret; + + ret =3D apple_smc_read(rtc->smc, SMC_KEY(CLKM), &ctr, RTC_BYTES); + if (ret < 0) + return ret; + if (ret !=3D RTC_BYTES) + return -EIO; + + p_off =3D nvmem_cell_read(rtc->rtc_offset, &len); + if (IS_ERR(p_off)) + return PTR_ERR(p_off); + if (len < RTC_BYTES) { + kfree(p_off); + return -EIO; + } + + memcpy(&off, p_off, RTC_BYTES); + kfree(p_off); + + /* Sign extend from 48 to 64 bits, then arithmetic shift right 15 bits to= get seconds */ + now =3D sign_extend64(ctr + off, RTC_BITS - 1) >> RTC_SEC_SHIFT; + rtc_time64_to_tm(now, tm); + + return ret; +} + +static int macsmc_rtc_set_time(struct device *dev, struct rtc_time *tm) +{ + struct macsmc_rtc *rtc =3D dev_get_drvdata(dev); + u64 ctr =3D 0, off =3D 0; + int ret; + + ret =3D apple_smc_read(rtc->smc, SMC_KEY(CLKM), &ctr, RTC_BYTES); + if (ret < 0) + return ret; + if (ret !=3D RTC_BYTES) + return -EIO; + + /* This sets the offset such that the set second begins now */ + off =3D (rtc_tm_to_time64(tm) << RTC_SEC_SHIFT) - ctr; + return nvmem_cell_write(rtc->rtc_offset, &off, RTC_BYTES); +} + +static const struct rtc_class_ops macsmc_rtc_ops =3D { + .read_time =3D macsmc_rtc_get_time, + .set_time =3D macsmc_rtc_set_time, +}; + +static int macsmc_rtc_probe(struct platform_device *pdev) +{ + struct apple_smc *smc =3D dev_get_drvdata(pdev->dev.parent); + struct macsmc_rtc *rtc; + + /* + * MFD will probe this device even without a node in the device tree, + * thus bail out early if the SMC on the current machines does not + * support RTC and has no node in the device tree. + */ + if (!pdev->dev.of_node) + return -ENODEV; + + rtc =3D devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); + if (!rtc) + return -ENOMEM; + + rtc->dev =3D &pdev->dev; + rtc->smc =3D smc; + + rtc->rtc_offset =3D devm_nvmem_cell_get(&pdev->dev, "rtc_offset"); + if (IS_ERR(rtc->rtc_offset)) + return dev_err_probe(&pdev->dev, PTR_ERR(rtc->rtc_offset), + "Failed to get rtc_offset NVMEM cell\n"); + + rtc->rtc_dev =3D devm_rtc_allocate_device(&pdev->dev); + if (IS_ERR(rtc->rtc_dev)) + return PTR_ERR(rtc->rtc_dev); + + rtc->rtc_dev->ops =3D &macsmc_rtc_ops; + rtc->rtc_dev->range_min =3D S64_MIN >> (RTC_SEC_SHIFT + (64 - RTC_BITS)); + rtc->rtc_dev->range_max =3D S64_MAX >> (RTC_SEC_SHIFT + (64 - RTC_BITS)); + + platform_set_drvdata(pdev, rtc); + + return devm_rtc_register_device(rtc->rtc_dev); +} + +static const struct of_device_id macsmc_rtc_of_table[] =3D { + { .compatible =3D "apple,smc-rtc", }, + {} +}; +MODULE_DEVICE_TABLE(of, macsmc_rtc_of_table); + +static struct platform_driver macsmc_rtc_driver =3D { + .driver =3D { + .name =3D "macsmc-rtc", + .of_match_table =3D macsmc_rtc_of_table, + }, + .probe =3D macsmc_rtc_probe, +}; +module_platform_driver(macsmc_rtc_driver); + +MODULE_LICENSE("Dual MIT/GPL"); +MODULE_DESCRIPTION("Apple SMC RTC driver"); +MODULE_AUTHOR("Hector Martin "); --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 D16C03314CC; Tue, 19 Aug 2025 11:48:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604119; cv=none; b=IJs6StJ/aDoe70emwieX5IfMi/RTbggcEK+aok1yVYW+bIlysLScTPQayZVK0DdKAcaXMvjvYLrnyhT0qrk6n8fYawn58PaP2IMkySRYF89ZMcq2bLmhVLhjYCFhIf6jSzt74LRwMqDwiFjmvP/ix+OSsiJ38tpbtoEyhzLxM2E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604119; c=relaxed/simple; bh=cpgXtyIFSas689lNECu7v9+wpYgV0YcBGXtJtZ14aAE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=n29BApy5dLerOZN4M4VS1YctEM6roLeekQdetPgp2Nc4HUpdUJ+jCUlwv+hGmRVg7dsu1Hm8cdv3vkdFpWoN91waeRQncL3eGJ2nnjh8D8R5AVj1h6xrk9Fia3AEVLRP6VVTskMtgvN4QPRAkgPgm0djMaYBvMvLVAPrYwhhhs4= 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=THdKwJmP; arc=none smtp.client-ip=209.85.210.177 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="THdKwJmP" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-76e2e629fc4so5292466b3a.0; Tue, 19 Aug 2025 04:48:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604116; x=1756208916; 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=dz0BPAKr/oe6B5Nr94B5KfH5jnTBdm8lrJ9/mXdIBV8=; b=THdKwJmPocqdJFHVPFcjWmYyUUw4WycMhZQISJWt4+8tCwBKzKONlDg11JrbJdT2Kb gjTmJ+ttN9lgGrAx06GjoXZgT+adbOy7VirvewbNrtaM9knStGZeMniVXHnoNRwQyEWV U22SoFbl0IHVhAimgFRazEZftNX5+IXBtFnJ91AsoP4hW0CPNxcV0fMUMHsgPss8HP7e 3ZDMccFO55zh1eGwa3Kj/EvB3X1s8Z6PK3uzmf2IPladBJtq/wBNwGffVNrCp45w4I1S GyD82gu6aWnspIAMTYWv9fW0V0gbdtK+6EmtQu9yZG79dkFEHWI0la8nRzy0nuEJV6XX tB2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604116; x=1756208916; 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=dz0BPAKr/oe6B5Nr94B5KfH5jnTBdm8lrJ9/mXdIBV8=; b=Syu6sE6foMuqTgkcPXUu8eex00yX4UIPBp0esgcKpJfi8rzmBD31FCoiLG8DdK8wvl UFW6W2cPQpirVMqE/fzZpm5BnyDX+NBHVo+8DZMsWwQ/6Co5Zw5ZBRC2U5amofPFRAzn hT3Q+W+iY8iuD5QEdp8NalXrK8WsqO9aNKciqTM9soUTwD3c9dpo+cjq8v7TRcm2usiH GmLScPEXkYN4+kqztRKs2J7nllWI5x6MXkNnSuqKI6My4xKjAi480/vH2zm+ZhuY4l8p mVeMY3QSEzPKTA5emvKM0OwmIUW6j4KG0nAN5wdSaik+wL6WkBL64fhITMeSlFfZqBpR muag== X-Forwarded-Encrypted: i=1; AJvYcCU3K6xQf/Gus4/AOEJA5jODSekAMo5wBF+92ZYlT7eYhYMVwAoka0SBau1hfIRakr0abu0bsTkd53P2@vger.kernel.org, AJvYcCW/0u2Z8wxEGPSOD33qmEqfV0jHTeKimcpLYFsGgEkctp3UbRqO1V3dmLLkx4fopj2ji/OJHUbKNdJA@vger.kernel.org, AJvYcCWYLyEU1luOeIHIVabl0JhFHkNAwn3plFlqCw1giNfdA2rjaftL4nQj/T31njKGkmKPhe/hN1x6eYCRsYsI@vger.kernel.org, AJvYcCWdAF/uPoHtgTXN62QBSiOXbTdYdbW/AJcONzNMItJheAHnM0jMChr1f9gN26Bj0THj5v4K28vj/rbjYlQ=@vger.kernel.org, AJvYcCWtuVN7t1yA1UhUqt1R5dfTVZbs571MkNOlAq247pANbK/eSkhk73VaNaS3lNoQUlGsEPr34psu27gdtE0=@vger.kernel.org X-Gm-Message-State: AOJu0YwDeXMHc+j+AVLbSJ3sTFaduCJ2d8YxDCccK3lqXzlUgf1kZw5Z a/Ofv2qd9S+7k6gup/5Iwto/1HJ//CCo4nHA69oENKLQ9jsfxgMFB58Y X-Gm-Gg: ASbGncsWK3PyVzV0FQLTLiVDN0eC+n86mRe+Lg+P+9CUZuK3l2h1kBL7vtq/tPTotW7 yuTMovJDPzEbyY9RR5zuJ8JGD4VnQkrSfyMyiberzxuxq1+ShdLfdUKhQS6BsWR/Zv716lG7olU kL17uiSk1vr46jWJVImThEYTOD9kJaqe+Z74fBRq/qYHEgiR+JFiR/KYpcVDdHZzc/WjsJPvvT8 5lN35wIM50O28Gy2NGLmjnuuQkYK3Cee6pUrX9DrggqIWS/pR6u/ReHuUjK0FkUSe2j3vML9W+W dDB8XxQqmuenfIMZii/Va74YjXXHCDQwV79+B6ACieyVc8tfBRONFmjwuGN6jYsmbtK3iddhFnt oksE34gbNXEZproEEd6VIn9NRgDtxITTU7VJ+c6X5Nd481Hcl4e0b7B/NtIedjHP0xRbTN2KrFW lGj5WEqfnfHSjHG52jCk1zPRCRQQ== X-Google-Smtp-Source: AGHT+IHgHEo3dkkdezD+hHGPMrwPcRunym2Arw48dolBS92yAclI0eQwBuGOkPMkE6U4YGKziooy0g== X-Received: by 2002:a05:6a21:6d81:b0:240:2234:6860 with SMTP id adf61e73a8af0-2430d491ccfmr3229856637.32.1755604115898; Tue, 19 Aug 2025 04:48:35 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:35 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:56 +1000 Subject: [PATCH 4/8] hwmon: Add Apple Silicon SMC hwmon driver 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: <20250819-macsmc-subdevs-v1-4-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=28186; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=cpgXtyIFSas689lNECu7v9+wpYgV0YcBGXtJtZ14aAE=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvIdVxfkKfuvrruuv57xyBUmx0zZWY9Wf/x7p3pP+ Du74AjPjlIWBjEuBlkxRZYNTUIes43YbvaLVO6FmcPKBDKEgYtTACaSvIXhn9WX3izzfxcd3z+w bw/pVur4PUlGQncpa+/NfbP5Mw4b2jH8M/Z79vRDzaOcGwuVcsTUHVheKa9/emV1q7rOE65QpUf urAA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 The System Management Controller on Apple Silicon devices is responsible for integrating and exposing the data reported by the vast array of hardware monitoring sensors present on these devices. It is also responsible for fan control, and allows users to manually set fan speeds if they so desire. Add a hwmon driver to expose current, power, temperature, and voltage monitoring sensors, as well as fan speed monitoring and control via the SMC on Apple Silicon devices. The SMC firmware has no consistency between devices, even when they share an SoC. The FourCC keys used to access sensors are almost random. An M1 Mac mini will have different FourCCs for its CPU core temperature sensors to an M1 MacBook Pro, for example. For this reason, the valid sensors for a given device are specified in a child of the SMC Devicetree node. The driver uses this information to determine which sensors to make available at runtime. Co-developed-by: Janne Grunau Signed-off-by: Janne Grunau Signed-off-by: James Calligeros --- MAINTAINERS | 2 + drivers/hwmon/Kconfig | 12 + drivers/hwmon/Makefile | 1 + drivers/hwmon/macsmc_hwmon.c | 858 +++++++++++++++++++++++++ drivers/mfd/macsmc.c | 1 + 5 files changed, 874 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 029117b921ea97d1276f5496ea06a3f918929b20..2eb23522654dd050262eb06e077= 587030cc335aa 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2380,6 +2380,7 @@ F: Documentation/devicetree/bindings/cpufreq/apple,cl= uster-cpufreq.yaml F: Documentation/devicetree/bindings/dma/apple,admac.yaml F: Documentation/devicetree/bindings/gpio/apple,smc-gpio.yaml F: Documentation/devicetree/bindings/gpu/apple,agx.yaml +F: Documentation/devicetree/bindings/hwmon/apple,smc-hwmon.yaml F: Documentation/devicetree/bindings/i2c/apple,i2c.yaml F: Documentation/devicetree/bindings/input/touchscreen/apple,z2-multitouch= .yaml F: Documentation/devicetree/bindings/interrupt-controller/apple,* @@ -2407,6 +2408,7 @@ F: drivers/clk/clk-apple-nco.c F: drivers/cpufreq/apple-soc-cpufreq.c F: drivers/dma/apple-admac.c F: drivers/gpio/gpio-macsmc.c +F: drivers/hwmon/macsmc_hwmon.c F: drivers/pmdomain/apple/ F: drivers/i2c/busses/i2c-pasemi-core.c F: drivers/i2c/busses/i2c-pasemi-platform.c diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index 9d28fcf7cd2a6f9e2f54694a717bd85ff4047b46..1ca6db71e4d9da32717fd14487c= 10944433ada41 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1164,6 +1164,18 @@ config SENSORS_LTQ_CPUTEMP If you say yes here you get support for the temperature sensor inside your CPU. =20 +config SENSORS_MACSMC_HWMON + tristate "Apple SMC (Apple Silicon)" + depends on MFD_MACSMC && OF + help + This driver enables hwmon support for current, power, temperature, + and voltage sensors, as well as fan speed reporting and control + on Apple Silicon devices. Say Y here if you have an Apple Silicon + device. + + This driver can also be built as a module. If so, the module will + be called macsmc_hwmon. + config SENSORS_MAX1111 tristate "Maxim MAX1111 Serial 8-bit ADC chip and compatibles" depends on SPI_MASTER diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index cd8bc4752b4dbf015c6eb46157626f4e8f87dfae..80fc8447aff15b3b8e8583dc755= c8accb3b6a93e 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -147,6 +147,7 @@ obj-$(CONFIG_SENSORS_LTC4260) +=3D ltc4260.o obj-$(CONFIG_SENSORS_LTC4261) +=3D ltc4261.o obj-$(CONFIG_SENSORS_LTC4282) +=3D ltc4282.o obj-$(CONFIG_SENSORS_LTQ_CPUTEMP) +=3D ltq-cputemp.o +obj-$(CONFIG_SENSORS_MACSMC_HWMON) +=3D macsmc_hwmon.o obj-$(CONFIG_SENSORS_MAX1111) +=3D max1111.o obj-$(CONFIG_SENSORS_MAX127) +=3D max127.o obj-$(CONFIG_SENSORS_MAX16065) +=3D max16065.o diff --git a/drivers/hwmon/macsmc_hwmon.c b/drivers/hwmon/macsmc_hwmon.c new file mode 100644 index 0000000000000000000000000000000000000000..543a1ab50fc3587cc88625ec703= d92a7e7db0825 --- /dev/null +++ b/drivers/hwmon/macsmc_hwmon.c @@ -0,0 +1,858 @@ +// SPDX-License-Identifier: GPL-2.0-only OR MIT +/* + * Apple SMC hwmon driver for Apple Silicon platforms + * + * The System Management Controller on Apple Silicon devices is responsibl= e for + * measuring data from sensors across the SoC and machine. These include p= ower, + * temperature, voltage and current sensors. Some "sensors" actually expose + * derived values. An example of this is the key PHPC, which is an estimate + * of the heat energy being dissipated by the SoC. + * + * While each SoC only has one SMC variant, each platform exposes a differ= ent + * set of sensors. For example, M1 MacBooks expose battery telemetry senso= rs + * which are not present on the M1 Mac mini. For this reason, the available + * sensors for a given platform are described in the device tree in a child + * node of the SMC device. We must walk this list of available sensors and + * populate the required hwmon data structures at runtime. + * + * Originally based on a concept by Jean-Francois Bortolotti + * + * Copyright The Asahi Linux Contributors + */ + +#include +#include +#include +#include +#include +#include + +#define MAX_LABEL_LENGTH 32 +#define NUM_SENSOR_TYPES 5 /* temp, volt, current, power, fan */ + +#define FLT_EXP_BIAS 127 +#define FLT_EXP_MASK GENMASK(30, 23) +#define FLT_MANT_BIAS 23 +#define FLT_MANT_MASK GENMASK(22, 0) +#define FLT_SIGN_MASK BIT(31) + +static bool melt_my_mac; +module_param_unsafe(melt_my_mac, bool, 0644); +MODULE_PARM_DESC( + melt_my_mac, + "Override the SMC to set your own fan speeds on supported machines"); + +struct macsmc_hwmon_sensor { + struct apple_smc_key_info info; + smc_key macsmc_key; + char label[MAX_LABEL_LENGTH]; +}; + +struct macsmc_hwmon_fan { + struct macsmc_hwmon_sensor now; + struct macsmc_hwmon_sensor min; + struct macsmc_hwmon_sensor max; + struct macsmc_hwmon_sensor set; + struct macsmc_hwmon_sensor mode; + char label[MAX_LABEL_LENGTH]; + u32 attrs; + bool manual; +}; + +struct macsmc_hwmon_sensors { + struct hwmon_channel_info channel_info; + struct macsmc_hwmon_sensor *sensors; + u32 n_sensors; +}; + +struct macsmc_hwmon_fans { + struct hwmon_channel_info channel_info; + struct macsmc_hwmon_fan *fans; + u32 n_fans; +}; + +struct macsmc_hwmon { + struct device *dev; + struct apple_smc *smc; + struct device *hwmon_dev; + struct hwmon_chip_info chip_info; + /* Chip + sensor types + NULL */ + const struct hwmon_channel_info *channel_infos[1 + NUM_SENSOR_TYPES + 1]; + struct macsmc_hwmon_sensors temp; + struct macsmc_hwmon_sensors volt; + struct macsmc_hwmon_sensors curr; + struct macsmc_hwmon_sensors power; + struct macsmc_hwmon_fans fan; +}; + +static int macsmc_hwmon_read_label(struct device *dev, + enum hwmon_sensor_types type, u32 attr, + int channel, const char **str) +{ + struct macsmc_hwmon *hwmon =3D dev_get_drvdata(dev); + + switch (type) { + case hwmon_temp: + if (channel >=3D hwmon->temp.n_sensors) + return -EINVAL; + *str =3D hwmon->temp.sensors[channel].label; + break; + case hwmon_in: + if (channel >=3D hwmon->volt.n_sensors) + return -EINVAL; + *str =3D hwmon->volt.sensors[channel].label; + break; + case hwmon_curr: + if (channel >=3D hwmon->curr.n_sensors) + return -EINVAL; + *str =3D hwmon->curr.sensors[channel].label; + break; + case hwmon_power: + if (channel >=3D hwmon->power.n_sensors) + return -EINVAL; + *str =3D hwmon->power.sensors[channel].label; + break; + case hwmon_fan: + if (channel >=3D hwmon->fan.n_fans) + return -EINVAL; + *str =3D hwmon->fan.fans[channel].label; + break; + default: + return -EOPNOTSUPP; + } + + return 0; +} + +/* + * A number of sensors report data in a 48.16 fixed-point decimal format t= hat is + * not used by any other function of the SMC. + */ +static int macsmc_hwmon_read_ioft_scaled(struct apple_smc *smc, smc_key ke= y, + u64 *p, int scale) +{ + u64 val; + int ret; + + ret =3D apple_smc_read_u64(smc, key, &val); + if (ret < 0) + return ret; + + *p =3D mult_frac(val, scale, 65536); + + return 0; +} + +/* + * Many sensors report their data as IEEE-754 floats. No other SMC functio= n uses + * them. + */ +static int macsmc_hwmon_read_f32_scaled(struct apple_smc *smc, smc_key key, + int *p, int scale) +{ + u32 fval; + u64 val; + int ret, exp; + + ret =3D apple_smc_read_u32(smc, key, &fval); + if (ret < 0) + return ret; + + val =3D ((u64)((fval & FLT_MANT_MASK) | BIT(23))); + exp =3D ((fval >> 23) & 0xff) - FLT_EXP_BIAS - FLT_MANT_BIAS; + if (scale < 0) { + val <<=3D 32; + exp -=3D 32; + val /=3D -scale; + } else { + val *=3D scale; + } + + if (exp > 63) + val =3D U64_MAX; + else if (exp < -63) + val =3D 0; + else if (exp < 0) + val >>=3D -exp; + else if (exp !=3D 0 && (val & ~((1UL << (64 - exp)) - 1))) /* overflow */ + val =3D U64_MAX; + else + val <<=3D exp; + + if (fval & FLT_SIGN_MASK) { + if (val > (-(s64)INT_MIN)) + *p =3D INT_MIN; + else + *p =3D -val; + } else { + if (val > INT_MAX) + *p =3D INT_MAX; + else + *p =3D val; + } + + return 0; +} + +/* + * The SMC has keys of multiple types, denoted by a FourCC of the same for= mat + * as the key ID. We don't know what data type a key encodes until we poke= at it. + */ +static int macsmc_hwmon_read_key(struct apple_smc *smc, + struct macsmc_hwmon_sensor *sensor, int scale, + long *val) +{ + int ret =3D 0; + + switch (sensor->info.type_code) { + /* 32-bit IEEE 754 float */ + case _SMC_KEY("flt "): { + u32 flt_ =3D 0; + + ret =3D macsmc_hwmon_read_f32_scaled(smc, sensor->macsmc_key, + &flt_, scale); + *val =3D flt_; + break; + } + /* 48.16 fixed point decimal */ + case _SMC_KEY("ioft"): { + u64 ioft =3D 0; + + ret =3D macsmc_hwmon_read_ioft_scaled(smc, sensor->macsmc_key, + &ioft, scale); + *val =3D (long)ioft; + break; + } + default: + return -EOPNOTSUPP; + } + + if (ret) + return -EINVAL; + + return 0; +} + +static int macsmc_hwmon_write_f32_scaled(struct apple_smc *smc, smc_key ke= y, + int value, int scale) +{ + u64 val; + u32 fval =3D 0; + int exp =3D 0, neg; + + val =3D abs(value); + neg =3D val !=3D value; + + if (scale > 1) { + val <<=3D 32; + exp =3D 32; + val /=3D scale; + } else if (scale < 1) { + val *=3D -scale; + } + + if (val) { + int msb =3D __fls(val) - exp; + + if (msb > 23) { + val >>=3D msb - 23; + exp -=3D msb - 23; + } else if (msb < 23) { + val <<=3D 23 - msb; + exp +=3D msb; + } + + fval =3D FIELD_PREP(FLT_SIGN_MASK, neg) | + FIELD_PREP(FLT_EXP_MASK, exp + FLT_EXP_BIAS) | + FIELD_PREP(FLT_MANT_MASK, val); + } + + return apple_smc_write_u32(smc, key, fval); +} + +static int macsmc_hwmon_write_key(struct apple_smc *smc, + struct macsmc_hwmon_sensor *sensor, long val, + int scale) +{ + switch (sensor->info.type_code) { + /* 32-bit IEEE 754 float */ + case _SMC_KEY("flt "): + return macsmc_hwmon_write_f32_scaled(smc, sensor->macsmc_key, + val, scale); + /* unsigned 8-bit integer */ + case _SMC_KEY("ui8 "): + return apple_smc_write_u8(smc, sensor->macsmc_key, val); + default: + return -EOPNOTSUPP; + } +} + +static int macsmc_hwmon_read_fan(struct macsmc_hwmon *hwmon, u32 attr, int= chan, + long *val) +{ + if (!(hwmon->fan.fans[chan].attrs & BIT(attr))) + return -EINVAL; + + switch (attr) { + case hwmon_fan_input: + return macsmc_hwmon_read_key( + hwmon->smc, &hwmon->fan.fans[chan].now, 1, val); + case hwmon_fan_min: + return macsmc_hwmon_read_key( + hwmon->smc, &hwmon->fan.fans[chan].min, 1, val); + case hwmon_fan_max: + return macsmc_hwmon_read_key( + hwmon->smc, &hwmon->fan.fans[chan].max, 1, val); + case hwmon_fan_target: + return macsmc_hwmon_read_key( + hwmon->smc, &hwmon->fan.fans[chan].set, 1, val); + default: + return -EINVAL; + } +} + +static int macsmc_hwmon_write_fan(struct device *dev, u32 attr, int channe= l, + long val) +{ + struct macsmc_hwmon *hwmon =3D dev_get_drvdata(dev); + int ret =3D 0; + long min =3D 0; + long max =3D 0; + + if (!melt_my_mac || hwmon->fan.fans[channel].mode.macsmc_key =3D=3D 0) + return -EOPNOTSUPP; + + if ((channel >=3D hwmon->fan.n_fans) || + !(hwmon->fan.fans[channel].attrs & BIT(attr)) || + (attr !=3D hwmon_fan_target)) + return -EINVAL; + + /* + * The SMC does no sanity checks on requested fan speeds, so we need to. + */ + ret =3D macsmc_hwmon_read_key(hwmon->smc, &hwmon->fan.fans[channel].min, + 1, &min); + if (ret) + return ret; + ret =3D macsmc_hwmon_read_key(hwmon->smc, &hwmon->fan.fans[channel].max, + 1, &max); + if (ret) + return ret; + + if (val >=3D min && val <=3D max) { + if (!hwmon->fan.fans[channel].manual) { + /* Write 1 to mode key for manual control */ + ret =3D macsmc_hwmon_write_key( + hwmon->smc, &hwmon->fan.fans[channel].mode, 1, + 1); + if (ret < 0) + return ret; + + hwmon->fan.fans[channel].manual =3D true; + dev_info( + dev, + "Fan %d now under manual control! Set target speed to 0 for automatic = control.\n", + channel + 1); + } + return macsmc_hwmon_write_key( + hwmon->smc, &hwmon->fan.fans[channel].set, val, 1); + } else if (!val) { + if (hwmon->fan.fans[channel].manual) { + dev_info(dev, "Returning control of fan %d to SMC.\n", + channel + 1); + ret =3D macsmc_hwmon_write_key( + hwmon->smc, &hwmon->fan.fans[channel].mode, 0, + 1); + if (ret < 0) + return ret; + + hwmon->fan.fans[channel].manual =3D false; + } + } else { + dev_err(dev, "Requested fan speed %ld out of range [%ld, %ld]", + val, min, max); + return -EINVAL; + } + + return 0; +} + +static int macsmc_hwmon_read(struct device *dev, enum hwmon_sensor_types t= ype, + u32 attr, int channel, long *val) +{ + struct macsmc_hwmon *hwmon =3D dev_get_drvdata(dev); + int ret =3D 0; + + switch (type) { + case hwmon_temp: + ret =3D macsmc_hwmon_read_key( + hwmon->smc, &hwmon->temp.sensors[channel], 1000, val); + break; + case hwmon_in: + ret =3D macsmc_hwmon_read_key( + hwmon->smc, &hwmon->volt.sensors[channel], 1000, val); + break; + case hwmon_curr: + ret =3D macsmc_hwmon_read_key( + hwmon->smc, &hwmon->curr.sensors[channel], 1000, val); + break; + case hwmon_power: + /* SMC returns power in Watts with acceptable precision to scale to uW */ + ret =3D macsmc_hwmon_read_key(hwmon->smc, + &hwmon->power.sensors[channel], + 1000000, val); + break; + case hwmon_fan: + ret =3D macsmc_hwmon_read_fan(hwmon, attr, channel, val); + break; + default: + return -EOPNOTSUPP; + } + + return ret; +} + +static int macsmc_hwmon_write(struct device *dev, enum hwmon_sensor_types = type, + u32 attr, int channel, long val) +{ + switch (type) { + case hwmon_fan: + return macsmc_hwmon_write_fan(dev, attr, channel, val); + default: + return -EOPNOTSUPP; + } +} + +static umode_t macsmc_hwmon_fan_is_visible(const void *data, u32 attr, + int channel) +{ + const struct macsmc_hwmon *hwmon =3D data; + + if (channel >=3D hwmon->fan.n_fans) + return -EINVAL; + + if (melt_my_mac && attr =3D=3D hwmon_fan_target && + hwmon->fan.fans[channel].mode.macsmc_key !=3D 0) + return 0644; + + return 0444; +} + +static umode_t macsmc_hwmon_is_visible(const void *data, + enum hwmon_sensor_types type, u32 attr, + int channel) +{ + switch (type) { + case hwmon_fan: + return macsmc_hwmon_fan_is_visible(data, attr, channel); + default: + break; + } + + return 0444; +} + +static const struct hwmon_ops macsmc_hwmon_ops =3D { + .is_visible =3D macsmc_hwmon_is_visible, + .read =3D macsmc_hwmon_read, + .read_string =3D macsmc_hwmon_read_label, + .write =3D macsmc_hwmon_write, +}; + +/* + * Get the key metadata, including key data type, from the SMC. + */ +static int macsmc_hwmon_parse_key(struct device *dev, struct apple_smc *sm= c, + struct macsmc_hwmon_sensor *sensor, + const char *key) +{ + int ret =3D 0; + + ret =3D apple_smc_get_key_info(smc, _SMC_KEY(key), &sensor->info); + if (ret) { + dev_err(dev, "Failed to retrieve key info for %s\n", key); + return ret; + } + sensor->macsmc_key =3D _SMC_KEY(key); + + return 0; +} + +/* + * A sensor is a single key-value pair as made available by the SMC. + * The devicetree gives us the SMC key ID and a friendly name where the + * purpose of the sensor is known. + */ +static int macsmc_hwmon_create_sensor(struct device *dev, struct apple_smc= *smc, + struct device_node *sensor_node, + struct macsmc_hwmon_sensor *sensor) +{ + const char *key, *label; + int ret =3D 0; + + ret =3D of_property_read_string(sensor_node, "apple,key-id", &key); + if (ret) { + dev_err(dev, "Could not find apple,key-id in sensor node"); + return ret; + } + + ret =3D macsmc_hwmon_parse_key(dev, smc, sensor, key); + if (ret) + return ret; + + if (!of_property_read_string(sensor_node, "label", &label)) + strscpy_pad(sensor->label, label, sizeof(sensor->label)); + else + strscpy_pad(sensor->label, key, sizeof(sensor->label)); + + return 0; +} + +/* + * Fan data is exposed by the SMC as multiple sensors. + * + * The devicetree schema reuses apple,key-id for the actual fan speed sens= or. + * Mix, max and target keys do not need labels, so we can reuse label + * for naming the entire fan. + */ +static int macsmc_hwmon_create_fan(struct device *dev, struct apple_smc *s= mc, + struct device_node *fan_node, + struct macsmc_hwmon_fan *fan) +{ + const char *label; + const char *now; + const char *min; + const char *max; + const char *set; + const char *mode; + int ret =3D 0; + + ret =3D of_property_read_string(fan_node, "apple,key-id", &now); + if (ret) { + dev_err(dev, "apple,key-id not found in fan node!"); + return -EINVAL; + } + + ret =3D macsmc_hwmon_parse_key(dev, smc, &fan->now, now); + if (ret) + return ret; + + if (!of_property_read_string(fan_node, "label", &label)) + strscpy_pad(fan->label, label, sizeof(fan->label)); + else + strscpy_pad(fan->label, now, sizeof(fan->label)); + + fan->attrs =3D HWMON_F_LABEL | HWMON_F_INPUT; + + ret =3D of_property_read_string(fan_node, "apple,fan-minimum", &min); + if (ret) + dev_warn(dev, "No minimum fan speed key for %s", fan->label); + else { + if (!macsmc_hwmon_parse_key(dev, smc, &fan->min, min)) + fan->attrs |=3D HWMON_F_MIN; + } + + ret =3D of_property_read_string(fan_node, "apple,fan-maximum", &max); + if (ret) + dev_warn(dev, "No maximum fan speed key for %s", fan->label); + else { + if (!macsmc_hwmon_parse_key(dev, smc, &fan->max, max)) + fan->attrs |=3D HWMON_F_MAX; + } + + ret =3D of_property_read_string(fan_node, "apple,fan-target", &set); + if (ret) + dev_warn(dev, "No target fan speed key for %s", fan->label); + else { + if (!macsmc_hwmon_parse_key(dev, smc, &fan->set, set)) + fan->attrs |=3D HWMON_F_TARGET; + } + + ret =3D of_property_read_string(fan_node, "apple,fan-mode", &mode); + if (ret) + dev_warn(dev, "No fan mode key for %s", fan->label); + else { + ret =3D macsmc_hwmon_parse_key(dev, smc, &fan->mode, mode); + if (ret) + return ret; + } + + /* Initialise fan control mode to automatic */ + fan->manual =3D false; + + return 0; +} + +static int macsmc_hwmon_populate_sensors(struct macsmc_hwmon *hwmon, + struct device_node *hwmon_node) +{ + struct device_node *group_node =3D NULL; + + for_each_child_of_node(hwmon_node, group_node) { + struct device_node *key_node =3D NULL; + struct macsmc_hwmon_sensors *sensor_group =3D NULL; + struct macsmc_hwmon_fans *fan_group =3D NULL; + u32 n_keys =3D 0; + int i =3D 0; + + n_keys =3D of_get_child_count(group_node); + if (!n_keys) { + dev_err(hwmon->dev, "No keys found in %s!\n", + group_node->name); + continue; + } + + if (strcmp(group_node->name, "temperature") =3D=3D 0) + sensor_group =3D &hwmon->temp; + else if (strcmp(group_node->name, "voltage") =3D=3D 0) + sensor_group =3D &hwmon->volt; + else if (strcmp(group_node->name, "current") =3D=3D 0) + sensor_group =3D &hwmon->curr; + else if (strcmp(group_node->name, "power") =3D=3D 0) + sensor_group =3D &hwmon->power; + else if (strcmp(group_node->name, "fan") =3D=3D 0) + fan_group =3D &hwmon->fan; + else { + dev_err(hwmon->dev, "Invalid group node: %s", + group_node->name); + continue; + } + + if (sensor_group) { + sensor_group->sensors =3D devm_kzalloc( + hwmon->dev, + sizeof(struct macsmc_hwmon_sensor) * n_keys, + GFP_KERNEL); + if (!sensor_group->sensors) { + of_node_put(group_node); + return -ENOMEM; + } + + for_each_child_of_node(group_node, key_node) { + if (!macsmc_hwmon_create_sensor( + hwmon->dev, hwmon->smc, key_node, + &sensor_group->sensors[i])) + i++; + } + + sensor_group->n_sensors =3D i; + if (!sensor_group->n_sensors) { + dev_err(hwmon->dev, + "No valid sensor keys found in %s\n", + group_node->name); + continue; + } + } else if (fan_group) { + fan_group->fans =3D devm_kzalloc( + hwmon->dev, + sizeof(struct macsmc_hwmon_fan) * n_keys, + GFP_KERNEL); + + if (!fan_group->fans) { + of_node_put(group_node); + return -ENOMEM; + } + + for_each_child_of_node(group_node, key_node) { + if (!macsmc_hwmon_create_fan( + hwmon->dev, hwmon->smc, key_node, + &fan_group->fans[i])) + i++; + } + + fan_group->n_fans =3D i; + if (!fan_group->n_fans) { + dev_err(hwmon->dev, + "No valid sensor fans found in %s\n", + group_node->name); + continue; + } + } + } + + return 0; +} + +/* Create NULL-terminated config arrays */ +static void macsmc_hwmon_populate_configs(u32 *configs, u32 num_keys, u32 = flags) +{ + int idx =3D 0; + + for (idx =3D 0; idx < num_keys; idx++) + configs[idx] =3D flags; + + configs[idx + 1] =3D 0; +} + +static void macsmc_hwmon_populate_fan_configs(u32 *configs, u32 num_keys, + struct macsmc_hwmon_fans *fans) +{ + int idx =3D 0; + + for (idx =3D 0; idx < num_keys; idx++) + configs[idx] =3D fans->fans[idx].attrs; + + configs[idx + 1] =3D 0; +} + +static const struct hwmon_channel_info *const macsmc_chip_channel_info =3D + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ); + +static int macsmc_hwmon_create_infos(struct macsmc_hwmon *hwmon) +{ + int i =3D 0; + struct hwmon_channel_info *channel_info; + + /* chip */ + hwmon->channel_infos[i++] =3D macsmc_chip_channel_info; + + if (hwmon->temp.n_sensors) { + channel_info =3D &hwmon->temp.channel_info; + channel_info->type =3D hwmon_temp; + channel_info->config =3D devm_kzalloc( + hwmon->dev, sizeof(u32) * hwmon->temp.n_sensors + 1, + GFP_KERNEL); + if (!channel_info->config) + return -ENOMEM; + + macsmc_hwmon_populate_configs((u32 *)channel_info->config, + hwmon->temp.n_sensors, + (HWMON_T_INPUT | HWMON_T_LABEL)); + hwmon->channel_infos[i++] =3D channel_info; + } + + if (hwmon->volt.n_sensors) { + channel_info =3D &hwmon->volt.channel_info; + channel_info->type =3D hwmon_in; + channel_info->config =3D devm_kzalloc( + hwmon->dev, sizeof(u32) * hwmon->volt.n_sensors + 1, + GFP_KERNEL); + if (!channel_info->config) + return -ENOMEM; + + macsmc_hwmon_populate_configs((u32 *)channel_info->config, + hwmon->volt.n_sensors, + (HWMON_I_INPUT | HWMON_I_LABEL)); + hwmon->channel_infos[i++] =3D channel_info; + } + + if (hwmon->curr.n_sensors) { + channel_info =3D &hwmon->curr.channel_info; + channel_info->type =3D hwmon_curr; + channel_info->config =3D devm_kzalloc( + hwmon->dev, sizeof(u32) * hwmon->curr.n_sensors + 1, + GFP_KERNEL); + if (!channel_info->config) + return -ENOMEM; + + macsmc_hwmon_populate_configs((u32 *)channel_info->config, + hwmon->curr.n_sensors, + (HWMON_C_INPUT | HWMON_C_LABEL)); + hwmon->channel_infos[i++] =3D channel_info; + } + + if (hwmon->power.n_sensors) { + channel_info =3D &hwmon->power.channel_info; + channel_info->type =3D hwmon_power; + channel_info->config =3D devm_kzalloc( + hwmon->dev, sizeof(u32) * hwmon->power.n_sensors + 1, + GFP_KERNEL); + if (!channel_info->config) + return -ENOMEM; + + macsmc_hwmon_populate_configs((u32 *)channel_info->config, + hwmon->power.n_sensors, + (HWMON_P_INPUT | HWMON_P_LABEL)); + hwmon->channel_infos[i++] =3D channel_info; + } + + if (hwmon->fan.n_fans) { + channel_info =3D &hwmon->fan.channel_info; + channel_info->type =3D hwmon_fan; + channel_info->config =3D devm_kzalloc( + hwmon->dev, sizeof(u32) * hwmon->fan.n_fans + 1, + GFP_KERNEL); + if (!channel_info->config) + return -ENOMEM; + + macsmc_hwmon_populate_fan_configs((u32 *)channel_info->config, + hwmon->fan.n_fans, + &hwmon->fan); + hwmon->channel_infos[i++] =3D channel_info; + } + + return 0; +} + +static int macsmc_hwmon_probe(struct platform_device *pdev) +{ + struct apple_smc *smc =3D dev_get_drvdata(pdev->dev.parent); + struct macsmc_hwmon *hwmon; + struct device_node *hwmon_node; + int ret =3D 0; + + hwmon =3D devm_kzalloc(&pdev->dev, sizeof(struct macsmc_hwmon), + GFP_KERNEL); + if (!hwmon) + return -ENOMEM; + + hwmon->dev =3D &pdev->dev; + hwmon->smc =3D smc; + + hwmon_node =3D of_get_child_by_name(pdev->dev.parent->of_node, "hwmon"); + if (!hwmon_node) { + dev_err(hwmon->dev, "SMC hwmon node not found in Devicetree\n"); + return -ENODEV; + } + + ret =3D macsmc_hwmon_populate_sensors(hwmon, hwmon_node); + if (ret) + dev_info(hwmon->dev, "Could not populate keys!\n"); + + of_node_put(hwmon_node); + + if (!hwmon->temp.n_sensors && !hwmon->volt.n_sensors && + !hwmon->curr.n_sensors && !hwmon->power.n_sensors && + !hwmon->fan.n_fans) { + dev_err(hwmon->dev, + "No valid keys found of any supported type"); + return -ENODEV; + } + + ret =3D macsmc_hwmon_create_infos(hwmon); + if (ret) + return ret; + + hwmon->chip_info.ops =3D &macsmc_hwmon_ops; + hwmon->chip_info.info =3D + (const struct hwmon_channel_info *const *)&hwmon->channel_infos; + + hwmon->hwmon_dev =3D devm_hwmon_device_register_with_info( + &pdev->dev, "macsmc_hwmon", hwmon, &hwmon->chip_info, NULL); + if (IS_ERR(hwmon->hwmon_dev)) + return dev_err_probe(hwmon->dev, PTR_ERR(hwmon->hwmon_dev), + "Probing SMC hwmon device failed\n"); + + dev_info(hwmon->dev, "Registered SMC hwmon device. Sensors:"); + dev_info( + hwmon->dev, + "Temperature: %d, Voltage: %d, Current: %d, Power: %d, Fans: %d", + hwmon->temp.n_sensors, hwmon->volt.n_sensors, + hwmon->curr.n_sensors, hwmon->power.n_sensors, + hwmon->fan.n_fans); + + return 0; +} + +static struct platform_driver macsmc_hwmon_driver =3D { + .probe =3D macsmc_hwmon_probe, + .driver =3D { + .name =3D "macsmc_hwmon", + }, +}; +module_platform_driver(macsmc_hwmon_driver); + +MODULE_DESCRIPTION("Apple Silicon SMC hwmon driver"); +MODULE_AUTHOR("James Calligeros "); +MODULE_LICENSE("Dual MIT/GPL"); +MODULE_ALIAS("platform:macsmc_hwmon"); diff --git a/drivers/mfd/macsmc.c b/drivers/mfd/macsmc.c index 59be894460d33afa754927630881532b548b7ad8..bc4adf2fcfdce6c5ecbc51ced0e= 5985cbd36f54d 100644 --- a/drivers/mfd/macsmc.c +++ b/drivers/mfd/macsmc.c @@ -48,6 +48,7 @@ static const struct mfd_cell apple_smc_devs[] =3D { MFD_CELL_OF("macsmc-gpio", NULL, NULL, 0, 0, "apple,smc-gpio"), MFD_CELL_OF("macsmc-reboot", NULL, NULL, 0, 0, "apple,smc-reboot"), MFD_CELL_OF("macsmc-rtc", NULL, NULL, 0, 0, "apple,smc-rtc"), + MFD_CELL_OF("macsmc_hwmon", NULL, NULL, 0, 0, "apple,smc-hwmon"), }; =20 static int apple_smc_cmd_locked(struct apple_smc *smc, u64 cmd, u64 arg, --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f176.google.com (mail-pf1-f176.google.com [209.85.210.176]) (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 EDEA43314A0; Tue, 19 Aug 2025 11:48:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604126; cv=none; b=cU+vfsDJkRzbguV7pCzoHJJzALiufdco6RmTWZLJW9dJF3XpVT0m6kY6IoQ3nH78Svej0na3Ifs8UBIIFdbK9XHnmS1AKSnLu5otj/KqnXQSmmmz+Fwg2xw+LJwMnhdSBMxyR68Ipf/dTBwZaVg2J7MrBIA3bLssjTtRMtF59tY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604126; c=relaxed/simple; bh=h/3XHUJRRkzWhH3que8CCD1U/Xs8MbOjWft7S2baHYQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VygRzQ85UaO11kQt/TVNxG/osVbqlm4d1CTB3BcyXyccxw/xepPDv6cfEEDzphi5ZMywaXFDgieujMWavgI53vZS10elOytanR9f9vgo0/P3pOYqz2TXNTm+PLNVi0ip6Nui4XsHaIUThfPncnPFbX2+9DHcsUqAUlRXJl9Ykjc= 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=FA7Fz/rC; arc=none smtp.client-ip=209.85.210.176 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="FA7Fz/rC" Received: by mail-pf1-f176.google.com with SMTP id d2e1a72fcca58-76e2ea94c7cso4504722b3a.2; Tue, 19 Aug 2025 04:48:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604123; x=1756208923; 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=bXRoXM3DvDAsJ4ioc/Y/G/EGKWE3my87dTILegnnEzc=; b=FA7Fz/rCI4Bclt2LrrjTSFQR0YW1cnEkl5j0wFgbR0EBGJRg/opBdaw37UnJCs6mWl lxo0xuyIjshGI3UiT/KtnANZtArVKvuKbmwo9LATKXNxwdHnj3S9sibiLX1JIRJyEIt3 nPPllwSJysg9D7/CaEGt3s5Zc93v2y8bQSyM3KzdfgHSYHePb2wUjAf43sSLDPAQVdhq ASWIgyldfwQxYbU75bBYxl2b+v7MqkSg6DhOqMFBBJhozJr2S/Lct+AJJ02McC0SBzjQ U0AaR9iaPBbN9/pTBvMGErFgpjtQdphEqspvZJj1cLOn/oCnJ6tafAyj2A2Ohyg8zJEp TwRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604123; x=1756208923; 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=bXRoXM3DvDAsJ4ioc/Y/G/EGKWE3my87dTILegnnEzc=; b=QskTTWmWZ9V4fvrcYWnZyZvLcNYDVLvsdVbihtr9TQmpwd7E6H3cmoxIz7a/LHzeFT RmCsiABazsZ9VDB/n6u8NS3p0IFkGqpbBXDLfKih8ysXIUZyI3XyXr9oTK7LC97Pylaf mYK330pW7S+UzHPXmE22sw4fz7HngYWSpeZgPYjFl7Qj5vkESRH1dQNI+Vem5J4p60qp k5VYBtY1u0MZLdPIOuIvxHyZIpoFLmwl74Vo+1tJv+QX7NpZOavpC2rAb7MET5F/klJ9 iaBCxvm1/JHr7gYjDr9n3PbRoshWcLdqe+zXT1XUH0z9t/sXYcpR8n6a9hyFUwGW55FH F9Ag== X-Forwarded-Encrypted: i=1; AJvYcCW0Ueo0ESpdVCt9JIB+4xAeCxzeY1zlAieD44f5Kd5726Mcd/gUHssWh8RD0/88OiO+PAiG+F/P4nn/KO7e@vger.kernel.org, AJvYcCWUKT7gd3tCR/K1yFucqe9B1JVnIGlU/TkmjQhfZRP1aYytrpPOFFM+OyCcECb5u2bDDloAQdzLYGAS@vger.kernel.org, AJvYcCWZbTLURWj3F8KQL6gM5Spm36K1+zw8Ydxr4YqmW0LNxhjHiAKd50EubeydTVe4qwsOuFXAHA2cQQdq@vger.kernel.org, AJvYcCWiTfOrEC2p6JHDl7qEVVy++sYsLkGwpi0KF5AX4VyORY3kqTAyY40NHKFc6zsw8FNco8zL8XtqjURSaHQ=@vger.kernel.org, AJvYcCXBiNXEg7l2wYHPCWIQFIVPqm5BGv+PEykT84M3sB0uFVV1lG1FhXrV3TaTKKUlp0qyl16uvPoqVKtTdWM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzz2ci2grVY/FN4xVOvy/K1JubTqzL8zJh/lTk1MIjRnvwadSHR glEKWXkRb74LU1tiA5JJYJZ3t4dOWDPIrpv+aHQ+POZs1Zb2EWnldBgo9Cpzr08M X-Gm-Gg: ASbGncsRZh27YeRnZ6QkNykJA1vapnQHRlg2mRsn8zLhfQgd7S+pC+MPxCyi9HKUEuX edyBbIThHS8SiG9Bg5qBl8qoweQZkuDB+nJ9+YSMqk6KItvj8d2cOG3QyYm0uIO/gbkU/uhKMel Pr9eiN6O/phTaACUeZ5p5ez0hZUxNiJKdtK+oOQOaMQkh4WbCuW6ByQ1Nns+PZIfPwgAsrLaLRZ bWGCvdPzoArNWii6/wUkZ3O6g41Hr3I2xybUmU/pGKxvyDK+Ekp7Xtx0+ZsuBI9dbclfOnU1cEJ eC+8S2YaokljTIqLZ3AkoAUCYaQl8W61giIArGfdKQ8suLtMTdJ4m5S86997p3uXkNu8oMV4HSp KSKiZqwtkTUnUjZfa0LSFuucvoJ9vTFqM7nJPzZKqcZarYnT8K7x/bE31DZO5FB/Wyjd2+StveN ecIL7ozZJh3yxVbx8= X-Google-Smtp-Source: AGHT+IHNuaJ0iQlKsaqW/TpGaZtDz/UoIX9Qtn8OcFIfbGXQhTIKU1bXyqHLmLAOXfJrLMQXsEGaEQ== X-Received: by 2002:a05:6a20:5483:b0:240:1c36:7979 with SMTP id adf61e73a8af0-2430d42cc7dmr2771195637.28.1755604123006; Tue, 19 Aug 2025 04:48:43 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:42 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:57 +1000 Subject: [PATCH 5/8] input: macsmc-hid: New driver to handle the Apple Mac SMC buttons/lid 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: <20250819-macsmc-subdevs-v1-5-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros , Hector Martin X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9790; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=Ywfc4mmL8m8wZ4DdTYNSycoo5uhc8m+LjSm+qJ/8tn0=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvJnlzfMFNCqmdL50kdKS2F5yNTMmsSzyg9a3GZO6 tCXzzvWUcrCIMbFICumyLKhSchjthHbzX6Ryr0wc1iZQIYwcHEKwEQsVjAytEffkpeetOjJ/7yG S/0n+pUyplTJGkmIqXUpWN+b/6ZkCsM/oyMSHw0euftH3HWOSPd13cGTERix8bfYsqiY/rpq9fd 8AA== X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Hector Martin This driver implements power button and lid switch support for Apple Mac devices using SMC controllers driven by the macsmc driver. In addition to basic input support, this also responds to the final shutdown warning (when the power button is held down long enough) by doing an emergency kernel poweroff. This allows the NVMe controller to be cleanly shut down, which prevents data loss for in-cache data. Signed-off-by: Hector Martin Co-developed-by: Sven Peter Signed-off-by: Sven Peter Signed-off-by: James Calligeros --- MAINTAINERS | 1 + drivers/input/misc/Kconfig | 11 ++ drivers/input/misc/Makefile | 1 + drivers/input/misc/macsmc-hid.c | 210 +++++++++++++++++++++++++ drivers/mfd/macsmc.c | 1 + 5 files changed, 224 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 2eb23522654dd050262eb06e077587030cc335aa..b3b5220fcd0d4bbef67613c8ee9= afa880c0aa45d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2412,6 +2412,7 @@ F: drivers/hwmon/macsmc_hwmon.c F: drivers/pmdomain/apple/ F: drivers/i2c/busses/i2c-pasemi-core.c F: drivers/i2c/busses/i2c-pasemi-platform.c +F: drivers/input/misc/macsmc-hid.c F: drivers/input/touchscreen/apple_z2.c F: drivers/iommu/apple-dart.c F: drivers/iommu/io-pgtable-dart.c diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 0fb21c99a5e3d1230d7f40f99e0c2d360bbe80e8..a430c50e7f63f245bba56bd5260= 26ec7901cf821 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig @@ -961,4 +961,15 @@ config INPUT_STPMIC1_ONKEY To compile this driver as a module, choose M here: the module will be called stpmic1_onkey. =20 +config INPUT_MACSMC_HID + tristate "Apple Mac SMC lid/buttons" + depends on MFD_MACSMC + help + Say Y here if you want to use the input events delivered via the + SMC controller on Apple Mac machines using the macsmc driver. + This includes lid open/close and the power button. + + To compile this driver as a module, choose M here: the + module will be called macsmc-hid. + endif diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index d468c8140b93da5bb537e8a3baea2b90e7bb4229..95b8ebbb9ebbe6f3afc9db724d2= ebeba1d75d1a6 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile @@ -51,6 +51,7 @@ obj-$(CONFIG_INPUT_IQS7222) +=3D iqs7222.o obj-$(CONFIG_INPUT_KEYSPAN_REMOTE) +=3D keyspan_remote.o obj-$(CONFIG_INPUT_KXTJ9) +=3D kxtj9.o obj-$(CONFIG_INPUT_M68K_BEEP) +=3D m68kspkr.o +obj-$(CONFIG_INPUT_MACSMC_HID) +=3D macsmc-hid.o obj-$(CONFIG_INPUT_MAX77650_ONKEY) +=3D max77650-onkey.o obj-$(CONFIG_INPUT_MAX77693_HAPTIC) +=3D max77693-haptic.o obj-$(CONFIG_INPUT_MAX8925_ONKEY) +=3D max8925_onkey.o diff --git a/drivers/input/misc/macsmc-hid.c b/drivers/input/misc/macsmc-hi= d.c new file mode 100644 index 0000000000000000000000000000000000000000..cdeef6c4797f82f464e3a6a760d= baaf186e1c58d --- /dev/null +++ b/drivers/input/misc/macsmc-hid.c @@ -0,0 +1,210 @@ +// SPDX-License-Identifier: GPL-2.0-only OR MIT +/* + * Apple SMC input event driver + * Copyright The Asahi Linux Contributors + * + * This driver exposes HID events from the SMC as an input device. + * This includes the lid open/close and power button notifications. + */ + +#include +#include +#include +#include +#include +#include + + +/** + * struct macsmc_hid + * @dev: Underlying struct device for the HID sub-device + * @smc: Pointer to apple_smc struct of the mfd parent + * @input: Allocated input_dev; devres managed + * @nb: Notifier block used for incoming events from SMC (e.g. button pres= sed down) + * @wakeup_mode: Set to true when system is suspended and power button eve= nts should wake it + */ +struct macsmc_hid { + struct device *dev; + struct apple_smc *smc; + struct input_dev *input; + struct notifier_block nb; + bool wakeup_mode; +}; + +#define SMC_EV_BTN 0x7201 +#define SMC_EV_LID 0x7203 + +#define BTN_POWER 0x01 /* power button on e.g. Mac Mini chasis pressed */ +#define BTN_TOUCHID 0x06 /* combined TouchID / power button on MacBooks p= ressed */ +#define BTN_POWER_HELD_SHORT 0xfe /* power button briefly held down */ +#define BTN_POWER_HELD_LONG 0x00 /* power button held down; sent just befo= re forced poweroff */ + +static void macsmc_hid_event_button(struct macsmc_hid *smchid, unsigned lo= ng event) +{ + u8 button =3D (event >> 8) & 0xff; + u8 state =3D !!(event & 0xff); + + switch (button) { + case BTN_POWER: + case BTN_TOUCHID: + if (smchid->wakeup_mode) { + if (state) + pm_wakeup_hard_event(smchid->dev); + } else { + input_report_key(smchid->input, KEY_POWER, state); + input_sync(smchid->input); + } + break; + case BTN_POWER_HELD_SHORT: /* power button held down; ignore */ + break; + case BTN_POWER_HELD_LONG: + /* + * If we get here the power button has been held down for a while and + * we have about 4 seconds before forced power-off is triggered by SMC. + * Try to do an emergency shutdown to make sure the NVMe cache is + * flushed. macOS actually does this by panicing (!)... + */ + if (state) { + dev_crit(smchid->dev, "Triggering forced shutdown!\n"); + if (kernel_can_power_off()) + kernel_power_off(); + else /* Missing macsmc-reboot driver? */ + kernel_restart("SMC power button triggered restart"); + } + break; + default: + dev_warn(smchid->dev, "Unknown SMC button event: %04lx\n", event & 0xfff= f); + } +} + +static void macsmc_hid_event_lid(struct macsmc_hid *smchid, unsigned long = event) +{ + u8 lid_state =3D !!((event >> 8) & 0xff); + + if (smchid->wakeup_mode && !lid_state) + pm_wakeup_hard_event(smchid->dev); + + input_report_switch(smchid->input, SW_LID, lid_state); + input_sync(smchid->input); +} + +static int macsmc_hid_event(struct notifier_block *nb, unsigned long event= , void *data) +{ + struct macsmc_hid *smchid =3D container_of(nb, struct macsmc_hid, nb); + u16 type =3D event >> 16; + + switch (type) { + case SMC_EV_BTN: + macsmc_hid_event_button(smchid, event); + return NOTIFY_OK; + case SMC_EV_LID: + macsmc_hid_event_lid(smchid, event); + return NOTIFY_OK; + default: + /* SMC event meant for another driver */ + return NOTIFY_DONE; + } +} + +static int macsmc_hid_probe(struct platform_device *pdev) +{ + struct apple_smc *smc =3D dev_get_drvdata(pdev->dev.parent); + struct macsmc_hid *smchid; + bool have_lid, have_power; + int ret; + + /* Bail early if this SMC neither supports power button nor lid events */ + have_lid =3D apple_smc_key_exists(smc, SMC_KEY(MSLD)); + have_power =3D apple_smc_key_exists(smc, SMC_KEY(bHLD)); + if (!have_lid && !have_power) + return -ENODEV; + + smchid =3D devm_kzalloc(&pdev->dev, sizeof(*smchid), GFP_KERNEL); + if (!smchid) + return -ENOMEM; + + smchid->dev =3D &pdev->dev; + smchid->smc =3D smc; + platform_set_drvdata(pdev, smchid); + + smchid->input =3D devm_input_allocate_device(&pdev->dev); + if (!smchid->input) + return -ENOMEM; + + smchid->input->phys =3D "macsmc-hid (0)"; + smchid->input->name =3D "Apple SMC power/lid events"; + + if (have_lid) + input_set_capability(smchid->input, EV_SW, SW_LID); + if (have_power) + input_set_capability(smchid->input, EV_KEY, KEY_POWER); + + ret =3D input_register_device(smchid->input); + if (ret) { + dev_err(&pdev->dev, "Failed to register input device: %d\n", ret); + return ret; + } + + if (have_lid) { + u8 val; + + ret =3D apple_smc_read_u8(smc, SMC_KEY(MSLD), &val); + if (ret < 0) + dev_warn(&pdev->dev, "Failed to read initial lid state\n"); + else + input_report_switch(smchid->input, SW_LID, val); + } + + if (have_power) { + u32 val; + + ret =3D apple_smc_read_u32(smc, SMC_KEY(bHLD), &val); + if (ret < 0) + dev_warn(&pdev->dev, "Failed to read initial power button state\n"); + else + input_report_key(smchid->input, KEY_POWER, val & 1); + } + + input_sync(smchid->input); + + smchid->nb.notifier_call =3D macsmc_hid_event; + blocking_notifier_chain_register(&smc->event_handlers, &smchid->nb); + + device_init_wakeup(&pdev->dev, 1); + + return 0; +} + +static int macsmc_hid_pm_prepare(struct device *dev) +{ + struct macsmc_hid *smchid =3D dev_get_drvdata(dev); + + smchid->wakeup_mode =3D true; + return 0; +} + +static void macsmc_hid_pm_complete(struct device *dev) +{ + struct macsmc_hid *smchid =3D dev_get_drvdata(dev); + + smchid->wakeup_mode =3D false; +} + +static const struct dev_pm_ops macsmc_hid_pm_ops =3D { + .prepare =3D macsmc_hid_pm_prepare, + .complete =3D macsmc_hid_pm_complete, +}; + +static struct platform_driver macsmc_hid_driver =3D { + .driver =3D { + .name =3D "macsmc-hid", + .pm =3D &macsmc_hid_pm_ops, + }, + .probe =3D macsmc_hid_probe, +}; +module_platform_driver(macsmc_hid_driver); + +MODULE_AUTHOR("Hector Martin "); +MODULE_LICENSE("Dual MIT/GPL"); +MODULE_DESCRIPTION("Apple SMC HID driver"); +MODULE_ALIAS("platform:macsmc-hid"); diff --git a/drivers/mfd/macsmc.c b/drivers/mfd/macsmc.c index bc4adf2fcfdce6c5ecbc51ced0e5985cbd36f54d..6a5ac449e23ddda0ebe4980614c= 49fe6c3bae50d 100644 --- a/drivers/mfd/macsmc.c +++ b/drivers/mfd/macsmc.c @@ -45,6 +45,7 @@ #define SMC_TIMEOUT_MS 500 =20 static const struct mfd_cell apple_smc_devs[] =3D { + MFD_CELL_NAME("macsmc-hid"), MFD_CELL_OF("macsmc-gpio", NULL, NULL, 0, 0, "apple,smc-gpio"), MFD_CELL_OF("macsmc-reboot", NULL, NULL, 0, 0, "apple,smc-reboot"), MFD_CELL_OF("macsmc-rtc", NULL, NULL, 0, 0, "apple,smc-rtc"), --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 B1D803375AA; Tue, 19 Aug 2025 11:48:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604132; cv=none; b=Z/SUujqL06l0b3pDIDRMNMEQWb0bIc0sOApgxunsxkS1VVujPgKBZMq79Tfu98MK415roW0Aj8yA0+DzIOE85PoRZyjTX9iopyrwo0Dr8m1cc5cZHLMkluvjrzToZy0hNJdOxmBDANcm9WkcioCxOoHBTEurfcHqNwASkH+kmQE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604132; c=relaxed/simple; bh=age/ppvC8S2VtISNKcoiQ4BjiQxWW/W33qt1sPYP8U8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lBlDTrGrT6Co5lpeSiRggCvU5t6wSEt0dHMbDzHqXnAFqos+G1XQLb6sh7GWyXj2vnkT4s/LPQGZIMHv7hGvYSr38J/nM61M0ZOJ0xITqOJCerV/zg2N3Y3fr5o9fr3mabYBQIq+aUTTeK9TWFSM320uPrJZkN+KTrUce33d27g= 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=dJHeoJGy; arc=none smtp.client-ip=209.85.210.180 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="dJHeoJGy" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-76e2eb6ce24so4518665b3a.3; Tue, 19 Aug 2025 04:48:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604130; x=1756208930; 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=fbXPkuhA9BfPbnhdmw51sj156sf1M0M3soMqtM7sghU=; b=dJHeoJGyoKGs8fhI1cxYOViMGDWTvsvEbhXZlhCg8ibYdXBhv8YH7y23f+4p+sGVBt 2Jyt78F0myg51yfU0Cr+udUHfyQkKcfmXuh6G51cKP3wjefNtBtdFDKi5yJ5DqUuLt4J sOwG4+o0A14BEYpIDx1dnXeRpP6VeSIXwzz+QKQ7C4NNDgSrcgzTeUA6jIZQNZhz3ibY SXqag30j0lEpVp7YGLvdbD46MmpoXlBEcsWiF9J/AuVaXXjVN6aPMlJCax4AUZBrd99C E98h9LOKXYXO3u/kD2Ok3msmnAusI8idrQOp//P8TFdxpFeh2PyCalt0AJLKUQu3VDcl p4ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604130; x=1756208930; 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=fbXPkuhA9BfPbnhdmw51sj156sf1M0M3soMqtM7sghU=; b=mdHQ+tzqrIUPgXtthajF9slewHf0rBie2x6kriD2ta30zpUFAYGrBi2RQwxqgVsFO5 QDGcXpsT+DIaYem5eylDx9oKax4AENmCc8r6bKyUN3TIh2F4NvGWC1xG/WbL//ZEsApV YwLfYMjTZx4gBIG0P02aNUltc57Z2Dlo6BQDgQNBC1w7qcktvu0bDVBDINfGshab3qeb ZTagwIhUNzXYDRSlVqBWLXbJqj7mwcW69KrsdZO9NUYIagbg8CW3Vr0yf5+QzSL9IKqY XQjT8kE7vx/z39xp3fMSSerSAEOa/RbYFs9NA4oEiJp9L0OSR0azmINIn1Ys45NqyVcK Nlig== X-Forwarded-Encrypted: i=1; AJvYcCU9x6ryPVSXeYgAH2ZKod6AWRF9IG+YckrfkE3/ISJntHPJtdYF5sHVrg10DeGgBvzID3mMG4M3qCYcN7y4@vger.kernel.org, AJvYcCV1gqb+F0hN0YCukh/NeHWOuAPTqLB6HAJEe3z7d+Kq/c6A7iDHS6VgA/MSDoJhPf1N5dfrXLZoCqxGhO4=@vger.kernel.org, AJvYcCVdFDvaAP0PRPWutxzSn6F/fRX4faD2OjcYl0FqfaEsemjnsJVrrhUtybo7ybjuX/pMyx5xQFmW9UKl/M8=@vger.kernel.org, AJvYcCVhYNwGr9H/m41Q/2lMK34ut1lMNlKPrCDrIFlY2RIKPWEnQ/VV7RbLEaDRzuFWFjwUSeIFdSVs+HW+@vger.kernel.org, AJvYcCVtLR7w5TNG5uzyc287St4yjPYLwh/XF98wXANjkKhcqOj5gsHmcaxz/gAvQ5hPRxYA6TAsVN/ZXVTG@vger.kernel.org X-Gm-Message-State: AOJu0YxXVw2Bz/5t8dxIBGIBO+jZzij3sP2gpL0ogyaX7iAvtTQabCGA hAEkQqP7tcSBi6PmBYnVU/0R+xpxvbuxjBEG1AjYvL9u6mLaah01j88swIncX7OQ X-Gm-Gg: ASbGnct6tPgCM0C8ub7UOjL8rXtKZKsXobEOEjxZ4+jowHArF9niCMInJcHjJcfXaKc qJCdWoDfWJqYOqN91idxpiNINrhLUbtUt50dF80u341m3s6JAjAYXpCqG/7MB7ojVNxoPw1zKh8 hwZmvhiEDSk1BcnOxxChKeammS74MYHL8AFa+uPKrV5njQ8RfITW4d3GIW9qbviPfYWFkJLCl4x JdoHvG2pQI4HfnHX0EMWgOQUTDX5I3oiAo0AKD66sXWhdg5niataasy8Vncc/HcbmGgRrnkwDCt s/0zGvTAMVEdDodOn9iE2CnNdTw1B46Gp79BBBmtTUXtfHYilwKfHEFUXEjWwyoUDuJ+sm6j54W kEpDpyW17i4ha0CT3zmg/j1eiA9m1v5pQ94pBtnzujX910cL2+Irnc/wuIilFYPxUvqQmKk/3Ws I2zDaFbhdVazP4y6bnvjYAzyKIhw== X-Google-Smtp-Source: AGHT+IFQNdCrZjHseP8SjURS8RzkWDQljSWopIJBsCZNBWk9P/4UAE6BKrcOCRHnIvQBOQaytEz7Kg== X-Received: by 2002:a05:6a21:6da5:b0:21f:5aa1:3124 with SMTP id adf61e73a8af0-2430d36f5f3mr3185360637.13.1755604129897; Tue, 19 Aug 2025 04:48:49 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:49 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:58 +1000 Subject: [PATCH 6/8] arm64: dts: apple: t8103,t600x,t8112: Add SMC RTC node 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: <20250819-macsmc-subdevs-v1-6-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2246; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=t1iXcsQQKpcvwP43mtFXoSktvnFhTteQzSXrmNnJ3bo=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvL3rGR+/Crup/Hxy3uNklbMV1z7xmOFF5duxUpzH +7d7BotHaUsDGJcDLJiiiwbmoQ8Zhux3ewXqdwLM4eVCWQIAxenAEzk0TyG/5FfJxbnH5z95bbm PS2F8nP/G+oOyu1+0rrsr7mOe1eavh7DX4Hw7YGiK+Ju3fir9Wqa7Y3O5HSBG4c6RQt/hz5d7/p anxUA X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 From: Sven Peter The System Manager Controller of all M1/M2 SoCs supports the RTC sub-device. Reviewed-by: Neal Gompa Signed-off-by: Sven Peter Signed-off-by: James Calligeros --- .../arm64/boot/dts/apple/t600x-die0.dtsi | 6 ++++++ arch/arm64/boot/dts/apple/t8103.dtsi | 6 ++++++ arch/arm64/boot/dts/apple/t8112.dtsi | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dt= s/apple/t600x-die0.dtsi index 3603b276a2abcfa6a730f58d5c6b9914f22f00b0..f715b19efd1679e5cd384a967d6= e2a7c261ee679 100644 --- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi +++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi @@ -44,6 +44,12 @@ smc_reboot: reboot { nvmem-cell-names =3D "shutdown_flag", "boot_stage", "boot_error_count", "panic_count"; }; + + rtc { + compatible =3D "apple,smc-rtc"; + nvmem-cells =3D <&rtc_offset>; + nvmem-cell-names =3D "rtc_offset"; + }; }; =20 smc_mbox: mbox@290408000 { diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/app= le/t8103.dtsi index 8b7b27887968741b745651e5133dffa7d8d20f6d..59f2678639cf47f469dc699c0ec= b5b9e50a45ab1 100644 --- a/arch/arm64/boot/dts/apple/t8103.dtsi +++ b/arch/arm64/boot/dts/apple/t8103.dtsi @@ -916,6 +916,12 @@ smc_reboot: reboot { nvmem-cell-names =3D "shutdown_flag", "boot_stage", "boot_error_count", "panic_count"; }; + + rtc { + compatible =3D "apple,smc-rtc"; + nvmem-cells =3D <&rtc_offset>; + nvmem-cell-names =3D "rtc_offset"; + }; }; =20 smc_mbox: mbox@23e408000 { diff --git a/arch/arm64/boot/dts/apple/t8112.dtsi b/arch/arm64/boot/dts/app= le/t8112.dtsi index 3f79878b25af1f7760088aa552589494d67347fb..6bc3f58b06f703ed79578e89a03= 0929a18d57796 100644 --- a/arch/arm64/boot/dts/apple/t8112.dtsi +++ b/arch/arm64/boot/dts/apple/t8112.dtsi @@ -919,6 +919,12 @@ smc_reboot: reboot { nvmem-cell-names =3D "shutdown_flag", "boot_stage", "boot_error_count", "panic_count"; }; + + rtc { + compatible =3D "apple,smc-rtc"; + nvmem-cells =3D <&rtc_offset>; + nvmem-cell-names =3D "rtc_offset"; + }; }; =20 smc_mbox: mbox@23e408000 { --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (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 9370933472A; Tue, 19 Aug 2025 11:48:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604139; cv=none; b=oAN3iqDZEync+xL2zvtqdfX5EowyGG41Tk6rsegtzsb+QG5ZEp2AKE0/x3agCbQR+1iAh0hIK01vOlQ+q/SLaq0Ra1L0NPG90gQhSG6LaVYq4J5pHuMnboYdJ1eze/IcPoiDK7KK136LIae56KcghHlXCxPI0wzyQXSTcpvwlv0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604139; c=relaxed/simple; bh=x2fSqlD1a+GhrYf08R4xKoVp1GNK3211Ryioe6NRPdw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ra3BGWVOufe2D9XzEWTydTs3BEGbTRp+CbnCq0t7KKaADN4HvpX5p6s632hBUbQOLR0+WFUzH5KTWU17+MMIpZvHJDghws0aCM8giCc9lAFLoEm5OhTKQIwGQc1ct0GimBaKfPaE3Tv7F8LitsAAcIJR3yg/8o36wKRGZfJHW0E= 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=ddCJhxgk; arc=none smtp.client-ip=209.85.210.177 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="ddCJhxgk" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-76e2e8aff06so4044225b3a.1; Tue, 19 Aug 2025 04:48:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604137; x=1756208937; 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=2SqCsknXMXu1IeldEwXpjLyAV6gKojmOFXR8VvOqIes=; b=ddCJhxgkaoIpSSmm7cKqS+GPsMZfvb2od/hXrcfYwDYpxFnCKT66zBHhtpMe8xJAR2 lP3DkrtJ3pGVLft0TDbtN5pesSWc7LlUccrAF8nLPj/K6YDnupxuymdugVfwa7LClGhn z07JnQH+K8pb9Uh6Ou/tsIZ3XaLY5R/rB/fSSEyoi2czCYyX5NLvSSxsVilemzWQ0oE3 /aezi6y6sv7h0+8mEqpVh/n9f8PEUzwNVSLbsYnnPJmgxYxl2nLVJ9z8WTIl6SdKzB3n 9JCz1wCIvg3EYDS5itO/TWUDMc9FR9WV5QuzCGUg8kFXWj6w67AVvvRoyhJVrMC94Y4C FxGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604137; x=1756208937; 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=2SqCsknXMXu1IeldEwXpjLyAV6gKojmOFXR8VvOqIes=; b=suW6sp5H45LmqU6M5TMnc5JNOoX+IYXhBz2ay8GwBK//MY2ZKOf+LPr71E555ea61x qsww0BNbwxJout3A0zhIAC19w59dOWk6YPnV2RViLdlrY/y7x/B9anTDHOcAXXeT14IF I21paejqzB1/B71Gh/r4GEDxxfiZGWXbsCnxgpm6gwx3JXj/gRDmRBWgjsvIAKWQFyd5 mSmktgvw/ZDjeto+BcbyOCUdsGZ/75eM0jqfa2dedXROmB9g/jdKnp2IGUU1F0d8f8FM KIK/LlwYf2Wb2uAjmvkm8UB9clBWseAJ5v4mYjH2H3Kz3wV2F5hKzUDo+rkIagpKUc5p H+Cw== X-Forwarded-Encrypted: i=1; AJvYcCUFKROo1kbLC16CQ43b/NDMIyFEDFNSjQIUQ/jF/OhnkoK0JB1zlOpdC3LuC+ImVdYzrt/JpWc6yYrs@vger.kernel.org, AJvYcCUXT/RBekb6Pykkzth0pAHqBJYR31WaU2ZEf9ZdnqE9Zf3CX6z8VIxjAj2Y2jkspFp3fWatBBeQqkC/B/c=@vger.kernel.org, AJvYcCUgJBI+wumC2V144vZ1C1ByQpfqPCZWIZNzs2r2fAnUiiSObcv8V1VmmAx1ted5k/k8YMBj1VFbpGF8xuY=@vger.kernel.org, AJvYcCVSSgtcbLwHWFYoa1GDyyHnn+xgY6o09UYHoqPAknGjmqXf0eMpXfUuUNReMNA7ReqR6Dl21bJTuPcYxJzJ@vger.kernel.org, AJvYcCWfYjD8QC4/jrClelOhD/l6SqZGCbY/3VtWmP5vYzk/aRvkyZikjJyLflGWW2K3kz9c0MY/ag2sf1Ul@vger.kernel.org X-Gm-Message-State: AOJu0Yz/mu/GP9iXQXd4FPNJfP4EkqjffqtyBdmrCaMe2Nds5lHbK7YU ljENQyC0HfETScu1RyAFucwh1BmFz/fqBxnwRgaKwF4TgHBCwA4bH42K X-Gm-Gg: ASbGnctms54LYTjIw14jc10m5rc4Egrwod3v9UoVJtR57A2fD/bDyvpnoBKoh/lbFzJ ycB0rPGBGKbDxZrS0wc1aZiwGkGFC4hDVc9WLJtFK+i1vL2NEIwqEysZ5oP9sJbK1ORvRZrSoE7 5NhVVtIxS/3Xic+UREHJGhWMEcD6mGqeXn06ZExjEHK0I6HxeNqZzPBiMvWPWcT/0tl7psJ1BeI 0J1NC/iqT9UJS+bogIc7U+X+6WCOKkV2mL3yoQAL1w2s8eByfFFtn5ZTmWdG7ILpas5AZrYd59D axZQYhfK3ytENQzsmfGL8LfPUitWmvGFmZHu4/GovQfbu4p8qVPITjSQL8d2HSGxRiV0n/iDwpf fcwvY8mzRsps5/EfNXUFhhOAzIy5cnEYM/ZDfAl5Dh3a0hhDGnL3/BojUsazM7ssuXGLe/WIRxQ aOT1c8lfyrz1t9WW4= X-Google-Smtp-Source: AGHT+IGv8XYNQhdMisvhcNFC2QCyy2wLByb+FNRg29NG9SM7abSIzlHCw3nXf5ewYBYJpL+eRz80rw== X-Received: by 2002:a05:6a20:72a5:b0:232:4a42:dfd1 with SMTP id adf61e73a8af0-2430d420584mr3645255637.36.1755604136875; Tue, 19 Aug 2025 04:48:56 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:48:56 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:47:59 +1000 Subject: [PATCH 7/8] arm64: dts: apple: add common hwmon sensors and fans 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: <20250819-macsmc-subdevs-v1-7-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5299; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=x2fSqlD1a+GhrYf08R4xKoVp1GNK3211Ryioe6NRPdw=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvKP7rrxVWf2KXfjsxf5rPefiTo9+UGJ3P+zueWND 5xe21pd6ChlYRDjYpAVU2TZ0CTkMduI7Wa/SOVemDmsTCBDGLg4BWAi9+cwMvyZuprz3e4pLMd3 Ri1pin3ukTOlW/HfRu4/652XOF294tDF8M/oqWp7nJV4iv79g03erLOW/3z1xS5R+oHa9ZB/rZ3 idYwA X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 Each Apple Silicon device exposes a unique set of sensors and fans, however some have been found to be reliably common across devices. Add these as .dtsi files so that they can be combined with any device-specific sensors without excessive repetition. Signed-off-by: James Calligeros --- .../boot/dts/apple/hwmon-common.dtsi | 46 +++++++++++++++++++++++++ .../boot/dts/apple/hwmon-fan-dual.dtsi | 27 +++++++++++++++ arch/arm64/boot/dts/apple/hwmon-fan.dtsi | 21 +++++++++++ .../boot/dts/apple/hwmon-laptop.dtsi | 43 +++++++++++++++++++++++ .../boot/dts/apple/hwmon-mac-mini.dtsi | 19 ++++++++++ 5 files changed, 156 insertions(+) diff --git a/arch/arm64/boot/dts/apple/hwmon-common.dtsi b/arch/arm64/boot/= dts/apple/hwmon-common.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..b8da8951194d1bce6e55f3558a2= f4af8b3bbb45c --- /dev/null +++ b/arch/arm64/boot/dts/apple/hwmon-common.dtsi @@ -0,0 +1,46 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Hardawre monitoring sensors expected to be found on all Apple Silicon d= evices + * + * Copyright The Asahi Linux Contributors + */ + +&smc { + hwmon { + current { + current-ID0R { + apple,key-id =3D "ID0R"; + label =3D "AC Input Current"; + }; + }; + + power { + power-PSTR { + apple,key-id =3D "PSTR"; + label =3D "Total System Power"; + }; + power-PDTR { + apple,key-id =3D "PDTR"; + label =3D "AC Input Power"; + }; + power-PMVR { + apple,key-id =3D "PMVR"; + label =3D "3.8 V Rail Power"; + }; + }; + + temperature { + temperature-TH0x { + apple,key-id =3D "TH0x"; + label =3D "NAND Flash Temperature"; + }; + }; + voltage { + voltage-VD0R { + apple,key-id =3D "VD0R"; + label =3D "AC Input Voltage"; + }; + }; + + }; +}; diff --git a/arch/arm64/boot/dts/apple/hwmon-fan-dual.dtsi b/arch/arm64/boo= t/dts/apple/hwmon-fan-dual.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..2897f3b7a6a32ad3d31566816a1= b237f27dc281d --- /dev/null +++ b/arch/arm64/boot/dts/apple/hwmon-fan-dual.dtsi @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * SMC hwmon fan keys for Apple Silicon desktops/laptops with two fans + * + * Copyright The Asahi Linux Contributors + */ + +#include "hwmon-fan.dtsi" + +&smc { + hwmon { + fan{ + fan-F0Ac { + label =3D "Fan 1"; + }; + + fan-F1Ac { + apple,key-id =3D "F1Ac"; + label =3D "Fan 2"; + apple,fan-minimum =3D "F1Mn"; + apple,fan-maximum =3D "F1Mx"; + apple,fan-target =3D "F1Tg"; + apple,fan-mode =3D "F1Md"; + }; + }; + }; +}; diff --git a/arch/arm64/boot/dts/apple/hwmon-fan.dtsi b/arch/arm64/boot/dts= /apple/hwmon-fan.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..6d307abd64adef9dda1a6435107= 0968167cc9f3a --- /dev/null +++ b/arch/arm64/boot/dts/apple/hwmon-fan.dtsi @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * hwmon fan keys for Apple Silicon desktops/laptops with a single fan. + * + * Copyright The Asahi Linux Contributors + */ + +&smc { + hwmon { + fan { + fan-F0Ac { + apple,key-id =3D "F0Ac"; + label =3D "Fan"; + apple,fan-minimum =3D "F0Mn"; + apple,fan-maximum =3D "F0Mx"; + apple,fan-target =3D "F0Tg"; + apple,fan-mode =3D "F0Md"; + }; + }; + }; +}; diff --git a/arch/arm64/boot/dts/apple/hwmon-laptop.dtsi b/arch/arm64/boot/= dts/apple/hwmon-laptop.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..f2d473c26526cff89d497b47023= 23996764973de --- /dev/null +++ b/arch/arm64/boot/dts/apple/hwmon-laptop.dtsi @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * Hardware monitoring sensors expected on all Apple Silicon laptops + * + * Copyright The Asahi Linux Contributors + */ + +&smc { + hwmon { + power { + power-PHPC { + apple,key-id =3D "PHPC"; + label =3D "Heatpipe Power"; + }; + }; + + temperature { + temperature-TB0T { + apple,key-id =3D "TB0T"; + label =3D "Battery Hotspot Temperature"; + }; + temperature-TCHP { + apple,key-id =3D "TCHP"; + label =3D "Charge Regulator Temperature"; + }; + temperature-TW0P { + apple,key-id =3D "TW0P"; + label =3D "WiFi/BT Module Temperature"; + }; + }; + + voltage { + voltage-SBAV { + apple,key-id =3D "SBAV"; + label =3D "Battery Voltage"; + }; + voltage-VD0R { + apple,key-id =3D "VD0R"; + label =3D "Charger Input Voltage"; + }; + }; + }; +}; diff --git a/arch/arm64/boot/dts/apple/hwmon-mac-mini.dtsi b/arch/arm64/boo= t/dts/apple/hwmon-mac-mini.dtsi new file mode 100644 index 0000000000000000000000000000000000000000..f65a3011372bd2bc37f84fad3ab= cd6ca59e88549 --- /dev/null +++ b/arch/arm64/boot/dts/apple/hwmon-mac-mini.dtsi @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +/* + * hwmon sensors expected on all Mac mini models + * + * Copyright The Asahi Linux Contributors + */ + +#include "hwmon-fan.dtsi" + +&smc { + hwmon { + temperature { + temperature-TW0P { + apple,key-id =3D "TW0P"; + label =3D "WiFi/BT Module Temperature"; + }; + }; + }; +}; --=20 2.50.1 From nobody Sat Oct 4 06:33:20 2025 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 9D587334709; Tue, 19 Aug 2025 11:49:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604146; cv=none; b=qBv/DXwgR6Fpps6GmTRvSBk+ldMWi68Ws/LcmwoR9WmDnFDj/3BF9OYrkYs4SnNoE6+01QqPTS+nlMRAa+cK5EZv27PKHe2bCTQCWN1W9mJqSIDubeYcf6ATu5taNY7yRmafd2Te4HjEQMTQTg6bu8NQB6d5bNMKy63zqkfHch8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755604146; c=relaxed/simple; bh=DeO8Ii5S4xPqjwogDhDaxek/3Uge8D2U0NrM4GwGiu0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=p9yECeAhHqbz4NT5o6U9UOYsoMWacrrS0nUikHU29VSZ1uzHAsxXSfExBdEZnm+PHRNYnFYXeo7pGg/r4rLZebJqZLZWkPHNKHbxP020ZUjTkm5DdzQYsfq3esCl8pAmCsnJ6+NfjzDA0aQndtdR6qlfPItDAwmoDlkrYCtvWD4= 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=bNWvq4Zv; arc=none smtp.client-ip=209.85.210.169 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="bNWvq4Zv" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-76e2e613e90so3746576b3a.0; Tue, 19 Aug 2025 04:49:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1755604144; x=1756208944; 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=/OhP9WyP/wpWu6Mb4fbUxFs+8834wmIS++iJ9iNw9HQ=; b=bNWvq4ZvPIFvucosDy0/hyuU9BnXVHUs1cf4Ob/HlHaBxPI8H/18rYlnHO2x0+qL7z ox1qltAJbClsVx3brf/CLIXtcnE6TgnGtdIefxWfyjUlKbc0v0GOCOYSx2An4ra06WB7 EvRLW+Y+UWS/cqxrPoEoo9c0yispMk7D1jGbUzsbUNBlXXm//nuXHB174NjqrWAOuU+i RJIsauwPM4GNdSbfYah7Ih7qvFevGu6fqxnPPd7/hvmzIL2iJhxfmP2cFCo+4/Ymd4eP ahXDBJveYINu6GBoX22vpx+N9Yull9v5qoll3U1dp5Tgr/tZhPX001HnB4WMTar3t1pu XZ5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755604144; x=1756208944; 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=/OhP9WyP/wpWu6Mb4fbUxFs+8834wmIS++iJ9iNw9HQ=; b=jG0soxbSG7r7f4VSHixIxYAFHSw0841GWUNuyXdZH30mxGlaOKgPyljo7EvtSM++O9 GNtV+bGrNviEZTH+lGzI2KDddjcOCGlKmg7zMwvNRN0Ph8HQhqG0bFu21mYQBgxZq+Ed j0rbiKfSIX2hhyLtrSJeMaWasdnj/CZNRRUz2cQ8jWS2oRlFS0b0ihItKdadgZKd0W2H fMm3zQ8dyU4QR7AeB+G/MCAtU6YVS9dA3Y9iFtNgJLRQFpyv3TS4OFujrA+1d+pMfYuo uTg7Fjc8X37AIs5hxgm5qfxr2Gqp2dHHMB9BiHIpiGIOG3E6eny47yxw2Dsav1+eKqsr XhYA== X-Forwarded-Encrypted: i=1; AJvYcCVLSBSGj/XueodndEqMayWlMbaYYmsOrveSkJ7Y3RhOvzzNdjQ4eRBM1W/ucI8tc/srWl6QiYIB/chCoeQ=@vger.kernel.org, AJvYcCVlNq0LXIKisQPAKtQoC4I4LAQ/i9+rwmkr6K5nmH4HxVDkoZfC6MOR5JuA8cYw8+i0FFIi2bHZjzOY@vger.kernel.org, AJvYcCW3RmVgOkRZHI/F9MwGpG87YIBNjH6hTK9rHn1seR99ZeO5nobDZMaCvFHlVn63I9Gos5sTKxPAoRecaphH@vger.kernel.org, AJvYcCX69kITUvkNQOrHUq0Aqi2WvidmCrLJUD9NWUGk0RTw+lj4kqtpzifes4nkF7YQb0BwaT3U7zAcVNBx/c4=@vger.kernel.org, AJvYcCXR82PkPzZYtovUDwNUt0L6u6Y9OJcspa37UdGK5qG44PcygSoZUwdyn54yaUtxaf5jl4DzPLpEPcKR@vger.kernel.org X-Gm-Message-State: AOJu0Yy5POCPZ07vg1a/3jZN5Ik7/TMe++xiG3XiBBgDDBDxhyEoWJlP T96GKYJPn8EY+Oeo/iIhW8W+JcOGkPGOMeyq3lgwuKnOGNVhZV+h6mcK X-Gm-Gg: ASbGnctV6jWXejgjDDmajbcTsdlsFxSebGvuW3yCBIamxZSBoITiMy5EiTw+lu3GGJK hcz35YvI9rpAbOA0blIZE0/2aJvJ6CC8xpXHwmgSbzYZVCzdTukOVdfxGaoIh8BBycPFt+kOUuc DEmr6YSXIQpUeQOfxqu6ApUmlg1qVKUAiUvfApEvl8uo9rzdfJ7ILs+uBjtT05D49zf88coCa+Y qwz5/FKILcLN7igroHjltIa2zXnxYqiB9rt3NcIiHQ5UblNkYUnkpxUuMM+HWQ8kwZdMMIOcbfj 2aYKpnDr8Tvbm0ugNYwVEPq3cGQ0pvtHfKF8fvpK/NZc3n9+blVqigkjK78qPNRe7xmMdfB98cZ gmNznIt4N3V+3TOcunohQnOYhtrtRvf95M24vbPlWw3ernfAK35CkNeWXQWLG9+umeEkCQvjWPp T0WSgWyzlL+AEzrqNKRL03tEysEg== X-Google-Smtp-Source: AGHT+IE0AX7GGv6lhJRvMXNEeWItmzt9jXuqrt/pCi46xXUUO89+xvPNiTEdfoooayxRjMHduL6Iig== X-Received: by 2002:a05:6a20:a10f:b0:243:78a:82bc with SMTP id adf61e73a8af0-2430d4d563dmr3224506637.54.1755604143798; Tue, 19 Aug 2025 04:49:03 -0700 (PDT) Received: from [192.168.2.3] (2403-580a-80ed-0-4835-5a07-49e7-f115.ip6.aussiebb.net. [2403:580a:80ed:0:4835:5a07:49e7:f115]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b472d76a430sm10286316a12.43.2025.08.19.04.48.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Aug 2025 04:49:03 -0700 (PDT) From: James Calligeros Date: Tue, 19 Aug 2025 21:48:00 +1000 Subject: [PATCH 8/8] arm64: dts: apple: t8103, t600x, t8112: add common hwmon nodes to devices 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: <20250819-macsmc-subdevs-v1-8-57df6c3e5f19@gmail.com> References: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> In-Reply-To: <20250819-macsmc-subdevs-v1-0-57df6c3e5f19@gmail.com> To: Sven Peter , Janne Grunau , Alyssa Rosenzweig , Neal Gompa , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Alexandre Belloni , Jean Delvare , Guenter Roeck , Dmitry Torokhov Cc: asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, linux-hwmon@vger.kernel.org, linux-input@vger.kernel.org, James Calligeros X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6874; i=jcalligeros99@gmail.com; h=from:subject:message-id; bh=DeO8Ii5S4xPqjwogDhDaxek/3Uge8D2U0NrM4GwGiu0=; b=owGbwMvMwCV2xczoYuD3ygTG02pJDBlLUvIf35OWPVC7/Lswm+0246dyUbd1Zxr42pQtW/HvP ZfTf0+jjlIWBjEuBlkxRZYNTUIes43YbvaLVO6FmcPKBDKEgYtTACbS9prhf1JPpHPfrn0y02IT 93/43Xj18r2TSY5WVVNfBj4xU07m+MXIsN1CXZevaHnPd0sZgUNaERsKDvIsy0mLXdVtpNb5+tw uXgA= X-Developer-Key: i=jcalligeros99@gmail.com; a=openpgp; fpr=B08212489B3206D98F1479BDD43632D151F77960 Add the known, common hwmon-related SMC keys to the DTs for the devices they pertain to. Co-developed-by: Janne Grunau Signed-off-by: Janne Grunau Signed-off-by: James Calligeros --- .../arm64/boot/dts/apple/t6001-j375c.dts | 2 ++ .../arm64/boot/dts/apple/t6002-j375d.dts | 2 ++ .../boot/dts/apple/t600x-j314-j316.dtsi | 4 ++++ .../arm64/boot/dts/apple/t600x-j375.dtsi | 2 ++ arch/arm64/boot/dts/apple/t8103-j274.dts | 2 ++ arch/arm64/boot/dts/apple/t8103-j293.dts | 3 +++ arch/arm64/boot/dts/apple/t8103-j313.dts | 2 ++ arch/arm64/boot/dts/apple/t8103-j456.dts | 2 ++ arch/arm64/boot/dts/apple/t8103-j457.dts | 2 ++ .../arm64/boot/dts/apple/t8103-jxxx.dtsi | 2 ++ arch/arm64/boot/dts/apple/t8112-j413.dts | 2 ++ arch/arm64/boot/dts/apple/t8112-j473.dts | 2 ++ arch/arm64/boot/dts/apple/t8112-j493.dts | 3 +++ .../arm64/boot/dts/apple/t8112-jxxx.dtsi | 2 ++ 14 files changed, 32 insertions(+) diff --git a/arch/arm64/boot/dts/apple/t6001-j375c.dts b/arch/arm64/boot/dt= s/apple/t6001-j375c.dts index 62ea437b58b25ca649e20b1072b4d835bbc17d3a..9e8c4107e65d8dc47ad2ad99af2= f436613c11d8f 100644 --- a/arch/arm64/boot/dts/apple/t6001-j375c.dts +++ b/arch/arm64/boot/dts/apple/t6001-j375c.dts @@ -16,3 +16,5 @@ / { compatible =3D "apple,j375c", "apple,t6001", "apple,arm-platform"; model =3D "Apple Mac Studio (M1 Max, 2022)"; }; + +#include "hwmon-fan-dual.dtsi" diff --git a/arch/arm64/boot/dts/apple/t6002-j375d.dts b/arch/arm64/boot/dt= s/apple/t6002-j375d.dts index 3365429bdc8be90b63c8051822243d897854ab27..b62cf16d6b73e74c3d9116730b4= 4596be2a89ea0 100644 --- a/arch/arm64/boot/dts/apple/t6002-j375d.dts +++ b/arch/arm64/boot/dts/apple/t6002-j375d.dts @@ -48,3 +48,5 @@ hpm5: usb-pd@3a { =20 /delete-node/ &ps_disp0_cpu0_die1; /delete-node/ &ps_disp0_fe_die1; + +#include "hwmon-fan-dual.dtsi" diff --git a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi b/arch/arm64/bo= ot/dts/apple/t600x-j314-j316.dtsi index 22ebc78e120bf8f0f71fd532e9dce4dcd117bbc6..2cb38861c3855e31c9b8ab66fe6= 9b818c381c604 100644 --- a/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi +++ b/arch/arm64/boot/dts/apple/t600x-j314-j316.dtsi @@ -121,3 +121,7 @@ &fpwm0 { }; =20 #include "spi1-nvram.dtsi" + +#include "hwmon-common.dtsi" +#include "hwmon-laptop.dtsi" +#include "hwmon-fan-dual.dtsi" diff --git a/arch/arm64/boot/dts/apple/t600x-j375.dtsi b/arch/arm64/boot/dt= s/apple/t600x-j375.dtsi index d5b985ad567936111ee5cccc9ca9fc23d01d9edf..7e551e8660c9c2b51f021b11886= 80c5cce9d2951 100644 --- a/arch/arm64/boot/dts/apple/t600x-j375.dtsi +++ b/arch/arm64/boot/dts/apple/t600x-j375.dtsi @@ -128,3 +128,5 @@ &pcie0_dart_3 { }; =20 #include "spi1-nvram.dtsi" + +#include "hwmon-common.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-j274.dts b/arch/arm64/boot/dts= /apple/t8103-j274.dts index 1c3e37f86d46d7b5d733717b47c4b57dc55e1201..f5b8cc087882d6bd2b0f4f27118= 44d2a0fa8b604 100644 --- a/arch/arm64/boot/dts/apple/t8103-j274.dts +++ b/arch/arm64/boot/dts/apple/t8103-j274.dts @@ -61,3 +61,5 @@ &pcie0_dart_2 { &i2c2 { status =3D "okay"; }; + +#include "hwmon-mac-mini.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-j293.dts b/arch/arm64/boot/dts= /apple/t8103-j293.dts index 5b3c42e9f0e6776241bf746d3458766e44e3639a..abb88391635fa048c196d0631d9= 0405519ddd178 100644 --- a/arch/arm64/boot/dts/apple/t8103-j293.dts +++ b/arch/arm64/boot/dts/apple/t8103-j293.dts @@ -119,3 +119,6 @@ dfr_panel_in: endpoint { &displaydfr_dart { status =3D "okay"; }; + +#include "hwmon-laptop.dtsi" +#include "hwmon-fan.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-j313.dts b/arch/arm64/boot/dts= /apple/t8103-j313.dts index 97a4344d8dca685708aff136af92a1b316f3c3dd..491ead016b2193f123f4ded9dad= f85ebf37cdc7e 100644 --- a/arch/arm64/boot/dts/apple/t8103-j313.dts +++ b/arch/arm64/boot/dts/apple/t8103-j313.dts @@ -41,3 +41,5 @@ &wifi0 { &fpwm1 { status =3D "okay"; }; + +#include "hwmon-laptop.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-j456.dts b/arch/arm64/boot/dts= /apple/t8103-j456.dts index 58c8e43789b4861544e20c717124ede3327be010..c2ec6fbb633cc6aeec2322f295c= 054998fbf08cc 100644 --- a/arch/arm64/boot/dts/apple/t8103-j456.dts +++ b/arch/arm64/boot/dts/apple/t8103-j456.dts @@ -75,3 +75,5 @@ &pcie0_dart_1 { &pcie0_dart_2 { status =3D "okay"; }; + +#include "hwmon-fan-dual.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-j457.dts b/arch/arm64/boot/dts= /apple/t8103-j457.dts index 152f95fd49a2118093396838fbd8b6bd1b518f81..20e85612ae70c116cab788f2c03= f5a7d76cb19be 100644 --- a/arch/arm64/boot/dts/apple/t8103-j457.dts +++ b/arch/arm64/boot/dts/apple/t8103-j457.dts @@ -48,3 +48,5 @@ ethernet0: ethernet@0,0 { &pcie0_dart_2 { status =3D "okay"; }; + +#include "hwmon-fan.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi b/arch/arm64/boot/dt= s/apple/t8103-jxxx.dtsi index 0c8206156bfefda8a32c869787b2e0c8e67a9d17..f711af410a2edf7587ff091e195= c5cf243dc8a34 100644 --- a/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi +++ b/arch/arm64/boot/dts/apple/t8103-jxxx.dtsi @@ -92,3 +92,5 @@ &nco_clkref { }; =20 #include "spi1-nvram.dtsi" + +#include "hwmon-common.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8112-j413.dts b/arch/arm64/boot/dts= /apple/t8112-j413.dts index 6f69658623bf89ce73e3486bce504f1f5f8003f3..500dcdf2d4b5da698ee0798f37f= 624ff70e7b9f0 100644 --- a/arch/arm64/boot/dts/apple/t8112-j413.dts +++ b/arch/arm64/boot/dts/apple/t8112-j413.dts @@ -78,3 +78,5 @@ &i2c4 { &fpwm1 { status =3D "okay"; }; + +#include "hwmon-laptop.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8112-j473.dts b/arch/arm64/boot/dts= /apple/t8112-j473.dts index 06fe257f08be498ace6906b936012e01084da702..11db6a92493f367cfa64be5e844= c80e99bdd325b 100644 --- a/arch/arm64/boot/dts/apple/t8112-j473.dts +++ b/arch/arm64/boot/dts/apple/t8112-j473.dts @@ -52,3 +52,5 @@ &pcie1_dart { &pcie2_dart { status =3D "okay"; }; + +#include "hwmon-mac-mini.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8112-j493.dts b/arch/arm64/boot/dts= /apple/t8112-j493.dts index fb8ad7d4c65a8fe7966f5541f24f03a379143cfb..a0da02c00f157a0e667b26aebef= 9157636b14ecf 100644 --- a/arch/arm64/boot/dts/apple/t8112-j493.dts +++ b/arch/arm64/boot/dts/apple/t8112-j493.dts @@ -133,3 +133,6 @@ touchbar0: touchbar@0 { touchscreen-inverted-y; }; }; + +#include "hwmon-laptop.dtsi" +#include "hwmon-fan.dtsi" diff --git a/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi b/arch/arm64/boot/dt= s/apple/t8112-jxxx.dtsi index 6da35496a4c88dbaba125ebbe8c5a4a428c647c3..6e54c1fb097e8f72cb4fb37e491= 893a7e3d7e6c2 100644 --- a/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi +++ b/arch/arm64/boot/dts/apple/t8112-jxxx.dtsi @@ -81,3 +81,5 @@ &nco_clkref { }; =20 #include "spi1-nvram.dtsi" + +#include "hwmon-common.dtsi" --=20 2.50.1