From mboxrd@z Thu Jan 1 00:00:00 1970 From: u.kleine-koenig@pengutronix.de (Uwe =?iso-8859-1?Q?Kleine-K=F6nig?=) Date: Wed, 7 Sep 2011 14:50:47 +0200 Subject: [PATCH] Add platform driver support to the CS890x driver In-Reply-To: <1315390967-6683-1-git-send-email-jaccon.bastiaansen@gmail.com> References: <1315390967-6683-1-git-send-email-jaccon.bastiaansen@gmail.com> Message-ID: <20110907125047.GU28816@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hello Jaccon, On Wed, Sep 07, 2011 at 12:22:47PM +0200, Jaccon Bastiaansen wrote: > The CS89x0 ethernet controller is used on a number of evaluation > boards, such as the MX31ADS. The current driver has memory address and > IRQ settings for each board on which this controller is used. Driver > updates are therefore required to support other boards that also use > the CS89x0. To avoid these driver updates, a better mechanism > (platform driver support) is added to communicate the board dependent > settings to the driver. > > Signed-off-by: Jaccon Bastiaansen > --- > drivers/net/Kconfig | 18 +++++++++-- > drivers/net/Space.c | 2 +- > drivers/net/cs89x0.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 96 insertions(+), 7 deletions(-) > > diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig > index 93359fa..17be84f 100644 > --- a/drivers/net/Kconfig > +++ b/drivers/net/Kconfig > @@ -1497,8 +1497,7 @@ config FORCEDETH > > config CS89x0 > tristate "CS89x0 support" > - depends on NET_ETHERNET && (ISA || EISA || MACH_IXDP2351 \ > - || ARCH_IXDP2X01 || MACH_MX31ADS || MACH_QQ2440) > + depends on NET_ETHERNET > ---help--- > Support for CS89x0 chipset based Ethernet cards. If you have a > network (Ethernet) card of this type, say Y and read the > @@ -1509,10 +1508,23 @@ config CS89x0 > To compile this driver as a module, choose M here. The module > will be called cs89x0. > > +config CS89x0_PLATFORM > + bool "CS89x0 platform driver support" > + depends on CS89x0 > + default n default n is implicit so you don't need (and should not) add it here. > + help > + Say Y to compile the cs890x0 driver as a platform driver. This > + makes this driver suitable for use on certain evaluation boards > + such as the IMX21ADS. > + > + If you are unsure, say N. > + > config CS89x0_NONISA_IRQ > def_bool y > depends on CS89x0 != n > - depends on MACH_IXDP2351 || ARCH_IXDP2X01 || MACH_MX31ADS || MACH_QQ2440 > + depends on MACH_IXDP2351 || ARCH_IXDP2X01 || MACH_MX31ADS || \ > + MACH_QQ2440 || CS89x0_PLATFORM > + > > config TC35815 > tristate "TOSHIBA TC35815 Ethernet support" > diff --git a/drivers/net/Space.c b/drivers/net/Space.c > index 068c356..3c53ab1 100644 > --- a/drivers/net/Space.c > +++ b/drivers/net/Space.c > @@ -189,7 +189,7 @@ static struct devprobe2 isa_probes[] __initdata = { > #ifdef CONFIG_SEEQ8005 > {seeq8005_probe, 0}, > #endif > -#ifdef CONFIG_CS89x0 > +#if defined(CONFIG_CS89x0) && !defined(CONFIG_CS89x0_PLATFORM) > {cs89x0_probe, 0}, > #endif > #ifdef CONFIG_AT1700 > diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c > index 537a4b2..604c828 100644 > --- a/drivers/net/cs89x0.c > +++ b/drivers/net/cs89x0.c > @@ -98,6 +98,8 @@ > Domenico Andreoli : cavokz at gmail.com > : QQ2440 platform support > > + Jaccon Bastiaansen: jaccon.bastiaansen at gmail.com > + : added platform driver support > */ > > /* Always include 'config.h' first in case the user wants to turn on > @@ -154,7 +156,9 @@ > #if ALLOW_DMA > #include > #endif > - > +#ifdef CONFIG_CS89x0_PLATFORM > +#include > +#endif IMHO better include that unconditionally. > #include "cs89x0.h" > > static char version[] __initdata = > @@ -189,6 +193,9 @@ static unsigned int netcard_portlist[] __used __initdata = { > PBC_BASE_ADDRESS + PBC_CS8900A_IOBASE + 0x300, 0 > }; > static unsigned cs8900_irq_map[] = {EXPIO_INT_ENET_INT, 0, 0, 0}; > +#elif defined(CONFIG_CS89x0_PLATFORM) > +static unsigned int netcard_portlist[] __used __initdata = {0, 0}; > +static unsigned int cs8900_irq_map[] = {0, 0, 0, 0}; > #else > static unsigned int netcard_portlist[] __used __initdata = > { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0}; > @@ -1746,7 +1753,7 @@ static int set_mac_address(struct net_device *dev, void *p) > return 0; > } > > -#ifdef MODULE > +#if defined(MODULE) && !defined(CONFIG_CS89x0_PLATFORM) > > static struct net_device *dev_cs89x0; > > @@ -1900,7 +1907,77 @@ cleanup_module(void) > release_region(dev_cs89x0->base_addr, NETCARD_IO_EXTENT); > free_netdev(dev_cs89x0); > } > -#endif /* MODULE */ > +#endif /* MODULE && !CONFIG_CS89x0_PLATFORM */ > + > +#ifdef CONFIG_CS89x0_PLATFORM > +static int cs89x0_platform_probe(struct platform_device *pdev) > +{ > + struct net_device *dev = alloc_etherdev(sizeof(struct net_local)); > + struct resource *mem_res; > + struct resource *irq_res; > + int err; > + > + if (!dev) > + return -ENODEV; > + > + mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); > + if (mem_res == NULL || irq_res == NULL) { > + printk(KERN_WARNING > + DRV_NAME > + ": memory and/or interrupt resource missing.\n"); I'd prefer you do: #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt at the top of the driver and then just use: pr_warning("memory and/or interrupt resource missing\m"); > + err = -ENOENT; > + goto out; > + } > + > + cs8900_irq_map[0] = irq_res->start; > + err = cs89x0_probe1(dev, mem_res->start, 0); hmm, better switch the complete driver to be a platform driver and instead of the legacy probing let it create the corresponding device. > + if (err) { > + printk(KERN_WARNING > + DRV_NAME > + ": no cs8900 or cs8920 detected.\n"); > + goto out; > + } > + > + platform_set_drvdata(pdev, dev); > + return 0; > +out: > + free_netdev(dev); > + return err; > +} > + > +static int cs89x0_platform_remove(struct platform_device *pdev) > +{ > + struct net_device *dev = platform_get_drvdata(pdev); > + > + unregister_netdev(dev); > + free_netdev(dev); > + return 0; > +} > + > +static struct platform_driver cs89x0_platform_driver = { > + .driver = { > + .name = DRV_NAME, > + .owner = THIS_MODULE, > + }, > + .probe = cs89x0_platform_probe, > + .remove = cs89x0_platform_remove, > +}; > + > +static int __init cs89x0_init(void) > +{ > + return platform_driver_register(&cs89x0_platform_driver); > +} > + > +static void __exit cs89x0_cleanup(void) > +{ > + platform_driver_unregister(&cs89x0_platform_driver); > +} > + > +module_init(cs89x0_init); this line should go directly after the function definition. > +module_exit(cs89x0_cleanup); > + > +#endif > > /* > * Local variables: > -- > 1.7.1 > > -- Pengutronix e.K. | Uwe Kleine-K?nig | Industrial Linux Solutions | http://www.pengutronix.de/ |