diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/pcmcia/axnet_cs.c | 3 | ||||
-rw-r--r-- | drivers/net/pcmcia/nmclan_cs.c | 21 | ||||
-rw-r--r-- | drivers/net/pcmcia/xirc2ps_cs.c | 16 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 91 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/spectrum_cs.c | 32 | ||||
-rw-r--r-- | drivers/pcmcia/cistpl.c | 7 | ||||
-rw-r--r-- | drivers/pcmcia/cs_internal.h | 4 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 70 | ||||
-rw-r--r-- | drivers/serial/serial_cs.c | 8 | ||||
-rw-r--r-- | drivers/ssb/pcmcia.c | 14 |
10 files changed, 102 insertions, 164 deletions
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 467fd4bfb2bd..ee0a6d036f94 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
@@ -378,8 +378,7 @@ static int axnet_config(struct pcmcia_device *link) | |||
378 | /* Maybe PHY is in power down mode. (PPD_SET = 1) | 378 | /* Maybe PHY is in power down mode. (PPD_SET = 1) |
379 | Bit 2 of CCSR is active low. */ | 379 | Bit 2 of CCSR is active low. */ |
380 | if (i == 32) { | 380 | if (i == 32) { |
381 | conf_reg_t reg = { 0, CS_WRITE, CISREG_CCSR, 0x04 }; | 381 | pcmcia_write_config_byte(link, CISREG_CCSR, 0x04); |
382 | pcmcia_access_configuration_register(link, ®); | ||
383 | for (i = 0; i < 32; i++) { | 382 | for (i = 0; i < 32; i++) { |
384 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); | 383 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); |
385 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); | 384 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); |
diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c index c0eacfae1512..c0d85af3e942 100644 --- a/drivers/net/pcmcia/nmclan_cs.c +++ b/drivers/net/pcmcia/nmclan_cs.c | |||
@@ -757,29 +757,20 @@ static void nmclan_reset(struct net_device *dev) | |||
757 | 757 | ||
758 | #if RESET_XILINX | 758 | #if RESET_XILINX |
759 | struct pcmcia_device *link = &lp->link; | 759 | struct pcmcia_device *link = &lp->link; |
760 | conf_reg_t reg; | 760 | u8 OrigCorValue; |
761 | u_long OrigCorValue; | ||
762 | 761 | ||
763 | /* Save original COR value */ | 762 | /* Save original COR value */ |
764 | reg.Function = 0; | 763 | pcmcia_read_config_byte(link, CISREG_COR, &OrigCorValue); |
765 | reg.Action = CS_READ; | ||
766 | reg.Offset = CISREG_COR; | ||
767 | reg.Value = 0; | ||
768 | pcmcia_access_configuration_register(link, ®); | ||
769 | OrigCorValue = reg.Value; | ||
770 | 764 | ||
771 | /* Reset Xilinx */ | 765 | /* Reset Xilinx */ |
772 | reg.Action = CS_WRITE; | 766 | dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%x, resetting...\n", |
773 | reg.Offset = CISREG_COR; | ||
774 | dev_dbg(&link->dev, "nmclan_reset: OrigCorValue=0x%lX, resetting...\n", | ||
775 | OrigCorValue); | 767 | OrigCorValue); |
776 | reg.Value = COR_SOFT_RESET; | 768 | pcmcia_write_config_byte(link, CISREG_COR, COR_SOFT_RESET); |
777 | pcmcia_access_configuration_register(link, ®); | ||
778 | /* Need to wait for 20 ms for PCMCIA to finish reset. */ | 769 | /* Need to wait for 20 ms for PCMCIA to finish reset. */ |
779 | 770 | ||
780 | /* Restore original COR configuration index */ | 771 | /* Restore original COR configuration index */ |
781 | reg.Value = COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK); | 772 | pcmcia_write_config_byte(link, CISREG_COR, |
782 | pcmcia_access_configuration_register(link, ®); | 773 | (COR_LEVEL_REQ | (OrigCorValue & COR_CONFIG_MASK))); |
783 | /* Xilinx is now completely reset along with the MACE chip. */ | 774 | /* Xilinx is now completely reset along with the MACE chip. */ |
784 | lp->tx_free_frames=AM2150_MAX_TX_FRAMES; | 775 | lp->tx_free_frames=AM2150_MAX_TX_FRAMES; |
785 | 776 | ||
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index a7662f0832eb..e3a85ce89880 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
@@ -869,7 +869,6 @@ xirc2ps_config(struct pcmcia_device * link) | |||
869 | goto config_error; | 869 | goto config_error; |
870 | 870 | ||
871 | if (local->dingo) { | 871 | if (local->dingo) { |
872 | conf_reg_t reg; | ||
873 | win_req_t req; | 872 | win_req_t req; |
874 | memreq_t mem; | 873 | memreq_t mem; |
875 | 874 | ||
@@ -878,15 +877,14 @@ xirc2ps_config(struct pcmcia_device * link) | |||
878 | * the base address of the ethernet port (BasePort1) is written | 877 | * the base address of the ethernet port (BasePort1) is written |
879 | * to the BAR registers of the modem. | 878 | * to the BAR registers of the modem. |
880 | */ | 879 | */ |
881 | reg.Action = CS_WRITE; | 880 | err = pcmcia_write_config_byte(link, CISREG_IOBASE_0, |
882 | reg.Offset = CISREG_IOBASE_0; | 881 | link->io.BasePort2 & 0xff); |
883 | reg.Value = link->io.BasePort2 & 0xff; | 882 | if (err) |
884 | if ((err = pcmcia_access_configuration_register(link, ®))) | ||
885 | goto config_error; | 883 | goto config_error; |
886 | reg.Action = CS_WRITE; | 884 | |
887 | reg.Offset = CISREG_IOBASE_1; | 885 | err = pcmcia_write_config_byte(link, CISREG_IOBASE_1, |
888 | reg.Value = (link->io.BasePort2 >> 8) & 0xff; | 886 | (link->io.BasePort2 >> 8) & 0xff); |
889 | if ((err = pcmcia_access_configuration_register(link, ®))) | 887 | if (err) |
890 | goto config_error; | 888 | goto config_error; |
891 | 889 | ||
892 | /* There is no config entry for the Ethernet part which | 890 | /* There is no config entry for the Ethernet part which |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 2f4b6d4350ab..691293675a93 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -224,27 +224,18 @@ static int prism2_pccard_card_present(local_info_t *local) | |||
224 | static void sandisk_set_iobase(local_info_t *local) | 224 | static void sandisk_set_iobase(local_info_t *local) |
225 | { | 225 | { |
226 | int res; | 226 | int res; |
227 | conf_reg_t reg; | ||
228 | struct hostap_cs_priv *hw_priv = local->hw_priv; | 227 | struct hostap_cs_priv *hw_priv = local->hw_priv; |
229 | 228 | ||
230 | reg.Function = 0; | 229 | res = pcmcia_write_config_byte(hw_priv->link, 0x10, |
231 | reg.Action = CS_WRITE; | 230 | hw_priv->link->io.BasePort1 & 0x00ff); |
232 | reg.Offset = 0x10; /* 0x3f0 IO base 1 */ | ||
233 | reg.Value = hw_priv->link->io.BasePort1 & 0x00ff; | ||
234 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
235 | ®); | ||
236 | if (res != 0) { | 231 | if (res != 0) { |
237 | printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -" | 232 | printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -" |
238 | " res=%d\n", res); | 233 | " res=%d\n", res); |
239 | } | 234 | } |
240 | udelay(10); | 235 | udelay(10); |
241 | 236 | ||
242 | reg.Function = 0; | 237 | res = pcmcia_write_config_byte(hw_priv->link, 0x12, |
243 | reg.Action = CS_WRITE; | 238 | (hw_priv->link->io.BasePort1 >> 8) & 0x00ff); |
244 | reg.Offset = 0x12; /* 0x3f2 IO base 2 */ | ||
245 | reg.Value = (hw_priv->link->io.BasePort1 & 0xff00) >> 8; | ||
246 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
247 | ®); | ||
248 | if (res != 0) { | 239 | if (res != 0) { |
249 | printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -" | 240 | printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -" |
250 | " res=%d\n", res); | 241 | " res=%d\n", res); |
@@ -270,7 +261,6 @@ static void sandisk_write_hcr(local_info_t *local, int hcr) | |||
270 | static int sandisk_enable_wireless(struct net_device *dev) | 261 | static int sandisk_enable_wireless(struct net_device *dev) |
271 | { | 262 | { |
272 | int res, ret = 0; | 263 | int res, ret = 0; |
273 | conf_reg_t reg; | ||
274 | struct hostap_interface *iface = netdev_priv(dev); | 264 | struct hostap_interface *iface = netdev_priv(dev); |
275 | local_info_t *local = iface->local; | 265 | local_info_t *local = iface->local; |
276 | struct hostap_cs_priv *hw_priv = local->hw_priv; | 266 | struct hostap_cs_priv *hw_priv = local->hw_priv; |
@@ -297,12 +287,8 @@ static int sandisk_enable_wireless(struct net_device *dev) | |||
297 | " - using vendor-specific initialization\n", dev->name); | 287 | " - using vendor-specific initialization\n", dev->name); |
298 | hw_priv->sandisk_connectplus = 1; | 288 | hw_priv->sandisk_connectplus = 1; |
299 | 289 | ||
300 | reg.Function = 0; | 290 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, |
301 | reg.Action = CS_WRITE; | 291 | COR_SOFT_RESET); |
302 | reg.Offset = CISREG_COR; | ||
303 | reg.Value = COR_SOFT_RESET; | ||
304 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
305 | ®); | ||
306 | if (res != 0) { | 292 | if (res != 0) { |
307 | printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", | 293 | printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", |
308 | dev->name, res); | 294 | dev->name, res); |
@@ -310,16 +296,13 @@ static int sandisk_enable_wireless(struct net_device *dev) | |||
310 | } | 296 | } |
311 | mdelay(5); | 297 | mdelay(5); |
312 | 298 | ||
313 | reg.Function = 0; | ||
314 | reg.Action = CS_WRITE; | ||
315 | reg.Offset = CISREG_COR; | ||
316 | /* | 299 | /* |
317 | * Do not enable interrupts here to avoid some bogus events. Interrupts | 300 | * Do not enable interrupts here to avoid some bogus events. Interrupts |
318 | * will be enabled during the first cor_sreset call. | 301 | * will be enabled during the first cor_sreset call. |
319 | */ | 302 | */ |
320 | reg.Value = COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | COR_FUNC_ENA; | 303 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, |
321 | res = pcmcia_access_configuration_register(hw_priv->link, | 304 | (COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | |
322 | ®); | 305 | COR_FUNC_ENA)); |
323 | if (res != 0) { | 306 | if (res != 0) { |
324 | printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", | 307 | printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n", |
325 | dev->name, res); | 308 | dev->name, res); |
@@ -342,30 +325,23 @@ done: | |||
342 | static void prism2_pccard_cor_sreset(local_info_t *local) | 325 | static void prism2_pccard_cor_sreset(local_info_t *local) |
343 | { | 326 | { |
344 | int res; | 327 | int res; |
345 | conf_reg_t reg; | 328 | u8 val; |
346 | struct hostap_cs_priv *hw_priv = local->hw_priv; | 329 | struct hostap_cs_priv *hw_priv = local->hw_priv; |
347 | 330 | ||
348 | if (!prism2_pccard_card_present(local)) | 331 | if (!prism2_pccard_card_present(local)) |
349 | return; | 332 | return; |
350 | 333 | ||
351 | reg.Function = 0; | 334 | res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &val); |
352 | reg.Action = CS_READ; | ||
353 | reg.Offset = CISREG_COR; | ||
354 | reg.Value = 0; | ||
355 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
356 | ®); | ||
357 | if (res != 0) { | 335 | if (res != 0) { |
358 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n", | 336 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n", |
359 | res); | 337 | res); |
360 | return; | 338 | return; |
361 | } | 339 | } |
362 | printk(KERN_DEBUG "prism2_pccard_cor_sreset: original COR %02x\n", | 340 | printk(KERN_DEBUG "prism2_pccard_cor_sreset: original COR %02x\n", |
363 | reg.Value); | 341 | val); |
364 | 342 | ||
365 | reg.Action = CS_WRITE; | 343 | val |= COR_SOFT_RESET; |
366 | reg.Value |= COR_SOFT_RESET; | 344 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val); |
367 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
368 | ®); | ||
369 | if (res != 0) { | 345 | if (res != 0) { |
370 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n", | 346 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n", |
371 | res); | 347 | res); |
@@ -374,11 +350,10 @@ static void prism2_pccard_cor_sreset(local_info_t *local) | |||
374 | 350 | ||
375 | mdelay(hw_priv->sandisk_connectplus ? 5 : 2); | 351 | mdelay(hw_priv->sandisk_connectplus ? 5 : 2); |
376 | 352 | ||
377 | reg.Value &= ~COR_SOFT_RESET; | 353 | val &= ~COR_SOFT_RESET; |
378 | if (hw_priv->sandisk_connectplus) | 354 | if (hw_priv->sandisk_connectplus) |
379 | reg.Value |= COR_IREQ_ENA; | 355 | val |= COR_IREQ_ENA; |
380 | res = pcmcia_access_configuration_register(hw_priv->link, | 356 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, val); |
381 | ®); | ||
382 | if (res != 0) { | 357 | if (res != 0) { |
383 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n", | 358 | printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n", |
384 | res); | 359 | res); |
@@ -395,8 +370,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local) | |||
395 | static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) | 370 | static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) |
396 | { | 371 | { |
397 | int res; | 372 | int res; |
398 | conf_reg_t reg; | 373 | u8 old_cor; |
399 | int old_cor; | ||
400 | struct hostap_cs_priv *hw_priv = local->hw_priv; | 374 | struct hostap_cs_priv *hw_priv = local->hw_priv; |
401 | 375 | ||
402 | if (!prism2_pccard_card_present(local)) | 376 | if (!prism2_pccard_card_present(local)) |
@@ -407,25 +381,17 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) | |||
407 | return; | 381 | return; |
408 | } | 382 | } |
409 | 383 | ||
410 | reg.Function = 0; | 384 | res = pcmcia_read_config_byte(hw_priv->link, CISREG_COR, &old_cor); |
411 | reg.Action = CS_READ; | ||
412 | reg.Offset = CISREG_COR; | ||
413 | reg.Value = 0; | ||
414 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
415 | ®); | ||
416 | if (res != 0) { | 385 | if (res != 0) { |
417 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 " | 386 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 " |
418 | "(%d)\n", res); | 387 | "(%d)\n", res); |
419 | return; | 388 | return; |
420 | } | 389 | } |
421 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset: original COR %02x\n", | 390 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset: original COR %02x\n", |
422 | reg.Value); | 391 | old_cor); |
423 | old_cor = reg.Value; | ||
424 | 392 | ||
425 | reg.Action = CS_WRITE; | 393 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, |
426 | reg.Value |= COR_SOFT_RESET; | 394 | old_cor | COR_SOFT_RESET); |
427 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
428 | ®); | ||
429 | if (res != 0) { | 395 | if (res != 0) { |
430 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 " | 396 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 " |
431 | "(%d)\n", res); | 397 | "(%d)\n", res); |
@@ -435,11 +401,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) | |||
435 | mdelay(10); | 401 | mdelay(10); |
436 | 402 | ||
437 | /* Setup Genesis mode */ | 403 | /* Setup Genesis mode */ |
438 | reg.Action = CS_WRITE; | 404 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_CCSR, hcr); |
439 | reg.Value = hcr; | ||
440 | reg.Offset = CISREG_CCSR; | ||
441 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
442 | ®); | ||
443 | if (res != 0) { | 405 | if (res != 0) { |
444 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 " | 406 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 " |
445 | "(%d)\n", res); | 407 | "(%d)\n", res); |
@@ -447,11 +409,8 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr) | |||
447 | } | 409 | } |
448 | mdelay(10); | 410 | mdelay(10); |
449 | 411 | ||
450 | reg.Action = CS_WRITE; | 412 | res = pcmcia_write_config_byte(hw_priv->link, CISREG_COR, |
451 | reg.Offset = CISREG_COR; | 413 | old_cor & ~COR_SOFT_RESET); |
452 | reg.Value = old_cor & ~COR_SOFT_RESET; | ||
453 | res = pcmcia_access_configuration_register(hw_priv->link, | ||
454 | ®); | ||
455 | if (res != 0) { | 414 | if (res != 0) { |
456 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 " | 415 | printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 " |
457 | "(%d)\n", res); | 416 | "(%d)\n", res); |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index cad30e499dba..39399cd2e683 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
@@ -79,35 +79,27 @@ static int | |||
79 | spectrum_reset(struct pcmcia_device *link, int idle) | 79 | spectrum_reset(struct pcmcia_device *link, int idle) |
80 | { | 80 | { |
81 | int ret; | 81 | int ret; |
82 | conf_reg_t reg; | 82 | u8 save_cor; |
83 | u_int save_cor; | 83 | u8 ccsr; |
84 | 84 | ||
85 | /* Doing it if hardware is gone is guaranteed crash */ | 85 | /* Doing it if hardware is gone is guaranteed crash */ |
86 | if (!pcmcia_dev_present(link)) | 86 | if (!pcmcia_dev_present(link)) |
87 | return -ENODEV; | 87 | return -ENODEV; |
88 | 88 | ||
89 | /* Save original COR value */ | 89 | /* Save original COR value */ |
90 | reg.Function = 0; | 90 | ret = pcmcia_read_config_byte(link, CISREG_COR, &save_cor); |
91 | reg.Action = CS_READ; | ||
92 | reg.Offset = CISREG_COR; | ||
93 | ret = pcmcia_access_configuration_register(link, ®); | ||
94 | if (ret) | 91 | if (ret) |
95 | goto failed; | 92 | goto failed; |
96 | save_cor = reg.Value; | ||
97 | 93 | ||
98 | /* Soft-Reset card */ | 94 | /* Soft-Reset card */ |
99 | reg.Action = CS_WRITE; | 95 | ret = pcmcia_write_config_byte(link, CISREG_COR, |
100 | reg.Offset = CISREG_COR; | 96 | (save_cor | COR_SOFT_RESET)); |
101 | reg.Value = (save_cor | COR_SOFT_RESET); | ||
102 | ret = pcmcia_access_configuration_register(link, ®); | ||
103 | if (ret) | 97 | if (ret) |
104 | goto failed; | 98 | goto failed; |
105 | udelay(1000); | 99 | udelay(1000); |
106 | 100 | ||
107 | /* Read CCSR */ | 101 | /* Read CCSR */ |
108 | reg.Action = CS_READ; | 102 | ret = pcmcia_read_config_byte(link, CISREG_CCSR, &ccsr); |
109 | reg.Offset = CISREG_CCSR; | ||
110 | ret = pcmcia_access_configuration_register(link, ®); | ||
111 | if (ret) | 103 | if (ret) |
112 | goto failed; | 104 | goto failed; |
113 | 105 | ||
@@ -115,19 +107,15 @@ spectrum_reset(struct pcmcia_device *link, int idle) | |||
115 | * Start or stop the firmware. Memory width bit should be | 107 | * Start or stop the firmware. Memory width bit should be |
116 | * preserved from the value we've just read. | 108 | * preserved from the value we've just read. |
117 | */ | 109 | */ |
118 | reg.Action = CS_WRITE; | 110 | ccsr = (idle ? HCR_IDLE : HCR_RUN) | (ccsr & HCR_MEM16); |
119 | reg.Offset = CISREG_CCSR; | 111 | ret = pcmcia_write_config_byte(link, CISREG_CCSR, ccsr); |
120 | reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16); | ||
121 | ret = pcmcia_access_configuration_register(link, ®); | ||
122 | if (ret) | 112 | if (ret) |
123 | goto failed; | 113 | goto failed; |
124 | udelay(1000); | 114 | udelay(1000); |
125 | 115 | ||
126 | /* Restore original COR configuration index */ | 116 | /* Restore original COR configuration index */ |
127 | reg.Action = CS_WRITE; | 117 | ret = pcmcia_write_config_byte(link, CISREG_COR, |
128 | reg.Offset = CISREG_COR; | 118 | (save_cor & ~COR_SOFT_RESET)); |
129 | reg.Value = (save_cor & ~COR_SOFT_RESET); | ||
130 | ret = pcmcia_access_configuration_register(link, ®); | ||
131 | if (ret) | 119 | if (ret) |
132 | goto failed; | 120 | goto failed; |
133 | udelay(1000); | 121 | udelay(1000); |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index ba4a5acc2e9a..1733fab469a1 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
@@ -209,7 +209,7 @@ int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, | |||
209 | * Probably only useful for writing one-byte registers. Must be called | 209 | * Probably only useful for writing one-byte registers. Must be called |
210 | * with ops_mutex held. | 210 | * with ops_mutex held. |
211 | */ | 211 | */ |
212 | void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, | 212 | int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, |
213 | u_int len, void *ptr) | 213 | u_int len, void *ptr) |
214 | { | 214 | { |
215 | void __iomem *sys, *end; | 215 | void __iomem *sys, *end; |
@@ -231,7 +231,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, | |||
231 | ((cis_width) ? MAP_16BIT : 0)); | 231 | ((cis_width) ? MAP_16BIT : 0)); |
232 | if (!sys) { | 232 | if (!sys) { |
233 | dev_dbg(&s->dev, "could not map memory\n"); | 233 | dev_dbg(&s->dev, "could not map memory\n"); |
234 | return; /* FIXME: Error */ | 234 | return -EINVAL; |
235 | } | 235 | } |
236 | 236 | ||
237 | writeb(flags, sys+CISREG_ICTRL0); | 237 | writeb(flags, sys+CISREG_ICTRL0); |
@@ -256,7 +256,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, | |||
256 | sys = set_cis_map(s, card_offset, flags); | 256 | sys = set_cis_map(s, card_offset, flags); |
257 | if (!sys) { | 257 | if (!sys) { |
258 | dev_dbg(&s->dev, "could not map memory\n"); | 258 | dev_dbg(&s->dev, "could not map memory\n"); |
259 | return; /* FIXME: error */ | 259 | return -EINVAL; |
260 | } | 260 | } |
261 | 261 | ||
262 | end = sys + s->map_size; | 262 | end = sys + s->map_size; |
@@ -270,6 +270,7 @@ void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, | |||
270 | addr = 0; | 270 | addr = 0; |
271 | } | 271 | } |
272 | } | 272 | } |
273 | return 0; | ||
273 | } | 274 | } |
274 | 275 | ||
275 | 276 | ||
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index 45e7fd1aa0bf..cebd40da8b9b 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h | |||
@@ -158,8 +158,8 @@ extern struct bin_attribute pccard_cis_attr; | |||
158 | 158 | ||
159 | int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, | 159 | int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, |
160 | u_int addr, u_int len, void *ptr); | 160 | u_int addr, u_int len, void *ptr); |
161 | void pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, | 161 | int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, |
162 | u_int addr, u_int len, void *ptr); | 162 | u_int addr, u_int len, void *ptr); |
163 | void release_cis_mem(struct pcmcia_socket *s); | 163 | void release_cis_mem(struct pcmcia_socket *s); |
164 | void destroy_cis_cache(struct pcmcia_socket *s); | 164 | void destroy_cis_cache(struct pcmcia_socket *s); |
165 | int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, | 165 | int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, |
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 2394de468602..563750e77eaf 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
@@ -108,25 +108,25 @@ static void release_io_space(struct pcmcia_socket *s, unsigned int base, | |||
108 | } /* release_io_space */ | 108 | } /* release_io_space */ |
109 | 109 | ||
110 | 110 | ||
111 | /** pccard_access_configuration_register | 111 | /** |
112 | * pcmcia_access_config() - read or write card configuration registers | ||
112 | * | 113 | * |
113 | * Access_configuration_register() reads and writes configuration | 114 | * pcmcia_access_config() reads and writes configuration registers in |
114 | * registers in attribute memory. Memory window 0 is reserved for | 115 | * attribute memory. Memory window 0 is reserved for this and the tuple |
115 | * this and the tuple reading services. | 116 | * reading services. Drivers must use pcmcia_read_config_byte() or |
117 | * pcmcia_write_config_byte(). | ||
116 | */ | 118 | */ |
117 | 119 | static int pcmcia_access_config(struct pcmcia_device *p_dev, | |
118 | int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, | 120 | off_t where, u8 *val, |
119 | conf_reg_t *reg) | 121 | int (*accessf) (struct pcmcia_socket *s, |
122 | int attr, unsigned int addr, | ||
123 | unsigned int len, void *ptr)) | ||
120 | { | 124 | { |
121 | struct pcmcia_socket *s; | 125 | struct pcmcia_socket *s; |
122 | config_t *c; | 126 | config_t *c; |
123 | int addr; | 127 | int addr; |
124 | u_char val; | ||
125 | int ret = 0; | 128 | int ret = 0; |
126 | 129 | ||
127 | if (!p_dev || !p_dev->function_config) | ||
128 | return -EINVAL; | ||
129 | |||
130 | s = p_dev->socket; | 130 | s = p_dev->socket; |
131 | 131 | ||
132 | mutex_lock(&s->ops_mutex); | 132 | mutex_lock(&s->ops_mutex); |
@@ -138,26 +138,40 @@ int pcmcia_access_configuration_register(struct pcmcia_device *p_dev, | |||
138 | return -EACCES; | 138 | return -EACCES; |
139 | } | 139 | } |
140 | 140 | ||
141 | addr = (c->ConfigBase + reg->Offset) >> 1; | 141 | addr = (c->ConfigBase + where) >> 1; |
142 | |||
143 | ret = accessf(s, 1, addr, 1, val); | ||
142 | 144 | ||
143 | switch (reg->Action) { | ||
144 | case CS_READ: | ||
145 | ret = pcmcia_read_cis_mem(s, 1, addr, 1, &val); | ||
146 | reg->Value = val; | ||
147 | break; | ||
148 | case CS_WRITE: | ||
149 | val = reg->Value; | ||
150 | pcmcia_write_cis_mem(s, 1, addr, 1, &val); | ||
151 | break; | ||
152 | default: | ||
153 | dev_dbg(&s->dev, "Invalid conf register request\n"); | ||
154 | ret = -EINVAL; | ||
155 | break; | ||
156 | } | ||
157 | mutex_unlock(&s->ops_mutex); | 145 | mutex_unlock(&s->ops_mutex); |
146 | |||
158 | return ret; | 147 | return ret; |
159 | } /* pcmcia_access_configuration_register */ | 148 | } /* pcmcia_access_config */ |
160 | EXPORT_SYMBOL(pcmcia_access_configuration_register); | 149 | |
150 | |||
151 | /** | ||
152 | * pcmcia_read_config_byte() - read a byte from a card configuration register | ||
153 | * | ||
154 | * pcmcia_read_config_byte() reads a byte from a configuration register in | ||
155 | * attribute memory. | ||
156 | */ | ||
157 | int pcmcia_read_config_byte(struct pcmcia_device *p_dev, off_t where, u8 *val) | ||
158 | { | ||
159 | return pcmcia_access_config(p_dev, where, val, pcmcia_read_cis_mem); | ||
160 | } | ||
161 | EXPORT_SYMBOL(pcmcia_read_config_byte); | ||
162 | |||
163 | |||
164 | /** | ||
165 | * pcmcia_write_config_byte() - write a byte to a card configuration register | ||
166 | * | ||
167 | * pcmcia_write_config_byte() writes a byte to a configuration register in | ||
168 | * attribute memory. | ||
169 | */ | ||
170 | int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val) | ||
171 | { | ||
172 | return pcmcia_access_config(p_dev, where, &val, pcmcia_write_cis_mem); | ||
173 | } | ||
174 | EXPORT_SYMBOL(pcmcia_write_config_byte); | ||
161 | 175 | ||
162 | 176 | ||
163 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh, | 177 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, window_handle_t wh, |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 2b99c7baf35b..2be8b107ed51 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
@@ -114,16 +114,14 @@ static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_ | |||
114 | 114 | ||
115 | static int quirk_post_ibm(struct pcmcia_device *link) | 115 | static int quirk_post_ibm(struct pcmcia_device *link) |
116 | { | 116 | { |
117 | conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; | 117 | u8 val; |
118 | int ret; | 118 | int ret; |
119 | 119 | ||
120 | ret = pcmcia_access_configuration_register(link, ®); | 120 | ret = pcmcia_read_config_byte(link, 0x800, &val); |
121 | if (ret) | 121 | if (ret) |
122 | goto failed; | 122 | goto failed; |
123 | 123 | ||
124 | reg.Action = CS_WRITE; | 124 | ret = pcmcia_write_config_byte(link, 0x800, val | 1); |
125 | reg.Value = reg.Value | 1; | ||
126 | ret = pcmcia_access_configuration_register(link, ®); | ||
127 | if (ret) | 125 | if (ret) |
128 | goto failed; | 126 | goto failed; |
129 | return 0; | 127 | return 0; |
diff --git a/drivers/ssb/pcmcia.c b/drivers/ssb/pcmcia.c index 21520308178b..526682d68de8 100644 --- a/drivers/ssb/pcmcia.c +++ b/drivers/ssb/pcmcia.c | |||
@@ -71,14 +71,9 @@ | |||
71 | /* Write to a PCMCIA configuration register. */ | 71 | /* Write to a PCMCIA configuration register. */ |
72 | static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value) | 72 | static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value) |
73 | { | 73 | { |
74 | conf_reg_t reg; | ||
75 | int res; | 74 | int res; |
76 | 75 | ||
77 | memset(®, 0, sizeof(reg)); | 76 | res = pcmcia_write_config_byte(bus->host_pcmcia, offset, value); |
78 | reg.Offset = offset; | ||
79 | reg.Action = CS_WRITE; | ||
80 | reg.Value = value; | ||
81 | res = pcmcia_access_configuration_register(bus->host_pcmcia, ®); | ||
82 | if (unlikely(res != 0)) | 77 | if (unlikely(res != 0)) |
83 | return -EBUSY; | 78 | return -EBUSY; |
84 | 79 | ||
@@ -88,16 +83,11 @@ static int ssb_pcmcia_cfg_write(struct ssb_bus *bus, u8 offset, u8 value) | |||
88 | /* Read from a PCMCIA configuration register. */ | 83 | /* Read from a PCMCIA configuration register. */ |
89 | static int ssb_pcmcia_cfg_read(struct ssb_bus *bus, u8 offset, u8 *value) | 84 | static int ssb_pcmcia_cfg_read(struct ssb_bus *bus, u8 offset, u8 *value) |
90 | { | 85 | { |
91 | conf_reg_t reg; | ||
92 | int res; | 86 | int res; |
93 | 87 | ||
94 | memset(®, 0, sizeof(reg)); | 88 | res = pcmcia_read_config_byte(bus->host_pcmcia, offset, value); |
95 | reg.Offset = offset; | ||
96 | reg.Action = CS_READ; | ||
97 | res = pcmcia_access_configuration_register(bus->host_pcmcia, ®); | ||
98 | if (unlikely(res != 0)) | 89 | if (unlikely(res != 0)) |
99 | return -EBUSY; | 90 | return -EBUSY; |
100 | *value = reg.Value; | ||
101 | 91 | ||
102 | return 0; | 92 | return 0; |
103 | } | 93 | } |