From nobody Sun May 24 19:33:56 2026 Received: from mail-ed1-f48.google.com (mail-ed1-f48.google.com [209.85.208.48]) (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 4C9C437FF4E for ; Sat, 23 May 2026 08:51:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779526284; cv=none; b=o3y+IJcOBCOa2OyYbNtaQqXJN31c0puqJXs0g1yAcy0ppGqK3Wnw+Sw9f8j1g8hT33kVc8TNNtBXZQEATu4lZRyrtX2ceKoZb+3S5U1bNt98JWnN/i4zXgIjg/w2lkws6Rxm7lUXiCfkS5Hz9JYGxD9c+PEGQIOgnXptc5sek54= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779526284; c=relaxed/simple; bh=lOWy9eUNtVw3uHlGLztGJ2hKsmF/zmvpZUW7KvLTwus=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bRDSw23vaQ4KSFZIkXv+3na0gZdUHrmaEyRvfv3EHvTThXv01+L9ZjQ5WMG2GjWt7HC3DtJIny0wVe13aPWLLjaFcqc5IZAdR9O6plbkRYjiL6WKHpJNsGRvNDXMRpmxxv3NvfnnYXxod/QthqGKWlcOdXNYlCOyVv9KdPkHmso= 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=f7yiklst; arc=none smtp.client-ip=209.85.208.48 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="f7yiklst" Received: by mail-ed1-f48.google.com with SMTP id 4fb4d7f45d1cf-687e7edaafeso1686952a12.1 for ; Sat, 23 May 2026 01:51:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779526282; x=1780131082; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=qd13IJH48wsy3wb7Nhpj3jYUFTP23MxMKgJz3kfiVvE=; b=f7yiklstturutL/q2rxY5rnZgqUHLPhI7kT1FB4XTobmV/T8mHmIXSSFV6W7VoBe1c O5OxB+Ye5jmYLpQW914xgPSaqXcFB1rfqH3u+fReKDPF+0I+yM1MAVrseYyfbsMLtBWI +FrLlp8icmUAXNed7mVCB+qCRz1oMdjvDJ1dDVSFZzMgmKzhbw18YnK1zzvA9CwihL0U JNmo23c0pZ2UhqFLqzk5jR3QzBtpGs7xxSI5s56b90p4Zwgaq92q5h/HEE+gAZZY/306 Pkzi8NrPTZHNjQ0eYU3E1VUJrzb+t4q3NBV2y4vOyqr0CwhSIKBFhXQcF3tsoA4Al7pJ uPOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779526282; x=1780131082; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=qd13IJH48wsy3wb7Nhpj3jYUFTP23MxMKgJz3kfiVvE=; b=iu/KeobHRm+tZu2hIVuGNx+E7X/Lf3/T93cJr/dDAJ586RSLunKmlla8bDzsSEbBmM 2l0YpzRc4v6752CqiVfdGYhvCtAHaTy1YLFKH53YwgoM9i8O999I0R30Ne/5GZ8cTwt+ GNY3a4wvGUFNlkMPAZ1pu5E5MWXSTyS4WzRvuAqjNvOhVnf7qKxDrISIMLV044mISFv/ /GEkB2mbbgZTgX16Dvw3zJbtpMxhCILUmBDeO68haRlhd5XpZJZ1flwDsaaA0vpicEVE AEMQE8yuVAb+Ru+H6z6RpnxzV0loAcpo0kELg5OXpR7ofgHY3acdro0yPEknfWA1FGD9 qqYQ== X-Forwarded-Encrypted: i=1; AFNElJ+pQPt1vmGDABAaDxbsM1UsOTHswv0/OE8UDAX9i0yZPlkbEE+Ea7JxgwZ9XvWR1tYT4GLAfKfokCIyWUk=@vger.kernel.org X-Gm-Message-State: AOJu0Yy947sgPiPRMgfl3+cPT1L7szgQxr3MSSNP/ENDphzPRd8tTXcp Z2bRZMw9tEfWvfn6aP5tyPcXzHaBgPy5NMpg/OnCmgrb/2Gog7W1hbSq X-Gm-Gg: Acq92OHrWSuZrzwrujkXaTQDwU+TYrs1HClbn0tYQO5pvejyQSbBFNnKfOhCEbzdC5H xmNkMpaCqQ7qqUeHfI7/RVr//PewYE2G2ttx303PHGZYjbLX339SHD/0PYcIIfqqjlGgqL739J5 MkL2rqlQJwKUz+gp3SZdo9GzP4afydaJL/bgcdmi2a+UywHWsg6koAOz6+RFvzkbsdtJPJW9mT6 0t9MzgPEUw/8K1DPfSMmlrqyqZal0yv3FGouS6MrPHM6XUrTDV7G9BNPefzXTIynUcM4KUmraCx Jzni9ecn/jPuplYBjJhVelCLvpU8vA0XleEyRD8RG4PYGKeopLP094E6pRw6JiZJwWMmFeEXUIL v/Gu8sTV+UM4C5pWhSSBihyN9X6wpcnzZieKURRpNlBCN6DcT/BvBQVKUEhyHqftPNQIfjO0Rgd H5Lts55lQdF1va X-Received: by 2002:a05:6402:35d1:b0:682:d851:6df9 with SMTP id 4fb4d7f45d1cf-6889cc3160cmr4084555a12.15.1779526281695; Sat, 23 May 2026 01:51:21 -0700 (PDT) Received: from xeon ([188.163.112.61]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-688baf1f0afsm1642658a12.17.2026.05.23.01.51.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 May 2026 01:51:20 -0700 (PDT) From: Svyatoslav Ryhel To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Bartosz Golaszewski , Svyatoslav Ryhel Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH v2 1/2] dt-bindings: soc: tegra: Document Nvidia Tegra modem pwrseq Date: Sat, 23 May 2026 11:51:01 +0300 Message-ID: <20260523085102.51000-2-clamor95@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260523085102.51000-1-clamor95@gmail.com> References: <20260523085102.51000-1-clamor95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Document the Tegra modem pwseq used by various devices based on the Nvidia Tegra SoC, describing its usage. The power sequence provides interaction between the modem and SoC-specific interface configurations. Signed-off-by: Svyatoslav Ryhel --- .../soc/tegra/nvidia,tegra-modem-pwrseq.yaml | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Documentation/devicetree/bindings/soc/tegra/nvidia,tegr= a-modem-pwrseq.yaml diff --git a/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra-modem= -pwrseq.yaml b/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra-mod= em-pwrseq.yaml new file mode 100644 index 000000000000..3770fd6dc2cf --- /dev/null +++ b/Documentation/devicetree/bindings/soc/tegra/nvidia,tegra-modem-pwrseq= .yaml @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/soc/tegra/nvidia,tegra-modem-pwrseq.yam= l# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Nvidia Tegra modem power sequence + +description: + A configuration sequence used in Tegra SoCs to provide proper interaction + between the application processor and the modem, as well as control over + one of the SoC's USB lines for the modem. + +maintainers: + - Svyatoslav Ryhel + +properties: + compatible: + const: nvidia,tegra-modem-pwrseq + + enable-gpios: + description: GPIO connected to the modem EINT1 pin + maxItems: 1 + + nvidia,usb-bus: + description: + Contains phandle pointing to the Host's USB controller + $ref: /schemas/types.yaml#/definitions/phandle + + power-supply: true + +required: + - compatible + - nvidia,usb-bus + +additionalProperties: false + +examples: + - | + #include + + pwrseq-modem { + compatible =3D "nvidia,tegra-modem-pwrseq"; + + enable-gpios =3D <&gpio 165 GPIO_ACTIVE_HIGH>; + power-supply =3D <&vdd_3v3_vbat>; + + nvidia,usb-bus =3D <&usb2>; + }; --=20 2.51.0 From nobody Sun May 24 19:33:56 2026 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 9E88637FF5D for ; Sat, 23 May 2026 08:51:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779526288; cv=none; b=J8sOwrcLE0YhmaedeE1pdhk5DcnaS9WMEAUFP7tnNX5stH+2+P6ZiANzL2EHqDc+0YA2YbDYU/+zOuwN1VBz2F+D3BIovv3ndOQXQ9mhJP8EDj+YvISo3hiUXaXeBogcGqrbzYK+pmi+z8A1VQ89fexgO/KymxLEV53MrqM2OIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779526288; c=relaxed/simple; bh=WGCtPIsx1klGYXiM4u2u/0+bc1X9oZto4hbGtOGOHPw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ALhockuHTQknfHGGIZbnELIvjY5qSqOErbuUhM7ydHpAYNpjx61C+XNryVW6BTc0kcH/HsgJQslTXufcqZGPcxmZo+imogg8hrABc116b75txqx9P3VSkCuARvVlpNHiDnmVHPqkKXg0Y4BeBxlwKdvKnLtuU1EgDYD8SLiHzGI= 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=VIucBs1j; arc=none smtp.client-ip=209.85.208.46 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="VIucBs1j" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-67b6da5a618so12841148a12.2 for ; Sat, 23 May 2026 01:51:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779526285; x=1780131085; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/UjB01wT884BtqcqCl2rm6i6c4hxd/SXr47aw6UGJ4g=; b=VIucBs1juq/Qsi8DLjn0YOjmGO01KnzQx5OVmVtoO0jHiZBbvkGW3aO5FzdluK5oD/ 2F+Ym0T4zjc9xs4r0aTHIKkwVJdaKjzEPVd4YzricF8bv5Ub4yLhimSbomLk8hoVaPFa G7RzPrEQwE9gctM1k0KJ7YRRWaRtOgC7NH8y4YpYb2wR6V5PPDNmlvwj5nJpMsRue/xx /456oh2Qw5yKp54aNh8yxY9oJ8QTDilWcGfISRQt7WmkLgb4AV+jTewbRunW9bthhUZz AhP39O+ZNmukS7L+QSu0MEdHBdSPjSBTVDyV95Xj5OvjWo31p+ytn84rk3ZdzDkF9tmb MkkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779526285; x=1780131085; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/UjB01wT884BtqcqCl2rm6i6c4hxd/SXr47aw6UGJ4g=; b=KW3G1zX6MlZVqzA3aF79vC6eojXGhqh1R3eX1RJYFMGaJNQ+/QQ7b1FypyqUbXYQfB DoG6dPxW9RIAc0rxSLBOnDekhIx9/vA3t0xdOKYzHJTdujAg9QqogyVK64qIG7o7IBTF mu0gGzkCSLafNkzolrn4Q+2+ST8lHmvblX6GwTPhGltjQJVNizrOWljvOE7IoSrgzL7B Rk2aSrWGUpCklIxsGBPXpnYcpfSEKQkMEdALazLpVHUG50BzzHvk08R85iZWRIB+PyZL GaFO3nia+v/Gu6Re/z5OrWEP4va6jhtLDgGYMBqF2y7FAhlx4uHJgmpmYbHbuoG3HH+k PTxQ== X-Forwarded-Encrypted: i=1; AFNElJ9gebpbV9O19OE3Gk7XJgCTbFmN3qCVatz/91UaluNrs4C/uPdmZ8ot75xdrdAlJXnfrx+fRCaBM8soJZ0=@vger.kernel.org X-Gm-Message-State: AOJu0Yyh0NZ8xgNC+o8Xx5WVCh9VwQcsmO8c910+M1F/cJeOHs3OxzfL U0Z+liPPdWb9pHz1U/lvfamHgUdhkSig224RyjNm3aans2/4tFT7uH88 X-Gm-Gg: Acq92OGBqp5Al9OQRUo19jVPIB+ftV+uq8VbDeIWc6TqtyqaWgPJGYtR8tcEH5BZICr hBP5wF+ffhjxK2yQdAoZ6vxnaxLkBYqq4fW1pz2tmwAEXmtciMPxPuQ2oQGaaV7ekmnRZWDcnRA 9pO1bxa8tyzOflVABEjHVMsE5F9zBj97ZEaL0EQ5bYINdKhTWlYP/G4svs4QTWHLaY75PErucLS N5H2JpSqgRxuX1TjvnTkJNtt5y4TVq6BZ/NEEfJIdDtwdFKiPMyzunAPDDLqn6x5ZSfGna0kk9p PZKtZztzWJuNPNffeuKDFsAEa4D7Y3j3QTLJPYIW22YCH9zWtwTbYwE6B/PMTQI8tdgaRp1a9/I +P0Fpb+j0U+Y1kTBy6hozzNvTSneJQxui3ObMWFNul9rvkSBymsoem1kudf1j9qlqLLQUbABJhH LZe/Ph93cbmz9n X-Received: by 2002:a05:6402:11d3:b0:66e:56a2:b67b with SMTP id 4fb4d7f45d1cf-6889cc44111mr3813692a12.20.1779526284988; Sat, 23 May 2026 01:51:24 -0700 (PDT) Received: from xeon ([188.163.112.61]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-688baf1f0afsm1642658a12.17.2026.05.23.01.51.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 May 2026 01:51:23 -0700 (PDT) From: Svyatoslav Ryhel To: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Thierry Reding , Jonathan Hunter , Bartosz Golaszewski , Svyatoslav Ryhel Cc: devicetree@vger.kernel.org, linux-tegra@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org Subject: [PATCH v2 2/2] power: sequencing: Add support for Nvidia Tegra modem pwrseq Date: Sat, 23 May 2026 11:51:02 +0300 Message-ID: <20260523085102.51000-3-clamor95@gmail.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260523085102.51000-1-clamor95@gmail.com> References: <20260523085102.51000-1-clamor95@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Nvidia Tegra modem power sequence is a set of configurations used in Tegra SoCs to provide proper interaction between the application processor and the modem, as well as control over one of the SoC's USB lines for the modem. Signed-off-by: Svyatoslav Ryhel --- drivers/power/sequencing/Kconfig | 12 + drivers/power/sequencing/Makefile | 1 + drivers/power/sequencing/pwrseq-tegra-modem.c | 209 ++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 drivers/power/sequencing/pwrseq-tegra-modem.c diff --git a/drivers/power/sequencing/Kconfig b/drivers/power/sequencing/Kc= onfig index 1c5f5820f5b7..e04a6bacb476 100644 --- a/drivers/power/sequencing/Kconfig +++ b/drivers/power/sequencing/Kconfig @@ -46,4 +46,16 @@ config POWER_SEQUENCING_PCIE_M2 connectors. This driver handles the power sequencing for the M.2 connectors exposing multiple interfaces like PCIe, SATA, UART, etc... =20 +config POWER_SEQUENCING_TEGRA_MODEM + tristate "NVIDIA Tegra modem power sequencing driver" + depends on ARCH_TEGRA && USB_NET_XMM6260 && USB_SUPPORT + help + Enable this to support power sequence for XMM6260 modem found in + various Tegra devices with cellular capabilities, like + LG Optimus 4X P880, LG Optimus Vu P895, Google Nexus 7 (2012) 3G + and ASUS Transformer Pad 3G TF300TG. + + To compile this driver as a module, choose M here: the module will + be called pwrseq-tegra-modem. + endif diff --git a/drivers/power/sequencing/Makefile b/drivers/power/sequencing/M= akefile index 0911d4618298..c36be7edb8ca 100644 --- a/drivers/power/sequencing/Makefile +++ b/drivers/power/sequencing/Makefile @@ -6,3 +6,4 @@ pwrseq-core-y :=3D core.o obj-$(CONFIG_POWER_SEQUENCING_QCOM_WCN) +=3D pwrseq-qcom-wcn.o obj-$(CONFIG_POWER_SEQUENCING_TH1520_GPU) +=3D pwrseq-thead-gpu.o obj-$(CONFIG_POWER_SEQUENCING_PCIE_M2) +=3D pwrseq-pcie-m2.o +obj-$(CONFIG_POWER_SEQUENCING_TEGRA_MODEM) +=3D pwrseq-tegra-modem.o diff --git a/drivers/power/sequencing/pwrseq-tegra-modem.c b/drivers/power/= sequencing/pwrseq-tegra-modem.c new file mode 100644 index 000000000000..61df645e642d --- /dev/null +++ b/drivers/power/sequencing/pwrseq-tegra-modem.c @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct pwrseq_tegra_modem_ctx { + struct device *dev; + struct pwrseq_device *pwrseq; + + struct gpio_desc *enable_gpio; + struct regulator *power_supply; + + struct platform_device *usb_dev; + struct tegra_usb *usb; +}; + +static int pwrseq_tegra_modem_power_enable(struct pwrseq_device *pwrseq) +{ + struct pwrseq_tegra_modem_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); + + return regulator_enable(ctx->power_supply); +} + +static int pwrseq_tegra_modem_power_disable(struct pwrseq_device *pwrseq) +{ + struct pwrseq_tegra_modem_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); + + return regulator_disable(ctx->power_supply); +} + +static const struct pwrseq_unit_data pwrseq_tegra_modem_power_unit_data = =3D { + .name =3D "power-enable", + .enable =3D pwrseq_tegra_modem_power_enable, + .disable =3D pwrseq_tegra_modem_power_disable, +}; + +static const struct pwrseq_unit_data *pwrseq_tegra_modem_unit_deps[] =3D { + &pwrseq_tegra_modem_power_unit_data, + NULL, +}; + +static int pwrseq_tegra_modem_enable(struct pwrseq_device *pwrseq) +{ + struct pwrseq_tegra_modem_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); + struct tegra_usb *usb =3D ctx->usb; + int ret; + + /* + * USB controller registers shouldn't be touched before PHY is + * initialized, otherwise CPU will hang because clocks are gated. + * PHY driver controls gating of internal USB clocks on Tegra. + */ + ret =3D usb_phy_init(usb->phy); + if (ret) { + dev_err(ctx->dev, "failed to init USB PHY\n"); + return ret; + } + + usb->dev =3D ci_hdrc_add_device(&ctx->usb_dev->dev, + ctx->usb_dev->resource, + ctx->usb_dev->num_resources, + &usb->data); + if (IS_ERR(usb->dev)) { + usb_phy_shutdown(usb->phy); + dev_err(ctx->dev, "failed to register USB controller\n"); + return PTR_ERR(usb->dev); + } + + gpiod_set_value_cansleep(ctx->enable_gpio, 1); + + return 0; +} + +static int pwrseq_tegra_modem_disable(struct pwrseq_device *pwrseq) +{ + struct pwrseq_tegra_modem_ctx *ctx =3D pwrseq_device_get_drvdata(pwrseq); + struct tegra_usb *usb =3D ctx->usb; + + gpiod_set_value_cansleep(ctx->enable_gpio, 0); + ci_hdrc_remove_device(usb->dev); + usb_phy_shutdown(usb->phy); + + /* For USB to settle after turning off */ + msleep(500); + + return 0; +} + +static const struct pwrseq_unit_data pwrseq_tegra_modem_unit =3D { + .name =3D "modem-power-sequence", + .deps =3D pwrseq_tegra_modem_unit_deps, + .enable =3D pwrseq_tegra_modem_enable, + .disable =3D pwrseq_tegra_modem_disable, +}; + +static const struct pwrseq_target_data pwrseq_tegra_modem_target =3D { + .name =3D "modem-power", + .unit =3D &pwrseq_tegra_modem_unit, +}; + +static const struct pwrseq_target_data *pwrseq_tegra_modem_targets[] =3D { + &pwrseq_tegra_modem_target, + NULL +}; + +static int pwrseq_tegra_modem_match(struct pwrseq_device *pwrseq, + struct device *dev) +{ + /* We only match the specific modem compatible for now */ + if (!of_device_is_compatible(dev->of_node, "infineon,xmm6260")) + return PWRSEQ_NO_MATCH; + + return PWRSEQ_MATCH_OK; +} + +static void pwrseq_tegra_modem_put_device(void *dev) +{ + put_device(dev); +} + +static int pwrseq_tegra_modem_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct device_node *usb_node; + struct pwrseq_tegra_modem_ctx *ctx; + struct pwrseq_config config =3D { }; + int ret; + + ctx =3D devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + ctx->dev =3D dev; + + ctx->enable_gpio =3D devm_gpiod_get_optional(dev, "enable", + GPIOD_OUT_LOW); + if (IS_ERR(ctx->enable_gpio)) + return dev_err_probe(dev, PTR_ERR(ctx->enable_gpio), + "failed to get enable GPIO\n"); + + ctx->power_supply =3D devm_regulator_get(dev, "power"); + if (IS_ERR(ctx->power_supply)) + return dev_err_probe(dev, PTR_ERR(ctx->power_supply), + "failed to get power supply\n"); + + usb_node =3D of_parse_phandle(dev->of_node, "nvidia,usb-bus", 0); + if (!usb_node) + return dev_err_probe(dev, -ENODEV, + "failed to parse modem USB bus\n"); + + ctx->usb_dev =3D of_find_device_by_node(usb_node); + of_node_put(usb_node); + if (!ctx->usb_dev) + return -EPROBE_DEFER; + + ret =3D devm_add_action_or_reset(dev, pwrseq_tegra_modem_put_device, + &ctx->usb_dev->dev); + if (ret) + return ret; + + ctx->usb =3D platform_get_drvdata(ctx->usb_dev); + if (!ctx->usb) + return -EPROBE_DEFER; + + config.parent =3D dev; + config.owner =3D THIS_MODULE; + config.drvdata =3D ctx; + config.match =3D pwrseq_tegra_modem_match; + config.targets =3D pwrseq_tegra_modem_targets; + + ctx->pwrseq =3D devm_pwrseq_device_register(dev, &config); + if (IS_ERR(ctx->pwrseq)) + return dev_err_probe(dev, PTR_ERR(ctx->pwrseq), + "failed to register the power sequencer\n"); + + return 0; +} + +static const struct of_device_id pwrseq_tegra_modem_of_match[] =3D { + { .compatible =3D "nvidia,tegra-modem-pwrseq" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, pwrseq_tegra_modem_of_match); + +static struct platform_driver pwrseq_tegra_modem_driver =3D { + .driver =3D { + .name =3D "pwrseq-tegra-modem", + .of_match_table =3D pwrseq_tegra_modem_of_match, + }, + .probe =3D pwrseq_tegra_modem_probe, +}; +module_platform_driver(pwrseq_tegra_modem_driver); + +MODULE_AUTHOR("Svyatolsav Ryhel "); +MODULE_DESCRIPTION("Tegra modem power sequencer driver"); +MODULE_LICENSE("GPL"); --=20 2.51.0