Re: [PATCH v4 1/2] phy: Add new PHY attribute max_link_rate and APIs to get/set PHY attributes

From: Laurent Pinchart
Date: Mon Aug 10 2020 - 20:20:42 EST


Hi Swapnil,

Thank you for the patch.

On Fri, Jul 17, 2020 at 08:50:32AM +0200, Swapnil Jakhade wrote:
> Add new PHY attribute max_link_rate to struct phy_attrs.
> Add a pair of PHY APIs to get/set all the PHY attributes.
> Use phy_get_attrs() to get attribute values and phy_set_attrs()
> to set attribute values.
>
> Signed-off-by: Yuti Amonkar <yamonkar@xxxxxxxxxxx>
> Signed-off-by: Swapnil Jakhade <sjakhade@xxxxxxxxxxx>
> ---
> include/linux/phy/phy.h | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
> index bcee8eba62b3..5d8ebb056c1d 100644
> --- a/include/linux/phy/phy.h
> +++ b/include/linux/phy/phy.h
> @@ -115,10 +115,12 @@ struct phy_ops {
> /**
> * struct phy_attrs - represents phy attributes
> * @bus_width: Data path width implemented by PHY
> + * @max_link_rate: Maximum link rate supported by PHY (in Mbps)
> * @mode: PHY mode
> */
> struct phy_attrs {
> u32 bus_width;
> + u32 max_link_rate;
> enum phy_mode mode;
> };
>
> @@ -231,6 +233,20 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> {
> phy->attrs.bus_width = bus_width;
> }
> +
> +static inline void phy_get_attrs(struct phy *phy, struct phy_attrs *attrs)
> +{
> + mutex_lock(&phy->mutex);
> + memcpy(attrs, &phy->attrs, sizeof(struct phy_attrs));
> + mutex_unlock(&phy->mutex);
> +}
> +
> +static inline void phy_set_attrs(struct phy *phy, struct phy_attrs attrs)

Passing the second argument by (const) pointer would be more efficient.

> +{
> + mutex_lock(&phy->mutex);
> + memcpy(&phy->attrs, &attrs, sizeof(struct phy_attrs));
> + mutex_unlock(&phy->mutex);
> +}

These two functions should be documented. I'm a but puzzled by the need
to protect the data with phy->mutex. Isn't phy->attrs static,
initialized at driver probe time, and then never changed ? If so I think
we can just access it directly, both in the PHY provider and consumer.

If the data can change at runtime, then the documentation of these
functions need to explain what can change, and when.

> struct phy *phy_get(struct device *dev, const char *string);
> struct phy *phy_optional_get(struct device *dev, const char *string);
> struct phy *devm_phy_get(struct device *dev, const char *string);
> @@ -389,6 +405,16 @@ static inline void phy_set_bus_width(struct phy *phy, int bus_width)
> return;
> }
>
> +static inline void phy_get_attrs(struct phy *phy, struct phy_attrs *attrs)
> +{
> + return;
> +}
> +
> +static inline void phy_set_attrs(struct phy *phy, struct phy_attrs attrs)
> +{
> + return;
> +}
> +
> static inline struct phy *phy_get(struct device *dev, const char *string)
> {
> return ERR_PTR(-ENOSYS);

--
Regards,

Laurent Pinchart