1 /* $NetBSD: pcmciachip.h,v 1.17 2011/07/26 22:24:36 dyoung Exp $ */ 2 3 /* 4 * Copyright (c) 1997 Marc Horowitz. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Marc Horowitz. 17 * 4. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _PCMCIA_PCMCIACHIP_H_ 33 #define _PCMCIA_PCMCIACHIP_H_ 34 35 #include <sys/bus.h> 36 37 struct pcmcia_function; 38 struct pcmcia_mem_handle; 39 struct pcmcia_io_handle; 40 41 /* interfaces for pcmcia to call the chipset */ 42 43 typedef const struct pcmcia_chip_functions *pcmcia_chipset_tag_t; 44 typedef void *pcmcia_chipset_handle_t; 45 typedef int pcmcia_mem_handle_t; 46 47 #define PCMCIA_MEM_ATTR 1 48 #define PCMCIA_MEM_COMMON 2 49 50 #define PCMCIA_WIDTH_MEM8 8 51 #define PCMCIA_WIDTH_MEM16 16 52 53 #define PCMCIA_WIDTH_MEM_MASK 24 54 55 #define PCMCIA_WIDTH_AUTO 0 56 #define PCMCIA_WIDTH_IO8 1 57 #define PCMCIA_WIDTH_IO16 2 58 59 struct pcmcia_chip_functions { 60 /* memory space allocation */ 61 int (*mem_alloc)(pcmcia_chipset_handle_t, bus_size_t, 62 struct pcmcia_mem_handle *); 63 void (*mem_free)(pcmcia_chipset_handle_t, 64 struct pcmcia_mem_handle *); 65 66 /* memory space window mapping */ 67 int (*mem_map)(pcmcia_chipset_handle_t, int, bus_addr_t, 68 bus_size_t, struct pcmcia_mem_handle *, 69 bus_size_t *, int *); 70 void (*mem_unmap)(pcmcia_chipset_handle_t, int); 71 72 /* I/O space allocation */ 73 int (*io_alloc)(pcmcia_chipset_handle_t, bus_addr_t, 74 bus_size_t, bus_size_t, struct pcmcia_io_handle *); 75 void (*io_free)(pcmcia_chipset_handle_t, 76 struct pcmcia_io_handle *); 77 78 /* I/O space window mapping */ 79 int (*io_map)(pcmcia_chipset_handle_t, int, bus_addr_t, 80 bus_size_t, struct pcmcia_io_handle *, int *); 81 void (*io_unmap)(pcmcia_chipset_handle_t, int); 82 83 /* interrupt glue */ 84 void *(*intr_establish)(pcmcia_chipset_handle_t, 85 struct pcmcia_function *, int, int (*)(void *), void *); 86 void (*intr_disestablish)(pcmcia_chipset_handle_t, void *); 87 88 /* card enable/disable */ 89 void (*socket_enable)(pcmcia_chipset_handle_t); 90 void (*socket_disable)(pcmcia_chipset_handle_t); 91 void (*socket_settype)(pcmcia_chipset_handle_t, int); 92 93 /* card detection */ 94 int (*card_detect)(pcmcia_chipset_handle_t); 95 }; 96 97 /* Memory space functions. */ 98 #define pcmcia_chip_mem_alloc(tag, handle, size, pcmhp) \ 99 ((*(tag)->mem_alloc)((handle), (size), (pcmhp))) 100 101 #define pcmcia_chip_mem_free(tag, handle, pcmhp) \ 102 ((*(tag)->mem_free)((handle), (pcmhp))) 103 104 #define pcmcia_chip_mem_map(tag, handle, kind, card_addr, size, pcmhp, \ 105 offsetp, windowp) \ 106 ((*(tag)->mem_map)((handle), (kind), (card_addr), (size), (pcmhp), \ 107 (offsetp), (windowp))) 108 109 #define pcmcia_chip_mem_unmap(tag, handle, window) \ 110 ((*(tag)->mem_unmap)((handle), (window))) 111 112 /* I/O space functions. */ 113 #define pcmcia_chip_io_alloc(tag, handle, start, size, align, pcihp) \ 114 ((*(tag)->io_alloc)((handle), (start), (size), (align), (pcihp))) 115 116 #define pcmcia_chip_io_free(tag, handle, pcihp) \ 117 ((*(tag)->io_free)((handle), (pcihp))) 118 119 #define pcmcia_chip_io_map(tag, handle, width, card_addr, size, pcihp, \ 120 windowp) \ 121 ((*(tag)->io_map)((handle), (width), (card_addr), (size), (pcihp), \ 122 (windowp))) 123 124 #define pcmcia_chip_io_unmap(tag, handle, window) \ 125 ((*(tag)->io_unmap)((handle), (window))) 126 127 /* Interrupt functions. */ 128 #define pcmcia_chip_intr_establish(tag, handle, pf, ipl, fct, arg) \ 129 ((*(tag)->intr_establish)((handle), (pf), (ipl), (fct), (arg))) 130 131 #define pcmcia_chip_intr_disestablish(tag, handle, ih) \ 132 ((*(tag)->intr_disestablish)((handle), (ih))) 133 134 /* Socket functions. */ 135 #define pcmcia_chip_socket_enable(tag, handle) \ 136 ((*(tag)->socket_enable)((handle))) 137 #define pcmcia_chip_socket_disable(tag, handle) \ 138 ((*(tag)->socket_disable)((handle))) 139 #define pcmcia_chip_socket_settype(tag, handle, type) \ 140 ((*(tag)->socket_settype)((handle), (type))) 141 142 struct pcmciabus_attach_args { 143 const char *paa_busname; /* Bus name */ 144 pcmcia_chipset_tag_t pct; 145 pcmcia_chipset_handle_t pch; 146 }; 147 148 /* interfaces for the chipset to call pcmcia */ 149 150 int pcmcia_card_attach(device_t); 151 void pcmcia_card_detach(device_t, int); 152 void pcmcia_card_deactivate(device_t); 153 154 #endif /* _PCMCIA_PCMCIACHIP_H_ */ 155