aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/mtd/maps/pcmciamtd.c3
-rw-r--r--drivers/net/pcmcia/smc91c92_cs.c29
-rw-r--r--drivers/pcmcia/ds_internal.h2
-rw-r--r--drivers/pcmcia/pcmcia_resource.c23
-rw-r--r--include/pcmcia/cs.h10
5 files changed, 41 insertions, 26 deletions
diff --git a/drivers/mtd/maps/pcmciamtd.c b/drivers/mtd/maps/pcmciamtd.c
index f988c817e196..f45ff2581dd3 100644
--- a/drivers/mtd/maps/pcmciamtd.c
+++ b/drivers/mtd/maps/pcmciamtd.c
@@ -353,8 +353,7 @@ static void pcmciamtd_release(dev_link_t *link)
353 } 353 }
354 pcmcia_release_window(link->win); 354 pcmcia_release_window(link->win);
355 } 355 }
356 pcmcia_release_configuration(link->handle); 356 pcmcia_disable_device(link->handle);
357 link->state &= ~DEV_CONFIG;
358} 357}
359 358
360 359
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index 84e18bbed9d2..86942c09d8da 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -874,11 +874,8 @@ static int smc91c92_suspend(struct pcmcia_device *p_dev)
874 dev_link_t *link = dev_to_instance(p_dev); 874 dev_link_t *link = dev_to_instance(p_dev);
875 struct net_device *dev = link->priv; 875 struct net_device *dev = link->priv;
876 876
877 if (link->state & DEV_CONFIG) { 877 if ((link->state & DEV_CONFIG) && (link->open))
878 if (link->open) 878 netif_device_detach(dev);
879 netif_device_detach(dev);
880 pcmcia_release_configuration(link->handle);
881 }
882 879
883 return 0; 880 return 0;
884} 881}
@@ -894,7 +891,6 @@ static int smc91c92_resume(struct pcmcia_device *p_dev)
894 if ((smc->manfid == MANFID_MEGAHERTZ) && 891 if ((smc->manfid == MANFID_MEGAHERTZ) &&
895 (smc->cardid == PRODID_MEGAHERTZ_EM3288)) 892 (smc->cardid == PRODID_MEGAHERTZ_EM3288))
896 mhz_3288_power(link); 893 mhz_3288_power(link);
897 pcmcia_request_configuration(link->handle, &link->conf);
898 if (smc->manfid == MANFID_MOTOROLA) 894 if (smc->manfid == MANFID_MOTOROLA)
899 mot_config(link); 895 mot_config(link);
900 if ((smc->manfid == MANFID_OSITECH) && 896 if ((smc->manfid == MANFID_OSITECH) &&
@@ -963,18 +959,15 @@ static int check_sig(dev_link_t *link)
963 } 959 }
964 960
965 if (width) { 961 if (width) {
966 printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n"); 962 modconf_t mod = {
967 /* call pcmcia_release_configuration() in _suspend */ 963 .Attributes = CONF_IO_CHANGE_WIDTH,
968 smc91c92_suspend(link->handle); 964 };
969 965 printk(KERN_INFO "smc91c92_cs: using 8-bit IO window.\n");
970 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; 966
971 link->handle->socket->io[0].res->flags &= ~IO_DATA_PATH_WIDTH; 967 smc91c92_suspend(link->handle);
972 link->handle->socket->io[0].res->flags |= IO_DATA_PATH_WIDTH_8; 968 pcmcia_modify_configuration(link->handle, &mod);
973 969 smc91c92_resume(link->handle);
974 /* call pcmcia_request_configuration() in _resume, it handles the 970 return check_sig(link);
975 * flag update */
976 smc91c92_resume(link->handle);
977 return check_sig(link);
978 } 971 }
979 return -ENODEV; 972 return -ENODEV;
980} 973}
diff --git a/drivers/pcmcia/ds_internal.h b/drivers/pcmcia/ds_internal.h
index 783d8617a05c..3a2b25e6ed73 100644
--- a/drivers/pcmcia/ds_internal.h
+++ b/drivers/pcmcia/ds_internal.h
@@ -8,6 +8,8 @@ extern void pcmcia_put_dev(struct pcmcia_device *p_dev);
8 8
9struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function); 9struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int function);
10 10
11extern int pcmcia_release_configuration(struct pcmcia_device *p_dev);
12
11#ifdef CONFIG_PCMCIA_IOCTL 13#ifdef CONFIG_PCMCIA_IOCTL
12extern void __init pcmcia_setup_ioctl(void); 14extern void __init pcmcia_setup_ioctl(void);
13extern void __exit pcmcia_cleanup_ioctl(void); 15extern void __exit pcmcia_cleanup_ioctl(void);
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index f4dcea6ac44b..16504f852af2 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -442,6 +442,28 @@ int pcmcia_modify_configuration(struct pcmcia_device *p_dev,
442 (mod->Attributes & CONF_VPP2_CHANGE_VALID)) 442 (mod->Attributes & CONF_VPP2_CHANGE_VALID))
443 return CS_BAD_VPP; 443 return CS_BAD_VPP;
444 444
445 if (mod->Attributes & CONF_IO_CHANGE_WIDTH) {
446 pccard_io_map io_off = { 0, 0, 0, 0, 1 };
447 pccard_io_map io_on;
448 int i;
449
450 io_on.speed = io_speed;
451 for (i = 0; i < MAX_IO_WIN; i++) {
452 if (!s->io[i].res)
453 continue;
454 io_off.map = i;
455 io_on.map = i;
456
457 io_on.flags = MAP_ACTIVE | IO_DATA_PATH_WIDTH_8;
458 io_on.start = s->io[i].res->start;
459 io_on.stop = s->io[i].res->end;
460
461 s->ops->set_io_map(s, &io_off);
462 mdelay(40);
463 s->ops->set_io_map(s, &io_on);
464 }
465 }
466
445 return CS_SUCCESS; 467 return CS_SUCCESS;
446} /* modify_configuration */ 468} /* modify_configuration */
447EXPORT_SYMBOL(pcmcia_modify_configuration); 469EXPORT_SYMBOL(pcmcia_modify_configuration);
@@ -479,7 +501,6 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev)
479 501
480 return CS_SUCCESS; 502 return CS_SUCCESS;
481} /* pcmcia_release_configuration */ 503} /* pcmcia_release_configuration */
482EXPORT_SYMBOL(pcmcia_release_configuration);
483 504
484 505
485/** pcmcia_release_io 506/** pcmcia_release_io
diff --git a/include/pcmcia/cs.h b/include/pcmcia/cs.h
index 7b915200c116..087b3bc0489c 100644
--- a/include/pcmcia/cs.h
+++ b/include/pcmcia/cs.h
@@ -116,10 +116,11 @@ typedef struct modconf_t {
116} modconf_t; 116} modconf_t;
117 117
118/* Attributes for ModifyConfiguration */ 118/* Attributes for ModifyConfiguration */
119#define CONF_IRQ_CHANGE_VALID 0x100 119#define CONF_IRQ_CHANGE_VALID 0x0100
120#define CONF_VCC_CHANGE_VALID 0x200 120#define CONF_VCC_CHANGE_VALID 0x0200
121#define CONF_VPP1_CHANGE_VALID 0x400 121#define CONF_VPP1_CHANGE_VALID 0x0400
122#define CONF_VPP2_CHANGE_VALID 0x800 122#define CONF_VPP2_CHANGE_VALID 0x0800
123#define CONF_IO_CHANGE_WIDTH 0x1000
123 124
124/* For RequestConfiguration */ 125/* For RequestConfiguration */
125typedef struct config_req_t { 126typedef struct config_req_t {
@@ -378,7 +379,6 @@ int pcmcia_get_status(struct pcmcia_device *p_dev, cs_status_t *status);
378int pcmcia_get_mem_page(window_handle_t win, memreq_t *req); 379int pcmcia_get_mem_page(window_handle_t win, memreq_t *req);
379int pcmcia_map_mem_page(window_handle_t win, memreq_t *req); 380int pcmcia_map_mem_page(window_handle_t win, memreq_t *req);
380int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod); 381int pcmcia_modify_configuration(struct pcmcia_device *p_dev, modconf_t *mod);
381int pcmcia_release_configuration(struct pcmcia_device *p_dev);
382int pcmcia_release_window(window_handle_t win); 382int pcmcia_release_window(window_handle_t win);
383int pcmcia_request_configuration(struct pcmcia_device *p_dev, config_req_t *req); 383int pcmcia_request_configuration(struct pcmcia_device *p_dev, config_req_t *req);
384int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req); 384int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);