diff options
Diffstat (limited to 'drivers/net/ethernet/stmicro')
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac.h | 63 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 35 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c | 29 | ||||
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 4 | 
5 files changed, 97 insertions, 38 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig index 036428348fa..9f448279e12 100644 --- a/drivers/net/ethernet/stmicro/stmmac/Kconfig +++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig @@ -13,7 +13,7 @@ config STMMAC_ETH  if STMMAC_ETH  config STMMAC_PLATFORM -	tristate "STMMAC platform bus support" +	bool "STMMAC Platform bus support"  	depends on STMMAC_ETH  	default y  	---help--- @@ -26,7 +26,7 @@ config STMMAC_PLATFORM  	  If unsure, say N.  config STMMAC_PCI -	tristate "STMMAC support on PCI bus (EXPERIMENTAL)" +	bool "STMMAC PCI bus support (EXPERIMENTAL)"  	depends on STMMAC_ETH && PCI && EXPERIMENTAL  	---help---  	  This is to select the Synopsys DWMAC available on PCI devices, diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index 6b5d060ee9d..dc20c56efc9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h @@ -26,6 +26,7 @@  #include <linux/clk.h>  #include <linux/stmmac.h>  #include <linux/phy.h> +#include <linux/pci.h>  #include "common.h"  #ifdef CONFIG_STMMAC_TIMER  #include "stmmac_timer.h" @@ -95,7 +96,6 @@ extern int stmmac_mdio_register(struct net_device *ndev);  extern void stmmac_set_ethtool_ops(struct net_device *netdev);  extern const struct stmmac_desc_ops enh_desc_ops;  extern const struct stmmac_desc_ops ndesc_ops; -  int stmmac_freeze(struct net_device *ndev);  int stmmac_restore(struct net_device *ndev);  int stmmac_resume(struct net_device *ndev); @@ -109,7 +109,7 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,  static inline int stmmac_clk_enable(struct stmmac_priv *priv)  {  	if (!IS_ERR(priv->stmmac_clk)) -		return clk_enable(priv->stmmac_clk); +		return clk_prepare_enable(priv->stmmac_clk);  	return 0;  } @@ -119,7 +119,7 @@ static inline void stmmac_clk_disable(struct stmmac_priv *priv)  	if (IS_ERR(priv->stmmac_clk))  		return; -	clk_disable(priv->stmmac_clk); +	clk_disable_unprepare(priv->stmmac_clk);  }  static inline int stmmac_clk_get(struct stmmac_priv *priv)  { @@ -143,3 +143,60 @@ static inline int stmmac_clk_get(struct stmmac_priv *priv)  	return 0;  }  #endif /* CONFIG_HAVE_CLK */ + + +#ifdef CONFIG_STMMAC_PLATFORM +extern struct platform_driver stmmac_pltfr_driver; +static inline int stmmac_register_platform(void) +{ +	int err; + +	err = platform_driver_register(&stmmac_pltfr_driver); +	if (err) +		pr_err("stmmac: failed to register the platform driver\n"); + +	return err; +} +static inline void stmmac_unregister_platform(void) +{ +	platform_driver_register(&stmmac_pltfr_driver); +} +#else +static inline int stmmac_register_platform(void) +{ +	pr_debug("stmmac: do not register the platf driver\n"); + +	return -EINVAL; +} +static inline void stmmac_unregister_platform(void) +{ +} +#endif /* CONFIG_STMMAC_PLATFORM */ + +#ifdef CONFIG_STMMAC_PCI +extern struct pci_driver stmmac_pci_driver; +static inline int stmmac_register_pci(void) +{ +	int err; + +	err = pci_register_driver(&stmmac_pci_driver); +	if (err) +		pr_err("stmmac: failed to register the PCI driver\n"); + +	return err; +} +static inline void stmmac_unregister_pci(void) +{ +	pci_unregister_driver(&stmmac_pci_driver); +} +#else +static inline int stmmac_register_pci(void) +{ +	pr_debug("stmmac: do not register the PCI driver\n"); + +	return -EINVAL; +} +static inline void stmmac_unregister_pci(void) +{ +} +#endif /* CONFIG_STMMAC_PCI */ diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 70966330f44..51b3b68528e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -833,8 +833,9 @@ static u32 stmmac_get_synopsys_id(struct stmmac_priv *priv)  /**   * stmmac_selec_desc_mode - * @dev : device pointer - * Description: select the Enhanced/Alternate or Normal descriptors */ + * @priv : private structure + * Description: select the Enhanced/Alternate or Normal descriptors + */  static void stmmac_selec_desc_mode(struct stmmac_priv *priv)  {  	if (priv->plat->enh_desc) { @@ -1861,6 +1862,8 @@ static int stmmac_hw_init(struct stmmac_priv *priv)  /**   * stmmac_dvr_probe   * @device: device pointer + * @plat_dat: platform data pointer + * @addr: iobase memory address   * Description: this is the main probe function used to   * call the alloc_etherdev, allocate the priv structure.   */ @@ -2090,6 +2093,34 @@ int stmmac_restore(struct net_device *ndev)  }  #endif /* CONFIG_PM */ +/* Driver can be configured w/ and w/ both PCI and Platf drivers + * depending on the configuration selected. + */ +static int __init stmmac_init(void) +{ +	int err_plt = 0; +	int err_pci = 0; + +	err_plt = stmmac_register_platform(); +	err_pci = stmmac_register_pci(); + +	if ((err_pci) && (err_plt)) { +		pr_err("stmmac: driver registration failed\n"); +		return -EINVAL; +	} + +	return 0; +} + +static void __exit stmmac_exit(void) +{ +	stmmac_unregister_platform(); +	stmmac_unregister_pci(); +} + +module_init(stmmac_init); +module_exit(stmmac_exit); +  #ifndef MODULE  static int __init stmmac_cmdline_opt(char *str)  { diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c index 58fab5303e9..cf826e6b6aa 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c @@ -179,7 +179,7 @@ static DEFINE_PCI_DEVICE_TABLE(stmmac_id_table) = {  MODULE_DEVICE_TABLE(pci, stmmac_id_table); -static struct pci_driver stmmac_driver = { +struct pci_driver stmmac_pci_driver = {  	.name = STMMAC_RESOURCE_NAME,  	.id_table = stmmac_id_table,  	.probe = stmmac_pci_probe, @@ -190,33 +190,6 @@ static struct pci_driver stmmac_driver = {  #endif  }; -/** - * stmmac_init_module - Entry point for the driver - * Description: This function is the entry point for the driver. - */ -static int __init stmmac_init_module(void) -{ -	int ret; - -	ret = pci_register_driver(&stmmac_driver); -	if (ret < 0) -		pr_err("%s: ERROR: driver registration failed\n", __func__); - -	return ret; -} - -/** - * stmmac_cleanup_module - Cleanup routine for the driver - * Description: This function is the cleanup routine for the driver. - */ -static void __exit stmmac_cleanup_module(void) -{ -	pci_unregister_driver(&stmmac_driver); -} - -module_init(stmmac_init_module); -module_exit(stmmac_cleanup_module); -  MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet PCI driver");  MODULE_AUTHOR("Rayagond Kokatanur <rayagond.kokatanur@vayavyalabs.com>");  MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>"); diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c index 3dd8f080380..680d2b8dfe2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c @@ -255,7 +255,7 @@ static const struct of_device_id stmmac_dt_ids[] = {  };  MODULE_DEVICE_TABLE(of, stmmac_dt_ids); -static struct platform_driver stmmac_driver = { +struct platform_driver stmmac_pltfr_driver = {  	.probe = stmmac_pltfr_probe,  	.remove = stmmac_pltfr_remove,  	.driver = { @@ -266,8 +266,6 @@ static struct platform_driver stmmac_driver = {  		   },  }; -module_platform_driver(stmmac_driver); -  MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet PLATFORM driver");  MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>");  MODULE_LICENSE("GPL");  |