Commit 33d5e332 authored by Giuseppe CAVALLARO's avatar Giuseppe CAVALLARO Committed by David S. Miller

stmmac: fix driver built w/ w/o both pci and platf modules

The commit ba27ec66 fixes the Kconfig of the
driver when built as module allowing to select/unselect
the PCI and Platform modules that are not anymore mutually
exclusive. This patch fixes and guarantees that the driver
builds on all the platforms w/ w/o PCI and when select/unselect
the two stmmac supports. In case of there are some problems
on both the configuration and the pci/pltf registration the
module_init will fail.

v2: set the CONFIG_STMMAC_PLATFORM enabled by default.
I've just noticed that this can actually help on
some configurations that don't enable any STMMAC
options by default (e.g. SPEAr).

v3: change printk level when do not register the driver.
Reported-by: default avatarFengguang Wu <wfg@linux.intel.com>
Signed-off-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2d8dbb04
...@@ -15,6 +15,7 @@ if STMMAC_ETH ...@@ -15,6 +15,7 @@ if STMMAC_ETH
config STMMAC_PLATFORM config STMMAC_PLATFORM
bool "STMMAC Platform bus support" bool "STMMAC Platform bus support"
depends on STMMAC_ETH depends on STMMAC_ETH
default y
---help--- ---help---
This selects the platform specific bus support for This selects the platform specific bus support for
the stmmac device driver. This is the driver used the stmmac device driver. This is the driver used
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/stmmac.h> #include <linux/stmmac.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/pci.h>
#include "common.h" #include "common.h"
#ifdef CONFIG_STMMAC_TIMER #ifdef CONFIG_STMMAC_TIMER
#include "stmmac_timer.h" #include "stmmac_timer.h"
...@@ -95,8 +96,6 @@ extern int stmmac_mdio_register(struct net_device *ndev); ...@@ -95,8 +96,6 @@ extern int stmmac_mdio_register(struct net_device *ndev);
extern void stmmac_set_ethtool_ops(struct net_device *netdev); 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 enh_desc_ops;
extern const struct stmmac_desc_ops ndesc_ops; extern const struct stmmac_desc_ops ndesc_ops;
extern struct pci_driver stmmac_pci_driver;
extern struct platform_driver stmmac_pltfr_driver;
int stmmac_freeze(struct net_device *ndev); int stmmac_freeze(struct net_device *ndev);
int stmmac_restore(struct net_device *ndev); int stmmac_restore(struct net_device *ndev);
int stmmac_resume(struct net_device *ndev); int stmmac_resume(struct net_device *ndev);
...@@ -144,3 +143,60 @@ static inline int stmmac_clk_get(struct stmmac_priv *priv) ...@@ -144,3 +143,60 @@ static inline int stmmac_clk_get(struct stmmac_priv *priv)
return 0; return 0;
} }
#endif /* CONFIG_HAVE_CLK */ #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 */
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/prefetch.h> #include <linux/prefetch.h>
#include <linux/pci.h>
#ifdef CONFIG_STMMAC_DEBUG_FS #ifdef CONFIG_STMMAC_DEBUG_FS
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
...@@ -2094,25 +2093,29 @@ int stmmac_restore(struct net_device *ndev) ...@@ -2094,25 +2093,29 @@ int stmmac_restore(struct net_device *ndev)
} }
#endif /* CONFIG_PM */ #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) static int __init stmmac_init(void)
{ {
int err = 0; int err_plt = 0;
int err_pci = 0;
err = platform_driver_register(&stmmac_pltfr_driver); err_plt = stmmac_register_platform();
err_pci = stmmac_register_pci();
if (!err) { if ((err_pci) && (err_plt)) {
err = pci_register_driver(&stmmac_pci_driver); pr_err("stmmac: driver registration failed\n");
if (err) return -EINVAL;
platform_driver_unregister(&stmmac_pltfr_driver);
} }
return err; return 0;
} }
static void __exit stmmac_exit(void) static void __exit stmmac_exit(void)
{ {
pci_unregister_driver(&stmmac_pci_driver); stmmac_unregister_platform();
platform_driver_unregister(&stmmac_pltfr_driver); stmmac_unregister_pci();
} }
module_init(stmmac_init); module_init(stmmac_init);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment