Commit a875f3b9 authored by Russell King's avatar Russell King

[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.
parent 0960a1f6
...@@ -192,61 +192,55 @@ struct sa1100_pcmcia_socket { ...@@ -192,61 +192,55 @@ struct sa1100_pcmcia_socket {
/* /*
* Declaration for all machine specific init/exit functions. * Declaration for all machine specific init/exit functions.
*/ */
extern int pcmcia_adsbitsy_init(void); extern int pcmcia_adsbitsy_init(struct device *);
extern void pcmcia_adsbitsy_exit(void); extern void pcmcia_adsbitsy_exit(struct device *);
extern int pcmcia_assabet_init(void); extern int pcmcia_assabet_init(struct device *);
extern void pcmcia_assabet_exit(void); extern void pcmcia_assabet_exit(struct device *);
extern int pcmcia_badge4_init(void); extern int pcmcia_badge4_init(struct device *);
extern void pcmcia_badge4_exit(void); extern void pcmcia_badge4_exit(struct device *);
extern int pcmcia_cerf_init(void); extern int pcmcia_cerf_init(struct device *);
extern void pcmcia_cerf_exit(void); extern void pcmcia_cerf_exit(struct device *);
extern int pcmcia_flexanet_init(void); extern int pcmcia_flexanet_init(struct device *);
extern void pcmcia_flexanet_exit(void); extern void pcmcia_flexanet_exit(struct device *);
extern int pcmcia_freebird_init(void); extern int pcmcia_freebird_init(struct device *);
extern void pcmcia_freebird_exit(void); extern void pcmcia_freebird_exit(struct device *);
extern int pcmcia_gcplus_init(void); extern int pcmcia_gcplus_init(struct device *);
extern void pcmcia_gcplus_exit(void); extern void pcmcia_gcplus_exit(struct device *);
extern int pcmcia_graphicsmaster_init(void); extern int pcmcia_graphicsmaster_init(struct device *);
extern void pcmcia_graphicsmaster_exit(void); extern void pcmcia_graphicsmaster_exit(struct device *);
extern int pcmcia_jornada720_init(void); extern int pcmcia_pangolin_init(struct device *);
extern void pcmcia_jornada720_exit(void); extern void pcmcia_pangolin_exit(struct device *);
extern int pcmcia_neponset_init(void); extern int pcmcia_pfs168_init(struct device *);
extern void pcmcia_neponset_exit(void); extern void pcmcia_pfs168_exit(struct device *);
extern int pcmcia_pangolin_init(void); extern int pcmcia_shannon_init(struct device *);
extern void pcmcia_pangolin_exit(void); extern void pcmcia_shannon_exit(struct device *);
extern int pcmcia_pfs168_init(void); extern int pcmcia_simpad_init(struct device *);
extern void pcmcia_pfs168_exit(void); extern void pcmcia_simpad_exit(struct device *);
extern int pcmcia_shannon_init(void); extern int pcmcia_stork_init(struct device *);
extern void pcmcia_shannon_exit(void); extern void pcmcia_stork_exit(struct device *);
extern int pcmcia_simpad_init(void); extern int pcmcia_system3_init(struct device *);
extern void pcmcia_simpad_exit(void); extern void pcmcia_system3_exit(struct device *);
extern int pcmcia_stork_init(void); extern int pcmcia_trizeps_init(struct device *);
extern void pcmcia_stork_exit(void); extern void pcmcia_trizeps_exit(struct device *);
extern int pcmcia_system3_init(void); extern int pcmcia_xp860_init(struct device *);
extern void pcmcia_system3_exit(void); extern void pcmcia_xp860_exit(struct device *);
extern int pcmcia_trizeps_init(void); extern int pcmcia_yopy_init(struct device *);
extern void pcmcia_trizeps_exit(void); extern void pcmcia_yopy_exit(struct device *);
extern int pcmcia_xp860_init(void);
extern void pcmcia_xp860_exit(void);
extern int pcmcia_yopy_init(void);
extern void pcmcia_yopy_exit(void);
#endif /* !defined(_PCMCIA_SA1100_H) */ #endif /* !defined(_PCMCIA_SA1100_H) */
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
* 7/5/01 Woojung Huh <whuh@applieddata.net> * 7/5/01 Woojung Huh <whuh@applieddata.net>
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -84,6 +86,7 @@ adsbitsy_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf) ...@@ -84,6 +86,7 @@ adsbitsy_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level adsbitsy_pcmcia_ops = { static struct pcmcia_low_level adsbitsy_pcmcia_ops = {
.owner = THIS_MODULE,
.init = adsbitsy_pcmcia_init, .init = adsbitsy_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -94,15 +97,15 @@ static struct pcmcia_low_level adsbitsy_pcmcia_ops = { ...@@ -94,15 +97,15 @@ static struct pcmcia_low_level adsbitsy_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_adsbitsy_init(void) int __init pcmcia_adsbitsy_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_adsbitsy()) if (machine_is_adsbitsy())
ret = sa1100_register_pcmcia(&adsbitsy_pcmcia_ops); ret = sa1100_register_pcmcia(&adsbitsy_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -5,9 +5,11 @@ ...@@ -5,9 +5,11 @@
* *
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -189,6 +191,7 @@ static int assabet_pcmcia_socket_suspend(int sock) ...@@ -189,6 +191,7 @@ static int assabet_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level assabet_pcmcia_ops = { static struct pcmcia_low_level assabet_pcmcia_ops = {
.owner = THIS_MODULE,
.init = assabet_pcmcia_init, .init = assabet_pcmcia_init,
.shutdown = assabet_pcmcia_shutdown, .shutdown = assabet_pcmcia_shutdown,
.socket_state = assabet_pcmcia_socket_state, .socket_state = assabet_pcmcia_socket_state,
...@@ -199,13 +202,13 @@ static struct pcmcia_low_level assabet_pcmcia_ops = { ...@@ -199,13 +202,13 @@ static struct pcmcia_low_level assabet_pcmcia_ops = {
.socket_suspend = assabet_pcmcia_socket_suspend, .socket_suspend = assabet_pcmcia_socket_suspend,
}; };
int __init pcmcia_assabet_init(void) int __init pcmcia_assabet_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_assabet()) { if (machine_is_assabet()) {
if (!machine_has_neponset()) if (!machine_has_neponset())
ret = sa1100_register_pcmcia(&assabet_pcmcia_ops); ret = sa1100_register_pcmcia(&assabet_pcmcia_ops, dev);
#ifndef CONFIG_ASSABET_NEPONSET #ifndef CONFIG_ASSABET_NEPONSET
else else
printk(KERN_ERR "Card Services disabled: missing " printk(KERN_ERR "Card Services disabled: missing "
...@@ -215,8 +218,8 @@ int __init pcmcia_assabet_init(void) ...@@ -215,8 +218,8 @@ int __init pcmcia_assabet_init(void)
return ret; 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);
} }
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h> #include <linux/device.h>
...@@ -148,6 +149,7 @@ badge4_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf) ...@@ -148,6 +149,7 @@ badge4_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level badge4_pcmcia_ops = { static struct pcmcia_low_level badge4_pcmcia_ops = {
.owner = THIS_MODULE,
.init = badge4_pcmcia_init, .init = badge4_pcmcia_init,
.shutdown = badge4_pcmcia_shutdown, .shutdown = badge4_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -158,19 +160,19 @@ static struct pcmcia_low_level badge4_pcmcia_ops = { ...@@ -158,19 +160,19 @@ static struct pcmcia_low_level badge4_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int pcmcia_badge4_init(void) int pcmcia_badge4_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_badge4()) if (machine_is_badge4())
ret = sa1100_register_pcmcia(&badge4_pcmcia_ops); ret = sa1100_register_pcmcia(&badge4_pcmcia_ops, dev);
return ret; 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) static int __init pcmv_setup(char *s)
......
...@@ -6,8 +6,10 @@ ...@@ -6,8 +6,10 @@
* *
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -156,6 +158,7 @@ static int cerf_pcmcia_socket_suspend(int sock) ...@@ -156,6 +158,7 @@ static int cerf_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level cerf_pcmcia_ops = { static struct pcmcia_low_level cerf_pcmcia_ops = {
.owner = THIS_MODULE,
.init = cerf_pcmcia_init, .init = cerf_pcmcia_init,
.shutdown = cerf_pcmcia_shutdown, .shutdown = cerf_pcmcia_shutdown,
.socket_state = cerf_pcmcia_socket_state, .socket_state = cerf_pcmcia_socket_state,
...@@ -166,17 +169,17 @@ static struct pcmcia_low_level cerf_pcmcia_ops = { ...@@ -166,17 +169,17 @@ static struct pcmcia_low_level cerf_pcmcia_ops = {
.socket_suspend = cerf_pcmcia_socket_suspend, .socket_suspend = cerf_pcmcia_socket_suspend,
}; };
int __init pcmcia_cerf_init(void) int __init pcmcia_cerf_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_cerf()) if (machine_is_cerf())
ret = sa1100_register_pcmcia(&cerf_pcmcia_ops); ret = sa1100_register_pcmcia(&cerf_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -5,9 +5,10 @@ ...@@ -5,9 +5,10 @@
* by Jordi Colomer, 09/05/2001 * by Jordi Colomer, 09/05/2001
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -217,6 +218,7 @@ static int flexanet_pcmcia_socket_suspend(int sock) ...@@ -217,6 +218,7 @@ static int flexanet_pcmcia_socket_suspend(int sock)
* *
*/ */
static struct pcmcia_low_level flexanet_pcmcia_ops = { static struct pcmcia_low_level flexanet_pcmcia_ops = {
.owner = THIS_MODULE,
.init = flexanet_pcmcia_init, .init = flexanet_pcmcia_init,
.shutdown = flexanet_pcmcia_shutdown, .shutdown = flexanet_pcmcia_shutdown,
.socket_state = flexanet_pcmcia_socket_state, .socket_state = flexanet_pcmcia_socket_state,
...@@ -227,18 +229,18 @@ static struct pcmcia_low_level flexanet_pcmcia_ops = { ...@@ -227,18 +229,18 @@ static struct pcmcia_low_level flexanet_pcmcia_ops = {
.socket_suspend = flexanet_pcmcia_socket_suspend, .socket_suspend = flexanet_pcmcia_socket_suspend,
}; };
int __init pcmcia_flexanet_init(void) int __init pcmcia_flexanet_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_flexanet()) if (machine_is_flexanet())
ret = sa1100_register_pcmcia(&flexanet_pcmcia_ops); ret = sa1100_register_pcmcia(&flexanet_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
* Created by Eric Peng <ericpeng@coventive.com> * Created by Eric Peng <ericpeng@coventive.com>
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -165,6 +167,7 @@ static int freebird_pcmcia_socket_suspend(int sock) ...@@ -165,6 +167,7 @@ static int freebird_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level freebird_pcmcia_ops = { static struct pcmcia_low_level freebird_pcmcia_ops = {
.owner = THIS_MODULE,
.init = freebird_pcmcia_init, .init = freebird_pcmcia_init,
.shutdown = freebird_pcmcia_shutdown, .shutdown = freebird_pcmcia_shutdown,
.socket_state = freebird_pcmcia_socket_state, .socket_state = freebird_pcmcia_socket_state,
...@@ -175,17 +178,17 @@ static struct pcmcia_low_level freebird_pcmcia_ops = { ...@@ -175,17 +178,17 @@ static struct pcmcia_low_level freebird_pcmcia_ops = {
.socket_suspend = freebird_pcmcia_socket_suspend, .socket_suspend = freebird_pcmcia_socket_suspend,
}; };
int __init pcmcia_freebird_init(void) int __init pcmcia_freebird_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_freebird()) if (machine_is_freebird())
ret = sa1100_register_pcmcia(&freebird_pcmcia_ops); ret = sa1100_register_pcmcia(&freebird_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -377,12 +377,16 @@ sa1100_pcmcia_register_callback(unsigned int sock, ...@@ -377,12 +377,16 @@ sa1100_pcmcia_register_callback(unsigned int sock,
{ {
struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock); struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(sock);
if (handler && !try_module_get(skt->ops->owner))
return -ENODEV;
if (handler == NULL) { if (handler == NULL) {
skt->handler = NULL; skt->handler = NULL;
} else { } else {
skt->handler_info = info; skt->handler_info = info;
skt->handler = handler; skt->handler = handler;
} }
if (!handler)
module_put(skt->ops->owner);
return 0; return 0;
} }
...@@ -918,11 +922,10 @@ static struct notifier_block sa1100_pcmcia_notifier_block = { ...@@ -918,11 +922,10 @@ static struct notifier_block sa1100_pcmcia_notifier_block = {
* *
* Register an SA1100 PCMCIA low level driver with the SA1100 core. * 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_init pcmcia_init;
struct pcmcia_state state[SA1100_PCMCIA_MAX_SOCK]; struct pcmcia_socket_class_data *cls;
struct pcmcia_state_array state_array;
unsigned int i, cpu_clock; unsigned int i, cpu_clock;
int ret; int ret;
...@@ -990,15 +993,18 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops) ...@@ -990,15 +993,18 @@ int sa1100_register_pcmcia(struct pcmcia_low_level *ops)
sa1100_pcmcia_set_mecr(skt, cpu_clock); sa1100_pcmcia_set_mecr(skt, cpu_clock);
} }
cls = kmalloc(sizeof(struct pcmcia_socket_class_data), GFP_KERNEL);
/* Only advertise as many sockets as we can detect */ if (!cls) {
ret = register_ss_entry(sa1100_pcmcia_socket_count, ret = -ENOMEM;
&sa1100_pcmcia_operations);
if (ret < 0) {
printk(KERN_ERR "Unable to register sockets\n");
goto out_err; 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. * Start the event poll timer. It will reschedule by itself afterwards.
*/ */
...@@ -1027,7 +1033,7 @@ EXPORT_SYMBOL(sa1100_register_pcmcia); ...@@ -1027,7 +1033,7 @@ EXPORT_SYMBOL(sa1100_register_pcmcia);
* *
* Unregister a previously registered pcmcia driver * 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; int i;
...@@ -1043,8 +1049,6 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops) ...@@ -1043,8 +1049,6 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops)
del_timer_sync(&poll_timer); del_timer_sync(&poll_timer);
unregister_ss_entry(&sa1100_pcmcia_operations);
for (i = 0; i < sa1100_pcmcia_socket_count; i++) { for (i = 0; i < sa1100_pcmcia_socket_count; i++) {
struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i); struct sa1100_pcmcia_socket *skt = PCMCIA_SOCKET(i);
...@@ -1058,10 +1062,71 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops) ...@@ -1058,10 +1062,71 @@ void sa1100_unregister_pcmcia(struct pcmcia_low_level *ops)
flush_scheduled_work(); flush_scheduled_work();
kfree(dev->class_data);
dev->class_data = NULL;
pcmcia_low_level = NULL; pcmcia_low_level = NULL;
} }
EXPORT_SYMBOL(sa1100_unregister_pcmcia); 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() /* sa1100_pcmcia_init()
* ^^^^^^^^^^^^^^^^^^^^ * ^^^^^^^^^^^^^^^^^^^^
* *
...@@ -1086,61 +1151,34 @@ static int __init sa1100_pcmcia_init(void) ...@@ -1086,61 +1151,34 @@ static int __init sa1100_pcmcia_init(void)
return -EINVAL; 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 #ifdef CONFIG_CPU_FREQ
ret = cpufreq_register_notifier(&sa1100_pcmcia_notifier_block, ret = cpufreq_register_notifier(&sa1100_pcmcia_notifier_block,
CPUFREQ_TRANSITION_NOTIFIER); CPUFREQ_TRANSITION_NOTIFIER);
if (ret < 0) { if (ret < 0) {
printk(KERN_ERR "Unable to register CPU frequency change " printk(KERN_ERR "Unable to register CPU frequency change "
"notifier (%d)\n", ret); "notifier (%d)\n", ret);
driver_unregister(&sa1100_pcmcia_driver);
return ret; return ret;
} }
#endif #endif
#ifdef CONFIG_SA1100_ASSABET driver_register(&sa1100_pcmcia_driver);
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
/*
* 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; return 0;
} }
...@@ -1151,48 +1189,14 @@ static int __init sa1100_pcmcia_init(void) ...@@ -1151,48 +1189,14 @@ static int __init sa1100_pcmcia_init(void)
*/ */
static void __exit sa1100_pcmcia_exit(void) static void __exit sa1100_pcmcia_exit(void)
{ {
#ifdef CONFIG_SA1100_ASSABET platform_device_unregister(&sa1100_pcmcia_device);
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
if (pcmcia_low_level) {
printk(KERN_ERR "PCMCIA: low level driver still registered\n");
sa1100_unregister_pcmcia(pcmcia_low_level);
}
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
cpufreq_unregister_notifier(&sa1100_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER); cpufreq_unregister_notifier(&sa1100_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
#endif #endif
driver_unregister(&sa1100_pcmcia_driver);
} }
MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>"); MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
......
...@@ -46,6 +46,8 @@ struct pcmcia_irq_info { ...@@ -46,6 +46,8 @@ struct pcmcia_irq_info {
}; };
struct pcmcia_low_level { struct pcmcia_low_level {
struct module *owner;
int (*init)(struct pcmcia_init *); int (*init)(struct pcmcia_init *);
int (*shutdown)(void); int (*shutdown)(void);
void (*socket_state)(int sock, struct pcmcia_state *); void (*socket_state)(int sock, struct pcmcia_state *);
...@@ -71,7 +73,7 @@ struct pcmcia_low_level { ...@@ -71,7 +73,7 @@ struct pcmcia_low_level {
unsigned int cpu_speed, unsigned int cmd_time); unsigned int cpu_speed, unsigned int cmd_time);
}; };
extern int sa1100_register_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 *); extern void sa1100_unregister_pcmcia(struct pcmcia_low_level *, struct device *);
#endif #endif
...@@ -11,9 +11,11 @@ ...@@ -11,9 +11,11 @@
* Fix * Fix
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -56,6 +58,8 @@ static int gcplus_pcmcia_init(struct pcmcia_init *init) ...@@ -56,6 +58,8 @@ static int gcplus_pcmcia_init(struct pcmcia_init *init)
return res; return res;
} }
init->socket_irq[0] = S0_STS_IRQ;
return 1; // 1 PCMCIA Slot return 1; // 1 PCMCIA Slot
} }
...@@ -71,45 +75,27 @@ static int gcplus_pcmcia_shutdown(void) ...@@ -71,45 +75,27 @@ static int gcplus_pcmcia_shutdown(void)
return 0; return 0;
} }
static int gcplus_pcmcia_socket_state(struct pcmcia_state_array static void gcplus_pcmcia_socket_state(int sock, struct pcmcia_state *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)
{ {
if (info->sock > 1) unsigned long levels = *PCMCIA_Status;
return -1;
if (sock == 0) {
if (info->sock == 0) state->detect=(levels & ADS_CS_ST_A_CD)?1:0;
info->irq = S0_STS_IRQ; state->ready=(levels & ADS_CS_ST_A_READY)?1:0;
state->bvd1= 0;
return 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) *configure)
{ {
unsigned long flags; unsigned long flags;
if(configure->sock>1) return -1; if(sock>1) return -1;
local_irq_save(flags); local_irq_save(flags);
...@@ -160,28 +146,28 @@ static int gcplus_pcmcia_socket_suspend(int sock) ...@@ -160,28 +146,28 @@ static int gcplus_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level gcplus_pcmcia_ops = { static struct pcmcia_low_level gcplus_pcmcia_ops = {
.owner = THIS_MODULE,
.init = gcplus_pcmcia_init, .init = gcplus_pcmcia_init,
.shutdown = gcplus_pcmcia_shutdown, .shutdown = gcplus_pcmcia_shutdown,
.socket_state = gcplus_pcmcia_socket_state, .socket_state = gcplus_pcmcia_socket_state,
.get_irq_info = gcplus_pcmcia_get_irq_info,
.configure_socket = gcplus_pcmcia_configure_socket, .configure_socket = gcplus_pcmcia_configure_socket,
.socket_init = gcplus_pcmcia_socket_init, .socket_init = gcplus_pcmcia_socket_init,
.socket_suspend = gcplus_pcmcia_socket_suspend, .socket_suspend = gcplus_pcmcia_socket_suspend,
}; };
int __init pcmcia_gcplus_init(void) int __init pcmcia_gcplus_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_gcplus()) if (machine_is_gcplus())
ret = sa1100_register_pcmcia(&gcplus_pcmcia_ops); ret = sa1100_register_pcmcia(&gcplus_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
* 7/5/01 Woojung Huh <whuh@applieddata.net> * 7/5/01 Woojung Huh <whuh@applieddata.net>
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -35,12 +37,12 @@ static int graphicsmaster_pcmcia_init(struct pcmcia_init *init) ...@@ -35,12 +37,12 @@ static int graphicsmaster_pcmcia_init(struct pcmcia_init *init)
} }
static int 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; unsigned int pa_dwr_mask, pa_dwr_set;
int ret; int ret;
switch (conf->sock) { switch (sock) {
case 0: case 0:
pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1; pa_dwr_mask = GPIO_GPIO0 | GPIO_GPIO1;
...@@ -69,7 +71,7 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf) ...@@ -69,7 +71,7 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf)
return -1; return -1;
} }
ret = sa1111_pcmcia_configure_socket(conf); ret = sa1111_pcmcia_configure_socket(sock, conf);
if (ret == 0) { if (ret == 0) {
unsigned long flags; unsigned long flags;
...@@ -82,28 +84,28 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf) ...@@ -82,28 +84,28 @@ graphicsmaster_pcmcia_configure_socket(const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level graphicsmaster_pcmcia_ops = { static struct pcmcia_low_level graphicsmaster_pcmcia_ops = {
.owner = THIS_MODULE,
.init = graphicsmaster_pcmcia_init, .init = graphicsmaster_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
.get_irq_info = sa1111_pcmcia_get_irq_info,
.configure_socket = graphicsmaster_pcmcia_configure_socket, .configure_socket = graphicsmaster_pcmcia_configure_socket,
.socket_init = sa1111_pcmcia_socket_init, .socket_init = sa1111_pcmcia_socket_init,
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_graphicsmaster_init(void) int __init pcmcia_graphicsmaster_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_graphicsmaster()) if (machine_is_graphicsmaster())
ret = sa1100_register_pcmcia(&graphicsmaster_pcmcia_ops); ret = sa1100_register_pcmcia(&graphicsmaster_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
* PCMCIA implementation routines for H3600 * PCMCIA implementation routines for H3600
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -186,6 +188,7 @@ static int h3600_pcmcia_socket_suspend(int sock) ...@@ -186,6 +188,7 @@ static int h3600_pcmcia_socket_suspend(int sock)
} }
struct pcmcia_low_level h3600_pcmcia_ops = { struct pcmcia_low_level h3600_pcmcia_ops = {
.owner = THIS_MODULE,
.init = h3600_pcmcia_init, .init = h3600_pcmcia_init,
.shutdown = h3600_pcmcia_shutdown, .shutdown = h3600_pcmcia_shutdown,
.socket_state = h3600_pcmcia_socket_state, .socket_state = h3600_pcmcia_socket_state,
...@@ -196,17 +199,17 @@ struct pcmcia_low_level h3600_pcmcia_ops = { ...@@ -196,17 +199,17 @@ struct pcmcia_low_level h3600_pcmcia_ops = {
.socket_suspend = h3600_pcmcia_socket_suspend, .socket_suspend = h3600_pcmcia_socket_suspend,
}; };
int __init pcmcia_h3600_init(void) int __init pcmcia_h3600_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_h3600()) if (machine_is_h3600())
ret = sa1100_register_pcmcia(&h3600_pcmcia_ops); ret = sa1100_register_pcmcia(&h3600_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
* Jornada720 PCMCIA specific routines * Jornada720 PCMCIA specific routines
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h> #include <linux/device.h>
...@@ -90,7 +91,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, ...@@ -90,7 +91,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
return -1; return -1;
} }
ret = sa1111_pcmcia_configure_socket(conf); ret = sa1111_pcmcia_configure_socket(sock, conf);
if (ret == 0) { if (ret == 0) {
unsigned long flags; unsigned long flags;
...@@ -103,6 +104,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__, ...@@ -103,6 +104,7 @@ printk("%s(): config socket %d vcc %d vpp %d\n", __FUNCTION__,
} }
static struct pcmcia_low_level jornada720_pcmcia_ops = { static struct pcmcia_low_level jornada720_pcmcia_ops = {
.owner = THIS_MODULE,
.init = jornada720_pcmcia_init, .init = jornada720_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -113,17 +115,17 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = { ...@@ -113,17 +115,17 @@ static struct pcmcia_low_level jornada720_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_jornada720_init(void) int __init pcmcia_jornada720_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_jornada720()) if (machine_is_jornada720())
ret = sa1100_register_pcmcia(&jornada720_pcmcia_ops); ret = sa1100_register_pcmcia(&jornada720_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
* *
* Neponset PCMCIA specific routines * Neponset PCMCIA specific routines
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h> #include <linux/device.h>
...@@ -127,6 +128,7 @@ neponset_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf) ...@@ -127,6 +128,7 @@ neponset_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level neponset_pcmcia_ops = { static struct pcmcia_low_level neponset_pcmcia_ops = {
.owner = THIS_MODULE,
.init = neponset_pcmcia_init, .init = neponset_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -137,17 +139,17 @@ static struct pcmcia_low_level neponset_pcmcia_ops = { ...@@ -137,17 +139,17 @@ static struct pcmcia_low_level neponset_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_neponset_init(void) int __init pcmcia_neponset_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_assabet()) if (machine_is_assabet())
ret = sa1100_register_pcmcia(&neponset_pcmcia_ops); ret = sa1100_register_pcmcia(&neponset_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -5,8 +5,10 @@ ...@@ -5,8 +5,10 @@
* *
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -151,6 +153,7 @@ static int pangolin_pcmcia_socket_suspend(int sock) ...@@ -151,6 +153,7 @@ static int pangolin_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level pangolin_pcmcia_ops = { static struct pcmcia_low_level pangolin_pcmcia_ops = {
.owner = THIS_MODULE,
.init = pangolin_pcmcia_init, .init = pangolin_pcmcia_init,
.shutdown = pangolin_pcmcia_shutdown, .shutdown = pangolin_pcmcia_shutdown,
.socket_state = pangolin_pcmcia_socket_state, .socket_state = pangolin_pcmcia_socket_state,
...@@ -161,18 +164,18 @@ static struct pcmcia_low_level pangolin_pcmcia_ops = { ...@@ -161,18 +164,18 @@ static struct pcmcia_low_level pangolin_pcmcia_ops = {
socket_suspend, pangolin_pcmcia_socket_suspend, socket_suspend, pangolin_pcmcia_socket_suspend,
}; };
int __init pcmcia_pangolin_init(void) int __init pcmcia_pangolin_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_pangolin()) if (machine_is_pangolin())
ret = sa1100_register_pcmcia(&pangolin_pcmcia_ops); ret = sa1100_register_pcmcia(&pangolin_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -5,9 +5,11 @@ ...@@ -5,9 +5,11 @@
* PFS168 PCMCIA specific routines * PFS168 PCMCIA specific routines
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -119,6 +121,7 @@ pfs168_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf) ...@@ -119,6 +121,7 @@ pfs168_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level pfs168_pcmcia_ops = { static struct pcmcia_low_level pfs168_pcmcia_ops = {
.owner = THIS_MODULE,
.init = pfs168_pcmcia_init, .init = pfs168_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -129,17 +132,17 @@ static struct pcmcia_low_level pfs168_pcmcia_ops = { ...@@ -129,17 +132,17 @@ static struct pcmcia_low_level pfs168_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_pfs168_init(void) int __init pcmcia_pfs168_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_pfs168()) if (machine_is_pfs168())
ret = sa1100_register_pcmcia(&pfs168_pcmcia_ops); ret = sa1100_register_pcmcia(&pfs168_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
* PCMCIA implementation routines for Shannon * PCMCIA implementation routines for Shannon
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -150,6 +152,7 @@ static int shannon_pcmcia_socket_suspend(int sock) ...@@ -150,6 +152,7 @@ static int shannon_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level shannon_pcmcia_ops = { static struct pcmcia_low_level shannon_pcmcia_ops = {
.owner = THIS_MODULE,
.init = shannon_pcmcia_init, .init = shannon_pcmcia_init,
.shutdown = shannon_pcmcia_shutdown, .shutdown = shannon_pcmcia_shutdown,
.socket_state = shannon_pcmcia_socket_state, .socket_state = shannon_pcmcia_socket_state,
...@@ -160,17 +163,17 @@ static struct pcmcia_low_level shannon_pcmcia_ops = { ...@@ -160,17 +163,17 @@ static struct pcmcia_low_level shannon_pcmcia_ops = {
.socket_suspend = shannon_pcmcia_socket_suspend, .socket_suspend = shannon_pcmcia_socket_suspend,
}; };
int __init pcmcia_shannon_init(void) int __init pcmcia_shannon_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_shannon()) if (machine_is_shannon())
ret = sa1100_register_pcmcia(&shannon_pcmcia_ops); ret = sa1100_register_pcmcia(&shannon_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
* PCMCIA implementation routines for simpad * PCMCIA implementation routines for simpad
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -146,6 +148,7 @@ static int simpad_pcmcia_socket_suspend(int sock) ...@@ -146,6 +148,7 @@ static int simpad_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level simpad_pcmcia_ops = { static struct pcmcia_low_level simpad_pcmcia_ops = {
.owner = THIS_MODULE,
.init = simpad_pcmcia_init, .init = simpad_pcmcia_init,
.shutdown = simpad_pcmcia_shutdown, .shutdown = simpad_pcmcia_shutdown,
.socket_state = simpad_pcmcia_socket_state, .socket_state = simpad_pcmcia_socket_state,
...@@ -156,17 +159,17 @@ static struct pcmcia_low_level simpad_pcmcia_ops = { ...@@ -156,17 +159,17 @@ static struct pcmcia_low_level simpad_pcmcia_ops = {
.socket_suspend = simpad_pcmcia_socket_suspend, .socket_suspend = simpad_pcmcia_socket_suspend,
}; };
int __init pcmcia_simpad_init(void) int __init pcmcia_simpad_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_simpad()) if (machine_is_simpad())
ret = sa1100_register_pcmcia(&simpad_pcmcia_ops); ret = sa1100_register_pcmcia(&simpad_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -226,6 +227,7 @@ static int stork_pcmcia_socket_suspend(int sock) ...@@ -226,6 +227,7 @@ static int stork_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level stork_pcmcia_ops = { static struct pcmcia_low_level stork_pcmcia_ops = {
.owner = THIS_MODULE,
.init = stork_pcmcia_init, .init = stork_pcmcia_init,
.shutdown = stork_pcmcia_shutdown, .shutdown = stork_pcmcia_shutdown,
.socket_state = stork_pcmcia_socket_state, .socket_state = stork_pcmcia_socket_state,
...@@ -236,18 +238,18 @@ static struct pcmcia_low_level stork_pcmcia_ops = { ...@@ -236,18 +238,18 @@ static struct pcmcia_low_level stork_pcmcia_ops = {
.socket_suspend = stork_pcmcia_socket_suspend, .socket_suspend = stork_pcmcia_socket_suspend,
}; };
int __init pcmcia_stork_init(void) int __init pcmcia_stork_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_stork()) if (machine_is_stork())
ret = sa1100_register_pcmcia(&stork_pcmcia_ops); ret = sa1100_register_pcmcia(&stork_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -25,9 +25,11 @@ ...@@ -25,9 +25,11 @@
* *
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/device.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -99,8 +101,9 @@ static void system3_pcmcia_socket_state(int sock, struct pcmcia_state *state) ...@@ -99,8 +101,9 @@ static void system3_pcmcia_socket_state(int sock, struct pcmcia_state *state)
} }
struct pcmcia_low_level system3_pcmcia_ops = { struct pcmcia_low_level system3_pcmcia_ops = {
.init = system3_pcmcia_init, .owner = THIS_MODULE,
.shutdown = system3_pcmcia_shutdown, .init = system3_pcmcia_init,
.shutdown = system3_pcmcia_shutdown,
.socket_state = system3_pcmcia_socket_state, .socket_state = system3_pcmcia_socket_state,
.get_irq_info = sa1111_pcmcia_get_irq_info, .get_irq_info = sa1111_pcmcia_get_irq_info,
.configure_socket = system3_pcmcia_configure_socket, .configure_socket = system3_pcmcia_configure_socket,
...@@ -109,17 +112,17 @@ struct pcmcia_low_level system3_pcmcia_ops = { ...@@ -109,17 +112,17 @@ struct pcmcia_low_level system3_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_system3_init(void) int __init pcmcia_system3_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_pt_system3()) if (machine_is_pt_system3())
ret = sa1100_register_pcmcia(&system3_pcmcia_ops); ret = sa1100_register_pcmcia(&system3_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
* Guennadi Liakhovetski <gl@dsa-ac.de> * Guennadi Liakhovetski <gl@dsa-ac.de>
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -186,6 +188,7 @@ static int trizeps_pcmcia_socket_suspend(int sock) ...@@ -186,6 +188,7 @@ static int trizeps_pcmcia_socket_suspend(int sock)
* *
******************************************************/ ******************************************************/
struct pcmcia_low_level trizeps_pcmcia_ops = { struct pcmcia_low_level trizeps_pcmcia_ops = {
.owner = THIS_MODULE,
.init = trizeps_pcmcia_init, .init = trizeps_pcmcia_init,
.shutdown = trizeps_pcmcia_shutdown, .shutdown = trizeps_pcmcia_shutdown,
.socket_state = trizeps_pcmcia_socket_state, .socket_state = trizeps_pcmcia_socket_state,
...@@ -195,15 +198,15 @@ struct pcmcia_low_level trizeps_pcmcia_ops = { ...@@ -195,15 +198,15 @@ struct pcmcia_low_level trizeps_pcmcia_ops = {
.socket_suspend = trizeps_pcmcia_socket_suspend, .socket_suspend = trizeps_pcmcia_socket_suspend,
}; };
int __init pcmcia_trizeps_init(void) int __init pcmcia_trizeps_init(struct device *dev)
{ {
if (machine_is_trizeps()) { if (machine_is_trizeps()) {
return sa1100_register_pcmcia(&trizeps_pcmcia_ops); return sa1100_register_pcmcia(&trizeps_pcmcia_ops, dev);
} }
return -ENODEV; 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);
} }
...@@ -4,9 +4,11 @@ ...@@ -4,9 +4,11 @@
* XP860 PCMCIA specific routines * XP860 PCMCIA specific routines
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -132,6 +134,7 @@ xp860_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf) ...@@ -132,6 +134,7 @@ xp860_pcmcia_configure_socket(int sock, const struct pcmcia_configure *conf)
} }
static struct pcmcia_low_level xp860_pcmcia_ops = { static struct pcmcia_low_level xp860_pcmcia_ops = {
.owner = THIS_MODULE,
.init = xp860_pcmcia_init, .init = xp860_pcmcia_init,
.shutdown = sa1111_pcmcia_shutdown, .shutdown = sa1111_pcmcia_shutdown,
.socket_state = sa1111_pcmcia_socket_state, .socket_state = sa1111_pcmcia_socket_state,
...@@ -142,18 +145,18 @@ static struct pcmcia_low_level xp860_pcmcia_ops = { ...@@ -142,18 +145,18 @@ static struct pcmcia_low_level xp860_pcmcia_ops = {
.socket_suspend = sa1111_pcmcia_socket_suspend, .socket_suspend = sa1111_pcmcia_socket_suspend,
}; };
int __init pcmcia_xp860_init(void) int __init pcmcia_xp860_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_xp860()) if (machine_is_xp860())
ret = sa1100_register_pcmcia(&xp860_pcmcia_ops); ret = sa1100_register_pcmcia(&xp860_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
* PCMCIA implementation routines for Yopy * PCMCIA implementation routines for Yopy
* *
*/ */
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/device.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/hardware.h> #include <asm/hardware.h>
...@@ -153,6 +155,7 @@ static int yopy_pcmcia_socket_suspend(int sock) ...@@ -153,6 +155,7 @@ static int yopy_pcmcia_socket_suspend(int sock)
} }
static struct pcmcia_low_level yopy_pcmcia_ops = { static struct pcmcia_low_level yopy_pcmcia_ops = {
.owner = THIS_MODULE,
.init = yopy_pcmcia_init, .init = yopy_pcmcia_init,
.shutdown = yopy_pcmcia_shutdown, .shutdown = yopy_pcmcia_shutdown,
.socket_state = yopy_pcmcia_socket_state, .socket_state = yopy_pcmcia_socket_state,
...@@ -163,18 +166,18 @@ static struct pcmcia_low_level yopy_pcmcia_ops = { ...@@ -163,18 +166,18 @@ static struct pcmcia_low_level yopy_pcmcia_ops = {
.socket_suspend = yopy_pcmcia_socket_suspend, .socket_suspend = yopy_pcmcia_socket_suspend,
}; };
int __init pcmcia_yopy_init(void) int __init pcmcia_yopy_init(struct device *dev)
{ {
int ret = -ENODEV; int ret = -ENODEV;
if (machine_is_yopy()) if (machine_is_yopy())
ret = sa1100_register_pcmcia(&yopy_pcmcia_ops); ret = sa1100_register_pcmcia(&yopy_pcmcia_ops, dev);
return ret; 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);
} }
...@@ -12,6 +12,9 @@ ...@@ -12,6 +12,9 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/proc_fs.h>
#include <pcmcia/ss.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/hardware/sa1111.h> #include <asm/hardware/sa1111.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -206,28 +209,28 @@ static int pcmcia_probe(struct device *dev) ...@@ -206,28 +209,28 @@ static int pcmcia_probe(struct device *dev)
sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + SA1111_PCCR); sa1111_writel(PCCR_S0_FLT | PCCR_S1_FLT, base + SA1111_PCCR);
#ifdef CONFIG_SA1100_ADSBITSY #ifdef CONFIG_SA1100_ADSBITSY
pcmcia_adsbitsy_init(); pcmcia_adsbitsy_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_BADGE4 #ifdef CONFIG_SA1100_BADGE4
pcmcia_badge4_init(); pcmcia_badge4_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_GRAPHICSMASTER #ifdef CONFIG_SA1100_GRAPHICSMASTER
pcmcia_graphicsmaster_init(); pcmcia_graphicsmaster_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_JORNADA720 #ifdef CONFIG_SA1100_JORNADA720
pcmcia_jornada720_init(); pcmcia_jornada720_init(dev);
#endif #endif
#ifdef CONFIG_ASSABET_NEPONSET #ifdef CONFIG_ASSABET_NEPONSET
pcmcia_neponset_init(); pcmcia_neponset_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_PFS168 #ifdef CONFIG_SA1100_PFS168
pcmcia_pfs_init(); pcmcia_pfs_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_PT_SYSTEM3 #ifdef CONFIG_SA1100_PT_SYSTEM3
pcmcia_system3_init(); pcmcia_system3_init(dev);
#endif #endif
#ifdef CONFIG_SA1100_XP860 #ifdef CONFIG_SA1100_XP860
pcmcia_xp860_init(); pcmcia_xp860_init(dev);
#endif #endif
return 0; return 0;
} }
...@@ -237,28 +240,28 @@ static int __devexit pcmcia_remove(struct device *dev) ...@@ -237,28 +240,28 @@ static int __devexit pcmcia_remove(struct device *dev)
struct sa1111_dev *sadev = SA1111_DEV(dev); struct sa1111_dev *sadev = SA1111_DEV(dev);
#ifdef CONFIG_SA1100_ADSBITSY #ifdef CONFIG_SA1100_ADSBITSY
pcmcia_adsbitsy_exit(); pcmcia_adsbitsy_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_BADGE4 #ifdef CONFIG_SA1100_BADGE4
pcmcia_badge4_exit(); pcmcia_badge4_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_GRAPHICSMASTER #ifdef CONFIG_SA1100_GRAPHICSMASTER
pcmcia_graphicsmaster_exit(); pcmcia_graphicsmaster_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_JORNADA720 #ifdef CONFIG_SA1100_JORNADA720
pcmcia_jornada720_exit(); pcmcia_jornada720_exit(dev);
#endif #endif
#ifdef CONFIG_ASSABET_NEPONSET #ifdef CONFIG_ASSABET_NEPONSET
pcmcia_neponset_exit(); pcmcia_neponset_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_PFS168 #ifdef CONFIG_SA1100_PFS168
pcmcia_pfs_exit(); pcmcia_pfs_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_PT_SYSTEM3 #ifdef CONFIG_SA1100_PT_SYSTEM3
pcmcia_system3_exit(); pcmcia_system3_exit(dev);
#endif #endif
#ifdef CONFIG_SA1100_XP860 #ifdef CONFIG_SA1100_XP860
pcmcia_xp860_exit(); pcmcia_xp860_exit(dev);
#endif #endif
release_mem_region(sadev->res.start, 512); release_mem_region(sadev->res.start, 512);
...@@ -281,6 +284,7 @@ static struct sa1111_driver pcmcia_driver = { ...@@ -281,6 +284,7 @@ static struct sa1111_driver pcmcia_driver = {
.drv = { .drv = {
.name = "sa1111-pcmcia", .name = "sa1111-pcmcia",
.bus = &sa1111_bus_type, .bus = &sa1111_bus_type,
.devclass = &pcmcia_socket_class,
.probe = pcmcia_probe, .probe = pcmcia_probe,
.remove = __devexit_p(pcmcia_remove), .remove = __devexit_p(pcmcia_remove),
.suspend = pcmcia_suspend, .suspend = pcmcia_suspend,
......
...@@ -5,3 +5,11 @@ extern int sa1111_pcmcia_get_irq_info(struct pcmcia_irq_info *); ...@@ -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_configure_socket(int sock, const struct pcmcia_configure *);
extern int sa1111_pcmcia_socket_init(int); extern int sa1111_pcmcia_socket_init(int);
extern int sa1111_pcmcia_socket_suspend(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 *);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment