]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: macb: Add "mobileye,eyeq5-gem" compatible
authorThéo Lebrun <theo.lebrun@bootlin.com>
Thu, 23 Oct 2025 16:22:55 +0000 (18:22 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 28 Oct 2025 14:17:54 +0000 (15:17 +0100)
Add support for the two GEM instances inside Mobileye EyeQ5 SoCs, using
compatible "mobileye,eyeq5-gem". With it, add a custom init sequence
that must grab a generic PHY and initialise it.

We use bp->phy in both RGMII and SGMII cases. Tell our mode by adding a
phy_set_mode_ext() during macb_open(), before phy_power_on(). We are
the first users of bp->phy that use it in non-SGMII cases.

The phy_set_mode_ext() call is made unconditionally. It cannot cause
issues on platforms where !bp->phy or !bp->phy->ops->set_mode as, in
those cases, the call is a no-op (returning zero). From reading
upstream DTS, we can figure out that no platform has a bp->phy and a
PHY driver that has a .set_mode() implementation:
 - cdns,zynqmp-gem: no DTS upstream.
 - microchip,mpfs-macb: microchip/mpfs.dtsi, &mac0..1, no PHY attached.
 - xlnx,versal-gem: xilinx/versal-net.dtsi, &gem0..1, no PHY attached.
 - xlnx,zynqmp-gem: xilinx/zynqmp.dtsi, &gem0..3, PHY attached to
   drivers/phy/xilinx/phy-zynqmp.c which has no .set_mode().

Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Signed-off-by: Théo Lebrun <theo.lebrun@bootlin.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20251023-macb-eyeq5-v3-5-af509422c204@bootlin.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/cadence/macb_main.c

index 44188e7eee5699ea5f010a40c7087e226004b540..b1ed98d9c43805a4f01c3facd802763ed19474b8 100644 (file)
@@ -2965,6 +2965,10 @@ static int macb_open(struct net_device *dev)
 
        macb_init_hw(bp);
 
+       err = phy_set_mode_ext(bp->phy, PHY_MODE_ETHERNET, bp->phy_interface);
+       if (err)
+               goto reset_hw;
+
        err = phy_power_on(bp->phy);
        if (err)
                goto reset_hw;
@@ -5189,6 +5193,28 @@ err_out_phy_exit:
        return ret;
 }
 
+static int eyeq5_init(struct platform_device *pdev)
+{
+       struct net_device *netdev = platform_get_drvdata(pdev);
+       struct macb *bp = netdev_priv(netdev);
+       struct device *dev = &pdev->dev;
+       int ret;
+
+       bp->phy = devm_phy_get(dev, NULL);
+       if (IS_ERR(bp->phy))
+               return dev_err_probe(dev, PTR_ERR(bp->phy),
+                                    "failed to get PHY\n");
+
+       ret = phy_init(bp->phy);
+       if (ret)
+               return dev_err_probe(dev, ret, "failed to init PHY\n");
+
+       ret = macb_init(pdev);
+       if (ret)
+               phy_exit(bp->phy);
+       return ret;
+}
+
 static const struct macb_usrio_config sama7g5_usrio = {
        .mii = 0,
        .rmii = 1,
@@ -5343,6 +5369,17 @@ static const struct macb_config versal_config = {
        .usrio = &macb_default_usrio,
 };
 
+static const struct macb_config eyeq5_config = {
+       .caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE | MACB_CAPS_JUMBO |
+               MACB_CAPS_GEM_HAS_PTP | MACB_CAPS_QUEUE_DISABLE |
+               MACB_CAPS_NO_LSO,
+       .dma_burst_length = 16,
+       .clk_init = macb_clk_init,
+       .init = eyeq5_init,
+       .jumbo_max_len = 10240,
+       .usrio = &macb_default_usrio,
+};
+
 static const struct macb_config raspberrypi_rp1_config = {
        .caps = MACB_CAPS_GIGABIT_MODE_AVAILABLE | MACB_CAPS_CLK_HW_CHG |
                MACB_CAPS_JUMBO |
@@ -5374,6 +5411,7 @@ static const struct of_device_id macb_dt_ids[] = {
        { .compatible = "microchip,mpfs-macb", .data = &mpfs_config },
        { .compatible = "microchip,sama7g5-gem", .data = &sama7g5_gem_config },
        { .compatible = "microchip,sama7g5-emac", .data = &sama7g5_emac_config },
+       { .compatible = "mobileye,eyeq5-gem", .data = &eyeq5_config },
        { .compatible = "raspberrypi,rp1-gem", .data = &raspberrypi_rp1_config },
        { .compatible = "xlnx,zynqmp-gem", .data = &zynqmp_config},
        { .compatible = "xlnx,zynq-gem", .data = &zynq_config },