net: stmmac: dwmac-qcom-ethqos: prepare the driver for more PHY modes
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 19 Jun 2023 09:23:58 +0000 (11:23 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 Jun 2023 03:44:38 +0000 (20:44 -0700)
In preparation for supporting SGMII, let's make the code a bit more
generic. Add a new callback for MAC configuration so that we can assign
a different variant of it in the future.

Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
Reviewed-by: Andrew Halaney <ahalaney@redhat.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c

index a739e1d5c046a2dd7b9642295869fadc19d9ac98..0ececc951528efaef00190344e3d3fed279c26ee 100644 (file)
@@ -92,11 +92,13 @@ struct ethqos_emac_driver_data {
 struct qcom_ethqos {
        struct platform_device *pdev;
        void __iomem *rgmii_base;
+       int (*configure_func)(struct qcom_ethqos *ethqos);
 
        unsigned int link_clk_rate;
        struct clk *link_clk;
        struct phy *serdes_phy;
        unsigned int speed;
+       int phy_mode;
 
        const struct ethqos_emac_por *por;
        unsigned int num_por;
@@ -331,13 +333,11 @@ static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
 {
        struct device *dev = &ethqos->pdev->dev;
        int phase_shift;
-       int phy_mode;
        int loopback;
 
        /* Determine if the PHY adds a 2 ns TX delay or the MAC handles it */
-       phy_mode = device_get_phy_mode(dev);
-       if (phy_mode == PHY_INTERFACE_MODE_RGMII_ID ||
-           phy_mode == PHY_INTERFACE_MODE_RGMII_TXID)
+       if (ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_ID ||
+           ethqos->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID)
                phase_shift = 0;
        else
                phase_shift = RGMII_CONFIG2_TX_CLK_PHASE_SHIFT_EN;
@@ -483,7 +483,7 @@ static int ethqos_rgmii_macro_init(struct qcom_ethqos *ethqos)
        return 0;
 }
 
-static int ethqos_configure(struct qcom_ethqos *ethqos)
+static int ethqos_configure_rgmii(struct qcom_ethqos *ethqos)
 {
        struct device *dev = &ethqos->pdev->dev;
        volatile unsigned int dll_lock;
@@ -559,6 +559,11 @@ static int ethqos_configure(struct qcom_ethqos *ethqos)
        return 0;
 }
 
+static int ethqos_configure(struct qcom_ethqos *ethqos)
+{
+       return ethqos->configure_func(ethqos);
+}
+
 static void ethqos_fix_mac_speed(void *priv, unsigned int speed)
 {
        struct qcom_ethqos *ethqos = priv;
@@ -650,6 +655,22 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
                goto out_config_dt;
        }
 
+       ethqos->phy_mode = device_get_phy_mode(dev);
+       switch (ethqos->phy_mode) {
+       case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+               ethqos->configure_func = ethqos_configure_rgmii;
+               break;
+       case -ENODEV:
+               ret = -ENODEV;
+               goto out_config_dt;
+       default:
+               ret = -EINVAL;
+               goto out_config_dt;
+       }
+
        ethqos->pdev = pdev;
        ethqos->rgmii_base = devm_platform_ioremap_resource_byname(pdev, "rgmii");
        if (IS_ERR(ethqos->rgmii_base)) {