1 1.1 khorben /* $NetBSD: emuxki_boards.c,v 1.1 2022/09/07 03:34:43 khorben Exp $ */ 2 1.1 khorben 3 1.1 khorben /*- 4 1.1 khorben * Copyright (c) 2001, 2007 The NetBSD Foundation, Inc. 5 1.1 khorben * All rights reserved. 6 1.1 khorben * 7 1.1 khorben * This code is derived from software contributed to The NetBSD Foundation 8 1.1 khorben * by Yannick Montulet, and by Andrew Doran. 9 1.1 khorben * 10 1.1 khorben * Redistribution and use in source and binary forms, with or without 11 1.1 khorben * modification, are permitted provided that the following conditions 12 1.1 khorben * are met: 13 1.1 khorben * 1. Redistributions of source code must retain the above copyright 14 1.1 khorben * notice, this list of conditions and the following disclaimer. 15 1.1 khorben * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 khorben * notice, this list of conditions and the following disclaimer in the 17 1.1 khorben * documentation and/or other materials provided with the distribution. 18 1.1 khorben * 19 1.1 khorben * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 khorben * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 khorben * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 khorben * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 khorben * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 khorben * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 khorben * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 khorben * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 khorben * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 khorben * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 khorben * POSSIBILITY OF SUCH DAMAGE. 30 1.1 khorben */ 31 1.1 khorben 32 1.1 khorben #include <sys/cdefs.h> 33 1.1 khorben __KERNEL_RCSID(0, "$NetBSD: emuxki_boards.c,v 1.1 2022/09/07 03:34:43 khorben Exp $"); 34 1.1 khorben 35 1.1 khorben #include <dev/pci/emuxkivar.h> 36 1.1 khorben #include <dev/pci/emuxki_boards.h> 37 1.1 khorben 38 1.1 khorben /* generic fallbacks must be after any corresponding precise match */ 39 1.1 khorben static const struct emuxki_board emuxki_boards[] = { 40 1.1 khorben { 41 1.1 khorben .sb_board = "SB1550", 42 1.1 khorben .sb_name = "Sound Blaster Audigy Rx", 43 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 44 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBAUDIGY4, 45 1.1 khorben .sb_subsystem = 0x10241102, 46 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2 | EMUXKI_AUDIGY2_CA0108, 47 1.1 khorben }, 48 1.1 khorben { 49 1.1 khorben .sb_board = "SB0610", 50 1.1 khorben .sb_name = "Sound Blaster Audigy 4", 51 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 52 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBAUDIGY4, 53 1.1 khorben .sb_subsystem = 0x10211102, 54 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2 | EMUXKI_AUDIGY2_CA0108, 55 1.1 khorben }, 56 1.1 khorben { 57 1.1 khorben .sb_board = "SB0400", 58 1.1 khorben .sb_name = "Sound Blaster Audigy 2 Value", 59 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 60 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBAUDIGY4, 61 1.1 khorben .sb_subsystem = 0x10011102, 62 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2 | EMUXKI_AUDIGY2_CA0108, 63 1.1 khorben }, 64 1.1 khorben { 65 1.1 khorben .sb_board = "generic", 66 1.1 khorben .sb_name = "Sound Blaster Audigy 2 Value", 67 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 68 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBAUDIGY4, 69 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2 | EMUXKI_AUDIGY2_CA0108, 70 1.1 khorben }, 71 1.1 khorben { 72 1.1 khorben .sb_board = "SB0350", 73 1.1 khorben .sb_name = "Sound Blaster Audigy 2 ZS", 74 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 75 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 76 1.1 khorben .sb_subsystem = 0x20021102, 77 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2, 78 1.1 khorben }, 79 1.1 khorben { 80 1.1 khorben .sb_board = "SB0350", 81 1.1 khorben .sb_name = "Sound Blaster Audigy 2", 82 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 83 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 84 1.1 khorben .sb_subsystem = 0x20051102, 85 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2, 86 1.1 khorben }, 87 1.1 khorben { 88 1.1 khorben .sb_board = "SB0240", 89 1.1 khorben .sb_name = "Sound Blaster Audigy 2", 90 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 91 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 92 1.1 khorben .sb_subsystem = 0x10021102, 93 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2, 94 1.1 khorben }, 95 1.1 khorben { 96 1.1 khorben .sb_board = "generic", 97 1.1 khorben .sb_name = "Sound Blaster Audigy 2", 98 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 99 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 100 1.1 khorben .sb_revision = 0x8, 101 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2, 102 1.1 khorben }, 103 1.1 khorben { 104 1.1 khorben .sb_board = "generic", 105 1.1 khorben .sb_name = "Sound Blaster Audigy 2", 106 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 107 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 108 1.1 khorben .sb_revision = 0x4, 109 1.1 khorben .sb_flags = EMUXKI_AUDIGY | EMUXKI_AUDIGY2, 110 1.1 khorben }, 111 1.1 khorben { 112 1.1 khorben .sb_board = "generic", 113 1.1 khorben .sb_name = "Sound Blaster Audigy", 114 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 115 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_AUDIGY, 116 1.1 khorben .sb_flags = EMUXKI_AUDIGY, 117 1.1 khorben }, 118 1.1 khorben { 119 1.1 khorben .sb_board = "generic", 120 1.1 khorben .sb_name = "Sound Blaster Live! 2", 121 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 122 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBLIVE2, 123 1.1 khorben .sb_flags = EMUXKI_SBLIVE, 124 1.1 khorben }, 125 1.1 khorben { 126 1.1 khorben .sb_board = "CT4870", 127 1.1 khorben .sb_name = "Sound Blaster Live! Value", 128 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 129 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBLIVE, 130 1.1 khorben .sb_subsystem = 0x80281102, 131 1.1 khorben .sb_flags = EMUXKI_SBLIVE, 132 1.1 khorben }, 133 1.1 khorben { 134 1.1 khorben .sb_board = "CT4790", 135 1.1 khorben .sb_name = "Sound Blaster PCI512", 136 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 137 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBLIVE, 138 1.1 khorben .sb_subsystem = 0x80231102, 139 1.1 khorben .sb_flags = EMUXKI_SBLIVE, 140 1.1 khorben }, 141 1.1 khorben { 142 1.1 khorben .sb_board = "PC545", 143 1.1 khorben .sb_name = "Sound Blaster E-mu APS", 144 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 145 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBLIVE, 146 1.1 khorben .sb_subsystem = 0x40011102, 147 1.1 khorben .sb_flags = EMUXKI_APS, 148 1.1 khorben }, 149 1.1 khorben { 150 1.1 khorben .sb_board = "generic", 151 1.1 khorben .sb_name = "Sound Blaster Live!", 152 1.1 khorben .sb_vendor = PCI_VENDOR_CREATIVELABS, 153 1.1 khorben .sb_product = PCI_PRODUCT_CREATIVELABS_SBLIVE, 154 1.1 khorben .sb_flags = EMUXKI_SBLIVE, 155 1.1 khorben }, 156 1.1 khorben }; 157 1.1 khorben 158 1.1 khorben const struct emuxki_board * 159 1.1 khorben emuxki_board_lookup(pci_vendor_id_t vendor, pci_product_id_t product, 160 1.1 khorben uint32_t subsystem, uint8_t revision) 161 1.1 khorben { 162 1.1 khorben const struct emuxki_board *sb; 163 1.1 khorben unsigned int i; 164 1.1 khorben 165 1.1 khorben for (i = 0; i < __arraycount(emuxki_boards); i++) { 166 1.1 khorben sb = &emuxki_boards[i]; 167 1.1 khorben 168 1.1 khorben /* precise match */ 169 1.1 khorben if (vendor == sb->sb_vendor && product == sb->sb_product && 170 1.1 khorben subsystem == sb->sb_subsystem && revision == sb->sb_revision) 171 1.1 khorben return sb; 172 1.1 khorben 173 1.1 khorben /* generic fallback (same subsystem, any revision) */ 174 1.1 khorben if (vendor == sb->sb_vendor && product == sb->sb_product && 175 1.1 khorben subsystem == sb->sb_subsystem && sb->sb_revision == 0) 176 1.1 khorben return sb; 177 1.1 khorben 178 1.1 khorben /* generic fallback (any subsystem, specific revision) */ 179 1.1 khorben if (vendor == sb->sb_vendor && product == sb->sb_product && 180 1.1 khorben sb->sb_subsystem == 0 && revision == sb->sb_revision) 181 1.1 khorben return sb; 182 1.1 khorben 183 1.1 khorben /* generic fallback (same vendor, same product) */ 184 1.1 khorben if (vendor == sb->sb_vendor && product == sb->sb_product && 185 1.1 khorben sb->sb_subsystem == 0 && sb->sb_revision == 0) 186 1.1 khorben return sb; 187 1.1 khorben } 188 1.1 khorben 189 1.1 khorben return NULL; 190 1.1 khorben } 191