[PATCH 3/4] phy: Add .set_mode and .set_speed callbacks

Patrice CHOTARD patrice.chotard at foss.st.com
Mon Mar 20 09:44:13 CET 2023


Hi Marek

On 3/19/23 18:09, Marek Vasut wrote:
> Add two new callbacks matching the Linux ones. The .set_mode is used to set
> PHY mode and submode, where mode is either USB, Ethernet, and so on, while
> submode is e.g. for Ethernet case RGMII, RMII, and so on. The .set_speed is
> used to configure link speed into the PHY. Unlike the existing configure
> callback, which is used to pass arbitrary custom information to the PHY,
> these two callbacks are used to pass standardized set of information to
> the PHY.
> 
> Signed-off-by: Marek Vasut <marek.vasut+renesas at mailbox.org>
> ---
> Cc: Jim Liu <jim.t90615 at gmail.com>
> Cc: Neil Armstrong <neil.armstrong at linaro.org>
> Cc: Patrice Chotard <patrice.chotard at foss.st.com>
> Cc: Samuel Holland <samuel at sholland.org>
> Cc: Sumit Garg <sumit.garg at linaro.org>
> Cc: Weijie Gao <weijie.gao at mediatek.com>
> ---
>  drivers/phy/phy-uclass.c | 22 ++++++++++++
>  include/generic-phy.h    | 77 ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 99 insertions(+)
> 
> diff --git a/drivers/phy/phy-uclass.c b/drivers/phy/phy-uclass.c
> index 3fef5135a9c..83e4b63079d 100644
> --- a/drivers/phy/phy-uclass.c
> +++ b/drivers/phy/phy-uclass.c
> @@ -351,6 +351,28 @@ int generic_phy_configure(struct phy *phy, void *params)
>  	return ops->configure ? ops->configure(phy, params) : 0;
>  }
>  
> +int generic_phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
> +{
> +	struct phy_ops const *ops;
> +
> +	if (!generic_phy_valid(phy))
> +		return 0;
> +	ops = phy_dev_ops(phy->dev);
> +
> +	return ops->set_mode ? ops->set_mode(phy, mode, submode) : 0;
> +}
> +
> +int generic_phy_set_speed(struct phy *phy, int speed)
> +{
> +	struct phy_ops const *ops;
> +
> +	if (!generic_phy_valid(phy))
> +		return 0;
> +	ops = phy_dev_ops(phy->dev);
> +
> +	return ops->set_speed ? ops->set_speed(phy, speed) : 0;
> +}
> +
>  int generic_phy_get_bulk(struct udevice *dev, struct phy_bulk *bulk)
>  {
>  	int i, ret, count;
> diff --git a/include/generic-phy.h b/include/generic-phy.h
> index 8dca21b1283..bee4de8a0ba 100644
> --- a/include/generic-phy.h
> +++ b/include/generic-phy.h
> @@ -11,6 +11,29 @@
>  
>  struct ofnode_phandle_args;
>  
> +enum phy_mode {
> +	PHY_MODE_INVALID,
> +	PHY_MODE_USB_HOST,
> +	PHY_MODE_USB_HOST_LS,
> +	PHY_MODE_USB_HOST_FS,
> +	PHY_MODE_USB_HOST_HS,
> +	PHY_MODE_USB_HOST_SS,
> +	PHY_MODE_USB_DEVICE,
> +	PHY_MODE_USB_DEVICE_LS,
> +	PHY_MODE_USB_DEVICE_FS,
> +	PHY_MODE_USB_DEVICE_HS,
> +	PHY_MODE_USB_DEVICE_SS,
> +	PHY_MODE_USB_OTG,
> +	PHY_MODE_UFS_HS_A,
> +	PHY_MODE_UFS_HS_B,
> +	PHY_MODE_PCIE,
> +	PHY_MODE_ETHERNET,
> +	PHY_MODE_MIPI_DPHY,
> +	PHY_MODE_SATA,
> +	PHY_MODE_LVDS,
> +	PHY_MODE_DP
> +};
> +
>  /**
>   * struct phy - A handle to (allowing control of) a single phy port.
>   *
> @@ -136,6 +159,32 @@ struct phy_ops {
>  	 * Return: 0 if OK, or a negative error code
>  	 */
>  	int	(*configure)(struct phy *phy, void *params);
> +
> +	/**
> +	 * set_mode - set PHY device mode
> +	 *
> +	 * @phy:	PHY port to be configured
> +	 * @mode: PHY mode
> +	 * @submode: PHY submode
> +	 *
> +	 * Configure PHY mode (e.g. USB, Ethernet, ...) and submode
> +	 * (e.g. for Ethernet this can be RGMII).
> +	 *
> +	 * Return: 0 if OK, or a negative error code
> +	 */
> +	int	(*set_mode)(struct phy *phy, enum phy_mode mode, int submode);
> +
> +	/**
> +	 * set_speed - set PHY device speed
> +	 *
> +	 * @phy:	PHY port to be configured
> +	 * @speed: PHY speed
> +	 *
> +	 * Configure PHY speed (e.g. for Ethernet, this could be 10 or 100 ...).
> +	 *
> +	 * Return: 0 if OK, or a negative error code
> +	 */
> +	int	(*set_speed)(struct phy *phy, int speed);
>  };
>  
>  /**
> @@ -206,6 +255,24 @@ int generic_phy_power_off(struct phy *phy);
>   */
>  int generic_phy_configure(struct phy *phy, void *params);
>  
> +/**
> + * generic_phy_set_mode() - set PHY device mode
> + *
> + * @phy:	PHY port to be configured
> + * @mode: PHY mode
> + * @submode: PHY submode
> + * Return: 0 if OK, or a negative error code
> + */
> +int generic_phy_set_mode(struct phy *phy, enum phy_mode mode, int submode);
> +
> +/**
> + * generic_phy_set_speed() - set PHY device speed
> + *
> + * @phy:	PHY port to be configured
> + * @speed: PHY speed
> + * Return: 0 if OK, or a negative error code
> + */
> +int generic_phy_set_speed(struct phy *phy, int speed);
>  
>  /**
>   * generic_phy_get_by_index() - Get a PHY device by integer index.
> @@ -394,6 +461,16 @@ static inline int generic_phy_configure(struct phy *phy, void *params)
>  	return 0;
>  }
>  
> +static inline int generic_phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
> +{
> +	return 0;
> +}
> +
> +static inline int generic_phy_set_speed(struct phy *phy, int speed)
> +{
> +	return 0;
> +}
> +
>  static inline int generic_phy_get_by_index(struct udevice *user, int index,
>  			     struct phy *phy)
>  {
Reviewed-by: Patrice Chotard <patrice.chotard at foss.st.com>

Thanks
Patrice


More information about the U-Boot mailing list