/*
* 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) */
* 7/5/01 Woojung Huh <whuh@applieddata.net>
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
*
*/
#include <linux/config.h>
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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 "
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);
}
* published by the Free Software Foundation.
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/device.h>
}
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,
.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)
*
*/
#include <linux/config.h>
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
* by Jordi Colomer, 09/05/2001
*
*/
-
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
*
*/
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,
.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);
}
* Created by Eric Peng <ericpeng@coventive.com>
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
{
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;
}
*
* 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;
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.
*/
*
* 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;
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);
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()
* ^^^^^^^^^^^^^^^^^^^^
*
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;
}
*/
static void __exit sa1100_pcmcia_exit(void)
{
-#ifdef CONFIG_SA1100_ASSABET
- pcmcia_assabet_exit();
-#endif
-#ifdef CONFIG_SA1100_CERF
- pcmcia_cerf_exit();
-#endif
-#ifdef CONFIG_SA1100_FLEXANET
- pcmcia_flexanet_exit();
-#endif
-#ifdef CONFIG_SA1100_FREEBIRD
- pcmcia_freebird_exit();
-#endif
-#ifdef CONFIG_SA1100_GRAPHICSCLIENT
- pcmcia_gcplus_exit();
-#endif
-#ifdef CONFIG_SA1100_H3600
- pcmcia_h3600_exit();
-#endif
-#ifdef CONFIG_SA1100_PANGOLIN
- pcmcia_pangolin_exit();
-#endif
-#ifdef CONFIG_SA1100_SHANNON
- pcmcia_shannon_exit();
-#endif
-#ifdef CONFIG_SA1100_SIMPAD
- pcmcia_simpad_exit();
-#endif
-#ifdef CONFIG_SA1100_STORK
- pcmcia_stork_exit();
-#endif
-#ifdef CONFIG_SA1100_YOPY
- pcmcia_yopy_exit();
-#endif
+ platform_device_unregister(&sa1100_pcmcia_device);
- if (pcmcia_low_level) {
- printk(KERN_ERR "PCMCIA: low level driver still registered\n");
- sa1100_unregister_pcmcia(pcmcia_low_level);
- }
#ifdef CONFIG_CPU_FREQ
cpufreq_unregister_notifier(&sa1100_pcmcia_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
#endif
+
+ driver_unregister(&sa1100_pcmcia_driver);
}
MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>");
};
struct pcmcia_low_level {
+ struct module *owner;
+
int (*init)(struct pcmcia_init *);
int (*shutdown)(void);
void (*socket_state)(int sock, struct pcmcia_state *);
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
* Fix
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/delay.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
return res;
}
+ init->socket_irq[0] = S0_STS_IRQ;
+
return 1; // 1 PCMCIA Slot
}
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);
}
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);
}
* 7/5/01 Woojung Huh <whuh@applieddata.net>
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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;
return -1;
}
- ret = sa1111_pcmcia_configure_socket(conf);
+ ret = sa1111_pcmcia_configure_socket(sock, conf);
if (ret == 0) {
unsigned long flags;
}
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);
}
* PCMCIA implementation routines for H3600
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
struct pcmcia_low_level h3600_pcmcia_ops = {
+ .owner = THIS_MODULE,
.init = h3600_pcmcia_init,
.shutdown = h3600_pcmcia_shutdown,
.socket_state = h3600_pcmcia_socket_state,
.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);
}
* Jornada720 PCMCIA specific routines
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/device.h>
return -1;
}
- ret = sa1111_pcmcia_configure_socket(conf);
+ ret = sa1111_pcmcia_configure_socket(sock, conf);
if (ret == 0) {
unsigned long flags;
}
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,
.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);
}
*
* Neponset PCMCIA specific routines
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/device.h>
}
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,
.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);
}
*
*/
#include <linux/config.h>
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
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);
}
* PFS168 PCMCIA specific routines
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/delay.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
* PCMCIA implementation routines for Shannon
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
* PCMCIA implementation routines for simpad
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/i2c.h>
#include <asm/hardware.h>
}
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,
.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);
}
*
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
+#include <linux/device.h>
#include <linux/ioport.h>
#include <asm/hardware.h>
}
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,
.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);
}
* Guennadi Liakhovetski <gl@dsa-ac.de>
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
*
******************************************************/
struct pcmcia_low_level trizeps_pcmcia_ops = {
+ .owner = THIS_MODULE,
.init = trizeps_pcmcia_init,
.shutdown = trizeps_pcmcia_shutdown,
.socket_state = trizeps_pcmcia_socket_state,
.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);
}
* XP860 PCMCIA specific routines
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
* PCMCIA implementation routines for Yopy
*
*/
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
+#include <linux/device.h>
#include <linux/init.h>
#include <asm/hardware.h>
}
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,
.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);
}
#include <linux/interrupt.h>
#include <linux/init.h>
+#include <linux/proc_fs.h>
+#include <pcmcia/ss.h>
+
#include <asm/hardware.h>
#include <asm/hardware/sa1111.h>
#include <asm/irq.h>
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;
}
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);
.drv = {
.name = "sa1111-pcmcia",
.bus = &sa1111_bus_type,
+ .devclass = &pcmcia_socket_class,
.probe = pcmcia_probe,
.remove = __devexit_p(pcmcia_remove),
.suspend = pcmcia_suspend,
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 *);
+