From patchwork Sat Aug 10 01:28:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Konrad Dybcio X-Patchwork-Id: 13759329 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3B6324087C; Sat, 10 Aug 2024 01:29:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253346; cv=none; b=H7MRe99RoRtOnCQMMkP0x/SYU3O4R0jSAoWfZarjIPQppkt1E0USI+YeS9MiBdjROeNjTBvBRnPY+dBP6X/3NkcOPEVMVRDIGY3RudtVaCWTNFtQnq+5b6bLTRKbV/ZCi8qMKtqrg4vHujCHe7OhHbLp1A2xCndNmGsHWhgQMeU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253346; c=relaxed/simple; bh=4SyE3li13fjLPwavf6bHMoEU85A4KFBeN5v2ikNfOS4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J2XFjo+2HJY0tk/yMjJNIGmPftEHRL52KqCHpyNXXVWWN91ezcrT58A/EvrUv/P8tSlwD5Hy8i6BmL1IWuzFlMaN7ELa2x8mE1hA2/Ye9CWlZrX96ca74wCy/i0gVdNJxo7BgBPVpXQ5a/NS8mlvZFg0ImOkePRkG1meej9hze8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=NbcuNSF2; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="NbcuNSF2" Received: by smtp.kernel.org (Postfix) with ESMTPSA id DE224C4AF09; Sat, 10 Aug 2024 01:28:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1723253345; bh=4SyE3li13fjLPwavf6bHMoEU85A4KFBeN5v2ikNfOS4=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=NbcuNSF2DYNYYRKJG94vXh75HLxGijtUjeQPLc0td6ayqya1vCCOr8n1hFkZXBdn4 FXSIluZ8fkoW+UiBqzx3HcKnXwHRU2YmCAgoA7ZbIVM6z8XPWg2mmz6FhNQWdmL/go 2omjwGmk0FwrWm+CYvMpq6UtWQbgqSUbVHDv+B5G5YOtgn7U53gFSCghJMD4/NDkNu wD4HTMRW1AENQ2Uj4oNnnKWgUjYWi8h2FLNhESLM6QZkDe3kiL+Jx8wOnLibOEJqlg mJh/k6RUdLjmheaUA6DrJ1ELhdprAMJJ100ooAUOTp02h0/lVdUmFcF62sKAHiMI3U y8QRkBrQ9gsdw== From: Konrad Dybcio Date: Sat, 10 Aug 2024 03:28:38 +0200 Subject: [PATCH v2 1/3] dt-bindings: serial: Allow embedded-controller as child node Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240810-topic-sam-v2-1-8a8eb368a4f0@quicinc.com> References: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> In-Reply-To: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> To: Rob Herring , Greg Kroah-Hartman , Jiri Slaby , Krzysztof Kozlowski , Conor Dooley , Konrad Dybcio , "Rafael J. Wysocki" , Len Brown , Maximilian Luz , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: Marijn Suijten , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org, Bjorn Andersson , Konrad Dybcio X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1723253333; l=1007; i=quic_kdybcio@quicinc.com; s=20230215; h=from:subject:message-id; bh=iPyhH97sgWQSvAYoTnYt3DadKCYesRP4ToQqaY07uPk=; b=9lKKuIOOp7WYVX3w6+26X30PFGf1TkRIosBETn9SmIYEgw1Lf0wYmj/9Egt8VM5VfBFwzmpaz IEb2KalqmRgAeidDtPBDG+oIxXR5NWUbrADH0a/TVCFwbjJgNe7FUGq X-Developer-Key: i=quic_kdybcio@quicinc.com; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= From: Konrad Dybcio There exist some embedded controllers (like Microsoft SAM found on Surface devices or Apple Oscar found on old iPhones) that connect to the host device via serial. Allow that class of devices to exist under serial interface controller nodes. Signed-off-by: Konrad Dybcio Reviewed-by: Krzysztof Kozlowski --- Documentation/devicetree/bindings/serial/serial.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/serial/serial.yaml b/Documentation/devicetree/bindings/serial/serial.yaml index ffc9198ae214..9b2c94796371 100644 --- a/Documentation/devicetree/bindings/serial/serial.yaml +++ b/Documentation/devicetree/bindings/serial/serial.yaml @@ -88,7 +88,7 @@ properties: TX FIFO threshold configuration (in bytes). patternProperties: - "^(bluetooth|bluetooth-gnss|gnss|gps|mcu|onewire)$": + "^(bluetooth|bluetooth-gnss|embedded-controller|gnss|gps|mcu|onewire)$": if: type: object then: From patchwork Sat Aug 10 01:28:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Konrad Dybcio X-Patchwork-Id: 13759330 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB3D0624; Sat, 10 Aug 2024 01:29:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253351; cv=none; b=Vq8QncS9KB0aJFPtLj3Z5BM5hqDh39JC5zPcg2644XWFUPZwUtMYNsrO6mdtUaqbNMqzSu64FD5Pp9lIla5nhb9cwldduqORhJ9GvXoNRohoroZhM3jkn+6MvS7TLKwQbOd4tPMSXpgUvZWFw21NsI9408lcuYsS3xYfcwup0Rg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253351; c=relaxed/simple; bh=saNUSormgrEjNTSTivpz7L+CKcywqBkfM5zmF2N9xeg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=uwMnIA1Y1YgDK2ASEEhx3rvhUA7FFdfX9YvKKj3WbaBHOmEcitUdD318a5tnY5L0YJZDs1av0qwc9kB57WSIwDtMyyEC4UO1JJsyAiHnvdr61/hkkROs3zdBW6XIMM9iscsoKEFghCdcTEGOcANmPOfVEgLrpDXQo16c9CQbOL4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=EbsL3WEX; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="EbsL3WEX" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6E4A9C4AF0F; Sat, 10 Aug 2024 01:29:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1723253351; bh=saNUSormgrEjNTSTivpz7L+CKcywqBkfM5zmF2N9xeg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=EbsL3WEXtj6X0rsIoRKdRlrQTUoZqThJryFgMi8BjaVpK7HGWT/s41VpsyjlXVKpG 75ygDl6072o3VO0jreMP+DoQj4Hk+9+b3EgCXwaORvWwmnLlBIyOr/LZMkBvTLXF5O 0drAB6ZbPQXrIy0a/VadxPaSfSfrbhJpsYAd+Q4VUbDRO/Y04OYeXd7wSN1NxrgjtV v2fBpDefGTEEzu2fdyxjwSoqg1seLdeTFx9rKKtWBXzrodHVBDk0osJ8fyQuXkZYiP B80ZFzkyg9F7WOE0gUzf+OvOAPVv1quT8u4F386kEbbT6oXjcxHEAyjC7sbjRKFLYn BagP283dWXumg== From: Konrad Dybcio Date: Sat, 10 Aug 2024 03:28:39 +0200 Subject: [PATCH v2 2/3] dt-bindings: platform: Add Surface System Aggregator Module Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240810-topic-sam-v2-2-8a8eb368a4f0@quicinc.com> References: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> In-Reply-To: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> To: Rob Herring , Greg Kroah-Hartman , Jiri Slaby , Krzysztof Kozlowski , Conor Dooley , Konrad Dybcio , "Rafael J. Wysocki" , Len Brown , Maximilian Luz , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: Marijn Suijten , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org, Bjorn Andersson , Konrad Dybcio X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1723253333; l=2301; i=quic_kdybcio@quicinc.com; s=20230215; h=from:subject:message-id; bh=SOihdCDjA8pZjnLElCJSnk3cELdk7fp9U7fR3qgjwq0=; b=QqpCnIM/t2ggZ5bzIuNZUKX1/hyOoA2c2jVMr93UTyWpB3lnsdAkR1/qMR8t0+XAOxAyWHutZ I07o/ft1z+KDRVpEJTHkv0FzMRcY7dJVyHMr5cvPwQD0iPwSbQH8FO6 X-Developer-Key: i=quic_kdybcio@quicinc.com; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= From: Konrad Dybcio Add bindings for the Surface System Aggregator Module (SAM/SSAM), the Microsoft Surface-standard Embedded Controller, used on both x86- and Qualcomm-based devices. It provides a plethora of functions, depending on what's wired up to it. That includes but is not limited to: fan control, keyboard/touchpad support, thermal sensors, power control, special buttons, tablet mode. Signed-off-by: Konrad Dybcio --- .../bindings/platform/microsoft,surface-sam.yaml | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/Documentation/devicetree/bindings/platform/microsoft,surface-sam.yaml b/Documentation/devicetree/bindings/platform/microsoft,surface-sam.yaml new file mode 100644 index 000000000000..f613738aa31d --- /dev/null +++ b/Documentation/devicetree/bindings/platform/microsoft,surface-sam.yaml @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/platform/microsoft,surface-sam.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Surface System Aggregator Module (SAM, SSAM) + +maintainers: + - Konrad Dybcio + +description: | + Surface devices use a standardized embedded controller to let the + operating system interface with various hardware functions. The + specific functionalities are modeled as subdevices and matched on + five levels: domain, category, target, instance and function. + +properties: + compatible: + const: microsoft,surface-sam + + interrupts: + maxItems: 1 + + current-speed: + description: The baudrate in bits per second of the device as it comes + online, current active speed. + $ref: /schemas/types.yaml#/definitions/uint32 + +required: + - compatible + - interrupts + +additionalProperties: false + +examples: + - | + #include + uart { + embedded-controller { + compatible = "microsoft,surface-sam"; + + interrupts-extended = <&tlmm 91 IRQ_TYPE_EDGE_RISING>; + + pinctrl-0 = <&ssam_state>; + pinctrl-names = "default"; + + current-speed = <4000000>; + }; + }; From patchwork Sat Aug 10 01:28:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Konrad Dybcio X-Patchwork-Id: 13759331 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B75E874BF5; Sat, 10 Aug 2024 01:29:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253357; cv=none; b=hmnPdCEdkQMPHByh13vmWnAy0qeTzfYAA4mi+anJ17wTqc2fZQTQx2s/BmTbAjhUhPkTNQ+3ZUyXpUz417R0OxxtXWDDXjYH+J8SskUCG/nQBeKc4rPMYOWJZ4ur8Q0tQRW0R3wuUOzVfa3QUvNkT03Su59Bpf9pLbBmQKMguXI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1723253357; c=relaxed/simple; bh=Sz6C8T3BoJ/QMt3ceuNkARbbFklF+dRTPeA+1lTrtd8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VplCMWAMeSmfzyGbn9TuTHTThAR/9ovFBUBV6CbRUE7umkLYaetvpREwWkuYiYfys47WmRBd5b1TrANMdNTThZToJjcxGm0lUeb2tA3wj8QKHcy1FQ85d0HeDCWLkh4GXgqxsTG9xZIdgGj8T9QKHElllsBtRBaf21gOyD8sLKg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UIEdC5UG; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UIEdC5UG" Received: by smtp.kernel.org (Postfix) with ESMTPSA id F148DC32782; Sat, 10 Aug 2024 01:29:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1723253357; bh=Sz6C8T3BoJ/QMt3ceuNkARbbFklF+dRTPeA+1lTrtd8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UIEdC5UGfU3pdC6Z+bQrcdEy5nJSoXcOeEavtwWFoz+RVyd4j/jI0KQvY8/CQFv8m vPINFke4rQ44wDCfKD7kpFTlQuEGtx64gHuFVb3HGEwM4vW3oM6MZAHcCMSsfZgZHf NYtTZsWIIQL4sB1GqbLhbPWpSb2kcPOw4UKjfsG7ok9iijVtbNJojXeCPKGlL22k5/ elb0ZDzCXcRVycvJy+2GrHyYNpslGVYeKW/DpmuPmaqeA6qcYJxKfLAj/ENIxnXCO8 jsMca9qSJtqS2sYVTrYXvY7HI7Q03im3r5wTjpIT0BmNM7PJwB9l6J9WJeXicepkgI UrA96KtMsy1EQ== From: Konrad Dybcio Date: Sat, 10 Aug 2024 03:28:40 +0200 Subject: [PATCH v2 3/3] platform/surface: Add OF support Precedence: bulk X-Mailing-List: platform-driver-x86@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20240810-topic-sam-v2-3-8a8eb368a4f0@quicinc.com> References: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> In-Reply-To: <20240810-topic-sam-v2-0-8a8eb368a4f0@quicinc.com> To: Rob Herring , Greg Kroah-Hartman , Jiri Slaby , Krzysztof Kozlowski , Conor Dooley , Konrad Dybcio , "Rafael J. Wysocki" , Len Brown , Maximilian Luz , Hans de Goede , =?utf-8?q?Ilpo_J=C3=A4rvinen?= Cc: Marijn Suijten , linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org, Bjorn Andersson , Konrad Dybcio X-Mailer: b4 0.14.1 X-Developer-Signature: v=1; a=ed25519-sha256; t=1723253333; l=14424; i=quic_kdybcio@quicinc.com; s=20230215; h=from:subject:message-id; bh=kzJQ8HBMMY7jGytHe5cgO7AgIRChWOBSlnoraKikZs4=; b=vV8zzhynDJOBZPS7TNQSr2kUtDnOX1hScFae7NGhKKY6xp6pwaCXSJfRpYEaWLxB34Ikb3J+O jeYCzxP8QWqAajqNlhkqTRakhHZ3VpG6T7bYnlFb5MsxaksJWKXFZIy X-Developer-Key: i=quic_kdybcio@quicinc.com; a=ed25519; pk=iclgkYvtl2w05SSXO5EjjSYlhFKsJ+5OSZBjOkQuEms= From: Konrad Dybcio Add basic support for registering the aggregator module on Device Tree- based platforms. These include at least three generations of Qualcomm Snapdragon-based Surface devices: - SC8180X / SQ1 / SQ2: Pro X, - SC8280XP / SQ3: Devkit 2023, Pro 9 - X Elite: Laptop 7 / Pro11 Thankfully, the aggregators on these seem to be configured in an identical way, which allows for using these settings as defaults and no DT properties need to be introduced (until that changes, anyway). Based on the work done by Maximilian Luz, largely rewritten. Signed-off-by: Konrad Dybcio --- drivers/platform/surface/aggregator/bus.c | 2 + drivers/platform/surface/aggregator/controller.c | 67 ++++++++++++++---- drivers/platform/surface/aggregator/core.c | 82 +++++++++++++++++----- drivers/platform/surface/surface3_power.c | 4 +- drivers/platform/surface/surface_acpi_notify.c | 4 +- .../platform/surface/surface_aggregator_registry.c | 44 ++++++++++-- 6 files changed, 164 insertions(+), 39 deletions(-) diff --git a/drivers/platform/surface/aggregator/bus.c b/drivers/platform/surface/aggregator/bus.c index af8d573aae93..d68d231e716e 100644 --- a/drivers/platform/surface/aggregator/bus.c +++ b/drivers/platform/surface/aggregator/bus.c @@ -6,6 +6,7 @@ */ #include +#include #include #include @@ -441,6 +442,7 @@ static int ssam_add_client_device(struct device *parent, struct ssam_controller sdev->dev.parent = parent; sdev->dev.fwnode = fwnode_handle_get(node); + sdev->dev.of_node = to_of_node(node); status = ssam_device_add(sdev); if (status) diff --git a/drivers/platform/surface/aggregator/controller.c b/drivers/platform/surface/aggregator/controller.c index 7fc602e01487..27eadf22b292 100644 --- a/drivers/platform/surface/aggregator/controller.c +++ b/drivers/platform/surface/aggregator/controller.c @@ -1104,13 +1104,6 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle, u64 funcs; int status; - /* Set defaults. */ - caps->ssh_power_profile = U32_MAX; - caps->screen_on_sleep_idle_timeout = U32_MAX; - caps->screen_off_sleep_idle_timeout = U32_MAX; - caps->d3_closes_handle = false; - caps->ssh_buffer_size = U32_MAX; - /* Pre-load supported DSM functions. */ status = ssam_dsm_get_functions(handle, &funcs); if (status) @@ -1149,6 +1142,52 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle, return 0; } +/** + * ssam_controller_caps_load_from_of() - Load controller capabilities from OF/DT. + * @dev: A pointer to the controller device + * @caps: Where to store the capabilities in. + * + * Return: Returns zero on success, a negative error code on failure. + */ +static int ssam_controller_caps_load_from_of(struct device *dev, struct ssam_controller_caps *caps) +{ + /* + * Every device starting with Surface Pro X through Laptop 7 uses these + * identical values, which makes them good defaults. + */ + caps->d3_closes_handle = true; + caps->screen_on_sleep_idle_timeout = 5000; + caps->screen_off_sleep_idle_timeout = 30; + caps->ssh_buffer_size = 48; + /* TODO: figure out power profile */ + + return 0; +} + +/** + * ssam_controller_caps_load() - Load controller capabilities + * @dev: A pointer to the controller device + * @caps: Where to store the capabilities in. + * + * Return: Returns zero on success, a negative error code on failure. + */ +static int ssam_controller_caps_load(struct device *dev, struct ssam_controller_caps *caps) +{ + acpi_handle handle = ACPI_HANDLE(dev); + + /* Set defaults. */ + caps->ssh_power_profile = U32_MAX; + caps->screen_on_sleep_idle_timeout = U32_MAX; + caps->screen_off_sleep_idle_timeout = U32_MAX; + caps->d3_closes_handle = false; + caps->ssh_buffer_size = U32_MAX; + + if (handle) + return ssam_controller_caps_load_from_acpi(handle, caps); + else + return ssam_controller_caps_load_from_of(dev, caps); +} + /** * ssam_controller_init() - Initialize SSAM controller. * @ctrl: The controller to initialize. @@ -1165,13 +1204,12 @@ int ssam_controller_caps_load_from_acpi(acpi_handle handle, int ssam_controller_init(struct ssam_controller *ctrl, struct serdev_device *serdev) { - acpi_handle handle = ACPI_HANDLE(&serdev->dev); int status; init_rwsem(&ctrl->lock); kref_init(&ctrl->kref); - status = ssam_controller_caps_load_from_acpi(handle, &ctrl->caps); + status = ssam_controller_caps_load(&serdev->dev, &ctrl->caps); if (status) return status; @@ -2715,11 +2753,12 @@ int ssam_irq_setup(struct ssam_controller *ctrl) const int irqf = IRQF_ONESHOT | IRQF_TRIGGER_RISING | IRQF_NO_AUTOEN; gpiod = gpiod_get(dev, "ssam_wakeup-int", GPIOD_ASIS); - if (IS_ERR(gpiod)) - return PTR_ERR(gpiod); - - irq = gpiod_to_irq(gpiod); - gpiod_put(gpiod); + if (IS_ERR(gpiod)) { + irq = fwnode_irq_get(dev_fwnode(dev), 0); + } else { + irq = gpiod_to_irq(gpiod); + gpiod_put(gpiod); + } if (irq < 0) return irq; diff --git a/drivers/platform/surface/aggregator/core.c b/drivers/platform/surface/aggregator/core.c index 797d0645bd77..2691b6438c0a 100644 --- a/drivers/platform/surface/aggregator/core.c +++ b/drivers/platform/surface/aggregator/core.c @@ -17,9 +17,12 @@ #include #include #include +#include +#include #include #include #include +#include #include #include @@ -299,7 +302,7 @@ static const struct attribute_group ssam_sam_group = { }; -/* -- ACPI based device setup. ---------------------------------------------- */ +/* -- Serial device setup. ------------------------------------------------- */ static acpi_status ssam_serdev_setup_via_acpi_crs(struct acpi_resource *rsc, void *ctx) @@ -352,13 +355,28 @@ static acpi_status ssam_serdev_setup_via_acpi_crs(struct acpi_resource *rsc, return AE_CTRL_TERMINATE; } -static acpi_status ssam_serdev_setup_via_acpi(acpi_handle handle, - struct serdev_device *serdev) +static int ssam_serdev_setup_via_acpi(struct serdev_device *serdev, acpi_handle handle) { - return acpi_walk_resources(handle, METHOD_NAME__CRS, - ssam_serdev_setup_via_acpi_crs, serdev); + acpi_status status; + + status = acpi_walk_resources(handle, METHOD_NAME__CRS, + ssam_serdev_setup_via_acpi_crs, serdev); + + return status ? -ENXIO : 0; } +static int ssam_serdev_setup(struct acpi_device *ssh, struct serdev_device *serdev) +{ + if (ssh) + return ssam_serdev_setup_via_acpi(serdev, ssh->handle); + + /* TODO: these values may differ per board/implementation */ + serdev_device_set_baudrate(serdev, 4 * HZ_PER_MHZ); + serdev_device_set_flow_control(serdev, true); + serdev_device_set_parity(serdev, SERDEV_PARITY_NONE); + + return 0; +} /* -- Power management. ----------------------------------------------------- */ @@ -621,16 +639,17 @@ static int ssam_serial_hub_probe(struct serdev_device *serdev) struct device *dev = &serdev->dev; struct acpi_device *ssh = ACPI_COMPANION(dev); struct ssam_controller *ctrl; - acpi_status astatus; int status; - status = gpiod_count(dev, NULL); - if (status < 0) - return dev_err_probe(dev, status, "no GPIO found\n"); + if (ssh) { + status = gpiod_count(dev, NULL); + if (status < 0) + return dev_err_probe(dev, status, "no GPIO found\n"); - status = devm_acpi_dev_add_driver_gpios(dev, ssam_acpi_gpios); - if (status) - return status; + status = devm_acpi_dev_add_driver_gpios(dev, ssam_acpi_gpios); + if (status) + return status; + } /* Allocate controller. */ ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); @@ -655,9 +674,9 @@ static int ssam_serial_hub_probe(struct serdev_device *serdev) goto err_devopen; } - astatus = ssam_serdev_setup_via_acpi(ssh->handle, serdev); - if (ACPI_FAILURE(astatus)) { - status = dev_err_probe(dev, -ENXIO, "failed to setup serdev\n"); + status = ssam_serdev_setup(ssh, serdev); + if (status) { + status = dev_err_probe(dev, status, "failed to setup serdev\n"); goto err_devinit; } @@ -717,7 +736,23 @@ static int ssam_serial_hub_probe(struct serdev_device *serdev) * For now let's thus default power/wakeup to false. */ device_set_wakeup_capable(dev, true); - acpi_dev_clear_dependencies(ssh); + + /* + * When using DT, we have to register the platform hub driver manually, + * as it can't be matched based on top-level board compatible (like it + * does the ACPI case). + */ + if (!ssh) { + struct platform_device *ph_pdev = + platform_device_register_simple("surface_aggregator_platform_hub", + 0, NULL, 0); + if (IS_ERR(ph_pdev)) + return dev_err_probe(dev, PTR_ERR(ph_pdev), + "Failed to register the platform hub driver\n"); + } + + if (ssh) + acpi_dev_clear_dependencies(ssh); return 0; @@ -782,18 +817,27 @@ static void ssam_serial_hub_remove(struct serdev_device *serdev) device_set_wakeup_capable(&serdev->dev, false); } -static const struct acpi_device_id ssam_serial_hub_match[] = { +static const struct acpi_device_id ssam_serial_hub_acpi_match[] = { { "MSHW0084", 0 }, { }, }; -MODULE_DEVICE_TABLE(acpi, ssam_serial_hub_match); +MODULE_DEVICE_TABLE(acpi, ssam_serial_hub_acpi_match); + +#ifdef CONFIG_OF +static const struct of_device_id ssam_serial_hub_of_match[] = { + { .compatible = "microsoft,surface-sam", }, + { }, +}; +MODULE_DEVICE_TABLE(of, ssam_serial_hub_of_match); +#endif static struct serdev_device_driver ssam_serial_hub = { .probe = ssam_serial_hub_probe, .remove = ssam_serial_hub_remove, .driver = { .name = "surface_serial_hub", - .acpi_match_table = ssam_serial_hub_match, + .acpi_match_table = ACPI_PTR(ssam_serial_hub_acpi_match), + .of_match_table = of_match_ptr(ssam_serial_hub_of_match), .pm = &ssam_serial_hub_pm_ops, .shutdown = ssam_serial_hub_shutdown, .probe_type = PROBE_PREFER_ASYNCHRONOUS, diff --git a/drivers/platform/surface/surface3_power.c b/drivers/platform/surface/surface3_power.c index 4c0f92562a79..7eab6a124712 100644 --- a/drivers/platform/surface/surface3_power.c +++ b/drivers/platform/surface/surface3_power.c @@ -478,7 +478,9 @@ static int mshw0011_install_space_handler(struct i2c_client *client) return -ENOMEM; } - acpi_dev_clear_dependencies(adev); + if (adev) + acpi_dev_clear_dependencies(adev); + return 0; } diff --git a/drivers/platform/surface/surface_acpi_notify.c b/drivers/platform/surface/surface_acpi_notify.c index 20f3870915d2..b0d43e639db2 100644 --- a/drivers/platform/surface/surface_acpi_notify.c +++ b/drivers/platform/surface/surface_acpi_notify.c @@ -815,7 +815,9 @@ static int san_probe(struct platform_device *pdev) if (status) goto err_install_dev; - acpi_dev_clear_dependencies(san); + if (san) + acpi_dev_clear_dependencies(san); + return 0; err_install_dev: diff --git a/drivers/platform/surface/surface_aggregator_registry.c b/drivers/platform/surface/surface_aggregator_registry.c index 1c4d74db08c9..57787f2ff38b 100644 --- a/drivers/platform/surface/surface_aggregator_registry.c +++ b/drivers/platform/surface/surface_aggregator_registry.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -273,6 +274,18 @@ static const struct software_node *ssam_node_group_sl5[] = { NULL, }; +/* Devices for Surface Laptop 7. */ +static const struct software_node *ssam_node_group_sl7[] = { + &ssam_node_root, + &ssam_node_bat_ac, + &ssam_node_bat_main, + &ssam_node_tmp_perf_profile_with_fan, + &ssam_node_fan_speed, + &ssam_node_hid_sam_keyboard, + /* TODO: evaluate thermal sensors devices when we get a driver for that */ + NULL, +}; + /* Devices for Surface Laptop Studio. */ static const struct software_node *ssam_node_group_sls[] = { &ssam_node_root, @@ -346,7 +359,7 @@ static const struct software_node *ssam_node_group_sp9[] = { /* -- SSAM platform/meta-hub driver. ---------------------------------------- */ -static const struct acpi_device_id ssam_platform_hub_match[] = { +static const struct acpi_device_id ssam_platform_hub_acpi_match[] = { /* Surface Pro 4, 5, and 6 (OMBR < 0x10) */ { "MSHW0081", (unsigned long)ssam_node_group_gen5 }, @@ -402,16 +415,39 @@ static const struct acpi_device_id ssam_platform_hub_match[] = { }; MODULE_DEVICE_TABLE(acpi, ssam_platform_hub_match); +#ifdef CONFIG_OF +static const struct of_device_id ssam_platform_hub_of_match[] = { + /* Surface Laptop 7 */ + { .compatible = "microsoft,romulus13", (void *)ssam_node_group_sl7 }, + { .compatible = "microsoft,romulus15", (void *)ssam_node_group_sl7 }, + { }, +}; +#endif + static int ssam_platform_hub_probe(struct platform_device *pdev) { const struct software_node **nodes; + const struct of_device_id *match; + struct device_node *fdt_root; struct ssam_controller *ctrl; struct fwnode_handle *root; int status; nodes = (const struct software_node **)acpi_device_get_match_data(&pdev->dev); - if (!nodes) - return -ENODEV; + if (!nodes) { + fdt_root = of_find_node_by_path("/"); + if (!fdt_root) + return -ENODEV; + + match = of_match_node(ssam_platform_hub_of_match, fdt_root); + of_node_put(fdt_root); + if (!match) + return -ENODEV; + + nodes = (const struct software_node **)match->data; + if (!nodes) + return -ENODEV; + } /* * As we're adding the SSAM client devices as children under this device @@ -460,7 +496,7 @@ static struct platform_driver ssam_platform_hub_driver = { .remove_new = ssam_platform_hub_remove, .driver = { .name = "surface_aggregator_platform_hub", - .acpi_match_table = ssam_platform_hub_match, + .acpi_match_table = ssam_platform_hub_acpi_match, .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, };