From: "Markus Schneider-Pargmann" <msp@baylibre.com>
To: "Vladimir Oltean" <vladimir.oltean@nxp.com>,
<linux-phy@lists.infradead.org>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
<dri-devel@lists.freedesktop.org>,
<freedreno@lists.freedesktop.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>, <linux-can@vger.kernel.org>,
<linux-gpio@vger.kernel.org>, <linux-ide@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-media@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-renesas-soc@vger.kernel.org>,
<linux-riscv@lists.infradead.org>,
<linux-rockchip@lists.infradead.org>,
<linux-samsung-soc@vger.kernel.org>,
<linux-sunxi@lists.linux.dev>, <linux-tegra@vger.kernel.org>,
<linux-usb@vger.kernel.org>, <netdev@vger.kernel.org>,
<spacemit@lists.linux.dev>, <UNGLinuxDriver@microchip.com>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Marc Kleine-Budde" <mkl@pengutronix.de>,
"Vincent Mailhol" <mailhol@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Markus Schneider-Pargmann" <msp@baylibre.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Magnus Damm" <magnus.damm@gmail.com>
Subject: Re: [PATCH phy-next 13/22] phy: introduce phy_get_max_link_rate() helper for consumers
Date: Thu, 05 Mar 2026 10:36:14 +0100 [thread overview]
Message-ID: <DGUQWFYCPRQZ.17SO07GXW2DYA@baylibre.com> (raw)
In-Reply-To: <20260304175735.2660419-14-vladimir.oltean@nxp.com>
[-- Attachment #1: Type: text/plain, Size: 7905 bytes --]
Hi,
On Wed Mar 4, 2026 at 6:57 PM CET, Vladimir Oltean wrote:
> Consumer drivers shouldn't dereference struct phy, not even to get to
> its attributes.
>
> We have phy_get_bus_width() as a precedent for getting the bus_width
> attribute, so let's add phy_get_max_link_rate() and use it in DRM and
> CAN drivers.
>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> ---
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Robert Foss <rfoss@kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Simona Vetter <simona@ffwll.ch>
> Cc: Andy Yan <andy.yan@rock-chips.com>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: Vincent Mailhol <mailhol@kernel.org>
> Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
> Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
> Cc: Markus Schneider-Pargmann <msp@baylibre.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Magnus Damm <magnus.damm@gmail.com>
> ---
> drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 4 ++--
> drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 +-
> drivers/net/can/at91_can.c | 2 +-
> drivers/net/can/flexcan/flexcan-core.c | 2 +-
> drivers/net/can/m_can/m_can_platform.c | 2 +-
> drivers/net/can/rcar/rcar_canfd.c | 2 +-
> drivers/phy/phy-core.c | 6 ++++++
> include/linux/phy/phy.h | 6 ++++++
> 8 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> index a8b6ae58cb0a..ed7ed82ddb64 100644
> --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> @@ -1300,7 +1300,7 @@ static u32 cdns_mhdp_get_training_interval_us(struct cdns_mhdp_device *mhdp,
>
> static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> {
> - unsigned int link_rate;
> + u32 link_rate;
>
> /* Get source capabilities based on PHY attributes */
>
> @@ -1308,7 +1308,7 @@ static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> if (!mhdp->host.lanes_cnt)
> mhdp->host.lanes_cnt = 4;
>
> - link_rate = mhdp->phy->attrs.max_link_rate;
> + link_rate = phy_get_max_link_rate(mhdp->phy);
> if (!link_rate)
> link_rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_8_1);
> else
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> index 4ab6922dd79c..79c72ee8e263 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> @@ -536,7 +536,7 @@ static int dw_dp_link_parse(struct dw_dp *dp, struct drm_connector *connector)
>
> link->revision = link->dpcd[DP_DPCD_REV];
> link->rate = min_t(u32, min(dp->plat_data.max_link_rate,
> - dp->phy->attrs.max_link_rate * 100),
> + phy_get_max_link_rate(dp->phy) * 100),
> drm_dp_max_link_rate(link->dpcd));
> link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
> drm_dp_max_lane_count(link->dpcd));
> diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
> index 58da323f14d7..b56db253f02d 100644
> --- a/drivers/net/can/at91_can.c
> +++ b/drivers/net/can/at91_can.c
> @@ -1126,7 +1126,7 @@ static int at91_can_probe(struct platform_device *pdev)
> can_rx_offload_add_timestamp(dev, &priv->offload);
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (at91_is_sam9263(priv))
> dev->sysfs_groups[0] = &at91_sysfs_attr_group;
> diff --git a/drivers/net/can/flexcan/flexcan-core.c b/drivers/net/can/flexcan/flexcan-core.c
> index f5d22c61503f..3a4307bc1d61 100644
> --- a/drivers/net/can/flexcan/flexcan-core.c
> +++ b/drivers/net/can/flexcan/flexcan-core.c
> @@ -2211,7 +2211,7 @@ static int flexcan_probe(struct platform_device *pdev)
> priv->transceiver = transceiver;
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) {
> priv->irq_boff = platform_get_irq(pdev, 1);
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 56da411878af..73525be6566b 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -132,7 +132,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> }
>
> if (transceiver)
> - mcan_class->can.bitrate_max = transceiver->attrs.max_link_rate;
> + mcan_class->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> priv->base = addr;
> priv->mram_base = mram_addr;
> diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
> index eaf8cac78038..645d5671705d 100644
> --- a/drivers/net/can/rcar/rcar_canfd.c
> +++ b/drivers/net/can/rcar/rcar_canfd.c
> @@ -1885,7 +1885,7 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
> priv->channel = ch;
> priv->gpriv = gpriv;
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
> priv->can.clock.freq = fcan_freq;
> dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq);
>
> diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
> index a1aff00fba7c..89f7410241aa 100644
> --- a/drivers/phy/phy-core.c
> +++ b/drivers/phy/phy-core.c
> @@ -640,6 +640,12 @@ void phy_set_bus_width(struct phy *phy, int bus_width)
> }
> EXPORT_SYMBOL_GPL(phy_set_bus_width);
>
> +u32 phy_get_max_link_rate(struct phy *phy)
> +{
All of the can drivers that would use this function are checking phy
before assigning the max_link_rate:
if (transceiver)
priv->can.bitrate_max = transceiver->attrs.max_link_rate;
Would it be reasonable to have
if (!phy)
return 0;
in this function to be able to drop these individual checks of the
drivers? This would be similar to clk_get_rate() which does the same
check and return 0 for convenience.
Best
Markus
> + return phy->attrs.max_link_rate;
> +}
> +EXPORT_SYMBOL_GPL(phy_get_max_link_rate);
> +
> /**
> * _of_phy_get() - lookup and obtain a reference to a phy by phandle
> * @np: device_node for which to get the phy
> diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
> index 36307e47760d..af9c3e795786 100644
> --- a/include/linux/phy/phy.h
> +++ b/include/linux/phy/phy.h
> @@ -57,6 +57,7 @@ int phy_notify_disconnect(struct phy *phy, int port);
> int phy_notify_state(struct phy *phy, union phy_notify state);
> int phy_get_bus_width(struct phy *phy);
> void phy_set_bus_width(struct phy *phy, int bus_width);
> +u32 phy_get_max_link_rate(struct phy *phy);
> #else
> static inline struct phy *phy_get(struct device *dev, const char *string)
> {
> @@ -256,6 +257,11 @@ static inline int phy_get_bus_width(struct phy *phy)
> static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> {
> }
> +
> +static inline u32 phy_get_max_link_rate(struct phy *phy)
> +{
> + return 0;
> +}
> #endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */
>
> #endif /* __PHY_CONSUMER_H */
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: "Markus Schneider-Pargmann" <msp@baylibre.com>
To: "Vladimir Oltean" <vladimir.oltean@nxp.com>,
<linux-phy@lists.infradead.org>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
<dri-devel@lists.freedesktop.org>,
<freedreno@lists.freedesktop.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>, <linux-can@vger.kernel.org>,
<linux-gpio@vger.kernel.org>, <linux-ide@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-media@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-renesas-soc@vger.kernel.org>,
<linux-riscv@lists.infradead.org>,
<linux-rockchip@lists.infradead.org>,
<linux-samsung-soc@vger.kernel.org>,
<linux-sunxi@lists.linux.dev>, <linux-tegra@vger.kernel.org>,
<linux-usb@vger.kernel.org>, <netdev@vger.kernel.org>,
<spacemit@lists.linux.dev>, <UNGLinuxDriver@microchip.com>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Marc Kleine-Budde" <mkl@pengutronix.de>,
"Vincent Mailhol" <mailhol@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Markus Schneider-Pargmann" <msp@baylibre.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Magnus Damm" <magnus.damm@gmail.com>
Subject: Re: [PATCH phy-next 13/22] phy: introduce phy_get_max_link_rate() helper for consumers
Date: Thu, 05 Mar 2026 10:36:14 +0100 [thread overview]
Message-ID: <DGUQWFYCPRQZ.17SO07GXW2DYA@baylibre.com> (raw)
In-Reply-To: <20260304175735.2660419-14-vladimir.oltean@nxp.com>
[-- Attachment #1.1: Type: text/plain, Size: 7905 bytes --]
Hi,
On Wed Mar 4, 2026 at 6:57 PM CET, Vladimir Oltean wrote:
> Consumer drivers shouldn't dereference struct phy, not even to get to
> its attributes.
>
> We have phy_get_bus_width() as a precedent for getting the bus_width
> attribute, so let's add phy_get_max_link_rate() and use it in DRM and
> CAN drivers.
>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> ---
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Robert Foss <rfoss@kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Simona Vetter <simona@ffwll.ch>
> Cc: Andy Yan <andy.yan@rock-chips.com>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: Vincent Mailhol <mailhol@kernel.org>
> Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
> Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
> Cc: Markus Schneider-Pargmann <msp@baylibre.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Magnus Damm <magnus.damm@gmail.com>
> ---
> drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 4 ++--
> drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 +-
> drivers/net/can/at91_can.c | 2 +-
> drivers/net/can/flexcan/flexcan-core.c | 2 +-
> drivers/net/can/m_can/m_can_platform.c | 2 +-
> drivers/net/can/rcar/rcar_canfd.c | 2 +-
> drivers/phy/phy-core.c | 6 ++++++
> include/linux/phy/phy.h | 6 ++++++
> 8 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> index a8b6ae58cb0a..ed7ed82ddb64 100644
> --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> @@ -1300,7 +1300,7 @@ static u32 cdns_mhdp_get_training_interval_us(struct cdns_mhdp_device *mhdp,
>
> static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> {
> - unsigned int link_rate;
> + u32 link_rate;
>
> /* Get source capabilities based on PHY attributes */
>
> @@ -1308,7 +1308,7 @@ static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> if (!mhdp->host.lanes_cnt)
> mhdp->host.lanes_cnt = 4;
>
> - link_rate = mhdp->phy->attrs.max_link_rate;
> + link_rate = phy_get_max_link_rate(mhdp->phy);
> if (!link_rate)
> link_rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_8_1);
> else
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> index 4ab6922dd79c..79c72ee8e263 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> @@ -536,7 +536,7 @@ static int dw_dp_link_parse(struct dw_dp *dp, struct drm_connector *connector)
>
> link->revision = link->dpcd[DP_DPCD_REV];
> link->rate = min_t(u32, min(dp->plat_data.max_link_rate,
> - dp->phy->attrs.max_link_rate * 100),
> + phy_get_max_link_rate(dp->phy) * 100),
> drm_dp_max_link_rate(link->dpcd));
> link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
> drm_dp_max_lane_count(link->dpcd));
> diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
> index 58da323f14d7..b56db253f02d 100644
> --- a/drivers/net/can/at91_can.c
> +++ b/drivers/net/can/at91_can.c
> @@ -1126,7 +1126,7 @@ static int at91_can_probe(struct platform_device *pdev)
> can_rx_offload_add_timestamp(dev, &priv->offload);
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (at91_is_sam9263(priv))
> dev->sysfs_groups[0] = &at91_sysfs_attr_group;
> diff --git a/drivers/net/can/flexcan/flexcan-core.c b/drivers/net/can/flexcan/flexcan-core.c
> index f5d22c61503f..3a4307bc1d61 100644
> --- a/drivers/net/can/flexcan/flexcan-core.c
> +++ b/drivers/net/can/flexcan/flexcan-core.c
> @@ -2211,7 +2211,7 @@ static int flexcan_probe(struct platform_device *pdev)
> priv->transceiver = transceiver;
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) {
> priv->irq_boff = platform_get_irq(pdev, 1);
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 56da411878af..73525be6566b 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -132,7 +132,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> }
>
> if (transceiver)
> - mcan_class->can.bitrate_max = transceiver->attrs.max_link_rate;
> + mcan_class->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> priv->base = addr;
> priv->mram_base = mram_addr;
> diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
> index eaf8cac78038..645d5671705d 100644
> --- a/drivers/net/can/rcar/rcar_canfd.c
> +++ b/drivers/net/can/rcar/rcar_canfd.c
> @@ -1885,7 +1885,7 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
> priv->channel = ch;
> priv->gpriv = gpriv;
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
> priv->can.clock.freq = fcan_freq;
> dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq);
>
> diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
> index a1aff00fba7c..89f7410241aa 100644
> --- a/drivers/phy/phy-core.c
> +++ b/drivers/phy/phy-core.c
> @@ -640,6 +640,12 @@ void phy_set_bus_width(struct phy *phy, int bus_width)
> }
> EXPORT_SYMBOL_GPL(phy_set_bus_width);
>
> +u32 phy_get_max_link_rate(struct phy *phy)
> +{
All of the can drivers that would use this function are checking phy
before assigning the max_link_rate:
if (transceiver)
priv->can.bitrate_max = transceiver->attrs.max_link_rate;
Would it be reasonable to have
if (!phy)
return 0;
in this function to be able to drop these individual checks of the
drivers? This would be similar to clk_get_rate() which does the same
check and return 0 for convenience.
Best
Markus
> + return phy->attrs.max_link_rate;
> +}
> +EXPORT_SYMBOL_GPL(phy_get_max_link_rate);
> +
> /**
> * _of_phy_get() - lookup and obtain a reference to a phy by phandle
> * @np: device_node for which to get the phy
> diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
> index 36307e47760d..af9c3e795786 100644
> --- a/include/linux/phy/phy.h
> +++ b/include/linux/phy/phy.h
> @@ -57,6 +57,7 @@ int phy_notify_disconnect(struct phy *phy, int port);
> int phy_notify_state(struct phy *phy, union phy_notify state);
> int phy_get_bus_width(struct phy *phy);
> void phy_set_bus_width(struct phy *phy, int bus_width);
> +u32 phy_get_max_link_rate(struct phy *phy);
> #else
> static inline struct phy *phy_get(struct device *dev, const char *string)
> {
> @@ -256,6 +257,11 @@ static inline int phy_get_bus_width(struct phy *phy)
> static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> {
> }
> +
> +static inline u32 phy_get_max_link_rate(struct phy *phy)
> +{
> + return 0;
> +}
> #endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */
>
> #endif /* __PHY_CONSUMER_H */
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]
[-- Attachment #2: Type: text/plain, Size: 112 bytes --]
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
WARNING: multiple messages have this Message-ID (diff)
From: "Markus Schneider-Pargmann" <msp@baylibre.com>
To: "Vladimir Oltean" <vladimir.oltean@nxp.com>,
<linux-phy@lists.infradead.org>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
<dri-devel@lists.freedesktop.org>,
<freedreno@lists.freedesktop.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>, <linux-can@vger.kernel.org>,
<linux-gpio@vger.kernel.org>, <linux-ide@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-media@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-renesas-soc@vger.kernel.org>,
<linux-riscv@lists.infradead.org>,
<linux-rockchip@lists.infradead.org>,
<linux-samsung-soc@vger.kernel.org>,
<linux-sunxi@lists.linux.dev>, <linux-tegra@vger.kernel.org>,
<linux-usb@vger.kernel.org>, <netdev@vger.kernel.org>,
<spacemit@lists.linux.dev>, <UNGLinuxDriver@microchip.com>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Marc Kleine-Budde" <mkl@pengutronix.de>,
"Vincent Mailhol" <mailhol@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Markus Schneider-Pargmann" <msp@baylibre.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Magnus Damm" <magnus.damm@gmail.com>
Subject: Re: [PATCH phy-next 13/22] phy: introduce phy_get_max_link_rate() helper for consumers
Date: Thu, 05 Mar 2026 10:36:14 +0100 [thread overview]
Message-ID: <DGUQWFYCPRQZ.17SO07GXW2DYA@baylibre.com> (raw)
In-Reply-To: <20260304175735.2660419-14-vladimir.oltean@nxp.com>
[-- Attachment #1.1: Type: text/plain, Size: 7905 bytes --]
Hi,
On Wed Mar 4, 2026 at 6:57 PM CET, Vladimir Oltean wrote:
> Consumer drivers shouldn't dereference struct phy, not even to get to
> its attributes.
>
> We have phy_get_bus_width() as a precedent for getting the bus_width
> attribute, so let's add phy_get_max_link_rate() and use it in DRM and
> CAN drivers.
>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> ---
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Robert Foss <rfoss@kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Simona Vetter <simona@ffwll.ch>
> Cc: Andy Yan <andy.yan@rock-chips.com>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: Vincent Mailhol <mailhol@kernel.org>
> Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
> Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
> Cc: Markus Schneider-Pargmann <msp@baylibre.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Magnus Damm <magnus.damm@gmail.com>
> ---
> drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 4 ++--
> drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 +-
> drivers/net/can/at91_can.c | 2 +-
> drivers/net/can/flexcan/flexcan-core.c | 2 +-
> drivers/net/can/m_can/m_can_platform.c | 2 +-
> drivers/net/can/rcar/rcar_canfd.c | 2 +-
> drivers/phy/phy-core.c | 6 ++++++
> include/linux/phy/phy.h | 6 ++++++
> 8 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> index a8b6ae58cb0a..ed7ed82ddb64 100644
> --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> @@ -1300,7 +1300,7 @@ static u32 cdns_mhdp_get_training_interval_us(struct cdns_mhdp_device *mhdp,
>
> static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> {
> - unsigned int link_rate;
> + u32 link_rate;
>
> /* Get source capabilities based on PHY attributes */
>
> @@ -1308,7 +1308,7 @@ static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> if (!mhdp->host.lanes_cnt)
> mhdp->host.lanes_cnt = 4;
>
> - link_rate = mhdp->phy->attrs.max_link_rate;
> + link_rate = phy_get_max_link_rate(mhdp->phy);
> if (!link_rate)
> link_rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_8_1);
> else
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> index 4ab6922dd79c..79c72ee8e263 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> @@ -536,7 +536,7 @@ static int dw_dp_link_parse(struct dw_dp *dp, struct drm_connector *connector)
>
> link->revision = link->dpcd[DP_DPCD_REV];
> link->rate = min_t(u32, min(dp->plat_data.max_link_rate,
> - dp->phy->attrs.max_link_rate * 100),
> + phy_get_max_link_rate(dp->phy) * 100),
> drm_dp_max_link_rate(link->dpcd));
> link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
> drm_dp_max_lane_count(link->dpcd));
> diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
> index 58da323f14d7..b56db253f02d 100644
> --- a/drivers/net/can/at91_can.c
> +++ b/drivers/net/can/at91_can.c
> @@ -1126,7 +1126,7 @@ static int at91_can_probe(struct platform_device *pdev)
> can_rx_offload_add_timestamp(dev, &priv->offload);
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (at91_is_sam9263(priv))
> dev->sysfs_groups[0] = &at91_sysfs_attr_group;
> diff --git a/drivers/net/can/flexcan/flexcan-core.c b/drivers/net/can/flexcan/flexcan-core.c
> index f5d22c61503f..3a4307bc1d61 100644
> --- a/drivers/net/can/flexcan/flexcan-core.c
> +++ b/drivers/net/can/flexcan/flexcan-core.c
> @@ -2211,7 +2211,7 @@ static int flexcan_probe(struct platform_device *pdev)
> priv->transceiver = transceiver;
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) {
> priv->irq_boff = platform_get_irq(pdev, 1);
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 56da411878af..73525be6566b 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -132,7 +132,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> }
>
> if (transceiver)
> - mcan_class->can.bitrate_max = transceiver->attrs.max_link_rate;
> + mcan_class->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> priv->base = addr;
> priv->mram_base = mram_addr;
> diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
> index eaf8cac78038..645d5671705d 100644
> --- a/drivers/net/can/rcar/rcar_canfd.c
> +++ b/drivers/net/can/rcar/rcar_canfd.c
> @@ -1885,7 +1885,7 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
> priv->channel = ch;
> priv->gpriv = gpriv;
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
> priv->can.clock.freq = fcan_freq;
> dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq);
>
> diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
> index a1aff00fba7c..89f7410241aa 100644
> --- a/drivers/phy/phy-core.c
> +++ b/drivers/phy/phy-core.c
> @@ -640,6 +640,12 @@ void phy_set_bus_width(struct phy *phy, int bus_width)
> }
> EXPORT_SYMBOL_GPL(phy_set_bus_width);
>
> +u32 phy_get_max_link_rate(struct phy *phy)
> +{
All of the can drivers that would use this function are checking phy
before assigning the max_link_rate:
if (transceiver)
priv->can.bitrate_max = transceiver->attrs.max_link_rate;
Would it be reasonable to have
if (!phy)
return 0;
in this function to be able to drop these individual checks of the
drivers? This would be similar to clk_get_rate() which does the same
check and return 0 for convenience.
Best
Markus
> + return phy->attrs.max_link_rate;
> +}
> +EXPORT_SYMBOL_GPL(phy_get_max_link_rate);
> +
> /**
> * _of_phy_get() - lookup and obtain a reference to a phy by phandle
> * @np: device_node for which to get the phy
> diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
> index 36307e47760d..af9c3e795786 100644
> --- a/include/linux/phy/phy.h
> +++ b/include/linux/phy/phy.h
> @@ -57,6 +57,7 @@ int phy_notify_disconnect(struct phy *phy, int port);
> int phy_notify_state(struct phy *phy, union phy_notify state);
> int phy_get_bus_width(struct phy *phy);
> void phy_set_bus_width(struct phy *phy, int bus_width);
> +u32 phy_get_max_link_rate(struct phy *phy);
> #else
> static inline struct phy *phy_get(struct device *dev, const char *string)
> {
> @@ -256,6 +257,11 @@ static inline int phy_get_bus_width(struct phy *phy)
> static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> {
> }
> +
> +static inline u32 phy_get_max_link_rate(struct phy *phy)
> +{
> + return 0;
> +}
> #endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */
>
> #endif /* __PHY_CONSUMER_H */
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]
[-- Attachment #2: Type: text/plain, Size: 170 bytes --]
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
WARNING: multiple messages have this Message-ID (diff)
From: "Markus Schneider-Pargmann" <msp@baylibre.com>
To: "Vladimir Oltean" <vladimir.oltean@nxp.com>,
<linux-phy@lists.infradead.org>
Cc: "Vinod Koul" <vkoul@kernel.org>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
<dri-devel@lists.freedesktop.org>,
<freedreno@lists.freedesktop.org>,
<linux-arm-kernel@lists.infradead.org>,
<linux-arm-msm@vger.kernel.org>, <linux-can@vger.kernel.org>,
<linux-gpio@vger.kernel.org>, <linux-ide@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-media@vger.kernel.org>,
<linux-pci@vger.kernel.org>, <linux-renesas-soc@vger.kernel.org>,
<linux-riscv@lists.infradead.org>,
<linux-rockchip@lists.infradead.org>,
<linux-samsung-soc@vger.kernel.org>,
<linux-sunxi@lists.linux.dev>, <linux-tegra@vger.kernel.org>,
<linux-usb@vger.kernel.org>, <netdev@vger.kernel.org>,
<spacemit@lists.linux.dev>, <UNGLinuxDriver@microchip.com>,
"Andrzej Hajda" <andrzej.hajda@intel.com>,
"Robert Foss" <rfoss@kernel.org>,
"Laurent Pinchart" <Laurent.pinchart@ideasonboard.com>,
"Jonas Karlman" <jonas@kwiboo.se>,
"Jernej Skrabec" <jernej.skrabec@gmail.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Andy Yan" <andy.yan@rock-chips.com>,
"Marc Kleine-Budde" <mkl@pengutronix.de>,
"Vincent Mailhol" <mailhol@kernel.org>,
"Nicolas Ferre" <nicolas.ferre@microchip.com>,
"Alexandre Belloni" <alexandre.belloni@bootlin.com>,
"Claudiu Beznea" <claudiu.beznea@tuxon.dev>,
"Markus Schneider-Pargmann" <msp@baylibre.com>,
"Geert Uytterhoeven" <geert+renesas@glider.be>,
"Magnus Damm" <magnus.damm@gmail.com>
Subject: Re: [PATCH phy-next 13/22] phy: introduce phy_get_max_link_rate() helper for consumers
Date: Thu, 05 Mar 2026 10:36:14 +0100 [thread overview]
Message-ID: <DGUQWFYCPRQZ.17SO07GXW2DYA@baylibre.com> (raw)
In-Reply-To: <20260304175735.2660419-14-vladimir.oltean@nxp.com>
[-- Attachment #1.1: Type: text/plain, Size: 7905 bytes --]
Hi,
On Wed Mar 4, 2026 at 6:57 PM CET, Vladimir Oltean wrote:
> Consumer drivers shouldn't dereference struct phy, not even to get to
> its attributes.
>
> We have phy_get_bus_width() as a precedent for getting the bus_width
> attribute, so let's add phy_get_max_link_rate() and use it in DRM and
> CAN drivers.
>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
> ---
> Cc: Andrzej Hajda <andrzej.hajda@intel.com>
> Cc: Neil Armstrong <neil.armstrong@linaro.org>
> Cc: Robert Foss <rfoss@kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart@ideasonboard.com>
> Cc: Jonas Karlman <jonas@kwiboo.se>
> Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
> Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> Cc: Maxime Ripard <mripard@kernel.org>
> Cc: Thomas Zimmermann <tzimmermann@suse.de>
> Cc: David Airlie <airlied@gmail.com>
> Cc: Simona Vetter <simona@ffwll.ch>
> Cc: Andy Yan <andy.yan@rock-chips.com>
> Cc: Marc Kleine-Budde <mkl@pengutronix.de>
> Cc: Vincent Mailhol <mailhol@kernel.org>
> Cc: Nicolas Ferre <nicolas.ferre@microchip.com>
> Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Cc: Claudiu Beznea <claudiu.beznea@tuxon.dev>
> Cc: Markus Schneider-Pargmann <msp@baylibre.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Magnus Damm <magnus.damm@gmail.com>
> ---
> drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 4 ++--
> drivers/gpu/drm/bridge/synopsys/dw-dp.c | 2 +-
> drivers/net/can/at91_can.c | 2 +-
> drivers/net/can/flexcan/flexcan-core.c | 2 +-
> drivers/net/can/m_can/m_can_platform.c | 2 +-
> drivers/net/can/rcar/rcar_canfd.c | 2 +-
> drivers/phy/phy-core.c | 6 ++++++
> include/linux/phy/phy.h | 6 ++++++
> 8 files changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> index a8b6ae58cb0a..ed7ed82ddb64 100644
> --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
> @@ -1300,7 +1300,7 @@ static u32 cdns_mhdp_get_training_interval_us(struct cdns_mhdp_device *mhdp,
>
> static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> {
> - unsigned int link_rate;
> + u32 link_rate;
>
> /* Get source capabilities based on PHY attributes */
>
> @@ -1308,7 +1308,7 @@ static void cdns_mhdp_fill_host_caps(struct cdns_mhdp_device *mhdp)
> if (!mhdp->host.lanes_cnt)
> mhdp->host.lanes_cnt = 4;
>
> - link_rate = mhdp->phy->attrs.max_link_rate;
> + link_rate = phy_get_max_link_rate(mhdp->phy);
> if (!link_rate)
> link_rate = drm_dp_bw_code_to_link_rate(DP_LINK_BW_8_1);
> else
> diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> index 4ab6922dd79c..79c72ee8e263 100644
> --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c
> @@ -536,7 +536,7 @@ static int dw_dp_link_parse(struct dw_dp *dp, struct drm_connector *connector)
>
> link->revision = link->dpcd[DP_DPCD_REV];
> link->rate = min_t(u32, min(dp->plat_data.max_link_rate,
> - dp->phy->attrs.max_link_rate * 100),
> + phy_get_max_link_rate(dp->phy) * 100),
> drm_dp_max_link_rate(link->dpcd));
> link->lanes = min_t(u8, phy_get_bus_width(dp->phy),
> drm_dp_max_lane_count(link->dpcd));
> diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c
> index 58da323f14d7..b56db253f02d 100644
> --- a/drivers/net/can/at91_can.c
> +++ b/drivers/net/can/at91_can.c
> @@ -1126,7 +1126,7 @@ static int at91_can_probe(struct platform_device *pdev)
> can_rx_offload_add_timestamp(dev, &priv->offload);
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (at91_is_sam9263(priv))
> dev->sysfs_groups[0] = &at91_sysfs_attr_group;
> diff --git a/drivers/net/can/flexcan/flexcan-core.c b/drivers/net/can/flexcan/flexcan-core.c
> index f5d22c61503f..3a4307bc1d61 100644
> --- a/drivers/net/can/flexcan/flexcan-core.c
> +++ b/drivers/net/can/flexcan/flexcan-core.c
> @@ -2211,7 +2211,7 @@ static int flexcan_probe(struct platform_device *pdev)
> priv->transceiver = transceiver;
>
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> if (priv->devtype_data.quirks & FLEXCAN_QUIRK_NR_IRQ_3) {
> priv->irq_boff = platform_get_irq(pdev, 1);
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 56da411878af..73525be6566b 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -132,7 +132,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
> }
>
> if (transceiver)
> - mcan_class->can.bitrate_max = transceiver->attrs.max_link_rate;
> + mcan_class->can.bitrate_max = phy_get_max_link_rate(transceiver);
>
> priv->base = addr;
> priv->mram_base = mram_addr;
> diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c
> index eaf8cac78038..645d5671705d 100644
> --- a/drivers/net/can/rcar/rcar_canfd.c
> +++ b/drivers/net/can/rcar/rcar_canfd.c
> @@ -1885,7 +1885,7 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
> priv->channel = ch;
> priv->gpriv = gpriv;
> if (transceiver)
> - priv->can.bitrate_max = transceiver->attrs.max_link_rate;
> + priv->can.bitrate_max = phy_get_max_link_rate(transceiver);
> priv->can.clock.freq = fcan_freq;
> dev_info(dev, "can_clk rate is %u\n", priv->can.clock.freq);
>
> diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
> index a1aff00fba7c..89f7410241aa 100644
> --- a/drivers/phy/phy-core.c
> +++ b/drivers/phy/phy-core.c
> @@ -640,6 +640,12 @@ void phy_set_bus_width(struct phy *phy, int bus_width)
> }
> EXPORT_SYMBOL_GPL(phy_set_bus_width);
>
> +u32 phy_get_max_link_rate(struct phy *phy)
> +{
All of the can drivers that would use this function are checking phy
before assigning the max_link_rate:
if (transceiver)
priv->can.bitrate_max = transceiver->attrs.max_link_rate;
Would it be reasonable to have
if (!phy)
return 0;
in this function to be able to drop these individual checks of the
drivers? This would be similar to clk_get_rate() which does the same
check and return 0 for convenience.
Best
Markus
> + return phy->attrs.max_link_rate;
> +}
> +EXPORT_SYMBOL_GPL(phy_get_max_link_rate);
> +
> /**
> * _of_phy_get() - lookup and obtain a reference to a phy by phandle
> * @np: device_node for which to get the phy
> diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
> index 36307e47760d..af9c3e795786 100644
> --- a/include/linux/phy/phy.h
> +++ b/include/linux/phy/phy.h
> @@ -57,6 +57,7 @@ int phy_notify_disconnect(struct phy *phy, int port);
> int phy_notify_state(struct phy *phy, union phy_notify state);
> int phy_get_bus_width(struct phy *phy);
> void phy_set_bus_width(struct phy *phy, int bus_width);
> +u32 phy_get_max_link_rate(struct phy *phy);
> #else
> static inline struct phy *phy_get(struct device *dev, const char *string)
> {
> @@ -256,6 +257,11 @@ static inline int phy_get_bus_width(struct phy *phy)
> static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> {
> }
> +
> +static inline u32 phy_get_max_link_rate(struct phy *phy)
> +{
> + return 0;
> +}
> #endif /* IS_ENABLED(CONFIG_GENERIC_PHY) */
>
> #endif /* __PHY_CONSUMER_H */
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]
[-- Attachment #2: Type: text/plain, Size: 161 bytes --]
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2026-03-05 9:36 UTC|newest]
Thread overview: 260+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-04 17:57 [PATCH phy-next 00/22] Split Generic PHY consumer and provider API Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 01/22] ata: add <linux/pm_runtime.h> where missing Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 20:14 ` Damien Le Moal
2026-03-04 20:14 ` Damien Le Moal
2026-03-04 20:14 ` Damien Le Moal
2026-03-04 20:14 ` Damien Le Moal
2026-03-04 17:57 ` [PATCH phy-next 02/22] PCI: add missing headers transitively included by <linux/phy/phy.h> Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 22:24 ` Bjorn Helgaas
2026-03-04 22:24 ` Bjorn Helgaas
2026-03-04 22:24 ` Bjorn Helgaas
2026-03-04 22:24 ` Bjorn Helgaas
2026-03-04 22:34 ` Vladimir Oltean
2026-03-04 22:34 ` Vladimir Oltean
2026-03-04 22:34 ` Vladimir Oltean
2026-03-04 22:34 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 03/22] usb: " Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 2:43 ` Thinh Nguyen
2026-03-05 2:43 ` Thinh Nguyen
2026-03-05 2:43 ` Thinh Nguyen
2026-03-05 2:43 ` Thinh Nguyen
2026-03-04 17:57 ` [PATCH phy-next 04/22] drm: add <linux/pm_runtime.h> where missing Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 05/22] phy: " Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 7:45 ` Geert Uytterhoeven
2026-03-05 7:45 ` Geert Uytterhoeven
2026-03-05 7:45 ` Geert Uytterhoeven
2026-03-05 7:45 ` Geert Uytterhoeven
2026-03-05 10:02 ` André Draszik
2026-03-05 10:02 ` André Draszik
2026-03-05 10:02 ` André Draszik
2026-03-05 10:02 ` André Draszik
2026-03-04 17:57 ` [PATCH phy-next 06/22] phy: spacemit: include missing <linux/phy/phy.h> Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 07/22] net: lan969x: include missing <linux/of.h> Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-06 9:56 ` Daniel Machon
2026-03-06 9:56 ` Daniel Machon
2026-03-06 9:56 ` Daniel Machon
2026-03-06 9:56 ` Daniel Machon
2026-03-04 17:57 ` [PATCH phy-next 08/22] PCI: remove device links to PHY Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 22:28 ` Bjorn Helgaas
2026-03-04 22:28 ` Bjorn Helgaas
2026-03-04 22:28 ` Bjorn Helgaas
2026-03-04 22:28 ` Bjorn Helgaas
2026-03-04 17:57 ` [PATCH phy-next 09/22] ufs: exynos: stop poking into struct phy guts Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 10/22] drm/rockchip: dw_hdmi: avoid direct dereference of phy->dev.of_node Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 11/22] drm/msm/dp: remove debugging prints with internal struct phy state Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 23:53 ` Dmitry Baryshkov
2026-03-04 23:53 ` Dmitry Baryshkov
2026-03-04 23:53 ` Dmitry Baryshkov
2026-03-04 23:53 ` Dmitry Baryshkov
2026-03-04 17:57 ` [PATCH phy-next 12/22] phy: move provider API out of public <linux/phy/phy.h> Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 23:54 ` Dmitry Baryshkov
2026-03-04 23:54 ` Dmitry Baryshkov
2026-03-04 23:54 ` Dmitry Baryshkov
2026-03-04 23:54 ` Dmitry Baryshkov
2026-03-05 8:28 ` Geert Uytterhoeven
2026-03-05 8:28 ` Geert Uytterhoeven
2026-03-05 8:28 ` Geert Uytterhoeven
2026-03-05 8:28 ` Geert Uytterhoeven
2026-03-06 12:51 ` Vladimir Oltean
2026-03-06 12:51 ` Vladimir Oltean
2026-03-06 12:51 ` Vladimir Oltean
2026-03-06 12:51 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 13/22] phy: introduce phy_get_max_link_rate() helper for consumers Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 7:47 ` Geert Uytterhoeven
2026-03-05 7:47 ` Geert Uytterhoeven
2026-03-05 7:47 ` Geert Uytterhoeven
2026-03-05 7:47 ` Geert Uytterhoeven
2026-03-06 12:50 ` Vladimir Oltean
2026-03-06 12:50 ` Vladimir Oltean
2026-03-06 12:50 ` Vladimir Oltean
2026-03-06 12:50 ` Vladimir Oltean
2026-03-05 9:36 ` Markus Schneider-Pargmann [this message]
2026-03-05 9:36 ` Markus Schneider-Pargmann
2026-03-05 9:36 ` Markus Schneider-Pargmann
2026-03-05 9:36 ` Markus Schneider-Pargmann
2026-03-05 11:54 ` Vladimir Oltean
2026-03-05 11:54 ` Vladimir Oltean
2026-03-05 11:54 ` Vladimir Oltean
2026-03-05 11:54 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 14/22] drm/rockchip: dsi: include PHY provider header Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 15/22] drm: bridge: cdns-mhdp8546: use consumer API for getting PHY bus width Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 16/22] media: sunxi: a83-mips-csi2: include PHY provider header Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 17/22] net: renesas: rswitch: " Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 8:29 ` Geert Uytterhoeven
2026-03-05 8:29 ` Geert Uytterhoeven
2026-03-05 8:29 ` Geert Uytterhoeven
2026-03-05 8:29 ` Geert Uytterhoeven
2026-03-04 17:57 ` [PATCH phy-next 18/22] pinctrl: tegra-xusb: " Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 12:43 ` Linus Walleij
2026-03-05 12:43 ` Linus Walleij
2026-03-05 12:43 ` Linus Walleij
2026-03-05 12:43 ` Linus Walleij
2026-03-05 12:44 ` Linus Walleij
2026-03-05 12:44 ` Linus Walleij
2026-03-05 12:44 ` Linus Walleij
2026-03-05 12:44 ` Linus Walleij
2026-03-05 12:47 ` Vladimir Oltean
2026-03-05 12:47 ` Vladimir Oltean
2026-03-05 12:47 ` Vladimir Oltean
2026-03-05 12:47 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 19/22] power: supply: cpcap-charger: include missing <linux/property.h> Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 9:52 ` Sebastian Reichel
2026-03-05 9:52 ` Sebastian Reichel
2026-03-05 9:52 ` Sebastian Reichel
2026-03-05 9:52 ` Sebastian Reichel
2026-03-04 17:57 ` [PATCH phy-next 20/22] phy: include PHY provider header Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-05 3:22 ` Shawn Lin
2026-03-05 3:22 ` Shawn Lin
2026-03-05 3:22 ` Shawn Lin
2026-03-05 3:22 ` Shawn Lin
2026-03-06 13:06 ` Vladimir Oltean
2026-03-06 13:06 ` Vladimir Oltean
2026-03-06 13:06 ` Vladimir Oltean
2026-03-06 13:06 ` Vladimir Oltean
2026-03-04 17:57 ` [PATCH phy-next 21/22] phy: remove temporary provider compatibility from consumer header Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 23:56 ` Dmitry Baryshkov
2026-03-04 17:57 ` [PATCH phy-next 22/22] MAINTAINERS: add regex for linux-phy Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-04 17:57 ` Vladimir Oltean
2026-03-05 8:39 ` Konrad Dybcio
2026-03-05 8:39 ` Konrad Dybcio
2026-03-05 8:39 ` Konrad Dybcio
2026-03-05 8:39 ` Konrad Dybcio
2026-03-05 8:51 ` Vladimir Oltean
2026-03-05 8:51 ` Vladimir Oltean
2026-03-05 8:51 ` Vladimir Oltean
2026-03-05 8:51 ` Vladimir Oltean
2026-03-05 9:11 ` Konrad Dybcio
2026-03-05 9:11 ` Konrad Dybcio
2026-03-05 9:11 ` Konrad Dybcio
2026-03-05 9:11 ` Konrad Dybcio
2026-03-05 9:13 ` Vladimir Oltean
2026-03-05 9:13 ` Vladimir Oltean
2026-03-05 9:13 ` Vladimir Oltean
2026-03-05 9:13 ` Vladimir Oltean
2026-03-05 9:15 ` Konrad Dybcio
2026-03-05 9:15 ` Konrad Dybcio
2026-03-05 9:15 ` Konrad Dybcio
2026-03-05 9:15 ` Konrad Dybcio
2026-03-05 9:30 ` Joe Perches
2026-03-05 9:30 ` Joe Perches
2026-03-05 9:30 ` Joe Perches
2026-03-05 9:30 ` Joe Perches
2026-03-05 11:43 ` Vladimir Oltean
2026-03-05 11:43 ` Vladimir Oltean
2026-03-05 11:43 ` Vladimir Oltean
2026-03-05 11:43 ` Vladimir Oltean
2026-03-05 12:15 ` Krzysztof Wilczyński
2026-03-05 12:15 ` Krzysztof Wilczyński
2026-03-05 12:15 ` Krzysztof Wilczyński
2026-03-05 12:15 ` Krzysztof Wilczyński
2026-03-05 12:29 ` Krzysztof Wilczyński
2026-03-05 12:29 ` Krzysztof Wilczyński
2026-03-05 12:29 ` Krzysztof Wilczyński
2026-03-05 12:29 ` Krzysztof Wilczyński
2026-03-05 12:39 ` Vladimir Oltean
2026-03-05 12:39 ` Vladimir Oltean
2026-03-05 12:39 ` Vladimir Oltean
2026-03-05 12:39 ` Vladimir Oltean
2026-03-05 12:44 ` Russell King (Oracle)
2026-03-05 12:44 ` Russell King (Oracle)
2026-03-05 12:44 ` Russell King (Oracle)
2026-03-05 12:44 ` Russell King (Oracle)
2026-03-05 13:01 ` Krzysztof Wilczyński
2026-03-05 13:01 ` Krzysztof Wilczyński
2026-03-05 13:01 ` Krzysztof Wilczyński
2026-03-05 13:01 ` Krzysztof Wilczyński
2026-03-05 12:38 ` Vladimir Oltean
2026-03-05 12:38 ` Vladimir Oltean
2026-03-05 12:38 ` Vladimir Oltean
2026-03-05 12:38 ` Vladimir Oltean
2026-03-05 13:06 ` Krzysztof Wilczyński
2026-03-05 13:06 ` Krzysztof Wilczyński
2026-03-05 13:06 ` Krzysztof Wilczyński
2026-03-05 13:06 ` Krzysztof Wilczyński
2026-03-05 13:11 ` Vladimir Oltean
2026-03-05 13:11 ` Vladimir Oltean
2026-03-05 13:11 ` Vladimir Oltean
2026-03-05 13:11 ` Vladimir Oltean
2026-03-05 15:35 ` Joe Perches
2026-03-05 15:35 ` Joe Perches
2026-03-05 15:35 ` Joe Perches
2026-03-05 15:35 ` Joe Perches
2026-03-05 15:39 ` Vladimir Oltean
2026-03-05 15:39 ` Vladimir Oltean
2026-03-05 15:39 ` Vladimir Oltean
2026-03-05 15:39 ` Vladimir Oltean
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=DGUQWFYCPRQZ.17SO07GXW2DYA@baylibre.com \
--to=msp@baylibre.com \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=airlied@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andrzej.hajda@intel.com \
--cc=andy.yan@rock-chips.com \
--cc=claudiu.beznea@tuxon.dev \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=geert+renesas@glider.be \
--cc=jernej.skrabec@gmail.com \
--cc=jonas@kwiboo.se \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-can@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=linux-rockchip@lists.infradead.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=linux-sunxi@lists.linux.dev \
--cc=linux-tegra@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=magnus.damm@gmail.com \
--cc=mailhol@kernel.org \
--cc=mkl@pengutronix.de \
--cc=mripard@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=netdev@vger.kernel.org \
--cc=nicolas.ferre@microchip.com \
--cc=rfoss@kernel.org \
--cc=simona@ffwll.ch \
--cc=spacemit@lists.linux.dev \
--cc=tzimmermann@suse.de \
--cc=vkoul@kernel.org \
--cc=vladimir.oltean@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.