From nobody Thu Oct 2 15:35:39 2025 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 531B829C343; Tue, 16 Sep 2025 08:45:09 +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=1758012312; cv=none; b=fjlQRuWTwzCVAl9G0gEfkLe71f6RDrmBnZN3V+fLG7FoDrqzu3WJy0wEn57wbF6jjdS3selPNCvVzhd+9lRTCb38HH0qH0hah6qz8s1f6Gqjyve2hIR68WRwmz04lpEpo758Wf4ZKLs6aXsWW8Iy8PVJ/YdqLWYXOr0KB972R6w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758012312; c=relaxed/simple; bh=KIbbD0GSBQY+XNT1CHBJboIeKET3uhmfRNjFa3cTimU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=TJJJqUKFcovZRFL2WoWBVzkeAa0p+a5RyO6SFSS93N3UDEKcrOt2LDNI9kP+h5zrNYsF58Tz077cEmOdVNKGynTfi0zkYJrn2sdjaQUjzonJyajp7cpTMdYGW5Vjucgy/hG0asytqbabOCDHdADnhnnKj0BCmyXcY9OOUqWN5j4= 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=bZ2orHAo; 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="bZ2orHAo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1758012302; bh=KIbbD0GSBQY+XNT1CHBJboIeKET3uhmfRNjFa3cTimU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bZ2orHAoCBxe5nOIKBk+8E47pxgfJqO88Bs0NLS87w8z5WEwjyZO6xZ0W0a88jk1j VvN1jRyj1vfbJftF+Y0oHFf27F+YCr+mThkbU9AiBYvStDQ5h1D0DpotJjWQrfNksJ cL4xnuXru2A3rsqN1DLhPs+XO3NpXZxFvyhhkbawiEFWVq8pwUalQR6Q4VdCaDV3Pf xf1waXim5IIiLgdjymJOWSIHJZ+zzCu0/NzFNRZ6pAd8SqYYjaKi7Gka7AKPT9LWjJ oumj812drcHtf1XNFXBL1UvWVhj1HtLXuIYkwF4/RWWKaU40HLIeARv3u0S9QvkAwd BhMDzAChjUezA== 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 7AEC817E1389; Tue, 16 Sep 2025 10:45:01 +0200 (CEST) From: AngeloGioacchino Del Regno To: sboyd@kernel.org Cc: jic23@kernel.org, dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, srini@kernel.org, vkoul@kernel.org, kishon@kernel.org, sre@kernel.org, krzysztof.kozlowski@linaro.org, u.kleine-koenig@baylibre.com, angelogioacchino.delregno@collabora.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, wenst@chromium.org, casey.connolly@linaro.org, Neil Armstrong Subject: [PATCH v4 4/7] phy: qualcomm: eusb2-repeater: Migrate to devm_spmi_subdevice_alloc_and_add() Date: Tue, 16 Sep 2025 10:44:42 +0200 Message-ID: <20250916084445.96621-5-angelogioacchino.delregno@collabora.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20250916084445.96621-1-angelogioacchino.delregno@collabora.com> References: <20250916084445.96621-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. Link: https://lore.kernel.org/r/20250722101317.76729-5-angelogioacchino.del= regno@collabora.com Tested-by: Neil Armstrong # on SM8650-QRD Link: https://lore.kernel.org/r/20250730112645.542179-5-angelogioacchino.de= lregno@collabora.com Signed-off-by: AngeloGioacchino Del Regno --- drivers/phy/qualcomm/Kconfig | 1 + .../phy/qualcomm/phy-qcom-eusb2-repeater.c | 53 ++++++++++++------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/drivers/phy/qualcomm/Kconfig b/drivers/phy/qualcomm/Kconfig index 60a0ead127fa..b248b7d44d3d 100644 --- a/drivers/phy/qualcomm/Kconfig +++ b/drivers/phy/qualcomm/Kconfig @@ -129,6 +129,7 @@ config PHY_QCOM_EUSB2_REPEATER tristate "Qualcomm PMIC eUSB2 Repeater Driver" depends on OF && (ARCH_QCOM || COMPILE_TEST) 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 651a12b59bc8..bdeb3c72d26a 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 @@ -55,7 +56,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 @@ -118,7 +118,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; int ret; u8 val; @@ -127,28 +126,28 @@ 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 /* 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"); @@ -161,7 +160,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: @@ -170,8 +168,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: /* @@ -180,8 +178,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; @@ -206,13 +204,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; @@ -224,15 +232,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) { @@ -295,3 +309,4 @@ module_platform_driver(eusb2_repeater_driver); =20 MODULE_DESCRIPTION("Qualcomm PMIC eUSB2 Repeater driver"); MODULE_LICENSE("GPL"); +MODULE_IMPORT_NS("SPMI"); --=20 2.51.0