]> git.hungrycats.org Git - linux/commitdiff
[ARM] SA11x0 PCMCIA 4
authorRussell King <rmk@flint.arm.linux.org.uk>
Sun, 2 Mar 2003 20:09:27 +0000 (20:09 +0000)
committerRussell King <rmk@flint.arm.linux.org.uk>
Sun, 2 Mar 2003 20:09:27 +0000 (20:09 +0000)
Convert all SA11x0 drivers to register with the Linux driver model,
so they work with the pcmcia layer in 2.5.63.

25 files changed:
drivers/pcmcia/sa1100.h
drivers/pcmcia/sa1100_adsbitsy.c
drivers/pcmcia/sa1100_assabet.c
drivers/pcmcia/sa1100_badge4.c
drivers/pcmcia/sa1100_cerf.c
drivers/pcmcia/sa1100_flexanet.c
drivers/pcmcia/sa1100_freebird.c
drivers/pcmcia/sa1100_generic.c
drivers/pcmcia/sa1100_generic.h
drivers/pcmcia/sa1100_graphicsclient.c
drivers/pcmcia/sa1100_graphicsmaster.c
drivers/pcmcia/sa1100_h3600.c
drivers/pcmcia/sa1100_jornada720.c
drivers/pcmcia/sa1100_neponset.c
drivers/pcmcia/sa1100_pangolin.c
drivers/pcmcia/sa1100_pfs168.c
drivers/pcmcia/sa1100_shannon.c
drivers/pcmcia/sa1100_simpad.c
drivers/pcmcia/sa1100_stork.c
drivers/pcmcia/sa1100_system3.c
drivers/pcmcia/sa1100_trizeps.c
drivers/pcmcia/sa1100_xp860.c
drivers/pcmcia/sa1100_yopy.c
drivers/pcmcia/sa1111_generic.c
drivers/pcmcia/sa1111_generic.h

index 6bc54de53d2d3dd5bbc9812fc9f23495a5529d38..839d9fa34084fb234eb5dc5279af6082c509f5bd 100644 (file)
@@ -192,61 +192,55 @@ struct sa1100_pcmcia_socket {
 /*
  * Declaration for all machine specific init/exit functions.
  */
-extern int pcmcia_adsbitsy_init(void);
-extern void pcmcia_adsbitsy_exit(void);
+extern int pcmcia_adsbitsy_init(struct device *);
+extern void pcmcia_adsbitsy_exit(struct device *);
 
-extern int pcmcia_assabet_init(void);
-extern void pcmcia_assabet_exit(void);
+extern int pcmcia_assabet_init(struct device *);
+extern void pcmcia_assabet_exit(struct device *);
 
-extern int pcmcia_badge4_init(void);
-extern void pcmcia_badge4_exit(void);
+extern int pcmcia_badge4_init(struct device *);
+extern void pcmcia_badge4_exit(struct device *);
 
-extern int pcmcia_cerf_init(void);
-extern void pcmcia_cerf_exit(void);
+extern int pcmcia_cerf_init(struct device *);
+extern void pcmcia_cerf_exit(struct device *);
 
-extern int pcmcia_flexanet_init(void);
-extern void pcmcia_flexanet_exit(void);
+extern int pcmcia_flexanet_init(struct device *);
+extern void pcmcia_flexanet_exit(struct device *);
 
-extern int pcmcia_freebird_init(void);
-extern void pcmcia_freebird_exit(void);
+extern int pcmcia_freebird_init(struct device *);
+extern void pcmcia_freebird_exit(struct device *);
 
-extern int pcmcia_gcplus_init(void);
-extern void pcmcia_gcplus_exit(void);
+extern int pcmcia_gcplus_init(struct device *);
+extern void pcmcia_gcplus_exit(struct device *);
 
-extern int pcmcia_graphicsmaster_init(void);
-extern void pcmcia_graphicsmaster_exit(void);
+extern int pcmcia_graphicsmaster_init(struct device *);
+extern void pcmcia_graphicsmaster_exit(struct device *);
 
-extern int pcmcia_jornada720_init(void);
-extern void pcmcia_jornada720_exit(void);
+extern int pcmcia_pangolin_init(struct device *);
+extern void pcmcia_pangolin_exit(struct device *);
 
-extern int pcmcia_neponset_init(void);
-extern void pcmcia_neponset_exit(void);
+extern int pcmcia_pfs168_init(struct device *);
+extern void pcmcia_pfs168_exit(struct device *);
 
-extern int pcmcia_pangolin_init(void);
-extern void pcmcia_pangolin_exit(void);
+extern int pcmcia_shannon_init(struct device *);
+extern void pcmcia_shannon_exit(struct device *);
 
-extern int pcmcia_pfs168_init(void);
-extern void pcmcia_pfs168_exit(void);
+extern int pcmcia_simpad_init(struct device *);
+extern void pcmcia_simpad_exit(struct device *);
 
-extern int pcmcia_shannon_init(void);
-extern void pcmcia_shannon_exit(void);
+extern int pcmcia_stork_init(struct device *);
+extern void pcmcia_stork_exit(struct device *);
 
-extern int pcmcia_simpad_init(void);
-extern void pcmcia_simpad_exit(void);
+extern int pcmcia_system3_init(struct device *);
+extern void pcmcia_system3_exit(struct device *);
 
-extern int pcmcia_stork_init(void);
-extern void pcmcia_stork_exit(void);
+extern int pcmcia_trizeps_init(struct device *);
+extern void pcmcia_trizeps_exit(struct device *);
 
-extern int pcmcia_system3_init(void);
-extern void pcmcia_system3_exit(void);
+extern int pcmcia_xp860_init(struct device *);
+extern void pcmcia_xp860_exit(struct device *);
 
-extern int pcmcia_trizeps_init(void);
-extern void pcmcia_trizeps_exit(void);
-
-extern int pcmcia_xp860_init(void);
-extern void pcmcia_xp860_exit(void);
-
-extern int pcmcia_yopy_init(void);
-extern void pcmcia_yopy_exit(void);
+extern int pcmcia_yopy_init(struct device *);
+extern void pcmcia_yopy_exit(struct device *);
 
 #endif  /* !defined(_PCMCIA_SA1100_H) */
index 709ca0a06da1e1cd22a42e4a499257c193f193f1..f01075f0669a626d9b87c744d8d4e175b6c71086 100644 (file)
@@ -9,8 +9,10 @@
  * 7/5/01 Woojung Huh <whuh@applieddata.net>
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -84,6 +86,7 @@ adsbitsy_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level adsbitsy_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = adsbitsy_pcmcia_init,
   .shutdown            = sa1111_pcmcia_shutdown,
   .socket_state                = sa1111_pcmcia_socket_state,
@@ -94,15 +97,15 @@ static struct pcmcia_low_level adsbitsy_pcmcia_ops = {
   .socket_suspend      = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_adsbitsy_init(void)
+int __init pcmcia_adsbitsy_init(struct device *dev)
 {
        int ret = -ENODEV;
        if (machine_is_adsbitsy())
-               ret = sa1100_register_pcmcia(&adsbitsy_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&adsbitsy_pcmcia_ops, dev);
        return ret;
 }
 
-void __exit pcmcia_adsbitsy_exit(void)
+void __exit pcmcia_adsbitsy_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&adsbitsy_pcmcia_ops);
+       sa1100_unregister_pcmcia(&adsbitsy_pcmcia_ops, dev);
 }
index 6566f6e0caa8718ec4c83c85c5bdfcabcb383eb6..70b2cab006d0382b88528be15bdc2e451b4b1084 100644 (file)
@@ -5,9 +5,11 @@
  *
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/interrupt.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -189,6 +191,7 @@ static int assabet_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level assabet_pcmcia_ops = { 
+       .owner                  = THIS_MODULE,
        .init                   = assabet_pcmcia_init,
        .shutdown               = assabet_pcmcia_shutdown,
        .socket_state           = assabet_pcmcia_socket_state,
@@ -199,13 +202,13 @@ static struct pcmcia_low_level assabet_pcmcia_ops = {
        .socket_suspend         = assabet_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_assabet_init(void)
+int __init pcmcia_assabet_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_assabet()) {
                if (!machine_has_neponset())
-                       ret = sa1100_register_pcmcia(&assabet_pcmcia_ops);
+                       ret = sa1100_register_pcmcia(&assabet_pcmcia_ops, dev);
 #ifndef CONFIG_ASSABET_NEPONSET
                else
                        printk(KERN_ERR "Card Services disabled: missing "
@@ -215,8 +218,8 @@ int __init pcmcia_assabet_init(void)
        return ret;
 }
 
-void __exit pcmcia_assabet_exit(void)
+void __exit pcmcia_assabet_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&assabet_pcmcia_ops);
+       sa1100_unregister_pcmcia(&assabet_pcmcia_ops, dev);
 }
 
index 09020970598cc3c62ff8759ec9f329c368c4931d..0b11544a1c97a1824c1a124d4d1a92cffef674f0 100644 (file)
@@ -12,6 +12,7 @@
  * published by the Free Software Foundation.
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/device.h>
@@ -148,6 +149,7 @@ badge4_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level badge4_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
        .init                   = badge4_pcmcia_init,
        .shutdown               = badge4_pcmcia_shutdown,
        .socket_state           = sa1111_pcmcia_socket_state,
@@ -158,19 +160,19 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {
        .socket_suspend         = sa1111_pcmcia_socket_suspend,
 };
 
-int pcmcia_badge4_init(void)
+int pcmcia_badge4_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_badge4())
-               ret = sa1100_register_pcmcia(&badge4_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&badge4_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __devexit pcmcia_badge4_exit(void)
+void __devexit pcmcia_badge4_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&badge4_pcmcia_ops);
+       sa1100_unregister_pcmcia(&badge4_pcmcia_ops, dev);
 }
 
 static int __init pcmv_setup(char *s)
index 0d7b0b4fcc3c46b336381c9af937acdeeedc83e0..235689b94828cfd49fab1673e9a876e86e16f77d 100644 (file)
@@ -6,8 +6,10 @@
  *
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -156,6 +158,7 @@ static int cerf_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level cerf_pcmcia_ops = { 
+  .owner               = THIS_MODULE,
   .init                        = cerf_pcmcia_init,
   .shutdown            = cerf_pcmcia_shutdown,
   .socket_state                = cerf_pcmcia_socket_state,
@@ -166,17 +169,17 @@ static struct pcmcia_low_level cerf_pcmcia_ops = {
   .socket_suspend      = cerf_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_cerf_init(void)
+int __init pcmcia_cerf_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_cerf())
-               ret = sa1100_register_pcmcia(&cerf_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&cerf_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_cerf_exit(void)
+void __exit pcmcia_cerf_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&cerf_pcmcia_ops);
+       sa1100_unregister_pcmcia(&cerf_pcmcia_ops, dev);
 }
index 8a4f07e9fc4712ff681a56b0379662b2a16d72bc..b77e6a69b4207928b24be01cac860e4813440a42 100644 (file)
@@ -5,9 +5,10 @@
  * by Jordi Colomer, 09/05/2001
  *
  */
-
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -217,6 +218,7 @@ static int flexanet_pcmcia_socket_suspend(int sock)
  *
  */
 static struct pcmcia_low_level flexanet_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = flexanet_pcmcia_init,
   .shutdown            = flexanet_pcmcia_shutdown,
   .socket_state                = flexanet_pcmcia_socket_state,
@@ -227,18 +229,18 @@ static struct pcmcia_low_level flexanet_pcmcia_ops = {
   .socket_suspend      = flexanet_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_flexanet_init(void)
+int __init pcmcia_flexanet_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_flexanet())
-               ret = sa1100_register_pcmcia(&flexanet_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&flexanet_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_flexanet_exit(void)
+void __exit pcmcia_flexanet_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&flexanet_pcmcia_ops);
+       sa1100_unregister_pcmcia(&flexanet_pcmcia_ops, dev);
 }
 
index 50d34e429bc47582417277b5b18f8d1c25da90ef..1f425d6d4b2e6f8527a5fc0d5986c794ccc2bc9e 100644 (file)
@@ -4,8 +4,10 @@
  * Created by Eric Peng <ericpeng@coventive.com>
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -165,6 +167,7 @@ static int freebird_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level freebird_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = freebird_pcmcia_init,
   .shutdown            = freebird_pcmcia_shutdown,
   .socket_state                = freebird_pcmcia_socket_state,
@@ -175,17 +178,17 @@ static struct pcmcia_low_level freebird_pcmcia_ops = {
   .socket_suspend      = freebird_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_freebird_init(void)
+int __init pcmcia_freebird_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_freebird())
-               ret = sa1100_register_pcmcia(&freebird_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&freebird_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_freebird_exit(void)
+void __exit pcmcia_freebird_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&freebird_pcmcia_ops);
+       sa1100_unregister_pcmcia(&freebird_pcmcia_ops, dev);
 }
index bc32508335c8be15e1e0b39946d7be4d3c2115a3..87708d4ca50c8619872738c41eaa7bc79ed3beb4 100644 (file)
@@ -377,12 +377,16 @@ sa1100_pcmcia_register_callback(unsigned int sock,
 {
   struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
 
+  if (handler && !try_module_get(skt->ops->owner))
+       return -ENODEV;
   if (handler == NULL) {
     skt->handler = NULL;
   } else {
     skt->handler_info = info;
     skt->handler = handler;
   }
+  if (!handler)
+       module_put(skt->ops->owner);
 
   return 0;
 }
@@ -918,11 +922,10 @@ static struct notifier_block sa1100_pcmcia_notifier_block = {
  *
  * Register an SA1100 PCMCIA low level driver with the SA1100 core.
  */
-int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
+int sa1100_register_pcmcia(struct pcmcia_low_level *ops, struct device *dev)
 {
        struct pcmcia_init pcmcia_init;
-       struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK];
-       struct pcmcia_state_array state_array;
+       struct pcmcia_socket_class_data *cls;
        unsigned int i, cpu_clock;
        int ret;
 
@@ -990,15 +993,18 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
                sa1100_pcmcia_set_mecr(skt, cpu_clock);
        }
 
-
-       /* Only advertise as many sockets as we can detect */
-       ret = register_ss_entry(sa1100_pcmcia_socket_count,
-                               &sa1100_pcmcia_operations);
-       if (ret < 0) {
-               printk(KERN_ERR "Unable to register sockets\n");
+       cls = kmalloc(sizeof(struct pcmcia_socket_class_data), GFP_KERNEL);
+       if (!cls) {
+               ret = -ENOMEM;
                goto out_err;
        }
 
+       memset(cls, 0, sizeof(struct pcmcia_socket_class_data));
+
+       cls->ops        = &sa1100_pcmcia_operations;
+       cls->nsock      = sa1100_pcmcia_socket_count;
+       dev->class_data = cls;
+
        /*
         * Start the event poll timer.  It will reschedule by itself afterwards.
         */
@@ -1027,7 +1033,7 @@ EXPORT_SYMBOL(sa1100_register_pcmcia);
  *
  * Unregister a previously registered pcmcia driver
  */
-void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops)
+void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops, struct device *dev)
 {
        int i;
 
@@ -1043,8 +1049,6 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops)
 
        del_timer_sync(&poll_timer);
 
-       unregister_ss_entry(&sa1100_pcmcia_operations);
-
        for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
                struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
 
@@ -1058,10 +1062,71 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops)
 
        flush_scheduled_work();
 
+       kfree(dev->class_data);
+       dev->class_data = NULL;
+
        pcmcia_low_level = NULL;
 }
 EXPORT_SYMBOL(sa1100_unregister_pcmcia);
 
+static struct device_driver sa1100_pcmcia_driver = {
+       .name           = "sa11x0-pcmcia",
+       .bus            = &platform_bus_type,
+       .devclass       = &pcmcia_socket_class,
+};
+
+static struct platform_device sa1100_pcmcia_device = {
+       .name           = "sa11x0-pcmcia",
+       .id             = 0,
+       .dev            = {
+               .name   = "Intel Corporation SA11x0 [PCMCIA]",
+       },
+};
+
+struct ll_fns {
+       int (*init)(struct device *dev);
+       void (*exit)(struct device *dev);
+};
+
+static struct ll_fns sa1100_ll_fns[] = {
+#ifdef CONFIG_SA1100_ASSABET
+       { .init = pcmcia_assabet_init,  .exit = pcmcia_assabet_exit,    },
+#endif
+#ifdef CONFIG_SA1100_CERF
+       { .init = pcmcia_cerf_init,     .exit = pcmcia_cerf_exit,       },
+#endif
+#ifdef CONFIG_SA1100_FLEXANET
+       { .init = pcmcia_flexanet_init, .exit = pcmcia_flexanet_exit,   },
+#endif
+#ifdef CONFIG_SA1100_FREEBIRD
+       { .init = pcmcia_freebird_init, .exit = pcmcia_freebird_exit,   },
+#endif
+#ifdef CONFIG_SA1100_GRAPHICSCLIENT
+       { .init = pcmcia_gcplus_init,   .exit = pcmcia_gcplus_exit,     },
+#endif
+#ifdef CONFIG_SA1100_H3600
+       { .init = pcmcia_h3600_init,    .exit = pcmcia_h3600_exit,      },
+#endif
+#ifdef CONFIG_SA1100_PANGOLIN
+       { .init = pcmcia_pangolin_init, .exit = pcmcia_pangolin_exit,   },
+#endif
+#ifdef CONFIG_SA1100_SHANNON
+       { .init = pcmcia_shannon_init,  .exit = pcmcia_shannon_exit,    },
+#endif
+#ifdef CONFIG_SA1100_SIMPAD
+       { .init = pcmcia_simpad_init,   .exit = pcmcia_simpad_exit,     },
+#endif
+#ifdef CONFIG_SA1100_STORK
+       { .init = pcmcia_stork_init,    .exit = pcmcia_stork_exit,      },
+#endif
+#ifdef CONFIG_SA1100_TRIZEPS
+       { .init = pcmcia_trizeps_init,  .exit = pcmcia_trizeps_exit,    },
+#endif
+#ifdef CONFIG_SA1100_YOPY
+       { .init = pcmcia_yopy_init,     .exit = pcmcia_yopy_exit,       },
+#endif
+};
+
 /* sa1100_pcmcia_init()
  * ^^^^^^^^^^^^^^^^^^^^
  *
@@ -1086,61 +1151,34 @@ static int __init sa1100_pcmcia_init(void)
                return -EINVAL;
        }
 
-       for (i = 0; i < SA1100_PCMCIA_MAX_SOCK; i++) {
-               struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
-
-               skt->speed_io   = SA1100_PCMCIA_IO_ACCESS;
-               skt->speed_attr = SA1100_PCMCIA_5V_MEM_ACCESS;
-               skt->speed_mem  = SA1100_PCMCIA_5V_MEM_ACCESS;
-       }
-
 #ifdef CONFIG_CPU_FREQ
        ret = cpufreq_register_notifier(&sa1100_pcmcia_notifier_block,
                                        CPUFREQ_TRANSITION_NOTIFIER);
        if (ret < 0) {
                printk(KERN_ERR "Unable to register CPU frequency change "
                        "notifier (%d)\n", ret);
+               driver_unregister(&sa1100_pcmcia_driver);
                return ret;
        }
 #endif
 
-#ifdef CONFIG_SA1100_ASSABET
-       pcmcia_assabet_init();
-#endif
-#ifdef CONFIG_SA1100_CERF
-       pcmcia_cerf_init();
-#endif
-#ifdef CONFIG_SA1100_FLEXANET
-       pcmcia_flexanet_init();
-#endif
-#ifdef CONFIG_SA1100_FREEBIRD
-       pcmcia_freebird_init();
-#endif
-#ifdef CONFIG_SA1100_GRAPHICSCLIENT
-       pcmcia_gcplus_init();
-#endif
-#ifdef CONFIG_SA1100_H3600
-       pcmcia_h3600_init();
-#endif
-#ifdef CONFIG_SA1100_PANGOLIN
-       pcmcia_pangolin_init();
-#endif
-#ifdef CONFIG_SA1100_SHANNON
-       pcmcia_shannon_init();
-#endif
-#ifdef CONFIG_SA1100_SIMPAD
-       pcmcia_simpad_init();
-#endif
-#ifdef CONFIG_SA1100_STORK
-       pcmcia_stork_init();
-#endif
-#ifdef CONFIG_SA1100_TRIZEPS
-       pcmcia_trizeps_init();
-#endif
-#ifdef CONFIG_SA1100_YOPY
-       pcmcia_yopy_init();
-#endif
+       driver_register(&sa1100_pcmcia_driver);
 
+       /*
+        * Initialise any "on-board" PCMCIA sockets.
+        */
+       for (i = 0; i < ARRAY_SIZE(sa1100_ll_fns); i++) {
+               ret = sa1100_ll_fns[i].init(&sa1100_pcmcia_device.dev);
+               if (ret == 0)
+                       break;
+       }
+
+       if (ret == 0)
+               platform_device_register(&sa1100_pcmcia_device);
+
+       /*
+        * Don't fail if we don't find any on-board sockets.
+        */
        return 0;
 }
 
@@ -1151,48 +1189,14 @@ static int __init sa1100_pcmcia_init(void)
  */
 static void __exit sa1100_pcmcia_exit(void)
 {
-#ifdef CONFIG_SA1100_ASSABET
-       pcmcia_assabet_exit();
-#endif
-#ifdef CONFIG_SA1100_CERF
-       pcmcia_cerf_exit();
-#endif
-#ifdef CONFIG_SA1100_FLEXANET
-       pcmcia_flexanet_exit();
-#endif
-#ifdef CONFIG_SA1100_FREEBIRD
-       pcmcia_freebird_exit();
-#endif
-#ifdef CONFIG_SA1100_GRAPHICSCLIENT
-       pcmcia_gcplus_exit();
-#endif
-#ifdef CONFIG_SA1100_H3600
-       pcmcia_h3600_exit();
-#endif
-#ifdef CONFIG_SA1100_PANGOLIN
-       pcmcia_pangolin_exit();
-#endif
-#ifdef CONFIG_SA1100_SHANNON
-       pcmcia_shannon_exit();
-#endif
-#ifdef CONFIG_SA1100_SIMPAD
-       pcmcia_simpad_exit();
-#endif
-#ifdef CONFIG_SA1100_STORK
-       pcmcia_stork_exit();
-#endif
-#ifdef CONFIG_SA1100_YOPY
-       pcmcia_yopy_exit();
-#endif
+       platform_device_unregister(&sa1100_pcmcia_device);
 
-       if (pcmcia_low_level) {
-               printk(KERN_ERR "PCMCIA: low level driver still registered\n");
-               sa1100_unregister_pcmcia(pcmcia_low_level);
-       }
 
 #ifdef CONFIG_CPU_FREQ
        cpufreq_unregister_notifier(&sa1100_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
 #endif
+
+       driver_unregister(&sa1100_pcmcia_driver);
 }
 
 MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
index 45ba6c539b05e152d25215429a78066622083617..6e118de19185eb20b760f3d9181d0bff605a3889 100644 (file)
@@ -46,6 +46,8 @@ struct pcmcia_irq_info {
 };
 
 struct pcmcia_low_level {
+  struct module *owner;
+
   int (*init)(struct pcmcia_init *);
   int (*shutdown)(void);
   void (*socket_state)(int sock, struct pcmcia_state *);
@@ -71,7 +73,7 @@ struct pcmcia_low_level {
                unsigned int cpu_speed, unsigned int cmd_time);
 };
 
-extern int sa1100_register_pcmcia(struct pcmcia_low_level *);
-extern void sa1100_unregister_pcmcia(struct pcmcia_low_level *);
+extern int sa1100_register_pcmcia(struct pcmcia_low_level *, struct device *);
+extern void sa1100_unregister_pcmcia(struct pcmcia_low_level *, struct device *);
 
 #endif
index 1268e6d88018a08758d2f93fe0d4fad2c5fa5164..c989019a5cf568e7377d59376fdc04cf8bc9edbb 100644 (file)
  *    Fix
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -56,6 +58,8 @@ static int gcplus_pcmcia_init(struct pcmcia_init *init)
     return res;
   }
 
+  init->socket_irq[0] = S0_STS_IRQ;
+
   return 1;                    // 1 PCMCIA Slot
 }
 
@@ -71,45 +75,27 @@ static int gcplus_pcmcia_shutdown(void)
   return 0;
 }
 
-static int gcplus_pcmcia_socket_state(struct pcmcia_state_array
-                                      *state_array){
-  unsigned long levels;
-
-  if(state_array->size<1) return -1;
-
-  memset(state_array->state, 0, 
-        (state_array->size)*sizeof(struct pcmcia_state));
-
-  levels=*PCMCIA_Status;
-
-  state_array->state[0].detect=(levels & ADS_CS_ST_A_CD)?1:0;
-  state_array->state[0].ready=(levels & ADS_CS_ST_A_READY)?1:0;
-  state_array->state[0].bvd1= 0;
-  state_array->state[0].bvd2= 0;
-  state_array->state[0].wrprot=0;
-  state_array->state[0].vs_3v=0;
-  state_array->state[0].vs_Xv=0;
-
-  return 1;
-}
-
-static int gcplus_pcmcia_get_irq_info(struct pcmcia_irq_info *info)
+static void gcplus_pcmcia_socket_state(int sock, struct pcmcia_state *state_array)
 {
-       if (info->sock > 1)
-               return -1;
-
-       if (info->sock == 0)
-               info->irq = S0_STS_IRQ;
-
-       return 0;
+  unsigned long levels = *PCMCIA_Status;
+
+  if (sock == 0) {
+    state->detect=(levels & ADS_CS_ST_A_CD)?1:0;
+    state->ready=(levels & ADS_CS_ST_A_READY)?1:0;
+    state->bvd1= 0;
+    state->bvd2= 0;
+    state->wrprot=0;
+    state->vs_3v=0;
+    state->vs_Xv=0;
+  }
 }
 
-static int gcplus_pcmcia_configure_socket(const struct pcmcia_configure
+static int gcplus_pcmcia_configure_socket(int sock, const struct pcmcia_configure
                                           *configure)
 {
   unsigned long flags;
 
-  if(configure->sock>1) return -1;
+  if(sock>1) return -1;
 
   local_irq_save(flags);
 
@@ -160,28 +146,28 @@ static int gcplus_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level gcplus_pcmcia_ops = { 
+  .owner               = THIS_MODULE,
   .init                        = gcplus_pcmcia_init,
   .shutdown            = gcplus_pcmcia_shutdown,
   .socket_state                = gcplus_pcmcia_socket_state,
-  .get_irq_info                = gcplus_pcmcia_get_irq_info,
   .configure_socket    = gcplus_pcmcia_configure_socket,
 
   .socket_init         = gcplus_pcmcia_socket_init,
   .socket_suspend      = gcplus_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_gcplus_init(void)
+int __init pcmcia_gcplus_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_gcplus())
-               ret = sa1100_register_pcmcia(&gcplus_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&gcplus_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_gcplus_exit(void)
+void __exit pcmcia_gcplus_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&gcplus_pcmcia_ops);
+       sa1100_unregister_pcmcia(&gcplus_pcmcia_ops, dev);
 }
 
index 34ca7f1442019f544e02585d24729c5e04eaebea..49c975ac5f131f4a6738ffbcbbb3a888465ff3ac 100644 (file)
@@ -8,8 +8,10 @@
  * 7/5/01 Woojung Huh <whuh@applieddata.net>
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -35,12 +37,12 @@ static int graphicsmaster_pcmcia_init(struct pcmcia_init *init)
 }
 
 static int
-graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf)
+graphicsmaster_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 {
   unsigned int pa_dwr_mask, pa_dwr_set;
   int ret;
 
-  switch (conf->sock) {
+  switch (sock) {
   case 0:
     pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1;
 
@@ -69,7 +71,7 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf)
     return -1;
   }
 
-  ret = sa1111_pcmcia_configure_socket(conf);
+  ret = sa1111_pcmcia_configure_socket(sock, conf);
   if (ret == 0) {
     unsigned long flags;
 
@@ -82,28 +84,28 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level graphicsmaster_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = graphicsmaster_pcmcia_init,
   .shutdown            = sa1111_pcmcia_shutdown,
   .socket_state                = sa1111_pcmcia_socket_state,
-  .get_irq_info                = sa1111_pcmcia_get_irq_info,
   .configure_socket    = graphicsmaster_pcmcia_configure_socket,
 
   .socket_init         = sa1111_pcmcia_socket_init,
   .socket_suspend      = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_graphicsmaster_init(void)
+int __init pcmcia_graphicsmaster_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_graphicsmaster())
-               ret = sa1100_register_pcmcia(&graphicsmaster_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&graphicsmaster_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_graphicsmaster_exit(void)
+void __exit pcmcia_graphicsmaster_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&graphicsmaster_pcmcia_ops);
+       sa1100_unregister_pcmcia(&graphicsmaster_pcmcia_ops, dev);
 }
 
index 386e58d6e566f08e93118838a554c953908b6382..9ee176994db21cfaeae380dbdb3e79ac9f8b6e43 100644 (file)
@@ -4,8 +4,10 @@
  * PCMCIA implementation routines for H3600
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -186,6 +188,7 @@ static int h3600_pcmcia_socket_suspend(int sock)
 }
 
 struct pcmcia_low_level h3600_pcmcia_ops = { 
+       .owner                  = THIS_MODULE,
        .init                   = h3600_pcmcia_init,
        .shutdown               = h3600_pcmcia_shutdown,
        .socket_state           = h3600_pcmcia_socket_state,
@@ -196,17 +199,17 @@ struct pcmcia_low_level h3600_pcmcia_ops = {
        .socket_suspend         = h3600_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_h3600_init(void)
+int __init pcmcia_h3600_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_h3600())
-               ret = sa1100_register_pcmcia(&h3600_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&h3600_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_h3600_exit(void)
+void __exit pcmcia_h3600_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&h3600_pcmcia_ops);
+       sa1100_unregister_pcmcia(&h3600_pcmcia_ops, dev);
 }
index ef3170a5c92b956a91a01576cce21d121b49682a..aca5fb50e8c07f4b7986daaf92f3729834724441 100644 (file)
@@ -4,6 +4,7 @@
  * Jornada720 PCMCIA specific routines
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/device.h>
@@ -90,7 +91,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
     return -1;
   }
 
-  ret = sa1111_pcmcia_configure_socket(conf);
+  ret = sa1111_pcmcia_configure_socket(sock, conf);
   if (ret == 0) {
     unsigned long flags;
 
@@ -103,6 +104,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
 }
 
 static struct pcmcia_low_level jornada720_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = jornada720_pcmcia_init,
   .shutdown            = sa1111_pcmcia_shutdown,
   .socket_state                = sa1111_pcmcia_socket_state,
@@ -113,17 +115,17 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = {
   .socket_suspend      = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_jornada720_init(void)
+int __init pcmcia_jornada720_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_jornada720())
-               ret = sa1100_register_pcmcia(&jornada720_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&jornada720_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __devexit pcmcia_jornada720_exit(void)
+void __devexit pcmcia_jornada720_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&jornada720_pcmcia_ops);
+       sa1100_unregister_pcmcia(&jornada720_pcmcia_ops, dev);
 }
index 296bd3ddff19c81ee8d67a663df8b2712f58e749..fc260d296e62069f172f37118aab5b21a1cc04bf 100644 (file)
@@ -3,6 +3,7 @@
  *
  * Neponset PCMCIA specific routines
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/device.h>
@@ -127,6 +128,7 @@ neponset_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level neponset_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
        .init                   = neponset_pcmcia_init,
        .shutdown               = sa1111_pcmcia_shutdown,
        .socket_state           = sa1111_pcmcia_socket_state,
@@ -137,17 +139,17 @@ static struct pcmcia_low_level neponset_pcmcia_ops = {
        .socket_suspend         = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_neponset_init(void)
+int __init pcmcia_neponset_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_assabet())
-               ret = sa1100_register_pcmcia(&neponset_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&neponset_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __devexit pcmcia_neponset_exit(void)
+void __devexit pcmcia_neponset_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&neponset_pcmcia_ops);
+       sa1100_unregister_pcmcia(&neponset_pcmcia_ops, dev);
 }
index 396f9581935f59623cc8438089b39211e66ecfd3..4b6a8323eda0e91761cd84d3c447a44b5c6ae4c8 100644 (file)
@@ -5,8 +5,10 @@
  *
  */
 #include <linux/config.h>
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -151,6 +153,7 @@ static int pangolin_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level pangolin_pcmcia_ops = { 
+  .owner               = THIS_MODULE,
   .init                        = pangolin_pcmcia_init,
   .shutdown            = pangolin_pcmcia_shutdown,
   .socket_state                = pangolin_pcmcia_socket_state,
@@ -161,18 +164,18 @@ static struct pcmcia_low_level pangolin_pcmcia_ops = {
   socket_suspend,      pangolin_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_pangolin_init(void)
+int __init pcmcia_pangolin_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_pangolin())
-               ret = sa1100_register_pcmcia(&pangolin_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&pangolin_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_pangolin_exit(void)
+void __exit pcmcia_pangolin_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&pangolin_pcmcia_ops);
+       sa1100_unregister_pcmcia(&pangolin_pcmcia_ops, dev);
 }
 
index 60e9725445eb7ec243bda66039dc84ab70f6c315..0812178be92af2e08dd036c44f83d2f247211798 100644 (file)
@@ -5,9 +5,11 @@
  * PFS168 PCMCIA specific routines
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/delay.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -119,6 +121,7 @@ pfs168_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level pfs168_pcmcia_ops = {
+  .owner               = THIS_MODULE,
   .init                        = pfs168_pcmcia_init,
   .shutdown            = sa1111_pcmcia_shutdown,
   .socket_state                = sa1111_pcmcia_socket_state,
@@ -129,17 +132,17 @@ static struct pcmcia_low_level pfs168_pcmcia_ops = {
   .socket_suspend      = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_pfs168_init(void)
+int __init pcmcia_pfs168_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_pfs168())
-               ret = sa1100_register_pcmcia(&pfs168_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&pfs168_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_pfs168_exit(void)
+void __exit pcmcia_pfs168_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&pfs168_pcmcia_ops);
+       sa1100_unregister_pcmcia(&pfs168_pcmcia_ops, dev);
 }
index 7559b19dd3987b5ebc7aa8d0c6617e431fd457fd..7524e4de0b65b845f1222af0c3f755541ae62e6f 100644 (file)
@@ -4,8 +4,10 @@
  * PCMCIA implementation routines for Shannon
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -150,6 +152,7 @@ static int shannon_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level shannon_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
        .init                   = shannon_pcmcia_init,
        .shutdown               = shannon_pcmcia_shutdown,
        .socket_state           = shannon_pcmcia_socket_state,
@@ -160,17 +163,17 @@ static struct pcmcia_low_level shannon_pcmcia_ops = {
        .socket_suspend         = shannon_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_shannon_init(void)
+int __init pcmcia_shannon_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_shannon())
-               ret = sa1100_register_pcmcia(&shannon_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&shannon_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_shannon_exit(void)
+void __exit pcmcia_shannon_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&shannon_pcmcia_ops);
+       sa1100_unregister_pcmcia(&shannon_pcmcia_ops, dev);
 }
index 92ca8f46f4774db5288a05ed501b1064a23189d0..7d07e94cd3f52882c6a650aff3da2166421e3eba 100644 (file)
@@ -4,8 +4,10 @@
  * PCMCIA implementation routines for simpad
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -146,6 +148,7 @@ static int simpad_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level simpad_pcmcia_ops = { 
+  .owner               = THIS_MODULE,
   .init                        = simpad_pcmcia_init,
   .shutdown            = simpad_pcmcia_shutdown,
   .socket_state                = simpad_pcmcia_socket_state,
@@ -156,17 +159,17 @@ static struct pcmcia_low_level simpad_pcmcia_ops = {
   .socket_suspend      = simpad_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_simpad_init(void)
+int __init pcmcia_simpad_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_simpad())
-               ret = sa1100_register_pcmcia(&simpad_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&simpad_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_simpad_exit(void)
+void __exit pcmcia_simpad_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&simpad_pcmcia_ops);
+       sa1100_unregister_pcmcia(&simpad_pcmcia_ops, dev);
 }
index 1dea8cbccbfa6b43e3ee7fee5663bc05161ae394..78af79ec430a84165ad813c5568c9b9fb8967c4b 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/init.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/i2c.h>
 
 #include <asm/hardware.h>
@@ -226,6 +227,7 @@ static int stork_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level stork_pcmcia_ops = { 
+       .owner                  = THIS_MODULE,
        .init                   = stork_pcmcia_init,
        .shutdown               = stork_pcmcia_shutdown,
        .socket_state           = stork_pcmcia_socket_state,
@@ -236,18 +238,18 @@ static struct pcmcia_low_level stork_pcmcia_ops = {
        .socket_suspend         = stork_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_stork_init(void)
+int __init pcmcia_stork_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_stork())
-               ret = sa1100_register_pcmcia(&stork_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&stork_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_stork_exit(void)
+void __exit pcmcia_stork_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&stork_pcmcia_ops);
+       sa1100_unregister_pcmcia(&stork_pcmcia_ops, dev);
 }
 
index 3ed835b6e789b58c5c60780aa2f5cfb272fe0972..ca61e33e8e443411c8c327586bac68bcd32f9882 100644 (file)
  *
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/init.h>
+#include <linux/device.h>
 #include <linux/ioport.h>
 
 #include <asm/hardware.h>
@@ -99,8 +101,9 @@ static void system3_pcmcia_socket_state(int sock, struct pcmcia_state *state)
 }
 
 struct pcmcia_low_level system3_pcmcia_ops = {
-       .init                           = system3_pcmcia_init,
-       .shutdown                       = system3_pcmcia_shutdown,
+       .owner                  = THIS_MODULE,
+       .init                   = system3_pcmcia_init,
+       .shutdown               = system3_pcmcia_shutdown,
        .socket_state           = system3_pcmcia_socket_state,
        .get_irq_info           = sa1111_pcmcia_get_irq_info,
        .configure_socket       = system3_pcmcia_configure_socket,
@@ -109,17 +112,17 @@ struct pcmcia_low_level system3_pcmcia_ops = {
        .socket_suspend         = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_system3_init(void)
+int __init pcmcia_system3_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_pt_system3())
-               ret = sa1100_register_pcmcia(&system3_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&system3_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_system3_exit(void)
+void __exit pcmcia_system3_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&system3_pcmcia_ops);
+       sa1100_unregister_pcmcia(&system3_pcmcia_ops, dev);
 }
index 84c3947928c9051823f4b16d0250484a8453ad28..e8c6a55dbc371863210d844c49ed01720856e56b 100644 (file)
@@ -9,8 +9,10 @@
  * Guennadi Liakhovetski <gl@dsa-ac.de>
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -186,6 +188,7 @@ static int trizeps_pcmcia_socket_suspend(int sock)
  *
  ******************************************************/
 struct pcmcia_low_level trizeps_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
        .init                   = trizeps_pcmcia_init,
        .shutdown               = trizeps_pcmcia_shutdown,
        .socket_state           = trizeps_pcmcia_socket_state,
@@ -195,15 +198,15 @@ struct pcmcia_low_level trizeps_pcmcia_ops = {
        .socket_suspend         = trizeps_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_trizeps_init(void)
+int __init pcmcia_trizeps_init(struct device *dev)
 {
        if (machine_is_trizeps()) {
-               return sa1100_register_pcmcia(&trizeps_pcmcia_ops);
+               return sa1100_register_pcmcia(&trizeps_pcmcia_ops, dev);
        }
        return -ENODEV;
 }
 
-void __exit pcmcia_trizeps_exit(void)
+void __exit pcmcia_trizeps_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&trizeps_pcmcia_ops);
+       sa1100_unregister_pcmcia(&trizeps_pcmcia_ops, dev);
 }
index 7e1179049591a2fec2debb2a27ae772c7bd67e07..6795de670b0b530804d8ad2b7f5ea00d8062072e 100644 (file)
@@ -4,9 +4,11 @@
  * XP860 PCMCIA specific routines
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/delay.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -132,6 +134,7 @@ xp860_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
 }
 
 static struct pcmcia_low_level xp860_pcmcia_ops = { 
+  .owner               = THIS_MODULE,
   .init                        = xp860_pcmcia_init,
   .shutdown            = sa1111_pcmcia_shutdown,
   .socket_state                = sa1111_pcmcia_socket_state,
@@ -142,18 +145,18 @@ static struct pcmcia_low_level xp860_pcmcia_ops = {
   .socket_suspend      = sa1111_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_xp860_init(void)
+int __init pcmcia_xp860_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_xp860())
-               ret = sa1100_register_pcmcia(&xp860_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&xp860_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_xp860_exit(void)
+void __exit pcmcia_xp860_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&xp860_pcmcia_ops);
+       sa1100_unregister_pcmcia(&xp860_pcmcia_ops, dev);
 }
 
index d8dfa6bb56362fccd1af9a5eac4f2b5d2fff25e0..ea1aabd29b3f59830bced14a1c22529b1fba78c8 100644 (file)
@@ -4,8 +4,10 @@
  * PCMCIA implementation routines for Yopy
  *
  */
+#include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
+#include <linux/device.h>
 #include <linux/init.h>
 
 #include <asm/hardware.h>
@@ -153,6 +155,7 @@ static int yopy_pcmcia_socket_suspend(int sock)
 }
 
 static struct pcmcia_low_level yopy_pcmcia_ops = {
+       .owner                  = THIS_MODULE,
        .init                   = yopy_pcmcia_init,
        .shutdown               = yopy_pcmcia_shutdown,
        .socket_state           = yopy_pcmcia_socket_state,
@@ -163,18 +166,18 @@ static struct pcmcia_low_level yopy_pcmcia_ops = {
        .socket_suspend         = yopy_pcmcia_socket_suspend,
 };
 
-int __init pcmcia_yopy_init(void)
+int __init pcmcia_yopy_init(struct device *dev)
 {
        int ret = -ENODEV;
 
        if (machine_is_yopy())
-               ret = sa1100_register_pcmcia(&yopy_pcmcia_ops);
+               ret = sa1100_register_pcmcia(&yopy_pcmcia_ops, dev);
 
        return ret;
 }
 
-void __exit pcmcia_yopy_exit(void)
+void __exit pcmcia_yopy_exit(struct device *dev)
 {
-       sa1100_unregister_pcmcia(&yopy_pcmcia_ops);
+       sa1100_unregister_pcmcia(&yopy_pcmcia_ops, dev);
 }
 
index 3202ee37d27665c738e4b371858ff8b50ebb570e..280629806c9cf28854cf1d65cac6ced2964e0128 100644 (file)
@@ -12,6 +12,9 @@
 #include <linux/interrupt.h>
 #include <linux/init.h>
 
+#include <linux/proc_fs.h>
+#include <pcmcia/ss.h>
+
 #include <asm/hardware.h>
 #include <asm/hardware/sa1111.h>
 #include <asm/irq.h>
@@ -206,28 +209,28 @@ static int pcmcia_probe(struct device *dev)
        sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + SA1111_PCCR);
 
 #ifdef CONFIG_SA1100_ADSBITSY
-       pcmcia_adsbitsy_init();
+       pcmcia_adsbitsy_init(dev);
 #endif
 #ifdef CONFIG_SA1100_BADGE4
-       pcmcia_badge4_init();
+       pcmcia_badge4_init(dev);
 #endif
 #ifdef CONFIG_SA1100_GRAPHICSMASTER
-       pcmcia_graphicsmaster_init();
+       pcmcia_graphicsmaster_init(dev);
 #endif
 #ifdef CONFIG_SA1100_JORNADA720
-       pcmcia_jornada720_init();
+       pcmcia_jornada720_init(dev);
 #endif
 #ifdef CONFIG_ASSABET_NEPONSET
-       pcmcia_neponset_init();
+       pcmcia_neponset_init(dev);
 #endif
 #ifdef CONFIG_SA1100_PFS168
-       pcmcia_pfs_init();
+       pcmcia_pfs_init(dev);
 #endif
 #ifdef CONFIG_SA1100_PT_SYSTEM3
-       pcmcia_system3_init();
+       pcmcia_system3_init(dev);
 #endif
 #ifdef CONFIG_SA1100_XP860
-       pcmcia_xp860_init();
+       pcmcia_xp860_init(dev);
 #endif
        return 0;
 }
@@ -237,28 +240,28 @@ static int __devexit pcmcia_remove(struct device *dev)
        struct sa1111_dev *sadev = SA1111_DEV(dev);
 
 #ifdef CONFIG_SA1100_ADSBITSY
-       pcmcia_adsbitsy_exit();
+       pcmcia_adsbitsy_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_BADGE4
-       pcmcia_badge4_exit();
+       pcmcia_badge4_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_GRAPHICSMASTER
-       pcmcia_graphicsmaster_exit();
+       pcmcia_graphicsmaster_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_JORNADA720
-       pcmcia_jornada720_exit();
+       pcmcia_jornada720_exit(dev);
 #endif
 #ifdef CONFIG_ASSABET_NEPONSET
-       pcmcia_neponset_exit();
+       pcmcia_neponset_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_PFS168
-       pcmcia_pfs_exit();
+       pcmcia_pfs_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_PT_SYSTEM3
-       pcmcia_system3_exit();
+       pcmcia_system3_exit(dev);
 #endif
 #ifdef CONFIG_SA1100_XP860
-       pcmcia_xp860_exit();
+       pcmcia_xp860_exit(dev);
 #endif
 
        release_mem_region(sadev->res.start, 512);
@@ -281,6 +284,7 @@ static struct sa1111_driver pcmcia_driver = {
        .drv = {
                .name           = "sa1111-pcmcia",
                .bus            = &sa1111_bus_type,
+               .devclass       = &pcmcia_socket_class,
                .probe          = pcmcia_probe,
                .remove         = __devexit_p(pcmcia_remove),
                .suspend        = pcmcia_suspend,
index f93c7f068cac24de5e66b0dd42ecbe440c103310..76e33b8a8476b5855021ec91e554f1db229a582f 100644 (file)
@@ -5,3 +5,11 @@ extern int sa1111_pcmcia_get_irq_info(struct pcmcia_irq_info *);
 extern int sa1111_pcmcia_configure_socket(int sock, const struct pcmcia_configure *);
 extern int sa1111_pcmcia_socket_init(int);
 extern int sa1111_pcmcia_socket_suspend(int);
+
+
+extern int pcmcia_jornada720_init(struct device *);
+extern void pcmcia_jornada720_exit(struct device *);
+
+extern int pcmcia_neponset_init(struct device *);
+extern void pcmcia_neponset_exit(struct device *);
+