* [PATCH] phy: core: Use EOPNOTSUPP for disabled blob return value
@ 2026-09-29 8:47 Inochi Amaoto
2026-09-29 13:30 ` Damien Le Moal
0 siblings, 1 reply; 2+ messages in thread
From: Inochi Amaoto @ 2026-09-29 8:47 UTC (permalink / raw)
To: Hans de Goede, Damien Le Moal, Niklas Cassel, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter,
Minas Harutyunyan, Greg Kroah-Hartman, Thinh Nguyen, Vinod Koul,
Manivannan Sadhasivam, Damon Ding, Dmitry Baryshkov,
Heiko Stuebner
Cc: Inochi Amaoto, linux-ide, linux-kernel, dri-devel, linux-usb,
linux-phy, Yixun Lan, Longbin Li
Currently, the phy subsystem uses ENOSYS for dummy blob functions,
it does not reflect the function state correctly. As kernel already
has EOPNOTSUPP for disabled blob function, replace ENOSYS with
EOPNOTSUPP for a clear return value. Also adapt the return value
changed in the following affect file:
- ata/libahci_platform.c
- drm/bridge/analogix/analogix_dp_core.c
- usb/dwc2/platform.c
- usb/dwc3/core.c
Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
---
The related discussion for switch to EOPNOTSUPP is at
https://lore.kernel.org/linux-phy/20260907114837.2y55l7dfqqrgcka2@skbuf/
Changed from RFC:
- https://lore.kernel.org/linux-phy/20260922024724.191412-1-inochiama@gmail.com/
1. Merge all patch into one to avoid function break.
2. Improve libahci_platform's comment as Damien request.
---
drivers/ata/libahci_platform.c | 6 +--
.../drm/bridge/analogix/analogix_dp_core.c | 2 +-
drivers/usb/dwc2/platform.c | 2 +-
drivers/usb/dwc3/core.c | 4 +-
include/linux/phy/phy.h | 52 +++++++++----------
5 files changed, 32 insertions(+), 34 deletions(-)
diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c
index 6e072d681341..b04789e7a23f 100644
--- a/drivers/ata/libahci_platform.c
+++ b/drivers/ata/libahci_platform.c
@@ -371,12 +371,10 @@ static int ahci_platform_get_phy(struct ahci_host_priv *hpriv, u32 port,
rc = PTR_ERR(hpriv->phys[port]);
switch (rc) {
- case -ENOSYS:
+ case -EOPNOTSUPP:
/* No PHY support. Check if PHY is required. */
if (of_property_present(node, "phys")) {
- dev_err(dev,
- "couldn't get PHY in node %pOFn: ENOSYS\n",
- node);
+ dev_err(dev, "Node %pOFn: PHY not supported\n", node);
break;
}
fallthrough;
diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
index 30c0c0b41d5a..8e26cd772482 100644
--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
+++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
@@ -1360,7 +1360,7 @@ analogix_dp_probe(struct device *dev, struct analogix_dp_plat_data *plat_data)
* phy itself is not enabled, so we can move forward
* assigning NULL to phy pointer.
*/
- if (ret == -ENOSYS || ret == -ENODEV)
+ if (ret == -EOPNOTSUPP || ret == -ENODEV)
dp->phy = NULL;
else
return ERR_PTR(ret);
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index ef0d73077034..62b663ef1504 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -243,7 +243,7 @@ static int dwc2_lowlevel_hw_init(struct dwc2_hsotg *hsotg)
ret = PTR_ERR(hsotg->phy);
switch (ret) {
case -ENODEV:
- case -ENOSYS:
+ case -EOPNOTSUPP:
hsotg->phy = NULL;
break;
default:
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index fd5c2cd36c59..6d253810c71f 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1588,7 +1588,7 @@ static int dwc3_core_get_phy(struct dwc3 *dwc)
dwc->usb2_generic_phy[i] = devm_phy_get(dev, phy_name);
if (IS_ERR(dwc->usb2_generic_phy[i])) {
ret = PTR_ERR(dwc->usb2_generic_phy[i]);
- if (ret == -ENOSYS || ret == -ENODEV)
+ if (ret == -EOPNOTSUPP || ret == -ENODEV)
dwc->usb2_generic_phy[i] = NULL;
else
return dev_err_probe(dev, ret, "failed to lookup phy %s\n",
@@ -1605,7 +1605,7 @@ static int dwc3_core_get_phy(struct dwc3 *dwc)
dwc->usb3_generic_phy[i] = devm_phy_get(dev, phy_name);
if (IS_ERR(dwc->usb3_generic_phy[i])) {
ret = PTR_ERR(dwc->usb3_generic_phy[i]);
- if (ret == -ENOSYS || ret == -ENODEV)
+ if (ret == -EOPNOTSUPP || ret == -ENODEV)
dwc->usb3_generic_phy[i] = NULL;
else
return dev_err_probe(dev, ret, "failed to lookup phy %s\n",
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
index ea47975e288a..3e84b54a4b03 100644
--- a/include/linux/phy/phy.h
+++ b/include/linux/phy/phy.h
@@ -314,14 +314,14 @@ static inline int phy_pm_runtime_get(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_pm_runtime_get_sync(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline void phy_pm_runtime_put(struct phy *phy)
@@ -332,35 +332,35 @@ static inline int phy_pm_runtime_put_sync(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_init(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_exit(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_power_on(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_power_off(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
@@ -368,7 +368,7 @@ static inline int phy_set_mode_ext(struct phy *phy, enum phy_mode mode,
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
#define phy_set_mode(phy, mode) \
@@ -397,35 +397,35 @@ static inline int phy_reset(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_calibrate(struct phy *phy)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_notify_connect(struct phy *phy, int index)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_notify_disconnect(struct phy *phy, int index)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_notify_state(struct phy *phy, union phy_notify state)
{
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_configure(struct phy *phy,
@@ -434,7 +434,7 @@ static inline int phy_configure(struct phy *phy,
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
@@ -443,12 +443,12 @@ static inline int phy_validate(struct phy *phy, enum phy_mode mode, int submode,
if (!phy)
return 0;
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline int phy_get_bus_width(struct phy *phy)
{
- return -ENOSYS;
+ return -EOPNOTSUPP;
}
static inline void phy_set_bus_width(struct phy *phy, int bus_width)
@@ -458,12 +458,12 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width)
static inline struct phy *phy_get(struct device *dev, const char *string)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *devm_phy_get(struct device *dev, const char *string)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *devm_phy_optional_get(struct device *dev,
@@ -476,7 +476,7 @@ static inline struct phy *devm_of_phy_get(struct device *dev,
struct device_node *np,
const char *con_id)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *devm_of_phy_optional_get(struct device *dev,
@@ -490,7 +490,7 @@ static inline struct phy *devm_of_phy_get_by_index(struct device *dev,
struct device_node *np,
int index)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline void of_phy_put(struct phy *phy)
@@ -507,27 +507,27 @@ static inline void devm_phy_put(struct device *dev, struct phy *phy)
static inline struct phy *of_phy_get(struct device_node *np, const char *con_id)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *of_phy_simple_xlate(struct device *dev,
const struct of_phandle_args *args)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *phy_create(struct device *dev,
struct device_node *node,
const struct phy_ops *ops)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy *devm_phy_create(struct device *dev,
struct device_node *node,
const struct phy_ops *ops)
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline void phy_destroy(struct phy *phy)
@@ -543,7 +543,7 @@ static inline struct phy_provider *__of_phy_provider_register(
struct phy * (*of_xlate)(struct device *dev,
const struct of_phandle_args *args))
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline struct phy_provider *__devm_of_phy_provider_register(struct device
@@ -551,7 +551,7 @@ static inline struct phy_provider *__devm_of_phy_provider_register(struct device
struct phy * (*of_xlate)(struct device *dev,
const struct of_phandle_args *args))
{
- return ERR_PTR(-ENOSYS);
+ return ERR_PTR(-EOPNOTSUPP);
}
static inline void of_phy_provider_unregister(struct phy_provider *phy_provider)
--
2.55.0
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] phy: core: Use EOPNOTSUPP for disabled blob return value
2026-09-29 8:47 [PATCH] phy: core: Use EOPNOTSUPP for disabled blob return value Inochi Amaoto
@ 2026-09-29 13:30 ` Damien Le Moal
0 siblings, 0 replies; 2+ messages in thread
From: Damien Le Moal @ 2026-09-29 13:30 UTC (permalink / raw)
To: Inochi Amaoto, Hans de Goede, Niklas Cassel, Andrzej Hajda,
Neil Armstrong, Robert Foss, Laurent Pinchart, Jonas Karlman,
Jernej Skrabec, Luca Ceresoli, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter,
Minas Harutyunyan, Greg Kroah-Hartman, Thinh Nguyen, Vinod Koul,
Manivannan Sadhasivam, Damon Ding, Dmitry Baryshkov,
Heiko Stuebner
Cc: linux-ide, linux-kernel, dri-devel, linux-usb, linux-phy,
Yixun Lan, Longbin Li
On 2026/09/29 10:47, Inochi Amaoto wrote:
> Currently, the phy subsystem uses ENOSYS for dummy blob functions,
> it does not reflect the function state correctly. As kernel already
s/function state/hardware capability ?
s/As kernel/As the kernel
> has EOPNOTSUPP for disabled blob function, replace ENOSYS with
What is "blob function" ? Are you talking about all the phy_xxx() functions?
> EOPNOTSUPP for a clear return value. Also adapt the return value
> changed in the following affect file:
s/affect/affected
> - ata/libahci_platform.c
> - drm/bridge/analogix/analogix_dp_core.c
> - usb/dwc2/platform.c
> - usb/dwc3/core.c
>
> Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
The ata bits looks OK, but this still feels like a lot of churn for no
functional change since the error is an internal one that is not exposed to the
user, as far as I can tell. The code in many places also uses -ENODEV, so the
error returned does not seem to be consistent anyway.
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-29 13:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-29 8:47 [PATCH] phy: core: Use EOPNOTSUPP for disabled blob return value Inochi Amaoto
2026-09-29 13:30 ` Damien Le Moal
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®