diff options
| -rw-r--r-- | drivers/pcmcia/pcmcia_resource.c | 111 |
1 files changed, 89 insertions, 22 deletions
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index 28de5e6e164c..3194d515c023 100644 --- a/drivers/pcmcia/pcmcia_resource.c +++ b/drivers/pcmcia/pcmcia_resource.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. | 6 | * are Copyright (C) 1999 David A. Hinds. All Rights Reserved. |
| 7 | * | 7 | * |
| 8 | * Copyright (C) 1999 David A. Hinds | 8 | * Copyright (C) 1999 David A. Hinds |
| 9 | * Copyright (C) 2004-2005 Dominik Brodowski | 9 | * Copyright (C) 2004-2010 Dominik Brodowski |
| 10 | * | 10 | * |
| 11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
| 12 | * it under the terms of the GNU General Public License version 2 as | 12 | * it under the terms of the GNU General Public License version 2 as |
| @@ -55,6 +55,12 @@ struct resource *pcmcia_find_mem_region(u_long base, u_long num, u_long align, | |||
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | 57 | ||
| 58 | /** | ||
| 59 | * release_io_space() - release IO ports allocated with alloc_io_space() | ||
| 60 | * @s: pcmcia socket | ||
| 61 | * @res: resource to release | ||
| 62 | * | ||
| 63 | */ | ||
| 58 | static void release_io_space(struct pcmcia_socket *s, struct resource *res) | 64 | static void release_io_space(struct pcmcia_socket *s, struct resource *res) |
| 59 | { | 65 | { |
| 60 | resource_size_t num = resource_size(res); | 66 | resource_size_t num = resource_size(res); |
| @@ -80,9 +86,14 @@ static void release_io_space(struct pcmcia_socket *s, struct resource *res) | |||
| 80 | } | 86 | } |
| 81 | } | 87 | } |
| 82 | } | 88 | } |
| 83 | } /* release_io_space */ | 89 | } |
| 90 | |||
| 84 | 91 | ||
| 85 | /** alloc_io_space | 92 | /** |
| 93 | * alloc_io_space() - allocate IO ports for use by a PCMCIA device | ||
| 94 | * @s: pcmcia socket | ||
| 95 | * @res: resource to allocate (begin: begin, end: size) | ||
| 96 | * @lines: number of IO lines decoded by the PCMCIA card | ||
| 86 | * | 97 | * |
| 87 | * Special stuff for managing IO windows, because they are scarce | 98 | * Special stuff for managing IO windows, because they are scarce |
| 88 | */ | 99 | */ |
| @@ -134,7 +145,7 @@ static int alloc_io_space(struct pcmcia_socket *s, struct resource *res, | |||
| 134 | } | 145 | } |
| 135 | dev_dbg(&s->dev, "alloc_io_space request result %d: %pR\n", ret, res); | 146 | dev_dbg(&s->dev, "alloc_io_space request result %d: %pR\n", ret, res); |
| 136 | return ret; | 147 | return ret; |
| 137 | } /* alloc_io_space */ | 148 | } |
| 138 | 149 | ||
| 139 | 150 | ||
| 140 | /** | 151 | /** |
| @@ -174,7 +185,7 @@ static int pcmcia_access_config(struct pcmcia_device *p_dev, | |||
| 174 | mutex_unlock(&s->ops_mutex); | 185 | mutex_unlock(&s->ops_mutex); |
| 175 | 186 | ||
| 176 | return ret; | 187 | return ret; |
| 177 | } /* pcmcia_access_config */ | 188 | } |
| 178 | 189 | ||
| 179 | 190 | ||
| 180 | /** | 191 | /** |
| @@ -203,6 +214,16 @@ int pcmcia_write_config_byte(struct pcmcia_device *p_dev, off_t where, u8 val) | |||
| 203 | EXPORT_SYMBOL(pcmcia_write_config_byte); | 214 | EXPORT_SYMBOL(pcmcia_write_config_byte); |
| 204 | 215 | ||
| 205 | 216 | ||
| 217 | /** | ||
| 218 | * pcmcia_map_mem_page() - modify iomem window to point to a different offset | ||
| 219 | * @p_dev: pcmcia device | ||
| 220 | * @res: iomem resource already enabled by pcmcia_request_window() | ||
| 221 | * @offset: card_offset to map | ||
| 222 | * | ||
| 223 | * pcmcia_map_mem_page() modifies what can be read and written by accessing | ||
| 224 | * an iomem range previously enabled by pcmcia_request_window(), by setting | ||
| 225 | * the card_offset value to @offset. | ||
| 226 | */ | ||
| 206 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res, | 227 | int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res, |
| 207 | unsigned int offset) | 228 | unsigned int offset) |
| 208 | { | 229 | { |
| @@ -221,12 +242,13 @@ int pcmcia_map_mem_page(struct pcmcia_device *p_dev, struct resource *res, | |||
| 221 | dev_warn(&p_dev->dev, "failed to set_mem_map\n"); | 242 | dev_warn(&p_dev->dev, "failed to set_mem_map\n"); |
| 222 | mutex_unlock(&s->ops_mutex); | 243 | mutex_unlock(&s->ops_mutex); |
| 223 | return ret; | 244 | return ret; |
| 224 | } /* pcmcia_map_mem_page */ | 245 | } |
| 225 | EXPORT_SYMBOL(pcmcia_map_mem_page); | 246 | EXPORT_SYMBOL(pcmcia_map_mem_page); |
| 226 | 247 | ||
| 227 | 248 | ||
| 228 | /** | 249 | /** |
| 229 | * pcmcia_fixup_iowidth() - reduce io width to 8bit | 250 | * pcmcia_fixup_iowidth() - reduce io width to 8bit |
| 251 | * @p_dev: pcmcia device | ||
| 230 | * | 252 | * |
| 231 | * pcmcia_fixup_iowidth() allows a PCMCIA device driver to reduce the | 253 | * pcmcia_fixup_iowidth() allows a PCMCIA device driver to reduce the |
| 232 | * IO width to 8bit after having called pcmcia_enable_device() | 254 | * IO width to 8bit after having called pcmcia_enable_device() |
| @@ -275,6 +297,8 @@ EXPORT_SYMBOL(pcmcia_fixup_iowidth); | |||
| 275 | 297 | ||
| 276 | /** | 298 | /** |
| 277 | * pcmcia_fixup_vpp() - set Vpp to a new voltage level | 299 | * pcmcia_fixup_vpp() - set Vpp to a new voltage level |
| 300 | * @p_dev: pcmcia device | ||
| 301 | * @new_vpp: new Vpp voltage | ||
| 278 | * | 302 | * |
| 279 | * pcmcia_fixup_vpp() allows a PCMCIA device driver to set Vpp to | 303 | * pcmcia_fixup_vpp() allows a PCMCIA device driver to set Vpp to |
| 280 | * a new voltage level between calls to pcmcia_enable_device() | 304 | * a new voltage level between calls to pcmcia_enable_device() |
| @@ -312,6 +336,17 @@ unlock: | |||
| 312 | EXPORT_SYMBOL(pcmcia_fixup_vpp); | 336 | EXPORT_SYMBOL(pcmcia_fixup_vpp); |
| 313 | 337 | ||
| 314 | 338 | ||
| 339 | /** | ||
| 340 | * pcmcia_release_configuration() - physically disable a PCMCIA device | ||
| 341 | * @p_dev: pcmcia device | ||
| 342 | * | ||
| 343 | * pcmcia_release_configuration() is the 1:1 counterpart to | ||
| 344 | * pcmcia_enable_device(): If a PCMCIA device is no longer used by any | ||
| 345 | * driver, the Vpp voltage is set to 0, IRQs will no longer be generated, | ||
| 346 | * and I/O ranges will be disabled. As pcmcia_release_io() and | ||
| 347 | * pcmcia_release_window() still need to be called, device drivers are | ||
| 348 | * expected to call pcmcia_disable_device() instead. | ||
| 349 | */ | ||
| 315 | int pcmcia_release_configuration(struct pcmcia_device *p_dev) | 350 | int pcmcia_release_configuration(struct pcmcia_device *p_dev) |
| 316 | { | 351 | { |
| 317 | pccard_io_map io = { 0, 0, 0, 0, 1 }; | 352 | pccard_io_map io = { 0, 0, 0, 0, 1 }; |
| @@ -324,7 +359,7 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev) | |||
| 324 | if (p_dev->_locked) { | 359 | if (p_dev->_locked) { |
| 325 | p_dev->_locked = 0; | 360 | p_dev->_locked = 0; |
| 326 | if (--(s->lock_count) == 0) { | 361 | if (--(s->lock_count) == 0) { |
| 327 | s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */ | 362 | s->socket.flags = SS_OUTPUT_ENA; /* Is this correct? */ |
| 328 | s->socket.Vpp = 0; | 363 | s->socket.Vpp = 0; |
| 329 | s->socket.io_irq = 0; | 364 | s->socket.io_irq = 0; |
| 330 | s->ops->set_socket(s, &s->socket); | 365 | s->ops->set_socket(s, &s->socket); |
| @@ -346,16 +381,18 @@ int pcmcia_release_configuration(struct pcmcia_device *p_dev) | |||
| 346 | mutex_unlock(&s->ops_mutex); | 381 | mutex_unlock(&s->ops_mutex); |
| 347 | 382 | ||
| 348 | return 0; | 383 | return 0; |
| 349 | } /* pcmcia_release_configuration */ | 384 | } |
| 350 | 385 | ||
| 351 | 386 | ||
| 352 | /** pcmcia_release_io | 387 | /** |
| 388 | * pcmcia_release_io() - release I/O allocated by a PCMCIA device | ||
| 389 | * @p_dev: pcmcia device | ||
| 353 | * | 390 | * |
| 354 | * Release_io() releases the I/O ranges allocated by a client. This | 391 | * pcmcia_release_io() releases the I/O ranges allocated by a PCMCIA |
| 355 | * may be invoked some time after a card ejection has already dumped | 392 | * device. This may be invoked some time after a card ejection has |
| 356 | * the actual socket configuration, so if the client is "stale", we | 393 | * already dumped the actual socket configuration, so if the client is |
| 357 | * don't bother checking the port ranges against the current socket | 394 | * "stale", we don't bother checking the port ranges against the |
| 358 | * values. | 395 | * current socket values. |
| 359 | */ | 396 | */ |
| 360 | static int pcmcia_release_io(struct pcmcia_device *p_dev) | 397 | static int pcmcia_release_io(struct pcmcia_device *p_dev) |
| 361 | { | 398 | { |
| @@ -383,10 +420,13 @@ out: | |||
| 383 | return ret; | 420 | return ret; |
| 384 | } /* pcmcia_release_io */ | 421 | } /* pcmcia_release_io */ |
| 385 | 422 | ||
| 423 | |||
| 386 | /** | 424 | /** |
| 387 | * pcmcia_release_window() - release reserved iomem for PCMCIA devices | 425 | * pcmcia_release_window() - release reserved iomem for PCMCIA devices |
| 426 | * @p_dev: pcmcia device | ||
| 427 | * @res: iomem resource to release | ||
| 388 | * | 428 | * |
| 389 | * pcmcia_release_window() releases struct resource *res which was | 429 | * pcmcia_release_window() releases &struct resource *res which was |
| 390 | * previously reserved by calling pcmcia_request_window(). | 430 | * previously reserved by calling pcmcia_request_window(). |
| 391 | */ | 431 | */ |
| 392 | int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res) | 432 | int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res) |
| @@ -431,9 +471,15 @@ int pcmcia_release_window(struct pcmcia_device *p_dev, struct resource *res) | |||
| 431 | } /* pcmcia_release_window */ | 471 | } /* pcmcia_release_window */ |
| 432 | EXPORT_SYMBOL(pcmcia_release_window); | 472 | EXPORT_SYMBOL(pcmcia_release_window); |
| 433 | 473 | ||
| 474 | |||
| 434 | /** | 475 | /** |
| 435 | * pcmcia_enable_device() - set up and activate a PCMCIA device | 476 | * pcmcia_enable_device() - set up and activate a PCMCIA device |
| 477 | * @p_dev: the associated PCMCIA device | ||
| 436 | * | 478 | * |
| 479 | * pcmcia_enable_device() physically enables a PCMCIA device. It parses | ||
| 480 | * the flags passed to in @flags and stored in @p_dev->flags and sets up | ||
| 481 | * the Vpp voltage, enables the speaker line, I/O ports and store proper | ||
| 482 | * values to configuration registers. | ||
| 437 | */ | 483 | */ |
| 438 | int pcmcia_enable_device(struct pcmcia_device *p_dev) | 484 | int pcmcia_enable_device(struct pcmcia_device *p_dev) |
| 439 | { | 485 | { |
| @@ -565,8 +611,9 @@ EXPORT_SYMBOL(pcmcia_enable_device); | |||
| 565 | 611 | ||
| 566 | /** | 612 | /** |
| 567 | * pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices | 613 | * pcmcia_request_io() - attempt to reserve port ranges for PCMCIA devices |
| 614 | * @p_dev: the associated PCMCIA device | ||
| 568 | * | 615 | * |
| 569 | * pcmcia_request_io() attepts to reserve the IO port ranges specified in | 616 | * pcmcia_request_io() attempts to reserve the IO port ranges specified in |
| 570 | * &struct pcmcia_device @p_dev->resource[0] and @p_dev->resource[1]. The | 617 | * &struct pcmcia_device @p_dev->resource[0] and @p_dev->resource[1]. The |
| 571 | * "start" value is the requested start of the IO port resource; "end" | 618 | * "start" value is the requested start of the IO port resource; "end" |
| 572 | * reflects the number of ports requested. The number of IO lines requested | 619 | * reflects the number of ports requested. The number of IO lines requested |
| @@ -630,11 +677,13 @@ EXPORT_SYMBOL(pcmcia_request_io); | |||
| 630 | 677 | ||
| 631 | /** | 678 | /** |
| 632 | * pcmcia_request_irq() - attempt to request a IRQ for a PCMCIA device | 679 | * pcmcia_request_irq() - attempt to request a IRQ for a PCMCIA device |
| 680 | * @p_dev: the associated PCMCIA device | ||
| 681 | * @handler: IRQ handler to register | ||
| 633 | * | 682 | * |
| 634 | * pcmcia_request_irq() is a wrapper around request_irq which will allow | 683 | * pcmcia_request_irq() is a wrapper around request_irq() which allows |
| 635 | * the PCMCIA core to clean up the registration in pcmcia_disable_device(). | 684 | * the PCMCIA core to clean up the registration in pcmcia_disable_device(). |
| 636 | * Drivers are free to use request_irq() directly, but then they need to | 685 | * Drivers are free to use request_irq() directly, but then they need to |
| 637 | * call free_irq themselfves, too. Also, only IRQF_SHARED capable IRQ | 686 | * call free_irq() themselfves, too. Also, only %IRQF_SHARED capable IRQ |
| 638 | * handlers are allowed. | 687 | * handlers are allowed. |
| 639 | */ | 688 | */ |
| 640 | int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, | 689 | int __must_check pcmcia_request_irq(struct pcmcia_device *p_dev, |
| @@ -657,12 +706,14 @@ EXPORT_SYMBOL(pcmcia_request_irq); | |||
| 657 | 706 | ||
| 658 | /** | 707 | /** |
| 659 | * pcmcia_request_exclusive_irq() - attempt to request an exclusive IRQ first | 708 | * pcmcia_request_exclusive_irq() - attempt to request an exclusive IRQ first |
| 709 | * @p_dev: the associated PCMCIA device | ||
| 710 | * @handler: IRQ handler to register | ||
| 660 | * | 711 | * |
| 661 | * pcmcia_request_exclusive_irq() is a wrapper around request_irq which | 712 | * pcmcia_request_exclusive_irq() is a wrapper around request_irq() which |
| 662 | * attempts first to request an exclusive IRQ. If it fails, it also accepts | 713 | * attempts first to request an exclusive IRQ. If it fails, it also accepts |
| 663 | * a shared IRQ, but prints out a warning. PCMCIA drivers should allow for | 714 | * a shared IRQ, but prints out a warning. PCMCIA drivers should allow for |
| 664 | * IRQ sharing and either use request_irq directly (then they need to call | 715 | * IRQ sharing and either use request_irq directly (then they need to call |
| 665 | * free_irq themselves, too), or the pcmcia_request_irq() function. | 716 | * free_irq() themselves, too), or the pcmcia_request_irq() function. |
| 666 | */ | 717 | */ |
| 667 | int __must_check | 718 | int __must_check |
| 668 | __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, | 719 | __pcmcia_request_exclusive_irq(struct pcmcia_device *p_dev, |
| @@ -805,10 +856,13 @@ int pcmcia_setup_irq(struct pcmcia_device *p_dev) | |||
| 805 | 856 | ||
| 806 | /** | 857 | /** |
| 807 | * pcmcia_request_window() - attempt to reserve iomem for PCMCIA devices | 858 | * pcmcia_request_window() - attempt to reserve iomem for PCMCIA devices |
| 859 | * @p_dev: the associated PCMCIA device | ||
| 860 | * @res: &struct resource pointing to p_dev->resource[2..5] | ||
| 861 | * @speed: access speed | ||
| 808 | * | 862 | * |
| 809 | * pcmcia_request_window() attepts to reserve an iomem ranges specified in | 863 | * pcmcia_request_window() attepts to reserve an iomem ranges specified in |
| 810 | * struct resource *res pointing to one of the entries in | 864 | * &struct resource @res pointing to one of the entries in |
| 811 | * struct pcmcia_device *p_dev->resource[2..5]. The "start" value is the | 865 | * &struct pcmcia_device @p_dev->resource[2..5]. The "start" value is the |
| 812 | * requested start of the IO mem resource; "end" reflects the size | 866 | * requested start of the IO mem resource; "end" reflects the size |
| 813 | * requested. | 867 | * requested. |
| 814 | */ | 868 | */ |
| @@ -900,6 +954,19 @@ int pcmcia_request_window(struct pcmcia_device *p_dev, struct resource *res, | |||
| 900 | } /* pcmcia_request_window */ | 954 | } /* pcmcia_request_window */ |
| 901 | EXPORT_SYMBOL(pcmcia_request_window); | 955 | EXPORT_SYMBOL(pcmcia_request_window); |
| 902 | 956 | ||
| 957 | |||
| 958 | /** | ||
| 959 | * pcmcia_disable_device() - disable and clean up a PCMCIA device | ||
| 960 | * @p_dev: the associated PCMCIA device | ||
| 961 | * | ||
| 962 | * pcmcia_disable_device() is the driver-callable counterpart to | ||
| 963 | * pcmcia_enable_device(): If a PCMCIA device is no longer used, | ||
| 964 | * drivers are expected to clean up and disable the device by calling | ||
| 965 | * this function. Any I/O ranges (iomem and ioports) will be released, | ||
| 966 | * the Vpp voltage will be set to 0, and IRQs will no longer be | ||
| 967 | * generated -- at least if there is no other card function (of | ||
| 968 | * multifunction devices) being used. | ||
| 969 | */ | ||
| 903 | void pcmcia_disable_device(struct pcmcia_device *p_dev) | 970 | void pcmcia_disable_device(struct pcmcia_device *p_dev) |
| 904 | { | 971 | { |
| 905 | int i; | 972 | int i; |
