mbox series

[net-next,RFC,v2,00/11] net: phy: Support DT PHY package

Message ID 20231125001127.5674-1-ansuelsmth@gmail.com (mailing list archive)
Headers show
Series net: phy: Support DT PHY package | expand

Message

Christian Marangi Nov. 25, 2023, 12:11 a.m. UTC
Idea of this big series is to introduce the concept of PHY package in DT
and generalize the support of it by PHY driver.

The concept of PHY package is nothing new and is already a thing in the
kernel with the API phy_package_join/leave/read/write.

The main idea of those API is to permit the PHY to have a shared global
data and to run probe/config only once for the PHY package. There are
various example of this already in the kernel with the mscc, bcm54140
mediatek ge and micrle driver and they all follow the same pattern.

What is currently lacking is describing this in DT and better reference
the PHY in charge of global configuration of the PHY package. For the
already present PHY, the implementation is simple enough with only one
PHY having the required regs to apply global configuration.

This can be ok for simple PHY package but some Qcom PHY package on
""modern"" SoC have more complex implementation. One example is the PHY
for qca807x where some global regs are present in the so-called "combo"
port and everything about psgmii calibration is placed in a 5th port in
the PHY package.

Given these additional thing, the original phy_package API are extended
with support for multiple global PHY for configuration. Each PHY driver
will have an enum of the ID for the global PHY to reference and is
required to pass to the read/write function.

On top of this, it's added correct DT support for describing PHY
package.

One example is this:

        ethernet-phy-package@0 {
            #address-cells = <1>;
            #size-cells = <0>;

            reg = <0>;

            ethernet-phy@1 {
              compatible = "ethernet-phy-ieee802.3-c22";
              reg = <1>;
            };

            phy4: ethernet-phy@4 {
              compatible = "ethernet-phy-ieee802.3-c22";
              reg = <4>;
            };
        };

The mdio parse functions are changed to address for this additional
special node, the function is changed to simply detect this node and
search also in this.

If this is detected phy core will join each PHY present in the node and
use (if defined) the additional info in the PHY driver to probe/config
once the PHY package.

I hope this implementation is clean enough as I expect more and more of
these configuration to appear in the future.

(For Andrew, we are looking intro making this in at803x PHY driver and see
what functions can be reused, idea is to move the driver to a dedicated
directory and create something like at803x-common.c as the at803x PHY
driver is too bloated and splitting it it's a better approach)

Changes v2:
- Drop compatible "ethernet-phy-package", use node name prefix matching
  instead
- Improve DT example
- Add reg for ethernet-phy-package
- Drop phy-mode for ethernet-phy-package
- Drop patch for generalization of phy-mode
- Drop global-phy property (handle internally to the PHY driver)
- Rework OF phy package code and PHY driver to handle base address
- Fix missing of_node_put
- Add some missing docs for added variables in struct
- Move some define from dt-bindings include to PHY driver
- Handle qsgmii validation in PHY driver
- Fix wrong include for gpiolib
- Drop reduntant version.h include

Christian Marangi (9):
  net: phy: extend PHY package API to support multiple global address
  dt-bindings: net: document ethernet PHY package nodes
  net: phy: add initial support for PHY package in DT
  net: phy: add support for shared priv data size for PHY package in DT
  net: phy: add support for driver specific PHY package probe/config
  net: phy: move mmd_phy_indirect to generic header
  net: phy: add support for PHY package MMD read/write
  dt-bindings: net: Document Qcom QCA807x PHY package
  net: phy: qca807x: Add support for configurable LED

Robert Marko (2):
  dt-bindings: net: add QCA807x PHY defines
  net: phy: add Qualcom QCA807x driver

 .../bindings/net/ethernet-phy-package.yaml    |   66 +
 .../devicetree/bindings/net/qcom,qca807x.yaml |  148 ++
 drivers/net/mdio/of_mdio.c                    |   68 +-
 drivers/net/phy/Kconfig                       |    7 +
 drivers/net/phy/Makefile                      |    1 +
 drivers/net/phy/bcm54140.c                    |   23 +-
 drivers/net/phy/mdio_bus.c                    |   35 +-
 drivers/net/phy/mediatek-ge-soc.c             |   11 +-
 drivers/net/phy/micrel.c                      |   13 +-
 drivers/net/phy/mscc/mscc.h                   |    7 +
 drivers/net/phy/mscc/mscc_main.c              |   16 +-
 drivers/net/phy/phy-core.c                    |   14 -
 drivers/net/phy/phy_device.c                  |  165 +-
 drivers/net/phy/qca807x.c                     | 1324 +++++++++++++++++
 include/dt-bindings/net/qcom-qca807x.h        |   30 +
 include/linux/phy.h                           |  170 ++-
 16 files changed, 1996 insertions(+), 102 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/ethernet-phy-package.yaml
 create mode 100644 Documentation/devicetree/bindings/net/qcom,qca807x.yaml
 create mode 100644 drivers/net/phy/qca807x.c
 create mode 100644 include/dt-bindings/net/qcom-qca807x.h

Comments

Christian Marangi Nov. 25, 2023, 1:50 p.m. UTC | #1
On Sat, Nov 25, 2023 at 06:28:06PM +0100, Andrew Lunn wrote:
> > One example is this:
> > 
> >         ethernet-phy-package@0 {
> >             #address-cells = <1>;
> >             #size-cells = <0>;
> 
> Please extend this example with a compatible, and include a property
> which is global.
>

Hi, don't know if you notice the changelog, I now check with the node
name prefix instead of using compatible ethernet-phy-package. (some
requested and didn't like using it) (easy to reintroduce, was just a
small proposal/idea)

Also in theory the compatible for specific PHY package can also be
skipped. (we can use the select way and match for PHY id. Can also be
introduced easily but shouldn't that be checked in some way? Or it's ok
to have a compatible that will only be used for documentation?)

> > (For Andrew, we are looking intro making this in at803x PHY driver and see
> > what functions can be reused, idea is to move the driver to a dedicated
> > directory and create something like at803x-common.c as the at803x PHY
> > driver is too bloated and splitting it it's a better approach)
> 
> This sounds good.
> 

Thanks, also for Russell, I forgot to include the PHY mode in the
qca807x commit, will include that once I will move the code to the
shared implementation with at803x. (sorry)
Andrew Lunn Nov. 25, 2023, 5:28 p.m. UTC | #2
> One example is this:
> 
>         ethernet-phy-package@0 {
>             #address-cells = <1>;
>             #size-cells = <0>;

Please extend this example with a compatible, and include a property
which is global.

> (For Andrew, we are looking intro making this in at803x PHY driver and see
> what functions can be reused, idea is to move the driver to a dedicated
> directory and create something like at803x-common.c as the at803x PHY
> driver is too bloated and splitting it it's a better approach)

This sounds good.

     Andrew