summaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-02-24 00:12:35 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-02-24 00:12:35 +0000
commit482368b1a8e45430672c58c9a42e7d2004367126 (patch)
treece2a1a567d4d62dee7c2e71a46a99cf72cf1d606 /drivers/pcmcia
parente4d0251c6f56ab2e191afb70f80f382793e23f74 (diff)
Merge with 2.3.47. Guys, this is buggy as shit. You've been warned.
Diffstat (limited to 'drivers/pcmcia')
-rw-r--r--drivers/pcmcia/cs.c38
-rw-r--r--drivers/pcmcia/cs_internal.h2
-rw-r--r--drivers/pcmcia/i82365.c26
-rw-r--r--drivers/pcmcia/tcic.c21
4 files changed, 49 insertions, 38 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index e7c945c0c..7025263d4 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -2,7 +2,7 @@
PCMCIA Card Services -- core services
- cs.c 1.247 2000/01/15 04:30:35
+ cs.c 1.249 2000/02/10 23:26:11
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
@@ -69,7 +69,7 @@ static int handle_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data);
int pc_debug = PCMCIA_DEBUG;
MODULE_PARM(pc_debug, "i");
static const char *version =
-"cs.c 1.247 2000/01/15 04:30:35 (David Hinds)";
+"cs.c 1.249 2000/02/10 23:26:11 (David Hinds)";
#endif
#ifdef CONFIG_PCI
@@ -82,13 +82,14 @@ static const char *version =
#else
#define CB_OPT ""
#endif
-#if defined(CONFIG_APM) || defined(CONFIG_ACPI)
+#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) || defined(CONFIG_ACPI)
#define APM_OPT " [apm]"
#else
#define APM_OPT ""
#endif
#if !defined(CONFIG_CARDBUS) && !defined(CONFIG_PCI) && \
- !defined(CONFIG_APM) && !defined(CONFIG_ACPI)
+ !defined(CONFIG_APM) && !defined(CONFIG_APM_MODULE) && \
+ !defined(CONFIG_ACPI)
#define OPTIONS " none"
#else
#define OPTIONS PCI_OPT CB_OPT APM_OPT
@@ -124,7 +125,7 @@ static int cis_speed = 300; /* ns */
static int io_speed = 0; /* ns */
/* Optional features */
-#if defined(CONFIG_APM) || defined(CONFIG_ACPI)
+#if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) || defined(CONFIG_ACPI)
static int do_apm = 1;
MODULE_PARM(do_apm, "i");
#else
@@ -341,6 +342,7 @@ int register_ss_entry(int nsock, struct pccard_operations * ss_entry)
s->sock = ns;
s->setup.data = sockets;
s->setup.function = &setup_socket;
+ s->setup_timeout = 0;
s->shutdown.data = sockets;
s->shutdown.function = &shutdown_socket;
/* base address = 0, map = 0 */
@@ -486,7 +488,17 @@ static void setup_socket(u_long i)
socket_info_t *s = socket_table[i];
get_socket_status(s, &val);
- if (val & SS_DETECT) {
+ if (val & SS_PENDING) {
+ /* Does the socket need more time? */
+ DEBUG(2, "cs: setup_socket(%ld): status pending\n", i);
+ if (++s->setup_timeout > 100) {
+ printk(KERN_NOTICE "cs: socket %ld voltage interrogation"
+ " timed out\n", i);
+ } else {
+ s->setup.expires = jiffies + HZ/10;
+ add_timer(&s->setup);
+ }
+ } else if (val & SS_DETECT) {
DEBUG(1, "cs: setup_socket(%ld): applying power\n", i);
s->state |= SOCKET_PRESENT;
s->socket.flags = 0;
@@ -532,7 +544,7 @@ static void reset_socket(u_long i)
udelay((long)reset_time);
s->socket.flags &= ~SS_RESET;
set_socket(s, &s->socket);
- s->unreset_timeout = 0;
+ s->setup_timeout = 0;
s->setup.expires = jiffies + unreset_delay;
s->setup.function = &unreset_socket;
add_timer(&s->setup);
@@ -571,12 +583,11 @@ static void unreset_socket(u_long i)
}
} else {
DEBUG(2, "cs: socket %ld not ready yet\n", i);
- if (s->unreset_timeout > unreset_limit) {
+ if (++s->setup_timeout > unreset_limit) {
printk(KERN_NOTICE "cs: socket %ld timed out during"
" reset\n", i);
s->state &= ~EVENT_MASK;
} else {
- s->unreset_timeout++;
s->setup.expires = jiffies + unreset_check;
add_timer(&s->setup);
}
@@ -1156,6 +1167,8 @@ struct pci_bus *pcmcia_lookup_bus(client_handle_t handle)
return s->cap.cb_dev->subordinate;
}
+EXPORT_SYMBOL(pcmcia_lookup_bus);
+
#endif
/*======================================================================
@@ -2188,7 +2201,7 @@ int CardServices(int func, void *a1, void *a2, void *a3)
{
memory_handle_t m;
int ret = pcmcia_open_memory(a1, a2, &m);
- (memory_handle_t *)a1 = m;
+ *(memory_handle_t *)a1 = m;
return ret;
}
break;
@@ -2202,7 +2215,7 @@ int CardServices(int func, void *a1, void *a2, void *a3)
{
eraseq_handle_t w;
int ret = pcmcia_register_erase_queue(a1, a2, &w);
- (eraseq_handle_t *)a1 = w;
+ *(eraseq_handle_t *)a1 = w;
return ret;
}
break;
@@ -2227,7 +2240,7 @@ int CardServices(int func, void *a1, void *a2, void *a3)
{
window_handle_t w;
int ret = pcmcia_request_window(a1, a2, &w);
- (window_handle_t *)a1 = w;
+ *(window_handle_t *)a1 = w;
return ret;
}
break;
@@ -2297,7 +2310,6 @@ EXPORT_SYMBOL(pcmcia_get_next_window);
EXPORT_SYMBOL(pcmcia_get_status);
EXPORT_SYMBOL(pcmcia_get_tuple_data);
EXPORT_SYMBOL(pcmcia_insert_card);
-EXPORT_SYMBOL(pcmcia_lookup_bus);
EXPORT_SYMBOL(pcmcia_map_mem_page);
EXPORT_SYMBOL(pcmcia_modify_configuration);
EXPORT_SYMBOL(pcmcia_modify_window);
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h
index cac2d350a..f355c337b 100644
--- a/drivers/pcmcia/cs_internal.h
+++ b/drivers/pcmcia/cs_internal.h
@@ -131,7 +131,7 @@ typedef struct socket_info_t {
u_int real_clients;
client_handle_t reset_handle;
struct timer_list setup, shutdown;
- u_long unreset_timeout;
+ u_long setup_timeout;
pccard_mem_map cis_mem;
u_char *cis_virt;
config_t *config;
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c
index 73c177d8d..18d47d9a8 100644
--- a/drivers/pcmcia/i82365.c
+++ b/drivers/pcmcia/i82365.c
@@ -82,9 +82,9 @@ static const char *version =
static void irq_count(int, void *, struct pt_regs *);
static inline int _check_irq(int irq, int flags)
{
- if (request_irq(irq, irq_count, flags, "x", NULL) != 0)
+ if (request_irq(irq, irq_count, flags, "x", irq_count) != 0)
return -1;
- free_irq(irq, NULL);
+ free_irq(irq, irq_count);
return 0;
}
@@ -570,28 +570,26 @@ static void irq_count(int irq, void *dev, struct pt_regs *regs)
DEBUG(2, "-> hit on irq %d\n", irq);
}
-static u_int __init test_irq(u_short sock, int irq, int pci)
+static u_int __init test_irq(u_short sock, int irq)
{
- u_char csc = (pci) ? 0 : irq;
- DEBUG(2, " testing %s irq %d\n", pci ? "PCI" : "ISA", irq);
-
- if (request_irq(irq, irq_count, (pci?SA_SHIRQ:0), "scan", NULL) != 0)
+ DEBUG(2, " testing ISA irq %d\n", irq);
+ if (request_irq(irq, irq_count, 0, "scan", irq_count) != 0)
return 1;
irq_hits = 0; irq_sock = sock;
__set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(HZ/100);
if (irq_hits) {
- free_irq(irq, NULL);
+ free_irq(irq, irq_count);
DEBUG(2, " spurious hit!\n");
return 1;
}
/* Generate one interrupt */
- i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (csc << 4));
+ i365_set(sock, I365_CSCINT, I365_CSC_DETECT | (irq << 4));
i365_bset(sock, I365_GENCTL, I365_CTL_SW_IRQ);
udelay(1000);
- free_irq(irq, NULL);
+ free_irq(irq, irq_count);
/* mask all interrupts */
i365_set(sock, I365_CSCINT, 0);
@@ -617,10 +615,10 @@ static u_int __init isa_scan(u_short sock, u_int mask0)
set_bridge_state(sock);
i365_set(sock, I365_CSCINT, 0);
for (i = 0; i < 16; i++)
- if ((mask0 & (1 << i)) && (test_irq(sock, i, 0) == 0))
+ if ((mask0 & (1 << i)) && (test_irq(sock, i) == 0))
mask1 |= (1 << i);
for (i = 0; i < 16; i++)
- if ((mask1 & (1 << i)) && (test_irq(sock, i, 0) != 0))
+ if ((mask1 & (1 << i)) && (test_irq(sock, i) != 0))
mask1 ^= (1 << i);
}
@@ -1543,7 +1541,7 @@ static int __init init_i82365(void)
/* Set up interrupt handler(s) */
#ifdef CONFIG_ISA
if (grab_irq != 0)
- request_irq(cs_irq, pcic_interrupt, 0, "i82365", NULL);
+ request_irq(cs_irq, pcic_interrupt, 0, "i82365", pcic_interrupt);
#endif
if (register_ss_entry(sockets, &pcic_operations) != 0)
@@ -1573,7 +1571,7 @@ static void __exit exit_i82365(void)
del_timer(&poll_timer);
#ifdef CONFIG_ISA
if (grab_irq != 0)
- free_irq(cs_irq, NULL);
+ free_irq(cs_irq, pcic_interrupt);
#endif
for (i = 0; i < sockets; i++) {
/* Turn off all interrupt sources! */
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c
index ff25ac893..8939ea9f6 100644
--- a/drivers/pcmcia/tcic.c
+++ b/drivers/pcmcia/tcic.c
@@ -2,7 +2,7 @@
Device driver for Databook TCIC-2 PCMCIA controller
- tcic.c 1.108 1999/12/09 20:17:29
+ tcic.c 1.111 2000/02/15 04:13:12
The contents of this file are subject to the Mozilla Public
License Version 1.1 (the "License"); you may not use this file
@@ -60,7 +60,7 @@
static int pc_debug = PCMCIA_DEBUG;
MODULE_PARM(pc_debug, "i");
static const char *version =
-"tcic.c 1.108 1999/12/09 20:17:29 (David Hinds)";
+"tcic.c 1.111 2000/02/15 04:13:12 (David Hinds)";
#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
#else
#define DEBUG(n, args...)
@@ -243,11 +243,11 @@ static u_int __init try_irq(int irq)
u_short cfg;
irq_hits = 0;
- if (request_irq(irq, irq_count, 0, "irq scan", NULL) != 0)
+ if (request_irq(irq, irq_count, 0, "irq scan", irq_count) != 0)
return -1;
mdelay(10);
if (irq_hits) {
- free_irq(irq, NULL);
+ free_irq(irq, irq_count);
return -1;
}
@@ -258,7 +258,7 @@ static u_int __init try_irq(int irq)
tcic_setb(TCIC_ICSR, TCIC_ICSR_ERR | TCIC_ICSR_JAM);
udelay(1000);
- free_irq(irq, NULL);
+ free_irq(irq, irq_count);
/* Turn off interrupts */
tcic_setb(TCIC_IENA, TCIC_IENA_CFG_OFF);
@@ -299,9 +299,9 @@ static u_int __init irq_scan(u_int mask0)
/* Fallback: just find interrupts that aren't in use */
for (i = 0; i < 16; i++)
if ((mask0 & (1 << i)) &&
- (request_irq(i, irq_count, 0, "x", NULL) == 0)) {
+ (request_irq(i, irq_count, 0, "x", irq_count) == 0)) {
mask1 |= (1 << i);
- free_irq(i, NULL);
+ free_irq(i, irq_count);
}
printk("default");
}
@@ -475,7 +475,8 @@ static int __init init_tcic(void)
u_int cs_mask = mask & ((cs_irq) ? (1<<cs_irq) : ~(1<<12));
for (i = 15; i > 0; i--)
if ((cs_mask & (1 << i)) &&
- (request_irq(i, tcic_interrupt, 0, "tcic", NULL) == 0))
+ (request_irq(i, tcic_interrupt, 0, "tcic",
+ tcic_interrupt) == 0))
break;
cs_irq = i;
if (cs_irq == 0) poll_interval = HZ;
@@ -501,7 +502,7 @@ static int __init init_tcic(void)
printk(KERN_NOTICE "tcic: register_ss_entry() failed\n");
release_region(tcic_base, 16);
if (cs_irq != 0)
- free_irq(cs_irq, NULL);
+ free_irq(cs_irq, tcic_interrupt);
return -ENODEV;
}
@@ -519,7 +520,7 @@ static void __exit exit_tcic(void)
cli();
if (cs_irq != 0) {
tcic_aux_setw(TCIC_AUX_SYSCFG, TCIC_SYSCFG_AUTOBUSY|0x0a00);
- free_irq(cs_irq, NULL);
+ free_irq(cs_irq, tcic_interrupt);
}
if (tcic_timer_pending)
del_timer(&poll_timer);