* [PATCH v5 0/6] initial usbdrd phy support for Exynosautov920 soc
[not found] <CGME20250805114303epcas5p4c88843b7e38d86b722e60e386c637160@epcas5p4.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
[not found] ` <CGME20250805114306epcas5p37782c02ae0ddc6b77094786c90af247a@epcas5p3.samsung.com>
` (5 more replies)
0 siblings, 6 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
This SoC has a single USB 3.1 DRD combo phy and three USB2.0 only
DRD phy controllers as mentined below
* Combo phy supports USB3.1 SSP+(10Gbps) protocol and is backwards
compatible to the USB3.0 SS(5Gbps). 'Add-on USB2.0' phy is added
to support USB2.0 HS(480Mbps), FS(12Mbps) and LS(1.5Mbps) data rates.
These two phys are combined to form a combo phy as mentioned below.
USB30DRD_0 port
+------------------------------------------------------------+
| |
| (combo) USB phy controller |
| +----------------------------------------------+ |
| | USB HSPHY | |
| | (samsung,exynosautov920-usbdrd-combo-hsphy) | |
| +----------------------------------------------+ |
| |
| +--------------------------------------------------+ |
| | USB SSPHY | |
| | (samsung,exynosautov920-usb31drd-combo-ssphy) | |
| +--------------------------------------------------+- |
| |
+------------------------------------------------------------+
| USBDRD30 Link |
| Controller |
+------------------------------------------------------------+
* USB2.0 phy supports only UTMI+ interface. USB2.0DRD phy
is very similar to the existing Exynos850 support in this driver.
USB20DRD_0/1/2 ports
+---------------------------------------------------+
| |
| USB PHY controller |
| +-----------------------------------------+ |
| | USB HSPHY | |
| | (samsung,exynosautov920-usbdrd-phy) | |
| +-----------------------------------------+ |
| |
+---------------------------------------------------+
| USBDRD20_* Link |
| Controller |
+---------------------------------------------------+
The "USB20 phy output isolation" is shared across the USB20 phys.
We have to bypass isolation when any one of the USBs is configured
and enable it when all are turned off. The "USB31 phy isolation"
is seperate for USB31 phy.
There are 3 types of the phys in this SoC as mentioned in above
above block diagram.
- one is simmilar with exynos850 as mentioned in patch no.1.
- second supports only USB2.0 HS as in patch no 3.
- third supports only USB3.1 SSP+ and denoted in patch no 5.
These three phys(usbdrd-phy, combo-hsphy, combo-ssphy) are totally
deferent, "NOT" same, hence added three compatible for three phys.
This patchset only supports device mode and same is verified with
as NCM device.
changelog
----------
Changes in v5:
- removed "Reviewed-by" tag.
- addressed comments from v4 patchset.
- DTS style is corrected and added required supplies in code
and schema.
- new schema block added for supplies to resolve below failure
during 'dtbs_check'.
Unevaluated properties are not allowed ('dvdd075-usb-supply', 'vdd18-usb20-supply', 'vdd33-usb20-supply' were unexpected.
- removed usage_counter(will take this later in subsequent patch-sets)
link for v4: https://lore.kernel.org/linux-phy/20250701120706.2219355-1-pritam.sutar@samsung.com/
Changes in v4:
- addressed comments from v3 patchset
- removed dts related patches, to be posted in new patchset.
- added regulator, pmu and power sequences.
- phy isol is shared across USBs, added usage counter to bypass or
enable phy isolation.
- modified schemas with hs and combo phy compatible names
(used "combo" to denote combo phy) and regulators
- modified code to work with binding and unbinding devices/drivers
- added "Reviewed-by" tag.
link for v3: https://lore.kernel.org/linux-phy/20250613055613.866909-1-pritam.sutar@samsung.com/
Changes in v3:
- Updated dt-bindings for USB2.0 only.
- Added dt-bindings for combo phy.
- Added implementation for combo phy (SS and HS phy).
- Added added DTS nodes for all the phys
link for v2: https://lore.kernel.org/linux-phy/20250516102650.2144487-1-pritam.sutar@samsung.com/
Changes in v2:
- Used standard GENMASK() and FIELD_GET() to get the major version
from controller version register.
link for v1: https://lore.kernel.org/linux-phy/20250514134813.380807-1-pritam.sutar@samsung.com/
Pritam Manohar Sutar (6):
dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy
compatible
phy: exynos5-usbdrd: support HS phy for ExynosAutov920
dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo hsphy
phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920
dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy
phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
.../bindings/phy/samsung,usb3-drd-phy.yaml | 41 ++
drivers/phy/samsung/phy-exynos5-usbdrd.c | 652 ++++++++++++++++++
include/linux/soc/samsung/exynos-regs-pmu.h | 3 +
3 files changed, 696 insertions(+)
--
2.34.1
^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy compatible
[not found] ` <CGME20250805114306epcas5p37782c02ae0ddc6b77094786c90af247a@epcas5p3.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
2025-08-06 23:42 ` Rob Herring
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
This SoC has USB2.0 phy and supports only UTMI+ interface. This phy
requires two clocks, named as "phy" and "ref". The required supplies for
this phy are vdd075_usb20(0.75v), vdd18_usb20(1.8v), vdd33_usb20(3.3v).
Add a dedicated compatible string for USB HS phy found in this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
.../bindings/phy/samsung,usb3-drd-phy.yaml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
index e906403208c0..1932a2272ef9 100644
--- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
+++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
@@ -34,6 +34,7 @@ properties:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usbdrd-phy
clocks:
minItems: 1
@@ -110,6 +111,12 @@ properties:
vddh-usbdp-supply:
description: VDDh power supply for the USB DP phy.
+ dvdd075-usb20-supply:
+ description: 0.75V power supply for the USB 2.0 phy.
+
+ vdd18-usb20-supply:
+ description: 1.8V power supply for the USB 2.0 phy.
+
required:
- compatible
- clocks
@@ -219,6 +226,7 @@ allOf:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usbdrd-phy
then:
properties:
clocks:
@@ -235,6 +243,17 @@ allOf:
reg-names:
maxItems: 1
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - samsung,exynosautov920-usbdrd-phy
+ then:
+ required:
+ - dvdd075-usb20-supply
+ - vdd18-usb20-supply
+ - vdd33-usb20-supply
unevaluatedProperties: false
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for ExynosAutov920
[not found] ` <CGME20250805114310epcas5p459aa232884d22501f5fefe42f239fecc@epcas5p4.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
2025-08-12 14:15 ` Vinod Koul
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
Enable UTMI+ phy support for this SoC which is very similar to what
the existing Exynos850 supports.
Add required change in phy driver to support HS phy for this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
drivers/phy/samsung/phy-exynos5-usbdrd.c | 123 ++++++++++++++++++++
include/linux/soc/samsung/exynos-regs-pmu.h | 2 +
2 files changed, 125 insertions(+)
diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
index dd660ebe8045..5400dd23e500 100644
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
@@ -2054,6 +2054,126 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
.n_regulators = ARRAY_SIZE(exynos5_regulator_names),
};
+static int exynosautov920_usbdrd_phy_init(struct phy *phy)
+{
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
+ int ret;
+
+ ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
+ if (ret)
+ return ret;
+
+ /* Bypass PHY isol */
+ inst->phy_cfg->phy_isol(inst, false);
+
+ /* UTMI or PIPE3 specific init */
+ inst->phy_cfg->phy_init(phy_drd);
+
+ clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
+
+ return 0;
+}
+
+static int exynosautov920_usbdrd_phy_exit(struct phy *phy)
+{
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
+ int ret = 0;
+
+ ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
+ if (ret)
+ return ret;
+
+ exynos850_usbdrd_phy_exit(phy);
+
+ /* enable PHY isol */
+ inst->phy_cfg->phy_isol(inst, true);
+
+ clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
+
+ return 0;
+}
+
+static int exynosautov920_usbdrd_phy_power_on(struct phy *phy)
+{
+ int ret;
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
+
+ dev_dbg(phy_drd->dev, "Request to power_on usbdrd_phy phy\n");
+
+ ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_core_clks,
+ phy_drd->core_clks);
+ if (ret)
+ return ret;
+
+ /* Enable supply */
+ ret = regulator_bulk_enable(phy_drd->drv_data->n_regulators,
+ phy_drd->regulators);
+ if (ret) {
+ dev_err(phy_drd->dev, "Failed to enable PHY regulator(s)\n");
+ goto fail_supply;
+ }
+
+ return 0;
+
+fail_supply:
+ clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
+ phy_drd->core_clks);
+
+ return ret;
+}
+
+static int exynosautov920_usbdrd_phy_power_off(struct phy *phy)
+{
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
+
+ dev_dbg(phy_drd->dev, "Request to power_off usbdrd_phy phy\n");
+
+ /* Disable supply */
+ regulator_bulk_disable(phy_drd->drv_data->n_regulators,
+ phy_drd->regulators);
+
+ clk_bulk_disable_unprepare(phy_drd->drv_data->n_core_clks,
+ phy_drd->core_clks);
+
+ return 0;
+}
+
+static const char * const exynosautov920_usb20_regulators[] = {
+ "dvdd075-usb20", "vdd18-usb20", "vdd33-usb20",
+};
+
+static const struct phy_ops exynosautov920_usbdrd_phy_ops = {
+ .init = exynosautov920_usbdrd_phy_init,
+ .exit = exynosautov920_usbdrd_phy_exit,
+ .power_on = exynosautov920_usbdrd_phy_power_on,
+ .power_off = exynosautov920_usbdrd_phy_power_off,
+ .owner = THIS_MODULE,
+};
+
+static const struct exynos5_usbdrd_phy_config phy_cfg_exynosautov920[] = {
+ {
+ .id = EXYNOS5_DRDPHY_UTMI,
+ .phy_isol = exynos5_usbdrd_phy_isol,
+ .phy_init = exynos850_usbdrd_utmi_init,
+ },
+};
+
+static const struct exynos5_usbdrd_phy_drvdata exynosautov920_usbdrd_phy = {
+ .phy_cfg = phy_cfg_exynosautov920,
+ .phy_ops = &exynosautov920_usbdrd_phy_ops,
+ .pmu_offset_usbdrd0_phy = EXYNOSAUTOV920_PHY_CTRL_USB20,
+ .clk_names = exynos5_clk_names,
+ .n_clks = ARRAY_SIZE(exynos5_clk_names),
+ .core_clk_names = exynos5_core_clk_names,
+ .n_core_clks = ARRAY_SIZE(exynos5_core_clk_names),
+ .regulator_names = exynosautov920_usb20_regulators,
+ .n_regulators = ARRAY_SIZE(exynosautov920_usb20_regulators),
+};
+
static const struct exynos5_usbdrd_phy_config phy_cfg_gs101[] = {
{
.id = EXYNOS5_DRDPHY_UTMI,
@@ -2260,6 +2380,9 @@ static const struct of_device_id exynos5_usbdrd_phy_of_match[] = {
}, {
.compatible = "samsung,exynos990-usbdrd-phy",
.data = &exynos990_usbdrd_phy
+ }, {
+ .compatible = "samsung,exynosautov920-usbdrd-phy",
+ .data = &exynosautov920_usbdrd_phy
},
{ },
};
diff --git a/include/linux/soc/samsung/exynos-regs-pmu.h b/include/linux/soc/samsung/exynos-regs-pmu.h
index 71e0c09a49eb..4923f9be3d1f 100644
--- a/include/linux/soc/samsung/exynos-regs-pmu.h
+++ b/include/linux/soc/samsung/exynos-regs-pmu.h
@@ -688,4 +688,6 @@
#define GS101_GRP2_INTR_BID_UPEND (0x0208)
#define GS101_GRP2_INTR_BID_CLEAR (0x020c)
+/* exynosautov920 */
+#define EXYNOSAUTOV920_PHY_CTRL_USB20 (0x0710)
#endif /* __LINUX_SOC_EXYNOS_REGS_PMU_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v5 3/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo hsphy
[not found] ` <CGME20250805114313epcas5p15b843d7fe692feb20828a789cef49dc0@epcas5p1.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
This phy only supports USB2.0 HS(480Mbps), FS(12Mbps) and
LS(1.5Mbps) data rates. It requires two clocks, named as "phy" and "ref".
The required supplies for this phy, named as vdd075_usb20(0.75v),
vdd18_usb20(1.8v), vdd33_usb20(3.3v).
Add schema for combo hsphy found on this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
.../devicetree/bindings/phy/samsung,usb3-drd-phy.yaml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
index 1932a2272ef9..4a84b5405cd2 100644
--- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
+++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
@@ -34,6 +34,7 @@ properties:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usbdrd-combo-hsphy
- samsung,exynosautov920-usbdrd-phy
clocks:
@@ -226,6 +227,7 @@ allOf:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usbdrd-combo-hsphy
- samsung,exynosautov920-usbdrd-phy
then:
properties:
@@ -248,6 +250,7 @@ allOf:
compatible:
contains:
enum:
+ - samsung,exynosautov920-usbdrd-combo-hsphy
- samsung,exynosautov920-usbdrd-phy
then:
required:
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920
[not found] ` <CGME20250805114316epcas5p49b78db499c2e37a1fe68f4b2f0be62a7@epcas5p4.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
2025-08-12 14:18 ` Vinod Koul
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
Support UTMI+ combo phy for this SoC which is somewhat simmilar to
what the existing Exynos850 support does. The difference is that
some register offsets and bit fields are defferent from Exynos850.
Add required change in phy driver to support combo HS phy for this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
drivers/phy/samsung/phy-exynos5-usbdrd.c | 210 +++++++++++++++++++++++
1 file changed, 210 insertions(+)
diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
index 5400dd23e500..c22f4de7d094 100644
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
@@ -41,6 +41,13 @@
#define EXYNOS2200_CLKRST_LINK_PCLK_SEL BIT(1)
#define EXYNOS2200_DRD_UTMI 0x10
+
+/* ExynosAutov920 bits */
+#define UTMICTL_FORCE_UTMI_SUSPEND BIT(13)
+#define UTMICTL_FORCE_UTMI_SLEEP BIT(12)
+#define UTMICTL_FORCE_DPPULLDOWN BIT(9)
+#define UTMICTL_FORCE_DMPULLDOWN BIT(8)
+
#define EXYNOS2200_UTMI_FORCE_VBUSVALID BIT(1)
#define EXYNOS2200_UTMI_FORCE_BVALID BIT(0)
@@ -250,6 +257,22 @@
#define EXYNOS850_DRD_HSP_TEST 0x5c
#define HSP_TEST_SIDDQ BIT(24)
+#define EXYNOSAUTOV920_DRD_HSP_CLKRST 0x100
+#define HSPCLKRST_PHY20_SW_PORTRESET BIT(3)
+#define HSPCLKRST_PHY20_SW_POR BIT(1)
+#define HSPCLKRST_PHY20_SW_POR_SEL BIT(0)
+
+#define EXYNOSAUTOV920_DRD_HSPCTL 0x104
+#define HSPCTRL_VBUSVLDEXTSEL BIT(13)
+#define HSPCTRL_VBUSVLDEXT BIT(12)
+#define HSPCTRL_EN_UTMISUSPEND BIT(9)
+#define HSPCTRL_COMMONONN BIT(8)
+
+#define EXYNOSAUTOV920_DRD_HSP_TEST 0x10c
+
+#define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
+#define HSPPLLTUNE_FSEL GENMASK(18, 16)
+
/* Exynos9 - GS101 */
#define EXYNOS850_DRD_SECPMACTL 0x48
#define SECPMACTL_PMA_ROPLL_REF_CLK_SEL GENMASK(13, 12)
@@ -2054,6 +2077,139 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
.n_regulators = ARRAY_SIZE(exynos5_regulator_names),
};
+static void
+exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg;
+
+ /*
+ * Disable HWACG (hardware auto clock gating control). This
+ * forces QACTIVE signal in Q-Channel interface to HIGH level,
+ * to make sure the PHY clock is not gated by the hardware.
+ */
+ reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
+ reg |= LINKCTRL_FORCE_QACT;
+ writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
+
+ /* De-assert link reset */
+ reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
+ reg &= ~CLKRST_LINK_SW_RST;
+ writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
+
+ /* Set PHY POR High */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
+ reg |= HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_POR_SEL;
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
+
+ /* Enable UTMI+ */
+ reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
+ reg &= ~(UTMICTL_FORCE_UTMI_SUSPEND | UTMICTL_FORCE_UTMI_SLEEP |
+ UTMICTL_FORCE_DPPULLDOWN | UTMICTL_FORCE_DMPULLDOWN);
+ writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
+
+ /* set phy clock & control HS phy */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
+ reg |= HSPCTRL_EN_UTMISUSPEND | HSPCTRL_COMMONONN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
+
+ fsleep(100);
+
+ /* Set VBUS Valid and DP-Pull up control by VBUS pad usage */
+ reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
+ reg |= FIELD_PREP_CONST(LINKCTRL_BUS_FILTER_BYPASS, 0xf);
+ writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
+
+ reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
+ reg |= EXYNOS2200_UTMI_FORCE_VBUSVALID | EXYNOS2200_UTMI_FORCE_BVALID;
+ writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
+ reg |= HSPCTRL_VBUSVLDEXTSEL | HSPCTRL_VBUSVLDEXT;
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
+
+ /* Setting FSEL for refference clock */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
+ reg &= ~HSPPLLTUNE_FSEL;
+ switch (phy_drd->extrefclk) {
+ case EXYNOS5_FSEL_50MHZ:
+ reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 7);
+ break;
+ case EXYNOS5_FSEL_26MHZ:
+ reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 6);
+ break;
+ case EXYNOS5_FSEL_24MHZ:
+ reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 2);
+ break;
+ case EXYNOS5_FSEL_20MHZ:
+ reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 1);
+ break;
+ case EXYNOS5_FSEL_19MHZ2:
+ reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 0);
+ break;
+ default:
+ dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
+ phy_drd->extrefclk);
+ break;
+ }
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
+
+ /* Enable PHY Power Mode */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
+ reg &= ~HSP_TEST_SIDDQ;
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
+
+ /* before POR low, 10us delay is needed to Finish PHY reset */
+ fsleep(10);
+
+ /* Set PHY POR Low */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
+ reg |= HSPCLKRST_PHY20_SW_POR_SEL;
+ reg &= ~(HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_PORTRESET);
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
+
+ /* after POR low and delay 75us, PHYCLOCK is guaranteed. */
+ fsleep(75);
+
+ /* force pipe3 signal for link */
+ reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
+ reg |= LINKCTRL_FORCE_PIPE_EN;
+ reg &= ~LINKCTRL_FORCE_PHYSTATUS;
+ reg |= LINKCTRL_FORCE_RXELECIDLE;
+ writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
+}
+
+static void
+exynosautov920_usbdrd_hsphy_disable(struct exynos5_usbdrd_phy *phy_drd)
+{
+ u32 reg;
+ void __iomem *reg_phy = phy_drd->reg_phy;
+
+ /* set phy clock & control HS phy */
+ reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
+ reg |= UTMICTL_FORCE_UTMI_SUSPEND | UTMICTL_FORCE_UTMI_SLEEP;
+ reg &= ~(UTMICTL_FORCE_DPPULLDOWN | UTMICTL_FORCE_DMPULLDOWN);
+ writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
+
+ /* Disable PHY Power Mode */
+ reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
+ reg |= HSP_TEST_SIDDQ;
+ writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_TEST);
+
+ /* clear force q-channel */
+ reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
+ reg &= ~LINKCTRL_FORCE_QACT;
+ writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
+
+ /* link sw reset is need for USB_DP/DM high-z in host mode */
+ reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
+ reg |= CLKRST_LINK_SW_RST;
+ writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
+ fsleep(10);
+ reg &= ~CLKRST_LINK_SW_RST;
+ writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
+}
+
static int exynosautov920_usbdrd_phy_init(struct phy *phy)
{
struct phy_usb_instance *inst = phy_get_drvdata(phy);
@@ -2095,6 +2251,27 @@ static int exynosautov920_usbdrd_phy_exit(struct phy *phy)
return 0;
}
+static int exynosautov920_usbdrd_combo_phy_exit(struct phy *phy)
+{
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
+ int ret = 0;
+
+ ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
+ if (ret)
+ return ret;
+
+ if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
+ exynosautov920_usbdrd_hsphy_disable(phy_drd);
+
+ /* enable PHY isol */
+ inst->phy_cfg->phy_isol(inst, true);
+
+ clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
+
+ return 0;
+}
+
static int exynosautov920_usbdrd_phy_power_on(struct phy *phy)
{
int ret;
@@ -2146,6 +2323,36 @@ static const char * const exynosautov920_usb20_regulators[] = {
"dvdd075-usb20", "vdd18-usb20", "vdd33-usb20",
};
+static const struct phy_ops exynosautov920_usbdrd_combo_hsphy_ops = {
+ .init = exynosautov920_usbdrd_phy_init,
+ .exit = exynosautov920_usbdrd_combo_phy_exit,
+ .power_on = exynosautov920_usbdrd_phy_power_on,
+ .power_off = exynosautov920_usbdrd_phy_power_off,
+ .owner = THIS_MODULE,
+};
+
+static const struct
+exynos5_usbdrd_phy_config usbdrd_hsphy_cfg_exynosautov920[] = {
+ {
+ .id = EXYNOS5_DRDPHY_UTMI,
+ .phy_isol = exynos5_usbdrd_phy_isol,
+ .phy_init = exynosautov920_usbdrd_utmi_init,
+ },
+};
+
+static const
+struct exynos5_usbdrd_phy_drvdata exynosautov920_usbdrd_combo_hsphy = {
+ .phy_cfg = usbdrd_hsphy_cfg_exynosautov920,
+ .phy_ops = &exynosautov920_usbdrd_combo_hsphy_ops,
+ .pmu_offset_usbdrd0_phy = EXYNOSAUTOV920_PHY_CTRL_USB20,
+ .clk_names = exynos5_clk_names,
+ .n_clks = ARRAY_SIZE(exynos5_clk_names),
+ .core_clk_names = exynos5_core_clk_names,
+ .n_core_clks = ARRAY_SIZE(exynos5_core_clk_names),
+ .regulator_names = exynosautov920_usb20_regulators,
+ .n_regulators = ARRAY_SIZE(exynosautov920_usb20_regulators),
+};
+
static const struct phy_ops exynosautov920_usbdrd_phy_ops = {
.init = exynosautov920_usbdrd_phy_init,
.exit = exynosautov920_usbdrd_phy_exit,
@@ -2380,6 +2587,9 @@ static const struct of_device_id exynos5_usbdrd_phy_of_match[] = {
}, {
.compatible = "samsung,exynos990-usbdrd-phy",
.data = &exynos990_usbdrd_phy
+ }, {
+ .compatible = "samsung,exynosautov920-usbdrd-combo-hsphy",
+ .data = &exynosautov920_usbdrd_combo_hsphy
}, {
.compatible = "samsung,exynosautov920-usbdrd-phy",
.data = &exynosautov920_usbdrd_phy
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy
[not found] ` <CGME20250805114320epcas5p3968288f8d01944d3d730b3094a7befe4@epcas5p3.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
2025-08-06 23:43 ` Rob Herring
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
This phy supports USB3.1 SSP+(10Gbps) protocol and is backwards
compatible to the USB3.0 SS(5Gbps). It requires two clocks, named
"phy" and "ref". The required supplies for USB3.1 are named as
vdd075_usb30(0.75v), vdd18_usb30(1.8v).
Add schemas for combo ssphy found on this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
.../bindings/phy/samsung,usb3-drd-phy.yaml | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
index 4a84b5405cd2..7a71cff10fb5 100644
--- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
+++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
@@ -34,6 +34,7 @@ properties:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usb31drd-combo-ssphy
- samsung,exynosautov920-usbdrd-combo-hsphy
- samsung,exynosautov920-usbdrd-phy
@@ -118,6 +119,12 @@ properties:
vdd18-usb20-supply:
description: 1.8V power supply for the USB 2.0 phy.
+ dvdd075-usb30-supply:
+ description: 0.75V power supply for the USB 3.0 phy.
+
+ vdd18-usb30-supply:
+ description: 1.8V power supply for the USB 3.0 phy.
+
required:
- compatible
- clocks
@@ -227,6 +234,7 @@ allOf:
- samsung,exynos7870-usbdrd-phy
- samsung,exynos850-usbdrd-phy
- samsung,exynos990-usbdrd-phy
+ - samsung,exynosautov920-usb31drd-combo-ssphy
- samsung,exynosautov920-usbdrd-combo-hsphy
- samsung,exynosautov920-usbdrd-phy
then:
@@ -258,6 +266,17 @@ allOf:
- vdd18-usb20-supply
- vdd33-usb20-supply
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - samsung,exynosautov920-usb31drd-combo-ssphy
+ then:
+ required:
+ - dvdd075-usb30-supply
+ - vdd18-usb30-supply
+
unevaluatedProperties: false
examples:
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
[not found] ` <CGME20250805114323epcas5p39bf73c5e0a9382ff54b1832724804cc9@epcas5p3.samsung.com>
@ 2025-08-05 11:52 ` Pritam Manohar Sutar
2025-08-12 14:21 ` Vinod Koul
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-05 11:52 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, alim.akhtar,
andre.draszik, peter.griffin, kauschluss, ivo.ivanov.ivanov1,
igor.belwon, m.szyprowski, s.nawrocki, pritam.sutar
Cc: linux-phy, devicetree, linux-kernel, linux-arm-kernel,
linux-samsung-soc, rosa.pila, dev.tailor, faraz.ata, muhammed.ali,
selvarasu.g
Add required change in phy driver to support combo SS phy for this SoC.
Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
---
drivers/phy/samsung/phy-exynos5-usbdrd.c | 327 +++++++++++++++++++-
include/linux/soc/samsung/exynos-regs-pmu.h | 1 +
2 files changed, 324 insertions(+), 4 deletions(-)
diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
index c22f4de7d094..1108f0c07755 100644
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
@@ -273,6 +273,36 @@
#define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
#define HSPPLLTUNE_FSEL GENMASK(18, 16)
+/* ExynosAutov920 phy usb31drd port reg */
+#define EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL 0x000
+#define PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN BIT(5)
+#define PHY_RST_CTRL_PIPE_LANE0_RESET_N BIT(4)
+#define PHY_RST_CTRL_PHY_RESET_OVRD_EN BIT(1)
+#define PHY_RST_CTRL_PHY_RESET BIT(0)
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0 0x0004
+#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR GENMASK(31, 16)
+#define PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK BIT(8)
+#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK BIT(4)
+#define PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL BIT(0)
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1 0x0008
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2 0x000c
+#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN BIT(0)
+#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA GENMASK(31, 16)
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0 0x100
+#define PHY_CONFIG0_PHY0_PMA_PWR_STABLE BIT(14)
+#define PHY_CONFIG0_PHY0_PCS_PWR_STABLE BIT(13)
+#define PHY_CONFIG0_PHY0_ANA_PWR_EN BIT(1)
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7 0x11c
+#define PHY_CONFIG7_PHY_TEST_POWERDOWN BIT(24)
+
+#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4 0x110
+#define PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN BIT(2)
+
/* Exynos9 - GS101 */
#define EXYNOS850_DRD_SECPMACTL 0x48
#define SECPMACTL_PMA_ROPLL_REF_CLK_SEL GENMASK(13, 12)
@@ -2077,6 +2107,253 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
.n_regulators = ARRAY_SIZE(exynos5_regulator_names),
};
+static void
+exynosautov920_usb31drd_cr_clk(struct exynos5_usbdrd_phy *phy_drd, bool high)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg = 0;
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ if (high)
+ reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
+ else
+ reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
+
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ fsleep(1);
+}
+
+static void
+exynosautov920_usb31drd_port_phy_ready(struct exynos5_usbdrd_phy *phy_drd)
+{
+ struct device *dev = phy_drd->dev;
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ static const unsigned int timeout_us = 20000;
+ static const unsigned int sleep_us = 40;
+ u32 reg = 0;
+ int err;
+
+ /* Clear cr_para_con */
+ reg &= ~(PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
+ PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR);
+ reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1);
+ writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
+
+ exynosautov920_usb31drd_cr_clk(phy_drd, true);
+ exynosautov920_usb31drd_cr_clk(phy_drd, false);
+
+ /*
+ * The maximum time from phy reset de-assertion to de-assertion of
+ * tx/rx_ack can be as high as 5ms in fast simulation mode.
+ * Time to phy ready is < 20ms
+ */
+ err = readl_poll_timeout(reg_phy +
+ EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0,
+ reg, !(reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK),
+ sleep_us, timeout_us);
+ if (err)
+ dev_err(dev, "timed out waiting for rx/tx_ack: %#.8x\n", reg);
+
+ reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+}
+
+static void
+exynosautov920_usb31drd_cr_write(struct exynos5_usbdrd_phy *phy_drd,
+ u16 addr, u16 data)
+{
+ struct device *dev = phy_drd->dev;
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 cnt = 0;
+ u32 reg = 0;
+
+ /* Pre Clocking */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+
+ /*
+ * tx clks must be available prior to assertion of tx req.
+ * tx pstate p2 to p0 transition directly is not permitted.
+ * tx clk ready must be asserted synchronously on tx clk prior
+ * to internal transmit clk alignment sequence in the phy
+ * when entering from p2 to p1 to p0.
+ */
+ do {
+ exynosautov920_usb31drd_cr_clk(phy_drd, true);
+ exynosautov920_usb31drd_cr_clk(phy_drd, false);
+ cnt++;
+ } while (cnt < 15);
+
+ reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+
+ /*
+ * tx data path is active when tx lane is in p0 state
+ * and tx data en asserted. enable cr_para_wr_en.
+ */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
+ reg &= ~PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA;
+ reg |= FIELD_PREP(PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA, data) |
+ PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
+
+ /* write addr */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR;
+ reg |= FIELD_PREP(PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR, addr) |
+ PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
+ PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+
+ /* check cr_para_ack*/
+ cnt = 0;
+ do {
+ /*
+ * data symbols are captured by phy on rising edge of the
+ * tx_clk when tx data enabled.
+ * completion of the write cycle is acknowledged by assertion
+ * of the cr_para_ack.
+ */
+ exynosautov920_usb31drd_cr_clk(phy_drd, true);
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
+ if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
+ break;
+
+ exynosautov920_usb31drd_cr_clk(phy_drd, false);
+
+ /*
+ * wait for minimum of 10 cr_para_clk cycles after phy reset
+ * is negated, before accessing control regs to allow for
+ * internal resets.
+ */
+ cnt++;
+ } while (cnt < 10);
+
+ if (cnt == 10)
+ dev_dbg(dev, "CR write failed to 0x%04x\n", addr);
+ else
+ exynosautov920_usb31drd_cr_clk(phy_drd, false);
+}
+
+static void
+exynosautov920_usb31drd_phy_reset(struct exynos5_usbdrd_phy *phy_drd, int val)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg;
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+ reg &= ~PHY_RST_CTRL_PHY_RESET_OVRD_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+ if (val)
+ reg |= PHY_RST_CTRL_PHY_RESET;
+ else
+ reg &= ~PHY_RST_CTRL_PHY_RESET;
+
+ reg |= PHY_RST_CTRL_PHY_RESET_OVRD_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+}
+
+static void
+exynosautov920_usb31drd_lane0_reset(struct exynos5_usbdrd_phy *phy_drd, int val)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg;
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+ reg |= PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+ if (val)
+ reg &= ~PHY_RST_CTRL_PIPE_LANE0_RESET_N;
+ else
+ reg |= PHY_RST_CTRL_PIPE_LANE0_RESET_N;
+
+ reg &= ~PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL);
+}
+
+static void
+exynosautov920_usb31drd_pipe3_init(struct exynos5_usbdrd_phy *phy_drd)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg;
+
+ /*
+ * Phy and Pipe Lane reset assert.
+ * assert reset (phy_reset = 1).
+ * The lane-ack outputs are asserted during reset (tx_ack = rx_ack = 1)
+ */
+ exynosautov920_usb31drd_phy_reset(phy_drd, 1);
+ exynosautov920_usb31drd_lane0_reset(phy_drd, 1);
+
+ /*
+ * ANA Power En, PCS & PMA PWR Stable Set
+ * ramp-up power suppiles
+ */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0);
+ reg |= PHY_CONFIG0_PHY0_ANA_PWR_EN | PHY_CONFIG0_PHY0_PCS_PWR_STABLE |
+ PHY_CONFIG0_PHY0_PMA_PWR_STABLE;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0);
+
+ fsleep(10);
+
+ /*
+ * phy is not functional in test_powerdown mode, test_powerdown to be
+ * de-asserted for normal operation
+ */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
+ reg &= ~PHY_CONFIG7_PHY_TEST_POWERDOWN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
+
+ /*
+ * phy reset signal be asserted for minimum 10us after power
+ * supplies are ramped-up
+ */
+ fsleep(10);
+
+ /*
+ * Phy and Pipe Lane reset assert de-assert
+ */
+ exynosautov920_usb31drd_phy_reset(phy_drd, 0);
+ exynosautov920_usb31drd_lane0_reset(phy_drd, 0);
+
+ /* Pipe_rx0_sris_mode_en = 1 */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4);
+ reg |= PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4);
+
+ /*
+ * wait for lane ack outputs to de-assert (tx_ack = rx_ack = 0)
+ * Exit from the reset state is indicated by de-assertion of *_ack
+ */
+ exynosautov920_usb31drd_port_phy_ready(phy_drd);
+
+ /* override values for level settings */
+ exynosautov920_usb31drd_cr_write(phy_drd, 0x22, 0x00F5);
+}
+
+static void
+exynosautov920_usb31drd_ssphy_disable(struct exynos5_usbdrd_phy *phy_drd)
+{
+ void __iomem *reg_phy = phy_drd->reg_phy;
+ u32 reg;
+
+ /* 1. Assert reset (phy_reset = 1) */
+ exynosautov920_usb31drd_lane0_reset(phy_drd, 1);
+ exynosautov920_usb31drd_phy_reset(phy_drd, 1);
+
+ /* phy test power down */
+ reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
+ reg |= PHY_CONFIG7_PHY_TEST_POWERDOWN;
+ writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7);
+}
+
static void
exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
{
@@ -2171,12 +2448,15 @@ exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
/* after POR low and delay 75us, PHYCLOCK is guaranteed. */
fsleep(75);
- /* force pipe3 signal for link */
+ /* Disable forcing pipe interface */
reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
- reg |= LINKCTRL_FORCE_PIPE_EN;
- reg &= ~LINKCTRL_FORCE_PHYSTATUS;
- reg |= LINKCTRL_FORCE_RXELECIDLE;
+ reg &= ~LINKCTRL_FORCE_PIPE_EN;
writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
+
+ /* Pclk to pipe_clk */
+ reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
+ reg |= EXYNOS2200_CLKRST_LINK_PCLK_SEL;
+ writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
}
static void
@@ -2263,6 +2543,8 @@ static int exynosautov920_usbdrd_combo_phy_exit(struct phy *phy)
if (inst->phy_cfg->id == EXYNOS5_DRDPHY_UTMI)
exynosautov920_usbdrd_hsphy_disable(phy_drd);
+ else if (inst->phy_cfg->id == EXYNOS5_DRDPHY_PIPE3)
+ exynosautov920_usb31drd_ssphy_disable(phy_drd);
/* enable PHY isol */
inst->phy_cfg->phy_isol(inst, true);
@@ -2319,10 +2601,44 @@ static int exynosautov920_usbdrd_phy_power_off(struct phy *phy)
return 0;
}
+static const char * const exynosautov920_usb30_regulators[] = {
+ "dvdd075-usb30", "vdd18-usb30",
+};
+
static const char * const exynosautov920_usb20_regulators[] = {
"dvdd075-usb20", "vdd18-usb20", "vdd33-usb20",
};
+static const struct
+exynos5_usbdrd_phy_config usb31drd_phy_cfg_exynosautov920[] = {
+ {
+ .id = EXYNOS5_DRDPHY_PIPE3,
+ .phy_isol = exynos5_usbdrd_phy_isol,
+ .phy_init = exynosautov920_usb31drd_pipe3_init,
+ },
+};
+
+static const struct phy_ops exynosautov920_usb31drd_combo_ssphy_ops = {
+ .init = exynosautov920_usbdrd_phy_init,
+ .exit = exynosautov920_usbdrd_combo_phy_exit,
+ .power_on = exynosautov920_usbdrd_phy_power_on,
+ .power_off = exynosautov920_usbdrd_phy_power_off,
+ .owner = THIS_MODULE,
+};
+
+static const
+struct exynos5_usbdrd_phy_drvdata exynosautov920_usb31drd_combo_ssphy = {
+ .phy_cfg = usb31drd_phy_cfg_exynosautov920,
+ .phy_ops = &exynosautov920_usb31drd_combo_ssphy_ops,
+ .pmu_offset_usbdrd0_phy = EXYNOSAUTOV920_PHY_CTRL_USB31,
+ .clk_names = exynos5_clk_names,
+ .n_clks = ARRAY_SIZE(exynos5_clk_names),
+ .core_clk_names = exynos5_core_clk_names,
+ .n_core_clks = ARRAY_SIZE(exynos5_core_clk_names),
+ .regulator_names = exynosautov920_usb30_regulators,
+ .n_regulators = ARRAY_SIZE(exynosautov920_usb30_regulators),
+};
+
static const struct phy_ops exynosautov920_usbdrd_combo_hsphy_ops = {
.init = exynosautov920_usbdrd_phy_init,
.exit = exynosautov920_usbdrd_combo_phy_exit,
@@ -2587,6 +2903,9 @@ static const struct of_device_id exynos5_usbdrd_phy_of_match[] = {
}, {
.compatible = "samsung,exynos990-usbdrd-phy",
.data = &exynos990_usbdrd_phy
+ }, {
+ .compatible = "samsung,exynosautov920-usb31drd-combo-ssphy",
+ .data = &exynosautov920_usb31drd_combo_ssphy
}, {
.compatible = "samsung,exynosautov920-usbdrd-combo-hsphy",
.data = &exynosautov920_usbdrd_combo_hsphy
diff --git a/include/linux/soc/samsung/exynos-regs-pmu.h b/include/linux/soc/samsung/exynos-regs-pmu.h
index 4923f9be3d1f..f96c773b85c9 100644
--- a/include/linux/soc/samsung/exynos-regs-pmu.h
+++ b/include/linux/soc/samsung/exynos-regs-pmu.h
@@ -690,4 +690,5 @@
/* exynosautov920 */
#define EXYNOSAUTOV920_PHY_CTRL_USB20 (0x0710)
+#define EXYNOSAUTOV920_PHY_CTRL_USB31 (0x0714)
#endif /* __LINUX_SOC_EXYNOS_REGS_PMU_H */
--
2.34.1
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy compatible
2025-08-05 11:52 ` [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy compatible Pritam Manohar Sutar
@ 2025-08-06 23:42 ` Rob Herring
2025-08-07 12:21 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Rob Herring @ 2025-08-06 23:42 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: vkoul, kishon, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On Tue, Aug 05, 2025 at 05:22:11PM +0530, Pritam Manohar Sutar wrote:
> This SoC has USB2.0 phy and supports only UTMI+ interface. This phy
> requires two clocks, named as "phy" and "ref". The required supplies for
> this phy are vdd075_usb20(0.75v), vdd18_usb20(1.8v), vdd33_usb20(3.3v).
>
> Add a dedicated compatible string for USB HS phy found in this SoC.
>
> Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> ---
> .../bindings/phy/samsung,usb3-drd-phy.yaml | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> index e906403208c0..1932a2272ef9 100644
> --- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> +++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> @@ -34,6 +34,7 @@ properties:
> - samsung,exynos7870-usbdrd-phy
> - samsung,exynos850-usbdrd-phy
> - samsung,exynos990-usbdrd-phy
> + - samsung,exynosautov920-usbdrd-phy
>
> clocks:
> minItems: 1
> @@ -110,6 +111,12 @@ properties:
> vddh-usbdp-supply:
> description: VDDh power supply for the USB DP phy.
>
> + dvdd075-usb20-supply:
> + description: 0.75V power supply for the USB 2.0 phy.
> +
> + vdd18-usb20-supply:
> + description: 1.8V power supply for the USB 2.0 phy.
> +
> required:
> - compatible
> - clocks
> @@ -219,6 +226,7 @@ allOf:
> - samsung,exynos7870-usbdrd-phy
> - samsung,exynos850-usbdrd-phy
> - samsung,exynos990-usbdrd-phy
> + - samsung,exynosautov920-usbdrd-phy
> then:
> properties:
> clocks:
> @@ -235,6 +243,17 @@ allOf:
>
> reg-names:
> maxItems: 1
> + - if:
> + properties:
> + compatible:
> + contains:
> + enum:
> + - samsung,exynosautov920-usbdrd-phy
> + then:
> + required:
> + - dvdd075-usb20-supply
> + - vdd18-usb20-supply
> + - vdd33-usb20-supply
Presumably the existing devices don't have these new supplies, so:
else:
properties:
dvdd075-usb20-supply: false
vdd18-usb20-supply: false
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy
2025-08-05 11:52 ` [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy Pritam Manohar Sutar
@ 2025-08-06 23:43 ` Rob Herring
2025-08-07 12:32 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Rob Herring @ 2025-08-06 23:43 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: vkoul, kishon, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On Tue, Aug 05, 2025 at 05:22:15PM +0530, Pritam Manohar Sutar wrote:
> This phy supports USB3.1 SSP+(10Gbps) protocol and is backwards
> compatible to the USB3.0 SS(5Gbps). It requires two clocks, named
> "phy" and "ref". The required supplies for USB3.1 are named as
> vdd075_usb30(0.75v), vdd18_usb30(1.8v).
>
> Add schemas for combo ssphy found on this SoC.
>
> Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> ---
> .../bindings/phy/samsung,usb3-drd-phy.yaml | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> index 4a84b5405cd2..7a71cff10fb5 100644
> --- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> +++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> @@ -34,6 +34,7 @@ properties:
> - samsung,exynos7870-usbdrd-phy
> - samsung,exynos850-usbdrd-phy
> - samsung,exynos990-usbdrd-phy
> + - samsung,exynosautov920-usb31drd-combo-ssphy
> - samsung,exynosautov920-usbdrd-combo-hsphy
> - samsung,exynosautov920-usbdrd-phy
>
> @@ -118,6 +119,12 @@ properties:
> vdd18-usb20-supply:
> description: 1.8V power supply for the USB 2.0 phy.
>
> + dvdd075-usb30-supply:
> + description: 0.75V power supply for the USB 3.0 phy.
> +
> + vdd18-usb30-supply:
> + description: 1.8V power supply for the USB 3.0 phy.
> +
> required:
> - compatible
> - clocks
> @@ -227,6 +234,7 @@ allOf:
> - samsung,exynos7870-usbdrd-phy
> - samsung,exynos850-usbdrd-phy
> - samsung,exynos990-usbdrd-phy
> + - samsung,exynosautov920-usb31drd-combo-ssphy
> - samsung,exynosautov920-usbdrd-combo-hsphy
> - samsung,exynosautov920-usbdrd-phy
> then:
> @@ -258,6 +266,17 @@ allOf:
> - vdd18-usb20-supply
> - vdd33-usb20-supply
>
> + - if:
> + properties:
> + compatible:
> + contains:
> + enum:
> + - samsung,exynosautov920-usb31drd-combo-ssphy
> + then:
> + required:
> + - dvdd075-usb30-supply
> + - vdd18-usb30-supply
Similar issue here.
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy compatible
2025-08-06 23:42 ` Rob Herring
@ 2025-08-07 12:21 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-07 12:21 UTC (permalink / raw)
To: 'Rob Herring'
Cc: vkoul, kishon, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Rob,
> -----Original Message-----
> From: Rob Herring <robh@kernel.org>
> Sent: 07 August 2025 05:12 AM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: vkoul@kernel.org; kishon@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> samsung-soc@vger.kernel.org; rosa.pila@samsung.com;
> dev.tailor@samsung.com; faraz.ata@samsung.com;
> muhammed.ali@samsung.com; selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add
> ExynosAutov920 HS phy compatible
>
> On Tue, Aug 05, 2025 at 05:22:11PM +0530, Pritam Manohar Sutar wrote:
> > This SoC has USB2.0 phy and supports only UTMI+ interface. This phy
> > requires two clocks, named as "phy" and "ref". The required supplies
> > for this phy are vdd075_usb20(0.75v), vdd18_usb20(1.8v),
> vdd33_usb20(3.3v).
> >
> > Add a dedicated compatible string for USB HS phy found in this SoC.
> >
> > Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> > ---
> > .../bindings/phy/samsung,usb3-drd-phy.yaml | 19
> +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> > b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> > index e906403208c0..1932a2272ef9 100644
> > --- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-
> phy.yaml
> > +++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-
> phy.yaml
> > @@ -34,6 +34,7 @@ properties:
> > - samsung,exynos7870-usbdrd-phy
> > - samsung,exynos850-usbdrd-phy
> > - samsung,exynos990-usbdrd-phy
> > + - samsung,exynosautov920-usbdrd-phy
> >
> > clocks:
> > minItems: 1
> > @@ -110,6 +111,12 @@ properties:
> > vddh-usbdp-supply:
> > description: VDDh power supply for the USB DP phy.
> >
> > + dvdd075-usb20-supply:
> > + description: 0.75V power supply for the USB 2.0 phy.
> > +
> > + vdd18-usb20-supply:
> > + description: 1.8V power supply for the USB 2.0 phy.
> > +
> > required:
> > - compatible
> > - clocks
> > @@ -219,6 +226,7 @@ allOf:
> > - samsung,exynos7870-usbdrd-phy
> > - samsung,exynos850-usbdrd-phy
> > - samsung,exynos990-usbdrd-phy
> > + - samsung,exynosautov920-usbdrd-phy
> > then:
> > properties:
> > clocks:
> > @@ -235,6 +243,17 @@ allOf:
> >
> > reg-names:
> > maxItems: 1
> > + - if:
> > + properties:
> > + compatible:
> > + contains:
> > + enum:
> > + - samsung,exynosautov920-usbdrd-phy
> > + then:
> > + required:
> > + - dvdd075-usb20-supply
> > + - vdd18-usb20-supply
> > + - vdd33-usb20-supply
>
> Presumably the existing devices don't have these new supplies, so:
>
> else:
> properties:
> dvdd075-usb20-supply: false
> vdd18-usb20-supply: false
Appreciated for the suggestion. Will add this change in next version (v6) of
the patch-set.
Snippet will look as mentioned below.
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - samsung,exynosautov920-usbdrd-phy
+ then:
+ required:
+ - dvdd075-usb20-supply
+ - vdd18-usb20-supply
+ - vdd33-usb20-supply
+
+ else:
+ properties:
+ dvdd075-usb20-supply: false
+ vdd18-usb20-supply: false
Thank you.
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy
2025-08-06 23:43 ` Rob Herring
@ 2025-08-07 12:32 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-07 12:32 UTC (permalink / raw)
To: 'Rob Herring'
Cc: vkoul, kishon, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Rob,
> -----Original Message-----
> From: Rob Herring <robh@kernel.org>
> Sent: 07 August 2025 05:13 AM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: vkoul@kernel.org; kishon@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> samsung-soc@vger.kernel.org; rosa.pila@samsung.com;
> dev.tailor@samsung.com; faraz.ata@samsung.com;
> muhammed.ali@samsung.com; selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add
> ExynosAutov920 combo ssphy
>
> On Tue, Aug 05, 2025 at 05:22:15PM +0530, Pritam Manohar Sutar wrote:
> > This phy supports USB3.1 SSP+(10Gbps) protocol and is backwards
> > compatible to the USB3.0 SS(5Gbps). It requires two clocks, named
> > "phy" and "ref". The required supplies for USB3.1 are named as
> > vdd075_usb30(0.75v), vdd18_usb30(1.8v).
> >
> > Add schemas for combo ssphy found on this SoC.
> >
> > Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> > ---
> > .../bindings/phy/samsung,usb3-drd-phy.yaml | 19
> +++++++++++++++++++
> > 1 file changed, 19 insertions(+)
> >
> > diff --git
> > a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> > b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-phy.yaml
> > index 4a84b5405cd2..7a71cff10fb5 100644
> > --- a/Documentation/devicetree/bindings/phy/samsung,usb3-drd-
> phy.yaml
> > +++ b/Documentation/devicetree/bindings/phy/samsung,usb3-drd-
> phy.yaml
> > @@ -34,6 +34,7 @@ properties:
> > - samsung,exynos7870-usbdrd-phy
> > - samsung,exynos850-usbdrd-phy
> > - samsung,exynos990-usbdrd-phy
> > + - samsung,exynosautov920-usb31drd-combo-ssphy
> > - samsung,exynosautov920-usbdrd-combo-hsphy
> > - samsung,exynosautov920-usbdrd-phy
> >
> > @@ -118,6 +119,12 @@ properties:
> > vdd18-usb20-supply:
> > description: 1.8V power supply for the USB 2.0 phy.
> >
> > + dvdd075-usb30-supply:
> > + description: 0.75V power supply for the USB 3.0 phy.
> > +
> > + vdd18-usb30-supply:
> > + description: 1.8V power supply for the USB 3.0 phy.
> > +
> > required:
> > - compatible
> > - clocks
> > @@ -227,6 +234,7 @@ allOf:
> > - samsung,exynos7870-usbdrd-phy
> > - samsung,exynos850-usbdrd-phy
> > - samsung,exynos990-usbdrd-phy
> > + - samsung,exynosautov920-usb31drd-combo-ssphy
> > - samsung,exynosautov920-usbdrd-combo-hsphy
> > - samsung,exynosautov920-usbdrd-phy
> > then:
> > @@ -258,6 +266,17 @@ allOf:
> > - vdd18-usb20-supply
> > - vdd33-usb20-supply
> >
> > + - if:
> > + properties:
> > + compatible:
> > + contains:
> > + enum:
> > + - samsung,exynosautov920-usb31drd-combo-ssphy
> > + then:
> > + required:
> > + - dvdd075-usb30-supply
> > + - vdd18-usb30-supply
>
> Similar issue here.
Will the suggested lines of the code in next version of the patch-set.
Snippet will look as below.
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - samsung,exynosautov920-usb31drd-combo-ssphy
+ then:
+ required:
+ - dvdd075-usb30-supply
+ - vdd18-usb30-supply
+
+ else:
+ properties:
+ dvdd075-usb30-supply: false
+ vdd18-usb30-supply: false
Thank you.
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for ExynosAutov920
2025-08-05 11:52 ` [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for ExynosAutov920 Pritam Manohar Sutar
@ 2025-08-12 14:15 ` Vinod Koul
2025-08-14 13:26 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Vinod Koul @ 2025-08-12 14:15 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> Enable UTMI+ phy support for this SoC which is very similar to what
> the existing Exynos850 supports.
>
> Add required change in phy driver to support HS phy for this SoC.
>
> Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> ---
> drivers/phy/samsung/phy-exynos5-usbdrd.c | 123 ++++++++++++++++++++
> include/linux/soc/samsung/exynos-regs-pmu.h | 2 +
> 2 files changed, 125 insertions(+)
>
> diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> index dd660ebe8045..5400dd23e500 100644
> --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> @@ -2054,6 +2054,126 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
> .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> };
>
> +static int exynosautov920_usbdrd_phy_init(struct phy *phy)
> +{
> + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
> + int ret;
> +
> + ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
> + if (ret)
> + return ret;
> +
> + /* Bypass PHY isol */
> + inst->phy_cfg->phy_isol(inst, false);
> +
> + /* UTMI or PIPE3 specific init */
> + inst->phy_cfg->phy_init(phy_drd);
> +
> + clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
> +
> + return 0;
> +}
> +
> +static int exynosautov920_usbdrd_phy_exit(struct phy *phy)
> +{
> + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
> + int ret = 0;
Superfluous init..
> +
> + ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks, phy_drd->clks);
> + if (ret)
> + return ret;
> +
> + exynos850_usbdrd_phy_exit(phy);
> +
> + /* enable PHY isol */
> + inst->phy_cfg->phy_isol(inst, true);
> +
> + clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks, phy_drd->clks);
> +
> + return 0;
> +}
> +
> +static int exynosautov920_usbdrd_phy_power_on(struct phy *phy)
> +{
> + int ret;
> + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
Reverse chrsitmas tree pls
--
~Vinod
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920
2025-08-05 11:52 ` [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920 Pritam Manohar Sutar
@ 2025-08-12 14:18 ` Vinod Koul
2025-08-19 5:40 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Vinod Koul @ 2025-08-12 14:18 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> Support UTMI+ combo phy for this SoC which is somewhat simmilar to
> what the existing Exynos850 support does. The difference is that
> some register offsets and bit fields are defferent from Exynos850.
>
> Add required change in phy driver to support combo HS phy for this SoC.
>
> Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> ---
> drivers/phy/samsung/phy-exynos5-usbdrd.c | 210 +++++++++++++++++++++++
> 1 file changed, 210 insertions(+)
>
> diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> index 5400dd23e500..c22f4de7d094 100644
> --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> @@ -41,6 +41,13 @@
> #define EXYNOS2200_CLKRST_LINK_PCLK_SEL BIT(1)
>
> #define EXYNOS2200_DRD_UTMI 0x10
> +
> +/* ExynosAutov920 bits */
> +#define UTMICTL_FORCE_UTMI_SUSPEND BIT(13)
> +#define UTMICTL_FORCE_UTMI_SLEEP BIT(12)
> +#define UTMICTL_FORCE_DPPULLDOWN BIT(9)
> +#define UTMICTL_FORCE_DMPULLDOWN BIT(8)
> +
> #define EXYNOS2200_UTMI_FORCE_VBUSVALID BIT(1)
> #define EXYNOS2200_UTMI_FORCE_BVALID BIT(0)
>
> @@ -250,6 +257,22 @@
> #define EXYNOS850_DRD_HSP_TEST 0x5c
> #define HSP_TEST_SIDDQ BIT(24)
>
> +#define EXYNOSAUTOV920_DRD_HSP_CLKRST 0x100
> +#define HSPCLKRST_PHY20_SW_PORTRESET BIT(3)
> +#define HSPCLKRST_PHY20_SW_POR BIT(1)
> +#define HSPCLKRST_PHY20_SW_POR_SEL BIT(0)
> +
> +#define EXYNOSAUTOV920_DRD_HSPCTL 0x104
> +#define HSPCTRL_VBUSVLDEXTSEL BIT(13)
> +#define HSPCTRL_VBUSVLDEXT BIT(12)
> +#define HSPCTRL_EN_UTMISUSPEND BIT(9)
> +#define HSPCTRL_COMMONONN BIT(8)
> +
> +#define EXYNOSAUTOV920_DRD_HSP_TEST 0x10c
> +
> +#define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
> +#define HSPPLLTUNE_FSEL GENMASK(18, 16)
> +
> /* Exynos9 - GS101 */
> #define EXYNOS850_DRD_SECPMACTL 0x48
> #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL GENMASK(13, 12)
> @@ -2054,6 +2077,139 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
> .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> };
>
> +static void
> +exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd)
> +{
> + void __iomem *reg_phy = phy_drd->reg_phy;
> + u32 reg;
> +
> + /*
> + * Disable HWACG (hardware auto clock gating control). This
> + * forces QACTIVE signal in Q-Channel interface to HIGH level,
> + * to make sure the PHY clock is not gated by the hardware.
> + */
> + reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
> + reg |= LINKCTRL_FORCE_QACT;
> + writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
maybe add a read-modify-write helper, this is user a lot here
> +
> + /* De-assert link reset */
> + reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
> + reg &= ~CLKRST_LINK_SW_RST;
> + writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
> +
> + /* Set PHY POR High */
> + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
> + reg |= HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_POR_SEL;
> + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
> +
> + /* Enable UTMI+ */
> + reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
> + reg &= ~(UTMICTL_FORCE_UTMI_SUSPEND | UTMICTL_FORCE_UTMI_SLEEP |
> + UTMICTL_FORCE_DPPULLDOWN | UTMICTL_FORCE_DMPULLDOWN);
> + writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
> +
> + /* set phy clock & control HS phy */
> + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> + reg |= HSPCTRL_EN_UTMISUSPEND | HSPCTRL_COMMONONN;
> + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> +
> + fsleep(100);
> +
> + /* Set VBUS Valid and DP-Pull up control by VBUS pad usage */
> + reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
> + reg |= FIELD_PREP_CONST(LINKCTRL_BUS_FILTER_BYPASS, 0xf);
> + writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
> +
> + reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
> + reg |= EXYNOS2200_UTMI_FORCE_VBUSVALID | EXYNOS2200_UTMI_FORCE_BVALID;
> + writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
> +
> + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> + reg |= HSPCTRL_VBUSVLDEXTSEL | HSPCTRL_VBUSVLDEXT;
> + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> +
> + /* Setting FSEL for refference clock */
> + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
> + reg &= ~HSPPLLTUNE_FSEL;
Empty line here please
> + switch (phy_drd->extrefclk) {
> + case EXYNOS5_FSEL_50MHZ:
> + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 7);
> + break;
> + case EXYNOS5_FSEL_26MHZ:
> + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 6);
> + break;
> + case EXYNOS5_FSEL_24MHZ:
> + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 2);
> + break;
> + case EXYNOS5_FSEL_20MHZ:
> + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 1);
> + break;
> + case EXYNOS5_FSEL_19MHZ2:
> + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 0);
> + break;
> + default:
> + dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
> + phy_drd->extrefclk);
but we still continue?
--
~Vinod
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
2025-08-05 11:52 ` [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920 Pritam Manohar Sutar
@ 2025-08-12 14:21 ` Vinod Koul
2025-08-18 7:41 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Vinod Koul @ 2025-08-12 14:21 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> Add required change in phy driver to support combo SS phy for this SoC.
>
> Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> ---
> drivers/phy/samsung/phy-exynos5-usbdrd.c | 327 +++++++++++++++++++-
> include/linux/soc/samsung/exynos-regs-pmu.h | 1 +
> 2 files changed, 324 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> index c22f4de7d094..1108f0c07755 100644
> --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> @@ -273,6 +273,36 @@
> #define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
> #define HSPPLLTUNE_FSEL GENMASK(18, 16)
>
> +/* ExynosAutov920 phy usb31drd port reg */
> +#define EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL 0x000
> +#define PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN BIT(5)
> +#define PHY_RST_CTRL_PIPE_LANE0_RESET_N BIT(4)
> +#define PHY_RST_CTRL_PHY_RESET_OVRD_EN BIT(1)
> +#define PHY_RST_CTRL_PHY_RESET BIT(0)
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0 0x0004
> +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR GENMASK(31, 16)
> +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK BIT(8)
> +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK BIT(4)
> +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL BIT(0)
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1 0x0008
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2 0x000c
> +#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN BIT(0)
> +#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA GENMASK(31, 16)
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0 0x100
> +#define PHY_CONFIG0_PHY0_PMA_PWR_STABLE BIT(14)
> +#define PHY_CONFIG0_PHY0_PCS_PWR_STABLE BIT(13)
> +#define PHY_CONFIG0_PHY0_ANA_PWR_EN BIT(1)
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7 0x11c
> +#define PHY_CONFIG7_PHY_TEST_POWERDOWN BIT(24)
> +
> +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4 0x110
> +#define PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN BIT(2)
> +
> /* Exynos9 - GS101 */
> #define EXYNOS850_DRD_SECPMACTL 0x48
> #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL GENMASK(13, 12)
> @@ -2077,6 +2107,253 @@ static const struct exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
> .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> };
>
> +static void
> +exynosautov920_usb31drd_cr_clk(struct exynos5_usbdrd_phy *phy_drd, bool high)
> +{
> + void __iomem *reg_phy = phy_drd->reg_phy;
> + u32 reg = 0;
again..
> +
> + reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + if (high)
> + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> + else
> + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> +
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + fsleep(1);
> +}
> +
> +static void
> +exynosautov920_usb31drd_port_phy_ready(struct exynos5_usbdrd_phy *phy_drd)
> +{
> + struct device *dev = phy_drd->dev;
> + void __iomem *reg_phy = phy_drd->reg_phy;
> + static const unsigned int timeout_us = 20000;
> + static const unsigned int sleep_us = 40;
> + u32 reg = 0;
here too
> + int err;
> +
> + /* Clear cr_para_con */
> + reg &= ~(PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
> + PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR);
> + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1);
> + writel(0x0, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> +
> + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> +
> + /*
> + * The maximum time from phy reset de-assertion to de-assertion of
> + * tx/rx_ack can be as high as 5ms in fast simulation mode.
> + * Time to phy ready is < 20ms
> + */
> + err = readl_poll_timeout(reg_phy +
> + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0,
> + reg, !(reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK),
> + sleep_us, timeout_us);
> + if (err)
> + dev_err(dev, "timed out waiting for rx/tx_ack: %#.8x\n", reg);
> +
> + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> +}
> +
> +static void
> +exynosautov920_usb31drd_cr_write(struct exynos5_usbdrd_phy *phy_drd,
> + u16 addr, u16 data)
> +{
> + struct device *dev = phy_drd->dev;
> + void __iomem *reg_phy = phy_drd->reg_phy;
> + u32 cnt = 0;
> + u32 reg = 0;
this one, former is okay
> +
> + /* Pre Clocking */
> + reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> +
> + /*
> + * tx clks must be available prior to assertion of tx req.
> + * tx pstate p2 to p0 transition directly is not permitted.
> + * tx clk ready must be asserted synchronously on tx clk prior
> + * to internal transmit clk alignment sequence in the phy
> + * when entering from p2 to p1 to p0.
> + */
> + do {
> + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> + cnt++;
> + } while (cnt < 15);
> +
> + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> +
> + /*
> + * tx data path is active when tx lane is in p0 state
> + * and tx data en asserted. enable cr_para_wr_en.
> + */
> + reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> + reg &= ~PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA;
> + reg |= FIELD_PREP(PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA, data) |
> + PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> +
> + /* write addr */
> + reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR;
> + reg |= FIELD_PREP(PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR, addr) |
> + PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
> + PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> + writel(reg, reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> +
> + /* check cr_para_ack*/
> + cnt = 0;
> + do {
> + /*
> + * data symbols are captured by phy on rising edge of the
> + * tx_clk when tx data enabled.
> + * completion of the write cycle is acknowledged by assertion
> + * of the cr_para_ack.
> + */
> + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> + reg = readl(reg_phy + EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> + if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
> + break;
> +
> + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> +
> + /*
> + * wait for minimum of 10 cr_para_clk cycles after phy reset
> + * is negated, before accessing control regs to allow for
> + * internal resets.
> + */
> + cnt++;
> + } while (cnt < 10);
> +
> + if (cnt == 10)
> + dev_dbg(dev, "CR write failed to 0x%04x\n", addr);
Not error?
--
~Vinod
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for ExynosAutov920
2025-08-12 14:15 ` Vinod Koul
@ 2025-08-14 13:26 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-14 13:26 UTC (permalink / raw)
To: 'Vinod Koul'
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Vinod,
> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: 12 August 2025 07:45 PM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: kishon@kernel.org; robh@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> samsung-soc@vger.kernel.org; rosa.pila@samsung.com;
> dev.tailor@samsung.com; faraz.ata@samsung.com;
> muhammed.ali@samsung.com; selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for
> ExynosAutov920
>
> On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> > Enable UTMI+ phy support for this SoC which is very similar to what
> > the existing Exynos850 supports.
> >
> > Add required change in phy driver to support HS phy for this SoC.
> >
> > Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> > ---
> > drivers/phy/samsung/phy-exynos5-usbdrd.c | 123
> ++++++++++++++++++++
> > include/linux/soc/samsung/exynos-regs-pmu.h | 2 +
> > 2 files changed, 125 insertions(+)
> >
> > diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > index dd660ebe8045..5400dd23e500 100644
> > --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > @@ -2054,6 +2054,126 @@ static const struct
> exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
> > .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> > };
> >
> > +static int exynosautov920_usbdrd_phy_init(struct phy *phy) {
> > + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> > + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
> > + int ret;
> > +
> > + ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks,
> phy_drd->clks);
> > + if (ret)
> > + return ret;
> > +
> > + /* Bypass PHY isol */
> > + inst->phy_cfg->phy_isol(inst, false);
> > +
> > + /* UTMI or PIPE3 specific init */
> > + inst->phy_cfg->phy_init(phy_drd);
> > +
> > + clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks,
> > +phy_drd->clks);
> > +
> > + return 0;
> > +}
> > +
> > +static int exynosautov920_usbdrd_phy_exit(struct phy *phy) {
> > + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> > + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
> > + int ret = 0;
>
> Superfluous init..
>
> > +
> > + ret = clk_bulk_prepare_enable(phy_drd->drv_data->n_clks,
> phy_drd->clks);
> > + if (ret)
> > + return ret;
> > +
> > + exynos850_usbdrd_phy_exit(phy);
> > +
> > + /* enable PHY isol */
> > + inst->phy_cfg->phy_isol(inst, true);
> > +
> > + clk_bulk_disable_unprepare(phy_drd->drv_data->n_clks,
> > +phy_drd->clks);
> > +
> > + return 0;
> > +}
> > +
> > +static int exynosautov920_usbdrd_phy_power_on(struct phy *phy) {
> > + int ret;
> > + struct phy_usb_instance *inst = phy_get_drvdata(phy);
> > + struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
>
> Reverse chrsitmas tree pls
>
> --
> ~Vinod
Will address these comments in next version of the patch-set (v6).
Thank you.
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
2025-08-12 14:21 ` Vinod Koul
@ 2025-08-18 7:41 ` Pritam Manohar Sutar
2025-08-19 6:54 ` Vinod Koul
0 siblings, 1 reply; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-18 7:41 UTC (permalink / raw)
To: 'Vinod Koul'
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Vinod,
> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: 12 August 2025 07:52 PM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: kishon@kernel.org; robh@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org; linux-
> samsung-soc@vger.kernel.org; rosa.pila@samsung.com;
> dev.tailor@samsung.com; faraz.ata@samsung.com;
> muhammed.ali@samsung.com; selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for
> ExynosAutov920
>
> On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> > Add required change in phy driver to support combo SS phy for this SoC.
> >
> > Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> > ---
> > drivers/phy/samsung/phy-exynos5-usbdrd.c | 327
> +++++++++++++++++++-
> > include/linux/soc/samsung/exynos-regs-pmu.h | 1 +
> > 2 files changed, 324 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > index c22f4de7d094..1108f0c07755 100644
> > --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > @@ -273,6 +273,36 @@
> > #define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
> > #define HSPPLLTUNE_FSEL GENMASK(18, 16)
> >
> > +/* ExynosAutov920 phy usb31drd port reg */
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_RST_CTRL 0x000
> > +#define PHY_RST_CTRL_PIPE_LANE0_RESET_N_OVRD_EN BIT(5)
> > +#define PHY_RST_CTRL_PIPE_LANE0_RESET_N BIT(4)
> > +#define PHY_RST_CTRL_PHY_RESET_OVRD_EN BIT(1)
> > +#define PHY_RST_CTRL_PHY_RESET BIT(0)
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0
> 0x0004
> > +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR
> GENMASK(31, 16)
> > +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK BIT(8)
> > +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK BIT(4)
> > +#define PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL BIT(0)
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1
> 0x0008
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2
> 0x000c
> > +#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN BIT(0)
> > +#define PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA
> GENMASK(31, 16)
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG0 0x100
> > +#define PHY_CONFIG0_PHY0_PMA_PWR_STABLE BIT(14)
> > +#define PHY_CONFIG0_PHY0_PCS_PWR_STABLE BIT(13)
> > +#define PHY_CONFIG0_PHY0_ANA_PWR_EN BIT(1)
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG7 0x11c
> > +#define PHY_CONFIG7_PHY_TEST_POWERDOWN BIT(24)
> > +
> > +#define EXYNOSAUTOV920_USB31DRD_PHY_CONFIG4 0x110
> > +#define PHY_CONFIG4_PIPE_RX0_SRIS_MODE_EN BIT(2)
> > +
> > /* Exynos9 - GS101 */
> > #define EXYNOS850_DRD_SECPMACTL 0x48
> > #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL
> GENMASK(13, 12)
> > @@ -2077,6 +2107,253 @@ static const struct
> exynos5_usbdrd_phy_drvdata exynos990_usbdrd_phy = {
> > .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> > };
> >
> > +static void
> > +exynosautov920_usb31drd_cr_clk(struct exynos5_usbdrd_phy *phy_drd,
> > +bool high) {
> > + void __iomem *reg_phy = phy_drd->reg_phy;
> > + u32 reg = 0;
>
> again..
>
> > +
> > + reg = readl(reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + if (high)
> > + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> > + else
> > + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> > +
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + fsleep(1);
> > +}
> > +
> > +static void
> > +exynosautov920_usb31drd_port_phy_ready(struct exynos5_usbdrd_phy
> > +*phy_drd) {
> > + struct device *dev = phy_drd->dev;
> > + void __iomem *reg_phy = phy_drd->reg_phy;
> > + static const unsigned int timeout_us = 20000;
> > + static const unsigned int sleep_us = 40;
> > + u32 reg = 0;
>
> here too
>
> > + int err;
> > +
> > + /* Clear cr_para_con */
> > + reg &= ~(PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
> > + PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR);
> > + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + writel(0x0, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON1);
> > + writel(0x0, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> > +
> > + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> > + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> > +
> > + /*
> > + * The maximum time from phy reset de-assertion to de-assertion of
> > + * tx/rx_ack can be as high as 5ms in fast simulation mode.
> > + * Time to phy ready is < 20ms
> > + */
> > + err = readl_poll_timeout(reg_phy +
> > +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0,
> > + reg, !(reg &
> PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK),
> > + sleep_us, timeout_us);
> > + if (err)
> > + dev_err(dev, "timed out waiting for rx/tx_ack: %#.8x\n",
> reg);
> > +
> > + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > +}
> > +
> > +static void
> > +exynosautov920_usb31drd_cr_write(struct exynos5_usbdrd_phy
> *phy_drd,
> > + u16 addr, u16 data)
> > +{
> > + struct device *dev = phy_drd->dev;
> > + void __iomem *reg_phy = phy_drd->reg_phy;
> > + u32 cnt = 0;
> > + u32 reg = 0;
>
> this one, former is okay
>
> > +
> > + /* Pre Clocking */
> > + reg = readl(reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + reg |= PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > +
> > + /*
> > + * tx clks must be available prior to assertion of tx req.
> > + * tx pstate p2 to p0 transition directly is not permitted.
> > + * tx clk ready must be asserted synchronously on tx clk prior
> > + * to internal transmit clk alignment sequence in the phy
> > + * when entering from p2 to p1 to p0.
> > + */
> > + do {
> > + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> > + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> > + cnt++;
> > + } while (cnt < 15);
> > +
> > + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > +
> > + /*
> > + * tx data path is active when tx lane is in p0 state
> > + * and tx data en asserted. enable cr_para_wr_en.
> > + */
> > + reg = readl(reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> > + reg &= ~PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA;
> > + reg |=
> FIELD_PREP(PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_DATA, data) |
> > + PHY_CR_PARA_CON2_PHY0_CR_PARA_WR_EN;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON2);
> > +
> > + /* write addr */
> > + reg = readl(reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + reg &= ~PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR;
> > + reg |= FIELD_PREP(PHY_CR_PARA_CON0_PHY0_CR_PARA_ADDR,
> addr) |
> > + PHY_CR_PARA_CON0_PHY0_CR_PARA_CLK |
> > + PHY_CR_PARA_CON0_PHY0_CR_PARA_SEL;
> > + writel(reg, reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > +
> > + /* check cr_para_ack*/
> > + cnt = 0;
> > + do {
> > + /*
> > + * data symbols are captured by phy on rising edge of the
> > + * tx_clk when tx data enabled.
> > + * completion of the write cycle is acknowledged by
assertion
> > + * of the cr_para_ack.
> > + */
> > + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> > + reg = readl(reg_phy +
> EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > + if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
> > + break;
> > +
> > + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> > +
> > + /*
> > + * wait for minimum of 10 cr_para_clk cycles after phy reset
> > + * is negated, before accessing control regs to allow for
> > + * internal resets.
> > + */
> > + cnt++;
> > + } while (cnt < 10);
> > +
> > + if (cnt == 10)
> > + dev_dbg(dev, "CR write failed to 0x%04x\n", addr);
>
> Not error?
This is only for debugging purpose. It is not considered as error.
> --
> ~Vinod
Will address other comments in next version of the patch-set (v6).
Thank you.
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920
2025-08-12 14:18 ` Vinod Koul
@ 2025-08-19 5:40 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-19 5:40 UTC (permalink / raw)
To: 'Vinod Koul'
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Vinod,
> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: 12 August 2025 07:48 PM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: kishon@kernel.org; robh@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
linux-samsung-
> soc@vger.kernel.org; rosa.pila@samsung.com; dev.tailor@samsung.com;
> faraz.ata@samsung.com; muhammed.ali@samsung.com;
> selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for
> ExynosAutov920
>
> On 05-08-25, 17:22, Pritam Manohar Sutar wrote:
> > Support UTMI+ combo phy for this SoC which is somewhat simmilar to
> > what the existing Exynos850 support does. The difference is that some
> > register offsets and bit fields are defferent from Exynos850.
> >
> > Add required change in phy driver to support combo HS phy for this SoC.
> >
> > Signed-off-by: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> > ---
> > drivers/phy/samsung/phy-exynos5-usbdrd.c | 210
> > +++++++++++++++++++++++
> > 1 file changed, 210 insertions(+)
> >
> > diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > index 5400dd23e500..c22f4de7d094 100644
> > --- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > +++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
> > @@ -41,6 +41,13 @@
> > #define EXYNOS2200_CLKRST_LINK_PCLK_SEL BIT(1)
> >
> > #define EXYNOS2200_DRD_UTMI 0x10
> > +
> > +/* ExynosAutov920 bits */
> > +#define UTMICTL_FORCE_UTMI_SUSPEND BIT(13)
> > +#define UTMICTL_FORCE_UTMI_SLEEP BIT(12)
> > +#define UTMICTL_FORCE_DPPULLDOWN BIT(9)
> > +#define UTMICTL_FORCE_DMPULLDOWN BIT(8)
> > +
> > #define EXYNOS2200_UTMI_FORCE_VBUSVALID BIT(1)
> > #define EXYNOS2200_UTMI_FORCE_BVALID BIT(0)
> >
> > @@ -250,6 +257,22 @@
> > #define EXYNOS850_DRD_HSP_TEST 0x5c
> > #define HSP_TEST_SIDDQ BIT(24)
> >
> > +#define EXYNOSAUTOV920_DRD_HSP_CLKRST 0x100
> > +#define HSPCLKRST_PHY20_SW_PORTRESET BIT(3)
> > +#define HSPCLKRST_PHY20_SW_POR BIT(1)
> > +#define HSPCLKRST_PHY20_SW_POR_SEL BIT(0)
> > +
> > +#define EXYNOSAUTOV920_DRD_HSPCTL 0x104
> > +#define HSPCTRL_VBUSVLDEXTSEL BIT(13)
> > +#define HSPCTRL_VBUSVLDEXT BIT(12)
> > +#define HSPCTRL_EN_UTMISUSPEND BIT(9)
> > +#define HSPCTRL_COMMONONN BIT(8)
> > +
> > +#define EXYNOSAUTOV920_DRD_HSP_TEST 0x10c
> > +
> > +#define EXYNOSAUTOV920_DRD_HSPPLLTUNE 0x110
> > +#define HSPPLLTUNE_FSEL GENMASK(18, 16)
> > +
> > /* Exynos9 - GS101 */
> > #define EXYNOS850_DRD_SECPMACTL 0x48
> > #define SECPMACTL_PMA_ROPLL_REF_CLK_SEL GENMASK(13,
> 12)
> > @@ -2054,6 +2077,139 @@ static const struct exynos5_usbdrd_phy_drvdata
> exynos990_usbdrd_phy = {
> > .n_regulators = ARRAY_SIZE(exynos5_regulator_names),
> > };
> >
> > +static void
> > +exynosautov920_usbdrd_utmi_init(struct exynos5_usbdrd_phy *phy_drd) {
> > + void __iomem *reg_phy = phy_drd->reg_phy;
> > + u32 reg;
> > +
> > + /*
> > + * Disable HWACG (hardware auto clock gating control). This
> > + * forces QACTIVE signal in Q-Channel interface to HIGH level,
> > + * to make sure the PHY clock is not gated by the hardware.
> > + */
> > + reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
> > + reg |= LINKCTRL_FORCE_QACT;
> > + writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
>
> maybe add a read-modify-write helper, this is user a lot here
Used this convention for readability purpose. Other SoCs are also using
convention in this file.
Moreover, noted this and will consider to clean-up this file later.
>
> > +
> > + /* De-assert link reset */
> > + reg = readl(reg_phy + EXYNOS2200_DRD_CLKRST);
> > + reg &= ~CLKRST_LINK_SW_RST;
> > + writel(reg, reg_phy + EXYNOS2200_DRD_CLKRST);
> > +
> > + /* Set PHY POR High */
> > + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
> > + reg |= HSPCLKRST_PHY20_SW_POR | HSPCLKRST_PHY20_SW_POR_SEL;
> > + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSP_CLKRST);
> > +
> > + /* Enable UTMI+ */
> > + reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
> > + reg &= ~(UTMICTL_FORCE_UTMI_SUSPEND |
> UTMICTL_FORCE_UTMI_SLEEP |
> > + UTMICTL_FORCE_DPPULLDOWN |
> UTMICTL_FORCE_DMPULLDOWN);
> > + writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
> > +
> > + /* set phy clock & control HS phy */
> > + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> > + reg |= HSPCTRL_EN_UTMISUSPEND | HSPCTRL_COMMONONN;
> > + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> > +
> > + fsleep(100);
> > +
> > + /* Set VBUS Valid and DP-Pull up control by VBUS pad usage */
> > + reg = readl(reg_phy + EXYNOS850_DRD_LINKCTRL);
> > + reg |= FIELD_PREP_CONST(LINKCTRL_BUS_FILTER_BYPASS, 0xf);
> > + writel(reg, reg_phy + EXYNOS850_DRD_LINKCTRL);
> > +
> > + reg = readl(reg_phy + EXYNOS2200_DRD_UTMI);
> > + reg |= EXYNOS2200_UTMI_FORCE_VBUSVALID |
> EXYNOS2200_UTMI_FORCE_BVALID;
> > + writel(reg, reg_phy + EXYNOS2200_DRD_UTMI);
> > +
> > + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> > + reg |= HSPCTRL_VBUSVLDEXTSEL | HSPCTRL_VBUSVLDEXT;
> > + writel(reg, reg_phy + EXYNOSAUTOV920_DRD_HSPCTL);
> > +
> > + /* Setting FSEL for refference clock */
> > + reg = readl(reg_phy + EXYNOSAUTOV920_DRD_HSPPLLTUNE);
> > + reg &= ~HSPPLLTUNE_FSEL;
>
> Empty line here please
Will add empty line.
>
> > + switch (phy_drd->extrefclk) {
> > + case EXYNOS5_FSEL_50MHZ:
> > + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 7);
> > + break;
> > + case EXYNOS5_FSEL_26MHZ:
> > + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 6);
> > + break;
> > + case EXYNOS5_FSEL_24MHZ:
> > + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 2);
> > + break;
> > + case EXYNOS5_FSEL_20MHZ:
> > + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 1);
> > + break;
> > + case EXYNOS5_FSEL_19MHZ2:
> > + reg |= FIELD_PREP(HSPPLLTUNE_FSEL, 0);
> > + break;
> > + default:
> > + dev_warn(phy_drd->dev, "unsupported ref clk: %#.2x\n",
> > + phy_drd->extrefclk);
>
> but we still continue?
This SoC supports 19.2Mhz refclk and it sets default reg value for this
refclk if it does not find clk.
> --
> ~Vinod
Thank you,
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
2025-08-18 7:41 ` Pritam Manohar Sutar
@ 2025-08-19 6:54 ` Vinod Koul
2025-08-19 7:44 ` Pritam Manohar Sutar
0 siblings, 1 reply; 19+ messages in thread
From: Vinod Koul @ 2025-08-19 6:54 UTC (permalink / raw)
To: Pritam Manohar Sutar
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
On 18-08-25, 13:11, Pritam Manohar Sutar wrote:
> > > + /* check cr_para_ack*/
> > > + cnt = 0;
> > > + do {
> > > + /*
> > > + * data symbols are captured by phy on rising edge of the
> > > + * tx_clk when tx data enabled.
> > > + * completion of the write cycle is acknowledged by
> assertion
> > > + * of the cr_para_ack.
> > > + */
> > > + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> > > + reg = readl(reg_phy +
> > EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > > + if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
> > > + break;
> > > +
> > > + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> > > +
> > > + /*
> > > + * wait for minimum of 10 cr_para_clk cycles after phy reset
> > > + * is negated, before accessing control regs to allow for
> > > + * internal resets.
> > > + */
> > > + cnt++;
> > > + } while (cnt < 10);
> > > +
> > > + if (cnt == 10)
> > > + dev_dbg(dev, "CR write failed to 0x%04x\n", addr);
> >
> > Not error?
>
> This is only for debugging purpose. It is not considered as error.
Write failed is not an error? If this code is only for debug, pls drop
it.
--
~Vinod
^ permalink raw reply [flat|nested] 19+ messages in thread
* RE: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920
2025-08-19 6:54 ` Vinod Koul
@ 2025-08-19 7:44 ` Pritam Manohar Sutar
0 siblings, 0 replies; 19+ messages in thread
From: Pritam Manohar Sutar @ 2025-08-19 7:44 UTC (permalink / raw)
To: 'Vinod Koul'
Cc: kishon, robh, krzk+dt, conor+dt, alim.akhtar, andre.draszik,
peter.griffin, kauschluss, ivo.ivanov.ivanov1, igor.belwon,
m.szyprowski, s.nawrocki, linux-phy, devicetree, linux-kernel,
linux-arm-kernel, linux-samsung-soc, rosa.pila, dev.tailor,
faraz.ata, muhammed.ali, selvarasu.g
Hi Vinod,
> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: 19 August 2025 12:25 PM
> To: Pritam Manohar Sutar <pritam.sutar@samsung.com>
> Cc: kishon@kernel.org; robh@kernel.org; krzk+dt@kernel.org;
> conor+dt@kernel.org; alim.akhtar@samsung.com; andre.draszik@linaro.org;
> peter.griffin@linaro.org; kauschluss@disroot.org;
> ivo.ivanov.ivanov1@gmail.com; igor.belwon@mentallysanemainliners.org;
> m.szyprowski@samsung.com; s.nawrocki@samsung.com; linux-
> phy@lists.infradead.org; devicetree@vger.kernel.org; linux-
> kernel@vger.kernel.org; linux-arm-kernel@lists.infradead.org;
linux-samsung-
> soc@vger.kernel.org; rosa.pila@samsung.com; dev.tailor@samsung.com;
> faraz.ata@samsung.com; muhammed.ali@samsung.com;
> selvarasu.g@samsung.com
> Subject: Re: [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for
> ExynosAutov920
>
> On 18-08-25, 13:11, Pritam Manohar Sutar wrote:
>
> > > > + /* check cr_para_ack*/
> > > > + cnt = 0;
> > > > + do {
> > > > + /*
> > > > + * data symbols are captured by phy on rising edge
of the
> > > > + * tx_clk when tx data enabled.
> > > > + * completion of the write cycle is acknowledged by
> > assertion
> > > > + * of the cr_para_ack.
> > > > + */
> > > > + exynosautov920_usb31drd_cr_clk(phy_drd, true);
> > > > + reg = readl(reg_phy +
> > > EXYNOSAUTOV920_USB31DRD_PHY_CR_PARA_CON0);
> > > > + if ((reg & PHY_CR_PARA_CON0_PHY0_CR_PARA_ACK))
> > > > + break;
> > > > +
> > > > + exynosautov920_usb31drd_cr_clk(phy_drd, false);
> > > > +
> > > > + /*
> > > > + * wait for minimum of 10 cr_para_clk cycles after
phy reset
> > > > + * is negated, before accessing control regs to
allow for
> > > > + * internal resets.
> > > > + */
> > > > + cnt++;
> > > > + } while (cnt < 10);
> > > > +
> > > > + if (cnt == 10)
> > > > + dev_dbg(dev, "CR write failed to 0x%04x\n", addr);
> > >
> > > Not error?
> >
> > This is only for debugging purpose. It is not considered as error.
>
> Write failed is not an error? If this code is only for debug, pls drop it.
Sure. will drop it.
>
> --
> ~Vinod
Regards,
Pritam
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2025-08-19 8:13 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20250805114303epcas5p4c88843b7e38d86b722e60e386c637160@epcas5p4.samsung.com>
2025-08-05 11:52 ` [PATCH v5 0/6] initial usbdrd phy support for Exynosautov920 soc Pritam Manohar Sutar
[not found] ` <CGME20250805114306epcas5p37782c02ae0ddc6b77094786c90af247a@epcas5p3.samsung.com>
2025-08-05 11:52 ` [PATCH v5 1/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 HS phy compatible Pritam Manohar Sutar
2025-08-06 23:42 ` Rob Herring
2025-08-07 12:21 ` Pritam Manohar Sutar
[not found] ` <CGME20250805114310epcas5p459aa232884d22501f5fefe42f239fecc@epcas5p4.samsung.com>
2025-08-05 11:52 ` [PATCH v5 2/6] phy: exynos5-usbdrd: support HS phy for ExynosAutov920 Pritam Manohar Sutar
2025-08-12 14:15 ` Vinod Koul
2025-08-14 13:26 ` Pritam Manohar Sutar
[not found] ` <CGME20250805114313epcas5p15b843d7fe692feb20828a789cef49dc0@epcas5p1.samsung.com>
2025-08-05 11:52 ` [PATCH v5 3/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo hsphy Pritam Manohar Sutar
[not found] ` <CGME20250805114316epcas5p49b78db499c2e37a1fe68f4b2f0be62a7@epcas5p4.samsung.com>
2025-08-05 11:52 ` [PATCH v5 4/6] phy: exynos5-usbdrd: support HS combo phy for ExynosAutov920 Pritam Manohar Sutar
2025-08-12 14:18 ` Vinod Koul
2025-08-19 5:40 ` Pritam Manohar Sutar
[not found] ` <CGME20250805114320epcas5p3968288f8d01944d3d730b3094a7befe4@epcas5p3.samsung.com>
2025-08-05 11:52 ` [PATCH v5 5/6] dt-bindings: phy: samsung,usb3-drd-phy: add ExynosAutov920 combo ssphy Pritam Manohar Sutar
2025-08-06 23:43 ` Rob Herring
2025-08-07 12:32 ` Pritam Manohar Sutar
[not found] ` <CGME20250805114323epcas5p39bf73c5e0a9382ff54b1832724804cc9@epcas5p3.samsung.com>
2025-08-05 11:52 ` [PATCH v5 6/6] phy: exynos5-usbdrd: support SS combo phy for ExynosAutov920 Pritam Manohar Sutar
2025-08-12 14:21 ` Vinod Koul
2025-08-18 7:41 ` Pritam Manohar Sutar
2025-08-19 6:54 ` Vinod Koul
2025-08-19 7:44 ` Pritam Manohar Sutar
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).