Message ID | 20220627032455.28280-46-peng.fan@oss.nxp.com |
---|---|
State | Superseded |
Delegated to: | Stefano Babic |
Headers | show |
Series | imx: support i.MX93 | expand |
On Mon, Jun 27, 2022 at 5:44 AM Peng Fan (OSS) <peng.fan@oss.nxp.com> wrote: > > From: Peng Fan <peng.fan@nxp.com> > > Move i.MX code to a standalone file to make it easy for adding new > platform support > > Signed-off-by: Peng Fan <peng.fan@nxp.com> > --- > drivers/net/Makefile | 1 + > drivers/net/dwc_eth_qos.c | 92 -------------------------- > drivers/net/dwc_eth_qos.h | 2 + > drivers/net/dwc_eth_qos_imx.c | 121 ++++++++++++++++++++++++++++++++++ > 4 files changed, 124 insertions(+), 92 deletions(-) > create mode 100644 drivers/net/dwc_eth_qos_imx.c > > diff --git a/drivers/net/Makefile b/drivers/net/Makefile > index 69fb3bbbf7c..9536af11946 100644 > --- a/drivers/net/Makefile > +++ b/drivers/net/Makefile > @@ -19,6 +19,7 @@ obj-$(CONFIG_DM_ETH_PHY) += eth-phy-uclass.o > obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o > 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_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 b69a9feb824..1f24f5cb0cf 100644 > --- a/drivers/net/dwc_eth_qos.c > +++ b/drivers/net/dwc_eth_qos.c > @@ -506,20 +506,6 @@ static ulong eqos_get_tick_clk_rate_stm32(struct udevice *dev) > #endif > } > > -__weak u32 imx_get_eqos_csr_clk(void) > -{ > - return 100 * 1000000; > -} > -__weak int imx_eqos_txclk_set_rate(unsigned long rate) > -{ > - return 0; > -} > - > -static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) > -{ > - return imx_get_eqos_csr_clk(); > -} > - > static int eqos_set_full_duplex(struct udevice *dev) > { > struct eqos_priv *eqos = dev_get_priv(dev); > @@ -616,38 +602,6 @@ static int eqos_set_tx_clk_speed_tegra186(struct udevice *dev) > return 0; > } > > -static int eqos_set_tx_clk_speed_imx(struct udevice *dev) > -{ > - struct eqos_priv *eqos = dev_get_priv(dev); > - ulong rate; > - int ret; > - > - debug("%s(dev=%p):\n", __func__, dev); > - > - switch (eqos->phy->speed) { > - case SPEED_1000: > - rate = 125 * 1000 * 1000; > - break; > - case SPEED_100: > - rate = 25 * 1000 * 1000; > - break; > - case SPEED_10: > - rate = 2.5 * 1000 * 1000; > - break; > - default: > - pr_err("invalid speed %d", eqos->phy->speed); > - return -EINVAL; > - } > - > - ret = imx_eqos_txclk_set_rate(rate); > - if (ret < 0) { > - pr_err("imx (tx_clk, %lu) failed: %d", rate, ret); > - return ret; > - } > - > - return 0; > -} > - > static int eqos_adjust_link(struct udevice *dev) > { > struct eqos_priv *eqos = dev_get_priv(dev); > @@ -1468,24 +1422,6 @@ static phy_interface_t eqos_get_interface_tegra186(const struct udevice *dev) > return PHY_INTERFACE_MODE_MII; > } > > -static int eqos_probe_resources_imx(struct udevice *dev) > -{ > - struct eqos_priv *eqos = dev_get_priv(dev); > - phy_interface_t interface; > - > - debug("%s(dev=%p):\n", __func__, dev); > - > - interface = eqos->config->interface(dev); > - > - if (interface == PHY_INTERFACE_MODE_NA) { > - pr_err("Invalid PHY interface\n"); > - return -EINVAL; > - } > - > - debug("%s: OK\n", __func__); > - return 0; > -} > - > static int eqos_remove_resources_tegra186(struct udevice *dev) > { > struct eqos_priv *eqos = dev_get_priv(dev); > @@ -1695,34 +1631,6 @@ static const struct eqos_config __maybe_unused eqos_stm32_config = { > .ops = &eqos_stm32_ops > }; > > -static struct eqos_ops eqos_imx_ops = { > - .eqos_inval_desc = eqos_inval_desc_generic, > - .eqos_flush_desc = eqos_flush_desc_generic, > - .eqos_inval_buffer = eqos_inval_buffer_generic, > - .eqos_flush_buffer = eqos_flush_buffer_generic, > - .eqos_probe_resources = eqos_probe_resources_imx, > - .eqos_remove_resources = eqos_null_ops, > - .eqos_stop_resets = eqos_null_ops, > - .eqos_start_resets = eqos_null_ops, > - .eqos_stop_clks = eqos_null_ops, > - .eqos_start_clks = eqos_null_ops, > - .eqos_calibrate_pads = eqos_null_ops, > - .eqos_disable_calibration = eqos_null_ops, > - .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_imx, > - .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx > -}; > - > -struct eqos_config __maybe_unused eqos_imx_config = { > - .reg_access_always_ok = false, > - .mdio_wait = 10, > - .swr_wait = 50, > - .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB, > - .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300, > - .axi_bus_width = EQOS_AXI_WIDTH_64, > - .interface = dev_read_phy_mode, > - .ops = &eqos_imx_ops > -}; > - > static const struct udevice_id eqos_ids[] = { > #if IS_ENABLED(CONFIG_DWC_ETH_QOS_TEGRA186) > { > diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h > index 68b367b068a..ce90e1f1ce1 100644 > --- a/drivers/net/dwc_eth_qos.h > +++ b/drivers/net/dwc_eth_qos.h > @@ -278,3 +278,5 @@ void eqos_flush_desc_generic(void *desc); > void eqos_inval_buffer_generic(void *buf, size_t size); > void eqos_flush_buffer_generic(void *buf, size_t size); > int eqos_null_ops(struct udevice *dev); > + > +extern struct eqos_config eqos_imx_config; > diff --git a/drivers/net/dwc_eth_qos_imx.c b/drivers/net/dwc_eth_qos_imx.c > new file mode 100644 > index 00000000000..2d1b5104af2 > --- /dev/null > +++ b/drivers/net/dwc_eth_qos_imx.c > @@ -0,0 +1,121 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright 2022 NXP > + */ > + > +#include <common.h> > +#include <clk.h> > +#include <cpu_func.h> > +#include <dm.h> > +#include <errno.h> > +#include <eth_phy.h> > +#include <log.h> > +#include <malloc.h> > +#include <memalign.h> > +#include <miiphy.h> > +#include <net.h> > +#include <netdev.h> > +#include <phy.h> > +#include <reset.h> > +#include <wait_bit.h> > +#include <asm/arch/clock.h> > +#include <asm/cache.h> > +#include <asm/gpio.h> > +#include <asm/io.h> > +#include <asm/mach-imx/sys_proto.h> > +#include <linux/delay.h> > + > +#include "dwc_eth_qos.h" > + > +__weak u32 imx_get_eqos_csr_clk(void) > +{ > + return 100 * 1000000; > +} > + > +__weak int imx_eqos_txclk_set_rate(unsigned long rate) > +{ > + return 0; > +} > + > +static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) > +{ > + return imx_get_eqos_csr_clk(); > +} > + > +static int eqos_probe_resources_imx(struct udevice *dev) > +{ > + struct eqos_priv *eqos = dev_get_priv(dev); > + phy_interface_t interface; > + > + debug("%s(dev=%p):\n", __func__, dev); > + > + interface = eqos->config->interface(dev); > + > + if (interface == PHY_INTERFACE_MODE_NA) { > + pr_err("Invalid PHY interface\n"); > + return -EINVAL; > + } > + > + debug("%s: OK\n", __func__); > + return 0; > +} > + > +static int eqos_set_tx_clk_speed_imx(struct udevice *dev) > +{ > + struct eqos_priv *eqos = dev_get_priv(dev); > + ulong rate; > + int ret; > + > + debug("%s(dev=%p):\n", __func__, dev); > + > + switch (eqos->phy->speed) { > + case SPEED_1000: > + rate = 125 * 1000 * 1000; > + break; > + case SPEED_100: > + rate = 25 * 1000 * 1000; > + break; > + case SPEED_10: > + rate = 2.5 * 1000 * 1000; > + break; > + default: > + pr_err("invalid speed %d", eqos->phy->speed); > + return -EINVAL; > + } > + > + ret = imx_eqos_txclk_set_rate(rate); > + if (ret < 0) { > + pr_err("imx (tx_clk, %lu) failed: %d", rate, ret); > + return ret; > + } > + > + return 0; > +} > + > +static struct eqos_ops eqos_imx_ops = { > + .eqos_inval_desc = eqos_inval_desc_generic, > + .eqos_flush_desc = eqos_flush_desc_generic, > + .eqos_inval_buffer = eqos_inval_buffer_generic, > + .eqos_flush_buffer = eqos_flush_buffer_generic, > + .eqos_probe_resources = eqos_probe_resources_imx, > + .eqos_remove_resources = eqos_null_ops, > + .eqos_stop_resets = eqos_null_ops, > + .eqos_start_resets = eqos_null_ops, > + .eqos_stop_clks = eqos_null_ops, > + .eqos_start_clks = eqos_null_ops, > + .eqos_calibrate_pads = eqos_null_ops, > + .eqos_disable_calibration = eqos_null_ops, > + .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_imx, > + .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx > +}; > + > +struct eqos_config __maybe_unused eqos_imx_config = { > + .reg_access_always_ok = false, > + .mdio_wait = 10, > + .swr_wait = 50, > + .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB, > + .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300, > + .axi_bus_width = EQOS_AXI_WIDTH_64, > + .interface = dev_read_phy_mode, > + .ops = &eqos_imx_ops > +}; > -- > 2.36.0 > Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 69fb3bbbf7c..9536af11946 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_DM_ETH_PHY) += eth-phy-uclass.o obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o 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_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 b69a9feb824..1f24f5cb0cf 100644 --- a/drivers/net/dwc_eth_qos.c +++ b/drivers/net/dwc_eth_qos.c @@ -506,20 +506,6 @@ static ulong eqos_get_tick_clk_rate_stm32(struct udevice *dev) #endif } -__weak u32 imx_get_eqos_csr_clk(void) -{ - return 100 * 1000000; -} -__weak int imx_eqos_txclk_set_rate(unsigned long rate) -{ - return 0; -} - -static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) -{ - return imx_get_eqos_csr_clk(); -} - static int eqos_set_full_duplex(struct udevice *dev) { struct eqos_priv *eqos = dev_get_priv(dev); @@ -616,38 +602,6 @@ static int eqos_set_tx_clk_speed_tegra186(struct udevice *dev) return 0; } -static int eqos_set_tx_clk_speed_imx(struct udevice *dev) -{ - struct eqos_priv *eqos = dev_get_priv(dev); - ulong rate; - int ret; - - debug("%s(dev=%p):\n", __func__, dev); - - switch (eqos->phy->speed) { - case SPEED_1000: - rate = 125 * 1000 * 1000; - break; - case SPEED_100: - rate = 25 * 1000 * 1000; - break; - case SPEED_10: - rate = 2.5 * 1000 * 1000; - break; - default: - pr_err("invalid speed %d", eqos->phy->speed); - return -EINVAL; - } - - ret = imx_eqos_txclk_set_rate(rate); - if (ret < 0) { - pr_err("imx (tx_clk, %lu) failed: %d", rate, ret); - return ret; - } - - return 0; -} - static int eqos_adjust_link(struct udevice *dev) { struct eqos_priv *eqos = dev_get_priv(dev); @@ -1468,24 +1422,6 @@ static phy_interface_t eqos_get_interface_tegra186(const struct udevice *dev) return PHY_INTERFACE_MODE_MII; } -static int eqos_probe_resources_imx(struct udevice *dev) -{ - struct eqos_priv *eqos = dev_get_priv(dev); - phy_interface_t interface; - - debug("%s(dev=%p):\n", __func__, dev); - - interface = eqos->config->interface(dev); - - if (interface == PHY_INTERFACE_MODE_NA) { - pr_err("Invalid PHY interface\n"); - return -EINVAL; - } - - debug("%s: OK\n", __func__); - return 0; -} - static int eqos_remove_resources_tegra186(struct udevice *dev) { struct eqos_priv *eqos = dev_get_priv(dev); @@ -1695,34 +1631,6 @@ static const struct eqos_config __maybe_unused eqos_stm32_config = { .ops = &eqos_stm32_ops }; -static struct eqos_ops eqos_imx_ops = { - .eqos_inval_desc = eqos_inval_desc_generic, - .eqos_flush_desc = eqos_flush_desc_generic, - .eqos_inval_buffer = eqos_inval_buffer_generic, - .eqos_flush_buffer = eqos_flush_buffer_generic, - .eqos_probe_resources = eqos_probe_resources_imx, - .eqos_remove_resources = eqos_null_ops, - .eqos_stop_resets = eqos_null_ops, - .eqos_start_resets = eqos_null_ops, - .eqos_stop_clks = eqos_null_ops, - .eqos_start_clks = eqos_null_ops, - .eqos_calibrate_pads = eqos_null_ops, - .eqos_disable_calibration = eqos_null_ops, - .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_imx, - .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx -}; - -struct eqos_config __maybe_unused eqos_imx_config = { - .reg_access_always_ok = false, - .mdio_wait = 10, - .swr_wait = 50, - .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB, - .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300, - .axi_bus_width = EQOS_AXI_WIDTH_64, - .interface = dev_read_phy_mode, - .ops = &eqos_imx_ops -}; - static const struct udevice_id eqos_ids[] = { #if IS_ENABLED(CONFIG_DWC_ETH_QOS_TEGRA186) { diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h index 68b367b068a..ce90e1f1ce1 100644 --- a/drivers/net/dwc_eth_qos.h +++ b/drivers/net/dwc_eth_qos.h @@ -278,3 +278,5 @@ void eqos_flush_desc_generic(void *desc); void eqos_inval_buffer_generic(void *buf, size_t size); void eqos_flush_buffer_generic(void *buf, size_t size); int eqos_null_ops(struct udevice *dev); + +extern struct eqos_config eqos_imx_config; diff --git a/drivers/net/dwc_eth_qos_imx.c b/drivers/net/dwc_eth_qos_imx.c new file mode 100644 index 00000000000..2d1b5104af2 --- /dev/null +++ b/drivers/net/dwc_eth_qos_imx.c @@ -0,0 +1,121 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright 2022 NXP + */ + +#include <common.h> +#include <clk.h> +#include <cpu_func.h> +#include <dm.h> +#include <errno.h> +#include <eth_phy.h> +#include <log.h> +#include <malloc.h> +#include <memalign.h> +#include <miiphy.h> +#include <net.h> +#include <netdev.h> +#include <phy.h> +#include <reset.h> +#include <wait_bit.h> +#include <asm/arch/clock.h> +#include <asm/cache.h> +#include <asm/gpio.h> +#include <asm/io.h> +#include <asm/mach-imx/sys_proto.h> +#include <linux/delay.h> + +#include "dwc_eth_qos.h" + +__weak u32 imx_get_eqos_csr_clk(void) +{ + return 100 * 1000000; +} + +__weak int imx_eqos_txclk_set_rate(unsigned long rate) +{ + return 0; +} + +static ulong eqos_get_tick_clk_rate_imx(struct udevice *dev) +{ + return imx_get_eqos_csr_clk(); +} + +static int eqos_probe_resources_imx(struct udevice *dev) +{ + struct eqos_priv *eqos = dev_get_priv(dev); + phy_interface_t interface; + + debug("%s(dev=%p):\n", __func__, dev); + + interface = eqos->config->interface(dev); + + if (interface == PHY_INTERFACE_MODE_NA) { + pr_err("Invalid PHY interface\n"); + return -EINVAL; + } + + debug("%s: OK\n", __func__); + return 0; +} + +static int eqos_set_tx_clk_speed_imx(struct udevice *dev) +{ + struct eqos_priv *eqos = dev_get_priv(dev); + ulong rate; + int ret; + + debug("%s(dev=%p):\n", __func__, dev); + + switch (eqos->phy->speed) { + case SPEED_1000: + rate = 125 * 1000 * 1000; + break; + case SPEED_100: + rate = 25 * 1000 * 1000; + break; + case SPEED_10: + rate = 2.5 * 1000 * 1000; + break; + default: + pr_err("invalid speed %d", eqos->phy->speed); + return -EINVAL; + } + + ret = imx_eqos_txclk_set_rate(rate); + if (ret < 0) { + pr_err("imx (tx_clk, %lu) failed: %d", rate, ret); + return ret; + } + + return 0; +} + +static struct eqos_ops eqos_imx_ops = { + .eqos_inval_desc = eqos_inval_desc_generic, + .eqos_flush_desc = eqos_flush_desc_generic, + .eqos_inval_buffer = eqos_inval_buffer_generic, + .eqos_flush_buffer = eqos_flush_buffer_generic, + .eqos_probe_resources = eqos_probe_resources_imx, + .eqos_remove_resources = eqos_null_ops, + .eqos_stop_resets = eqos_null_ops, + .eqos_start_resets = eqos_null_ops, + .eqos_stop_clks = eqos_null_ops, + .eqos_start_clks = eqos_null_ops, + .eqos_calibrate_pads = eqos_null_ops, + .eqos_disable_calibration = eqos_null_ops, + .eqos_set_tx_clk_speed = eqos_set_tx_clk_speed_imx, + .eqos_get_tick_clk_rate = eqos_get_tick_clk_rate_imx +}; + +struct eqos_config __maybe_unused eqos_imx_config = { + .reg_access_always_ok = false, + .mdio_wait = 10, + .swr_wait = 50, + .config_mac = EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB, + .config_mac_mdio = EQOS_MAC_MDIO_ADDRESS_CR_250_300, + .axi_bus_width = EQOS_AXI_WIDTH_64, + .interface = dev_read_phy_mode, + .ops = &eqos_imx_ops +};