From nobody Tue Feb 10 12:42:43 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (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 7E2E937F723; Wed, 14 Jan 2026 08:40:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768380016; cv=none; b=NQ/NRCL02RWENAhcq8ZxBEdQsKd8Om2phSXHeEOfT+IuLNk8oVsCzauNXBPLEIBRplidOVxMAKiTvQ57MF+jffB7gXbrNLqvM73iy6WycUCCogEr/WjOpCA1E1c6sG5d9kP7fhuCnxdmwlCkbTXsY8U+UbFxCjLv05cX+8A84Kw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768380016; c=relaxed/simple; bh=KLzPfasv33KjOdQP4AHDH9gsaAkoVuSbhKRBq5/2Ow4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JglaZzixDgNhNAMbEwL3rplTjMX6SkCR1ybiRm9/ALLdS+mHziLCrSsX16XxXfm1I5kdGB1kz8CihoRuCdXfD0p3OCOjhYEBTTMALA4RKPyPBpI6thvVwtW7ZgkFUXe3lkxcdZa+04OH/RPU9gHiUtLCjZut96lBSTYSrFgwbrM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=dkS85Zdu; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="dkS85Zdu" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1768380009; bh=KLzPfasv33KjOdQP4AHDH9gsaAkoVuSbhKRBq5/2Ow4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dkS85Zdu9UfZYpYg5UbEjEPR5I+ZraF5qMFIuVFqVYmaTA+aC4ujpChz99E7/o8G3 h58Jfj5/SizGl2u/U0YEK/JUvYO7mXnSUUYjq/df33eAt1EX5i+NTpx9pExqDDyqSh p6sd7pFWASvzTb5fXhUqk9KU/GD4LOiiS3oKJqvyySb1GKkrVKGnFUHpOrcGP0U/bI SAhiTW9NvmV8fNIp8aYMyTDX155R2pBpASlPy7DcUB6weuppFvUqmYiIz1OY2RQ0lX 6pKuhXjC3j/BwzasgmFEg6Z96q7fdUTtpWkbkHew12f4HS8lsjABwSc1BFbxiadVsO nysMHNNGNn94Q== Received: from IcarusMOD.eternityproject.eu (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by bali.collaboradmins.com (Postfix) with ESMTPSA id 315E517E0456; Wed, 14 Jan 2026 09:40:08 +0100 (CET) From: AngeloGioacchino Del Regno To: jic23@kernel.org Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, srini@kernel.org, vkoul@kernel.org, neil.armstrong@linaro.org, sre@kernel.org, sboyd@kernel.org, angelogioacchino.delregno@collabora.com, krzk@kernel.org, dmitry.baryshkov@oss.qualcomm.com, quic_wcheng@quicinc.com, melody.olvera@oss.qualcomm.com, quic_nsekar@quicinc.com, ivo.ivanov.ivanov1@gmail.com, abelvesa@kernel.org, luca.weiss@fairphone.com, konrad.dybcio@oss.qualcomm.com, mitltlatltl@gmail.com, krishna.kurapati@oss.qualcomm.com, linux-arm-msm@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-phy@lists.infradead.org, linux-pm@vger.kernel.org, kernel@collabora.com, Abel Vesa Subject: [PATCH v7 07/10] phy: qualcomm: eusb2-repeater: Migrate to devm_spmi_subdevice_alloc_and_add() Date: Wed, 14 Jan 2026 09:39:54 +0100 Message-ID: <20260114083957.9945-8-angelogioacchino.delregno@collabora.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260114083957.9945-1-angelogioacchino.delregno@collabora.com> References: <20260114083957.9945-1-angelogioacchino.delregno@collabora.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" Some Qualcomm PMICs integrate an USB Repeater device, used to convert between eUSB2 and USB 2.0 signaling levels, reachable in a specific address range over SPMI. Instead of using the parent SPMI device (the main PMIC) as a kind of syscon in this driver, register a new SPMI sub-device for EUSB2 and initialize its own regmap with this sub-device's specific base address, retrieved from the devicetree. This allows to stop manually adding the register base address to every R/W call in this driver, as this can be, and is now, handled by the regmap API instead. Tested-by: Neil Armstrong # on SM8650-QRD Reviewed-by: Abel Vesa Signed-off-by: AngeloGioacchino Del Regno --- drivers/phy/qualcomm/Kconfig | 2 + .../phy/qualcomm/phy-qcom-eusb2-repeater.c | 55 ++++++++++++------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig index 60a0ead127fa..902a788f35f1 100644 --- a/drivers/phy/qualcomm/Kconfig +++ b/drivers/phy/qualcomm/Kconfig @@ -128,7 +128,9 @@ config PHY_QCOM_QUSB2 config PHY_QCOM_EUSB2_REPEATER tristate "Qualcomm PMIC eUSB2 Repeater Driver" depends on OF && (ARCH_QCOM || COMPILE_TEST) + depends on SPMI select GENERIC_PHY + select REGMAP_SPMI help Enable support for the USB high-speed eUSB2 repeater on Qualcomm PMICs. The repeater is paired with a Synopsys or M31 eUSB2 Phy diff --git a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c b/drivers/phy/q= ualcomm/phy-qcom-eusb2-repeater.c index efeec4709a15..88e10020f958 100644 --- a/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c +++ b/drivers/phy/qualcomm/phy-qcom-eusb2-repeater.c @@ -9,6 +9,7 @@ #include #include #include +#include =20 /* eUSB2 status registers */ #define EUSB2_RPTR_STATUS 0x08 @@ -66,7 +67,6 @@ struct eusb2_repeater { struct phy *phy; struct regulator_bulk_data *vregs; const struct eusb2_repeater_cfg *cfg; - u32 base; enum phy_mode mode; }; =20 @@ -143,7 +143,6 @@ static int eusb2_repeater_init(struct phy *phy) struct eusb2_repeater *rptr =3D phy_get_drvdata(phy); struct device_node *np =3D rptr->dev->of_node; struct regmap *regmap =3D rptr->regmap; - u32 base =3D rptr->base; u32 poll_val; s32 dt_val; int ret; @@ -154,37 +153,37 @@ static int eusb2_repeater_init(struct phy *phy) if (ret) return ret; =20 - regmap_write(regmap, base + EUSB2_EN_CTL1, EUSB2_RPTR_EN); + regmap_write(regmap, EUSB2_EN_CTL1, EUSB2_RPTR_EN); =20 /* Write registers from init table */ for (int i =3D 0; i < rptr->cfg->init_tbl_num; i++) - regmap_write(regmap, base + rptr->cfg->init_tbl[i].reg, + regmap_write(regmap, rptr->cfg->init_tbl[i].reg, rptr->cfg->init_tbl[i].value); =20 /* Override registers from devicetree values */ if (!of_property_read_u8(np, "qcom,tune-usb2-preem", &val)) - regmap_write(regmap, base + EUSB2_TUNE_USB2_PREEM, val); + regmap_write(regmap, EUSB2_TUNE_USB2_PREEM, val); =20 if (!of_property_read_u8(np, "qcom,tune-usb2-disc-thres", &val)) - regmap_write(regmap, base + EUSB2_TUNE_HSDISC, val); + regmap_write(regmap, EUSB2_TUNE_HSDISC, val); =20 if (!of_property_read_u8(np, "qcom,tune-usb2-amplitude", &val)) - regmap_write(regmap, base + EUSB2_TUNE_IUSB2, val); + regmap_write(regmap, EUSB2_TUNE_IUSB2, val); =20 if (!of_property_read_u8(np, "qcom,tune-res-fsdif", &val)) - regmap_write(regmap, base + EUSB2_TUNE_RES_FSDIF, val); + regmap_write(regmap, EUSB2_TUNE_RES_FSDIF, val); =20 if (!of_property_read_s32(np, "qcom,squelch-detector-bp", &dt_val)) { for (i =3D 0; i < ARRAY_SIZE(squelch_detector); i++) { if (squelch_detector[i] =3D=3D dt_val) { - regmap_write(regmap, base + EUSB2_TUNE_SQUELCH_U, i); + regmap_write(regmap, EUSB2_TUNE_SQUELCH_U, i); break; } } } =20 /* Wait for status OK */ - ret =3D regmap_read_poll_timeout(regmap, base + EUSB2_RPTR_STATUS, poll_v= al, + ret =3D regmap_read_poll_timeout(regmap, EUSB2_RPTR_STATUS, poll_val, poll_val & RPTR_OK, 10, 5); if (ret) dev_err(rptr->dev, "initialization timed-out\n"); @@ -197,7 +196,6 @@ static int eusb2_repeater_set_mode(struct phy *phy, { struct eusb2_repeater *rptr =3D phy_get_drvdata(phy); struct regmap *regmap =3D rptr->regmap; - u32 base =3D rptr->base; =20 switch (mode) { case PHY_MODE_USB_HOST: @@ -206,8 +204,8 @@ static int eusb2_repeater_set_mode(struct phy *phy, * per eUSB 1.2 Spec. Below implement software workaround until * PHY and controller is fixing seen observation. */ - regmap_write(regmap, base + EUSB2_FORCE_EN_5, F_CLK_19P2M_EN); - regmap_write(regmap, base + EUSB2_FORCE_VAL_5, V_CLK_19P2M_EN); + regmap_write(regmap, EUSB2_FORCE_EN_5, F_CLK_19P2M_EN); + regmap_write(regmap, EUSB2_FORCE_VAL_5, V_CLK_19P2M_EN); break; case PHY_MODE_USB_DEVICE: /* @@ -216,8 +214,8 @@ static int eusb2_repeater_set_mode(struct phy *phy, * repeater doesn't clear previous value due to shared * regulators (say host <-> device mode switch). */ - regmap_write(regmap, base + EUSB2_FORCE_EN_5, 0); - regmap_write(regmap, base + EUSB2_FORCE_VAL_5, 0); + regmap_write(regmap, EUSB2_FORCE_EN_5, 0); + regmap_write(regmap, EUSB2_FORCE_VAL_5, 0); break; default: return -EINVAL; @@ -242,13 +240,23 @@ static const struct phy_ops eusb2_repeater_ops =3D { =20 static int eusb2_repeater_probe(struct platform_device *pdev) { + struct regmap_config eusb2_regmap_config =3D { + .reg_bits =3D 16, + .val_bits =3D 8, + .max_register =3D 0x100, + .fast_io =3D true, + }; + struct spmi_device *sparent; struct eusb2_repeater *rptr; + struct spmi_subdevice *sub_sdev; struct device *dev =3D &pdev->dev; struct phy_provider *phy_provider; struct device_node *np =3D dev->of_node; - u32 res; int ret; =20 + if (!dev->parent) + return -ENODEV; + rptr =3D devm_kzalloc(dev, sizeof(*rptr), GFP_KERNEL); if (!rptr) return -ENOMEM; @@ -260,15 +268,21 @@ static int eusb2_repeater_probe(struct platform_devic= e *pdev) if (!rptr->cfg) return -EINVAL; =20 - rptr->regmap =3D dev_get_regmap(dev->parent, NULL); - if (!rptr->regmap) + sparent =3D to_spmi_device(dev->parent); + if (!sparent) return -ENODEV; =20 - ret =3D of_property_read_u32(np, "reg", &res); + sub_sdev =3D devm_spmi_subdevice_alloc_and_add(dev, sparent); + if (IS_ERR(sub_sdev)) + return PTR_ERR(sub_sdev); + + ret =3D of_property_read_u32(np, "reg", &eusb2_regmap_config.reg_base); if (ret < 0) return ret; =20 - rptr->base =3D res; + rptr->regmap =3D devm_regmap_init_spmi_ext(&sub_sdev->sdev, &eusb2_regmap= _config); + if (IS_ERR(rptr->regmap)) + return -ENODEV; =20 ret =3D eusb2_repeater_init_vregs(rptr); if (ret < 0) { @@ -335,3 +349,4 @@ module_platform_driver(eusb2_repeater_driver); =20 MODULE_DESCRIPTION("Qualcomm PMIC eUSB2 Repeater driver"); MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("SPMI"); --=20 2.52.0