cs89x0: rework driver configuration
authorArnd Bergmann <arnd@arndb.de>
Tue, 3 Aug 2021 11:40:42 +0000 (13:40 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Aug 2021 12:05:25 +0000 (13:05 +0100)
There are two drivers in the cs89x0 file, with the CONFIG_CS89x0_PLATFORM
symbol deciding which one is getting built. This is somewhat confusing
and makes it more likely ton configure a driver that works nowhere.

Split up the Kconfig option into separate ISA and PLATFORM drivers,
with the ISA symbol explicitly connecting to the static probing in
drivers/net/Space.c

The two drivers are still mutually incompatible at compile time,
which could be lifted by splitting them into multiple files,
but in practice this will make no difference.

The platform driver can now be enabled for compile-testing on
non-ARM machines.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/Space.c
drivers/net/ethernet/cirrus/Kconfig
drivers/net/ethernet/cirrus/cs89x0.c

index 9196a26615ccb6c2b287d23d98bda2d23fcc0406..9f573f7ded3cc95dfde0fb9ececc9be89af630d1 100644 (file)
@@ -77,11 +77,9 @@ static struct devprobe2 isa_probes[] __initdata = {
 #ifdef CONFIG_SMC9194
        {smc_init, 0},
 #endif
-#ifdef CONFIG_CS89x0
-#ifndef CONFIG_CS89x0_PLATFORM
+#ifdef CONFIG_CS89x0_ISA
        {cs89x0_probe, 0},
 #endif
-#endif
 #if defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET)        /* Intel */
        {i82596_probe, 0},                                      /* I82596 */
 #endif
index d8af9e64dd1ed77509f1efc42eb1d57cb18df46a..7141340a8b0e6da67f093fc1757910eb1aaf237b 100644 (file)
@@ -6,7 +6,7 @@
 config NET_VENDOR_CIRRUS
        bool "Cirrus devices"
        default y
-       depends on ISA || EISA || ARM || MAC
+       depends on ISA || EISA || ARM || MAC || COMPILE_TEST
        help
          If you have a network (Ethernet) card belonging to this class, say Y.
 
@@ -18,9 +18,15 @@ config NET_VENDOR_CIRRUS
 if NET_VENDOR_CIRRUS
 
 config CS89x0
-       tristate "CS89x0 support"
-       depends on ISA || EISA || ARM
+       tristate
+
+config CS89x0_ISA
+       tristate "CS89x0 ISA driver support"
+       depends on HAS_IOPORT_MAP
+       depends on ISA
        depends on !PPC32
+       depends on CS89x0_PLATFORM=n
+       select CS89x0
        help
          Support for CS89x0 chipset based Ethernet cards. If you have a
          network (Ethernet) card of this type, say Y and read the file
@@ -30,15 +36,15 @@ config CS89x0
          will be called cs89x0.
 
 config CS89x0_PLATFORM
-       bool "CS89x0 platform driver support" if HAS_IOPORT_MAP
-       default !HAS_IOPORT_MAP
-       depends on CS89x0
+       tristate "CS89x0 platform driver support"
+       depends on ARM || COMPILE_TEST
+       select CS89x0
        help
-         Say Y to compile the cs89x0 driver as a platform driver. This
-         makes this driver suitable for use on certain evaluation boards
-         such as the iMX21ADS.
+         Say Y to compile the cs89x0 platform driver. This makes this driver
+         suitable for use on certain evaluation boards such as the iMX21ADS.
 
-         If you are unsure, say N.
+         To compile this driver as a module, choose M here. The module
+         will be called cs89x0.
 
 config EP93XX_ETH
        tristate "EP93xx Ethernet support"
index 33ace330705935476ea596cd23739d2d2f24c3f3..3b08cd943b7b0fef43db97a6af9702d9c5917d07 100644 (file)
@@ -104,7 +104,7 @@ static char version[] __initdata =
  * them to system IRQ numbers. This mapping is card specific and is set to
  * the configuration of the Cirrus Eval board for this chip.
  */
-#ifndef CONFIG_CS89x0_PLATFORM
+#if IS_ENABLED(CONFIG_CS89x0_ISA)
 static unsigned int netcard_portlist[] __used __initdata = {
        0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240,
        0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0
@@ -292,7 +292,7 @@ write_irq(struct net_device *dev, int chip_type, int irq)
        int i;
 
        if (chip_type == CS8900) {
-#ifndef CONFIG_CS89x0_PLATFORM
+#if IS_ENABLED(CONFIG_CS89x0_ISA)
                /* Search the mapping table for the corresponding IRQ pin. */
                for (i = 0; i != ARRAY_SIZE(cs8900_irq_map); i++)
                        if (cs8900_irq_map[i] == irq)
@@ -859,7 +859,7 @@ net_open(struct net_device *dev)
                        goto bad_out;
                }
        } else {
-#if !defined(CONFIG_CS89x0_PLATFORM)
+#if IS_ENABLED(CONFIG_CS89x0_ISA)
                if (((1 << dev->irq) & lp->irq_map) == 0) {
                        pr_err("%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
                               dev->name, dev->irq, lp->irq_map);
@@ -1523,7 +1523,7 @@ cs89x0_probe1(struct net_device *dev, void __iomem *ioaddr, int modular)
                        dev->irq = i;
        } else {
                i = lp->isa_config & INT_NO_MASK;
-#ifndef CONFIG_CS89x0_PLATFORM
+#if IS_ENABLED(CONFIG_CS89x0_ISA)
                if (lp->chip_type == CS8900) {
                        /* Translate the IRQ using the IRQ mapping table. */
                        if (i >= ARRAY_SIZE(cs8900_irq_map))
@@ -1576,7 +1576,7 @@ out1:
        return retval;
 }
 
-#ifndef CONFIG_CS89x0_PLATFORM
+#if IS_ENABLED(CONFIG_CS89x0_ISA)
 /*
  * This function converts the I/O port address used by the cs89x0_probe() and
  * init_module() functions to the I/O memory address used by the
@@ -1682,11 +1682,7 @@ out:
        pr_warn("no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP\n");
        return ERR_PTR(err);
 }
-#endif
-#endif
-
-#if defined(MODULE) && !defined(CONFIG_CS89x0_PLATFORM)
-
+#else
 static struct net_device *dev_cs89x0;
 
 /* Support the 'debug' module parm even if we're compiled for non-debug to
@@ -1759,7 +1755,7 @@ MODULE_LICENSE("GPL");
 
 int __init init_module(void)
 {
-       struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
+       struct net_device *dev;
        struct net_local *lp;
        int ret = 0;
 
@@ -1768,6 +1764,7 @@ int __init init_module(void)
 #else
        debug = 0;
 #endif
+       dev = alloc_etherdev(sizeof(struct net_local));
        if (!dev)
                return -ENOMEM;
 
@@ -1838,9 +1835,10 @@ cleanup_module(void)
        release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT);
        free_netdev(dev_cs89x0);
 }
-#endif /* MODULE && !CONFIG_CS89x0_PLATFORM */
+#endif /* MODULE */
+#endif /* CONFIG_CS89x0_ISA */
 
-#ifdef CONFIG_CS89x0_PLATFORM
+#if IS_ENABLED(CONFIG_CS89x0_PLATFORM)
 static int __init cs89x0_platform_probe(struct platform_device *pdev)
 {
        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));