Re: [PATCH v3 02/11] net: dwc_eth_qos: Add StarFive ethernet driver glue layer

2023-04-30 Thread Ramon Fried
On Fri, Apr 28, 2023 at 5:25 AM Yanhong Wang
 wrote:
>
> The StarFive ETHQOS hardware has its own clock and reset,so add a
> corresponding glue driver to configure them.
>
> Signed-off-by: Yanhong Wang 
> ---
>  drivers/net/Kconfig|   7 +
>  drivers/net/Makefile   |   1 +
>  drivers/net/dwc_eth_qos.c  |   6 +
>  drivers/net/dwc_eth_qos.h  |   1 +
>  drivers/net/dwc_eth_qos_starfive.c | 249 +
>  5 files changed, 264 insertions(+)
>  create mode 100644 drivers/net/dwc_eth_qos_starfive.c
>
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index 09039a283e..5540f0ea18 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -249,6 +249,13 @@ config DWC_ETH_QOS_QCOM
>   The Synopsys Designware Ethernet QOS IP block with specific
>   configuration used in Qcom QCS404 SoC.
>
> +config DWC_ETH_QOS_STARFIVE
> +   bool "Synopsys DWC Ethernet QOS device support for STARFIVE"
> +   depends on DWC_ETH_QOS
> +   help
> + The Synopsys Designware Ethernet QOS IP block with specific
> + configuration used in STARFIVE  JH7110 soc.
> +
>  config E1000
> bool "Intel PRO/1000 Gigabit Ethernet support"
> depends on PCI
> diff --git a/drivers/net/Makefile b/drivers/net/Makefile
> index 46a40e2ed9..d4af253b6f 100644
> --- a/drivers/net/Makefile
> +++ b/drivers/net/Makefile
> @@ -21,6 +21,7 @@ obj-$(CONFIG_DSA_SANDBOX) += dsa_sandbox.o
>  obj-$(CONFIG_DWC_ETH_QOS) += dwc_eth_qos.o
>  obj-$(CONFIG_DWC_ETH_QOS_IMX) += dwc_eth_qos_imx.o
>  obj-$(CONFIG_DWC_ETH_QOS_QCOM) += dwc_eth_qos_qcom.o
> +obj-$(CONFIG_DWC_ETH_QOS_STARFIVE) += dwc_eth_qos_starfive.o
>  obj-$(CONFIG_E1000) += e1000.o
>  obj-$(CONFIG_E1000_SPI) += e1000_spi.o
>  obj-$(CONFIG_EEPRO100) += eepro100.o
> diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
> index ec58697b31..8060a4e782 100644
> --- a/drivers/net/dwc_eth_qos.c
> +++ b/drivers/net/dwc_eth_qos.c
> @@ -1713,6 +1713,12 @@ static const struct udevice_id eqos_ids[] = {
> .data = (ulong)&eqos_qcom_config
> },
>  #endif
> +#if IS_ENABLED(CONFIG_DWC_ETH_QOS_STARFIVE)
> +   {
> +   .compatible = "starfive,jh7110-dwmac",
> +   .data = (ulong)&eqos_jh7110_config
> +   },
> +#endif
>
> { }
>  };
> diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h
> index fddbe9336c..a6b719af80 100644
> --- a/drivers/net/dwc_eth_qos.h
> +++ b/drivers/net/dwc_eth_qos.h
> @@ -289,3 +289,4 @@ int eqos_null_ops(struct udevice *dev);
>
>  extern struct eqos_config eqos_imx_config;
>  extern struct eqos_config eqos_qcom_config;
> +extern struct eqos_config eqos_jh7110_config;
> diff --git a/drivers/net/dwc_eth_qos_starfive.c 
> b/drivers/net/dwc_eth_qos_starfive.c
> new file mode 100644
> index 00..5be8ac0f1a
> --- /dev/null
> +++ b/drivers/net/dwc_eth_qos_starfive.c
> @@ -0,0 +1,249 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright (C) 2023 StarFive Technology Co., Ltd.
> + * Author: Yanhong Wang
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#include "dwc_eth_qos.h"
> +
> +#define STARFIVE_DWMAC_PHY_INFT_RGMII  0x1
> +#define STARFIVE_DWMAC_PHY_INFT_RMII   0x4
> +#define STARFIVE_DWMAC_PHY_INFT_FIELD  0x7U
> +
> +struct starfive_platform_data {
> +   struct regmap *regmap;
> +   struct reset_ctl_bulk resets;
> +   struct clk_bulk clks;
> +   phy_interface_t interface;
> +   u32 offset;
> +   u32 shift;
> +   bool tx_use_rgmii_clk;
> +};
> +
> +static int eqos_interface_init_jh7110(struct udevice *dev)
> +{
> +   struct eth_pdata *pdata = dev_get_plat(dev);
> +   struct starfive_platform_data *data = pdata->priv_pdata;
> +   struct ofnode_phandle_args args;
> +   unsigned int mode;
> +   int ret;
> +
> +   switch (data->interface) {
> +   case PHY_INTERFACE_MODE_RMII:
> +   mode = STARFIVE_DWMAC_PHY_INFT_RMII;
> +   break;
> +
> +   case PHY_INTERFACE_MODE_RGMII:
> +   case PHY_INTERFACE_MODE_RGMII_ID:
> +   mode = STARFIVE_DWMAC_PHY_INFT_RGMII;
> +   break;
> +
> +   default:
> +   return -EINVAL;
> +   }
> +
> +   ret = dev_read_phandle_with_args(dev, "starfive,syscon", NULL,
> +2, 0, &args);
> +   if (ret)
> +   return ret;
> +
> +   if (args.args_count != 2)
> +   return -EINVAL;
> +
> +   data->offset = args.args[0];
> +   data->shift = args.args[1];
> +   data->regmap = syscon_regmap_lookup_by_phandle(dev, 
> "starfive,syscon");
> +   if (IS_ERR(data->regmap)) {
> +   ret = PTR_ERR(data->regmap);
> +   pr_err("Failed to get regmap: %d\n", ret);
> +   return ret;
> +   }
> +
> +   return regmap_update_bit

[PATCH v3 02/11] net: dwc_eth_qos: Add StarFive ethernet driver glue layer

2023-04-27 Thread Yanhong Wang
The StarFive ETHQOS hardware has its own clock and reset,so add a
corresponding glue driver to configure them.

Signed-off-by: Yanhong Wang 
---
 drivers/net/Kconfig|   7 +
 drivers/net/Makefile   |   1 +
 drivers/net/dwc_eth_qos.c  |   6 +
 drivers/net/dwc_eth_qos.h  |   1 +
 drivers/net/dwc_eth_qos_starfive.c | 249 +
 5 files changed, 264 insertions(+)
 create mode 100644 drivers/net/dwc_eth_qos_starfive.c

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 09039a283e..5540f0ea18 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -249,6 +249,13 @@ config DWC_ETH_QOS_QCOM
  The Synopsys Designware Ethernet QOS IP block with specific
  configuration used in Qcom QCS404 SoC.
 
+config DWC_ETH_QOS_STARFIVE
+   bool "Synopsys DWC Ethernet QOS device support for STARFIVE"
+   depends on DWC_ETH_QOS
+   help
+ The Synopsys Designware Ethernet QOS IP block with specific
+ configuration used in STARFIVE  JH7110 soc.
+
 config E1000
bool "Intel PRO/1000 Gigabit Ethernet support"
depends on PCI
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 46a40e2ed9..d4af253b6f 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_DSA_SANDBOX) += dsa_sandbox.o
 obj-$(CONFIG_DWC_ETH_QOS) += dwc_eth_qos.o
 obj-$(CONFIG_DWC_ETH_QOS_IMX) += dwc_eth_qos_imx.o
 obj-$(CONFIG_DWC_ETH_QOS_QCOM) += dwc_eth_qos_qcom.o
+obj-$(CONFIG_DWC_ETH_QOS_STARFIVE) += dwc_eth_qos_starfive.o
 obj-$(CONFIG_E1000) += e1000.o
 obj-$(CONFIG_E1000_SPI) += e1000_spi.o
 obj-$(CONFIG_EEPRO100) += eepro100.o
diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
index ec58697b31..8060a4e782 100644
--- a/drivers/net/dwc_eth_qos.c
+++ b/drivers/net/dwc_eth_qos.c
@@ -1713,6 +1713,12 @@ static const struct udevice_id eqos_ids[] = {
.data = (ulong)&eqos_qcom_config
},
 #endif
+#if IS_ENABLED(CONFIG_DWC_ETH_QOS_STARFIVE)
+   {
+   .compatible = "starfive,jh7110-dwmac",
+   .data = (ulong)&eqos_jh7110_config
+   },
+#endif
 
{ }
 };
diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h
index fddbe9336c..a6b719af80 100644
--- a/drivers/net/dwc_eth_qos.h
+++ b/drivers/net/dwc_eth_qos.h
@@ -289,3 +289,4 @@ int eqos_null_ops(struct udevice *dev);
 
 extern struct eqos_config eqos_imx_config;
 extern struct eqos_config eqos_qcom_config;
+extern struct eqos_config eqos_jh7110_config;
diff --git a/drivers/net/dwc_eth_qos_starfive.c 
b/drivers/net/dwc_eth_qos_starfive.c
new file mode 100644
index 00..5be8ac0f1a
--- /dev/null
+++ b/drivers/net/dwc_eth_qos_starfive.c
@@ -0,0 +1,249 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Copyright (C) 2023 StarFive Technology Co., Ltd.
+ * Author: Yanhong Wang
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "dwc_eth_qos.h"
+
+#define STARFIVE_DWMAC_PHY_INFT_RGMII  0x1
+#define STARFIVE_DWMAC_PHY_INFT_RMII   0x4
+#define STARFIVE_DWMAC_PHY_INFT_FIELD  0x7U
+
+struct starfive_platform_data {
+   struct regmap *regmap;
+   struct reset_ctl_bulk resets;
+   struct clk_bulk clks;
+   phy_interface_t interface;
+   u32 offset;
+   u32 shift;
+   bool tx_use_rgmii_clk;
+};
+
+static int eqos_interface_init_jh7110(struct udevice *dev)
+{
+   struct eth_pdata *pdata = dev_get_plat(dev);
+   struct starfive_platform_data *data = pdata->priv_pdata;
+   struct ofnode_phandle_args args;
+   unsigned int mode;
+   int ret;
+
+   switch (data->interface) {
+   case PHY_INTERFACE_MODE_RMII:
+   mode = STARFIVE_DWMAC_PHY_INFT_RMII;
+   break;
+
+   case PHY_INTERFACE_MODE_RGMII:
+   case PHY_INTERFACE_MODE_RGMII_ID:
+   mode = STARFIVE_DWMAC_PHY_INFT_RGMII;
+   break;
+
+   default:
+   return -EINVAL;
+   }
+
+   ret = dev_read_phandle_with_args(dev, "starfive,syscon", NULL,
+2, 0, &args);
+   if (ret)
+   return ret;
+
+   if (args.args_count != 2)
+   return -EINVAL;
+
+   data->offset = args.args[0];
+   data->shift = args.args[1];
+   data->regmap = syscon_regmap_lookup_by_phandle(dev, "starfive,syscon");
+   if (IS_ERR(data->regmap)) {
+   ret = PTR_ERR(data->regmap);
+   pr_err("Failed to get regmap: %d\n", ret);
+   return ret;
+   }
+
+   return regmap_update_bits(data->regmap, data->offset,
+ STARFIVE_DWMAC_PHY_INFT_FIELD << data->shift,
+ mode << data->shift);
+}
+
+static int eqos_set_tx_clk_speed_jh7110(struct udevice *dev)
+{
+   struct eqos_priv *eqos = dev_get_priv(dev);
+   struct eth_pdata *pdata = dev_get_plat(dev);
+