From a875f3b97a830a1fc47930bb220f6b813d030b2d Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 2 Mar 2003 20:09:27 +0000 Subject: [PATCH] [ARM] SA11x0 PCMCIA 4 Convert all SA11x0 drivers to register with the Linux driver model, so they work with the pcmcia layer in 2.5.63. --- drivers/pcmcia/sa1100.h | 74 +++++----- drivers/pcmcia/sa1100_adsbitsy.c | 11 +- drivers/pcmcia/sa1100_assabet.c | 11 +- drivers/pcmcia/sa1100_badge4.c | 10 +- drivers/pcmcia/sa1100_cerf.c | 11 +- drivers/pcmcia/sa1100_flexanet.c | 12 +- drivers/pcmcia/sa1100_freebird.c | 11 +- drivers/pcmcia/sa1100_generic.c | 190 +++++++++++++------------ drivers/pcmcia/sa1100_generic.h | 6 +- drivers/pcmcia/sa1100_graphicsclient.c | 60 +++----- drivers/pcmcia/sa1100_graphicsmaster.c | 18 +-- drivers/pcmcia/sa1100_h3600.c | 11 +- drivers/pcmcia/sa1100_jornada720.c | 12 +- drivers/pcmcia/sa1100_neponset.c | 10 +- drivers/pcmcia/sa1100_pangolin.c | 11 +- drivers/pcmcia/sa1100_pfs168.c | 11 +- drivers/pcmcia/sa1100_shannon.c | 11 +- drivers/pcmcia/sa1100_simpad.c | 11 +- drivers/pcmcia/sa1100_stork.c | 10 +- drivers/pcmcia/sa1100_system3.c | 15 +- drivers/pcmcia/sa1100_trizeps.c | 11 +- drivers/pcmcia/sa1100_xp860.c | 11 +- drivers/pcmcia/sa1100_yopy.c | 11 +- drivers/pcmcia/sa1111_generic.c | 36 ++--- drivers/pcmcia/sa1111_generic.h | 8 ++ 25 files changed, 321 insertions(+), 272 deletions(-) diff --git a/drivers/pcmcia/sa1100.h b/drivers/pcmcia/sa1100.h index 6bc54de53d2d3..839d9fa34084f 100644 --- a/drivers/pcmcia/sa1100.h +++ b/drivers/pcmcia/sa1100.h @@ -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) */ diff --git a/drivers/pcmcia/sa1100_adsbitsy.c b/drivers/pcmcia/sa1100_adsbitsy.c index 709ca0a06da1e..f01075f0669a6 100644 --- a/drivers/pcmcia/sa1100_adsbitsy.c +++ b/drivers/pcmcia/sa1100_adsbitsy.c @@ -9,8 +9,10 @@ * 7/5/01 Woojung Huh * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_assabet.c b/drivers/pcmcia/sa1100_assabet.c index 6566f6e0caa87..70b2cab006d03 100644 --- a/drivers/pcmcia/sa1100_assabet.c +++ b/drivers/pcmcia/sa1100_assabet.c @@ -5,9 +5,11 @@ * */ #include +#include #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_badge4.c b/drivers/pcmcia/sa1100_badge4.c index 09020970598cc..0b11544a1c97a 100644 --- a/drivers/pcmcia/sa1100_badge4.c +++ b/drivers/pcmcia/sa1100_badge4.c @@ -12,6 +12,7 @@ * published by the Free Software Foundation. * */ +#include #include #include #include @@ -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) diff --git a/drivers/pcmcia/sa1100_cerf.c b/drivers/pcmcia/sa1100_cerf.c index 0d7b0b4fcc3c4..235689b94828c 100644 --- a/drivers/pcmcia/sa1100_cerf.c +++ b/drivers/pcmcia/sa1100_cerf.c @@ -6,8 +6,10 @@ * */ #include +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_flexanet.c b/drivers/pcmcia/sa1100_flexanet.c index 8a4f07e9fc471..b77e6a69b4207 100644 --- a/drivers/pcmcia/sa1100_flexanet.c +++ b/drivers/pcmcia/sa1100_flexanet.c @@ -5,9 +5,10 @@ * by Jordi Colomer, 09/05/2001 * */ - +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_freebird.c b/drivers/pcmcia/sa1100_freebird.c index 50d34e429bc47..1f425d6d4b2e6 100644 --- a/drivers/pcmcia/sa1100_freebird.c +++ b/drivers/pcmcia/sa1100_freebird.c @@ -4,8 +4,10 @@ * Created by Eric Peng * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c index bc32508335c8b..87708d4ca50c8 100644 --- a/drivers/pcmcia/sa1100_generic.c +++ b/drivers/pcmcia/sa1100_generic.c @@ -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 "); diff --git a/drivers/pcmcia/sa1100_generic.h b/drivers/pcmcia/sa1100_generic.h index 45ba6c539b05e..6e118de19185e 100644 --- a/drivers/pcmcia/sa1100_generic.h +++ b/drivers/pcmcia/sa1100_generic.h @@ -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 diff --git a/drivers/pcmcia/sa1100_graphicsclient.c b/drivers/pcmcia/sa1100_graphicsclient.c index 1268e6d88018a..c989019a5cf56 100644 --- a/drivers/pcmcia/sa1100_graphicsclient.c +++ b/drivers/pcmcia/sa1100_graphicsclient.c @@ -11,9 +11,11 @@ * Fix * */ +#include #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_graphicsmaster.c b/drivers/pcmcia/sa1100_graphicsmaster.c index 34ca7f1442019..49c975ac5f131 100644 --- a/drivers/pcmcia/sa1100_graphicsmaster.c +++ b/drivers/pcmcia/sa1100_graphicsmaster.c @@ -8,8 +8,10 @@ * 7/5/01 Woojung Huh * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_h3600.c b/drivers/pcmcia/sa1100_h3600.c index 386e58d6e566f..9ee176994db21 100644 --- a/drivers/pcmcia/sa1100_h3600.c +++ b/drivers/pcmcia/sa1100_h3600.c @@ -4,8 +4,10 @@ * PCMCIA implementation routines for H3600 * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_jornada720.c b/drivers/pcmcia/sa1100_jornada720.c index ef3170a5c92b9..aca5fb50e8c07 100644 --- a/drivers/pcmcia/sa1100_jornada720.c +++ b/drivers/pcmcia/sa1100_jornada720.c @@ -4,6 +4,7 @@ * Jornada720 PCMCIA specific routines * */ +#include #include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_neponset.c b/drivers/pcmcia/sa1100_neponset.c index 296bd3ddff19c..fc260d296e620 100644 --- a/drivers/pcmcia/sa1100_neponset.c +++ b/drivers/pcmcia/sa1100_neponset.c @@ -3,6 +3,7 @@ * * Neponset PCMCIA specific routines */ +#include #include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_pangolin.c b/drivers/pcmcia/sa1100_pangolin.c index 396f9581935f5..4b6a8323eda0e 100644 --- a/drivers/pcmcia/sa1100_pangolin.c +++ b/drivers/pcmcia/sa1100_pangolin.c @@ -5,8 +5,10 @@ * */ #include +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_pfs168.c b/drivers/pcmcia/sa1100_pfs168.c index 60e9725445eb7..0812178be92af 100644 --- a/drivers/pcmcia/sa1100_pfs168.c +++ b/drivers/pcmcia/sa1100_pfs168.c @@ -5,9 +5,11 @@ * PFS168 PCMCIA specific routines * */ +#include #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_shannon.c b/drivers/pcmcia/sa1100_shannon.c index 7559b19dd3987..7524e4de0b65b 100644 --- a/drivers/pcmcia/sa1100_shannon.c +++ b/drivers/pcmcia/sa1100_shannon.c @@ -4,8 +4,10 @@ * PCMCIA implementation routines for Shannon * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_simpad.c b/drivers/pcmcia/sa1100_simpad.c index 92ca8f46f4774..7d07e94cd3f52 100644 --- a/drivers/pcmcia/sa1100_simpad.c +++ b/drivers/pcmcia/sa1100_simpad.c @@ -4,8 +4,10 @@ * PCMCIA implementation routines for simpad * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_stork.c b/drivers/pcmcia/sa1100_stork.c index 1dea8cbccbfa6..78af79ec430a8 100644 --- a/drivers/pcmcia/sa1100_stork.c +++ b/drivers/pcmcia/sa1100_stork.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_system3.c b/drivers/pcmcia/sa1100_system3.c index 3ed835b6e789b..ca61e33e8e443 100644 --- a/drivers/pcmcia/sa1100_system3.c +++ b/drivers/pcmcia/sa1100_system3.c @@ -25,9 +25,11 @@ * * */ +#include #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_trizeps.c b/drivers/pcmcia/sa1100_trizeps.c index 84c3947928c90..e8c6a55dbc371 100644 --- a/drivers/pcmcia/sa1100_trizeps.c +++ b/drivers/pcmcia/sa1100_trizeps.c @@ -9,8 +9,10 @@ * Guennadi Liakhovetski * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_xp860.c b/drivers/pcmcia/sa1100_xp860.c index 7e1179049591a..6795de670b0b5 100644 --- a/drivers/pcmcia/sa1100_xp860.c +++ b/drivers/pcmcia/sa1100_xp860.c @@ -4,9 +4,11 @@ * XP860 PCMCIA specific routines * */ +#include #include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1100_yopy.c b/drivers/pcmcia/sa1100_yopy.c index d8dfa6bb56362..ea1aabd29b3f5 100644 --- a/drivers/pcmcia/sa1100_yopy.c +++ b/drivers/pcmcia/sa1100_yopy.c @@ -4,8 +4,10 @@ * PCMCIA implementation routines for Yopy * */ +#include #include #include +#include #include #include @@ -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); } diff --git a/drivers/pcmcia/sa1111_generic.c b/drivers/pcmcia/sa1111_generic.c index 3202ee37d2766..280629806c9cf 100644 --- a/drivers/pcmcia/sa1111_generic.c +++ b/drivers/pcmcia/sa1111_generic.c @@ -12,6 +12,9 @@ #include #include +#include +#include + #include #include #include @@ -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, diff --git a/drivers/pcmcia/sa1111_generic.h b/drivers/pcmcia/sa1111_generic.h index f93c7f068cac2..76e33b8a8476b 100644 --- a/drivers/pcmcia/sa1111_generic.h +++ b/drivers/pcmcia/sa1111_generic.h @@ -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 *); + -- 2.53.0