1 1.21 thorpej /* $NetBSD: hpcioman.c,v 1.21 2021/08/07 16:19:11 thorpej Exp $ */ 2 1.1 takemura 3 1.1 takemura /*- 4 1.1 takemura * Copyright (c) 1999-2001 The NetBSD Foundation, Inc. 5 1.1 takemura * All rights reserved. 6 1.1 takemura * 7 1.1 takemura * This code is derived from software contributed to The NetBSD Foundation 8 1.1 takemura * by UCHIYAMA Yasushi. 9 1.1 takemura * 10 1.1 takemura * Redistribution and use in source and binary forms, with or without 11 1.1 takemura * modification, are permitted provided that the following conditions 12 1.1 takemura * are met: 13 1.1 takemura * 1. Redistributions of source code must retain the above copyright 14 1.1 takemura * notice, this list of conditions and the following disclaimer. 15 1.1 takemura * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 takemura * notice, this list of conditions and the following disclaimer in the 17 1.1 takemura * documentation and/or other materials provided with the distribution. 18 1.1 takemura * 19 1.1 takemura * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 takemura * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 takemura * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 takemura * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 takemura * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 takemura * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 takemura * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 takemura * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 takemura * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 takemura * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 takemura * POSSIBILITY OF SUCH DAMAGE. 30 1.1 takemura */ 31 1.5 lukem 32 1.5 lukem #include <sys/cdefs.h> 33 1.21 thorpej __KERNEL_RCSID(0, "$NetBSD: hpcioman.c,v 1.21 2021/08/07 16:19:11 thorpej Exp $"); 34 1.1 takemura 35 1.1 takemura #include <sys/param.h> 36 1.1 takemura #include <sys/systm.h> 37 1.1 takemura #include <sys/device.h> 38 1.1 takemura 39 1.1 takemura #include <machine/config_hook.h> 40 1.1 takemura #include <machine/platid.h> 41 1.1 takemura #include <machine/platid_mask.h> 42 1.1 takemura 43 1.15 ad #include <sys/bus.h> 44 1.1 takemura #include <dev/hpc/hpciovar.h> 45 1.1 takemura #include <dev/hpc/hpciomanvar.h> 46 1.1 takemura 47 1.1 takemura #include "locators.h" 48 1.1 takemura 49 1.18 cegger int hpcioman_match(device_t, cfdata_t, void *); 50 1.18 cegger void hpcioman_attach(device_t, device_t, void *); 51 1.1 takemura int hpcioman_print(void *, const char *); 52 1.19 chs int hpcioman_search(device_t, cfdata_t, const int *, void *); 53 1.1 takemura 54 1.19 chs CFATTACH_DECL_NEW(hpcioman, 0, 55 1.9 thorpej hpcioman_match, hpcioman_attach, NULL, NULL); 56 1.1 takemura 57 1.1 takemura int 58 1.18 cegger hpcioman_match(device_t parent, cfdata_t cf, void *aux) 59 1.1 takemura { 60 1.2 takemura struct hpcio_attach_args *haa = aux; 61 1.1 takemura platid_mask_t mask; 62 1.1 takemura 63 1.2 takemura if (strcmp(haa->haa_busname, HPCIO_BUSNAME)) 64 1.3 uch return (0); 65 1.1 takemura /* select platform */ 66 1.1 takemura mask = PLATID_DEREF(cf->cf_loc[HPCIOIFCF_PLATFORM]); 67 1.1 takemura 68 1.3 uch return (platid_match(&platid, &mask)); 69 1.1 takemura } 70 1.1 takemura 71 1.1 takemura void 72 1.18 cegger hpcioman_attach(device_t parent, device_t self, void *aux) 73 1.1 takemura { 74 1.1 takemura printf("\n"); 75 1.1 takemura 76 1.20 thorpej config_search(self, aux, 77 1.21 thorpej CFARGS(.search = hpcioman_search)); 78 1.1 takemura } 79 1.1 takemura 80 1.1 takemura int 81 1.19 chs hpcioman_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 82 1.1 takemura { 83 1.1 takemura struct hpcio_attach_args *haa = aux; 84 1.1 takemura struct hpcioman_attach_args hma; 85 1.1 takemura 86 1.1 takemura /* get io chip */ 87 1.1 takemura hma.hma_hc = (*haa->haa_getchip)(haa->haa_sc, cf->cf_iochip); 88 1.1 takemura 89 1.1 takemura /* interrupt mode */ 90 1.1 takemura if (cf->cf_level != HPCIOMANCF_LEVEL_DEFAULT) { 91 1.6 takemura switch (cf->cf_hold) { 92 1.6 takemura case 1: 93 1.6 takemura hma.hma_intr_mode = HPCIO_INTR_HOLD; 94 1.6 takemura break; 95 1.6 takemura case 0: 96 1.6 takemura case HPCIOMANCF_HOLD_DEFAULT: 97 1.6 takemura default: 98 1.6 takemura hma.hma_intr_mode = HPCIO_INTR_THROUGH; 99 1.6 takemura break; 100 1.6 takemura } 101 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_LEVEL; 102 1.1 takemura if (cf->cf_level == 0) 103 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_LOW; 104 1.1 takemura else 105 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_HIGH; 106 1.1 takemura } else { 107 1.6 takemura switch (cf->cf_hold) { 108 1.6 takemura case 0: 109 1.6 takemura hma.hma_intr_mode = HPCIO_INTR_THROUGH; 110 1.6 takemura break; 111 1.6 takemura case 1: 112 1.6 takemura case HPCIOMANCF_HOLD_DEFAULT: 113 1.6 takemura default: 114 1.6 takemura hma.hma_intr_mode = HPCIO_INTR_HOLD; 115 1.6 takemura break; 116 1.6 takemura } 117 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_EDGE; 118 1.1 takemura switch (cf->cf_edge) { 119 1.1 takemura case 1: 120 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_POSEDGE; 121 1.1 takemura break; 122 1.1 takemura case 2: 123 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_NEGEDGE; 124 1.1 takemura break; 125 1.1 takemura case 0: 126 1.1 takemura case 3: 127 1.1 takemura case HPCIOMANCF_EDGE_DEFAULT: 128 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_POSEDGE; 129 1.1 takemura hma.hma_intr_mode |= HPCIO_INTR_NEGEDGE; 130 1.1 takemura break; 131 1.1 takemura default: 132 1.1 takemura printf("%s(%d): invalid configuration, edge=%d", 133 1.1 takemura __FILE__, __LINE__, cf->cf_edge); 134 1.1 takemura break; 135 1.1 takemura } 136 1.1 takemura } 137 1.1 takemura 138 1.1 takemura hma.hma_type = cf->cf_type; 139 1.1 takemura hma.hma_id = cf->cf_id; 140 1.1 takemura hma.hma_port = cf->cf_port; 141 1.1 takemura if (cf->cf_active == 0) { 142 1.1 takemura hma.hma_on = 0; 143 1.1 takemura hma.hma_off = 1; 144 1.1 takemura } else { 145 1.1 takemura hma.hma_on = 1; 146 1.1 takemura hma.hma_off = 0; 147 1.1 takemura } 148 1.1 takemura hma.hma_initvalue = -1; /* none */ 149 1.1 takemura if (cf->cf_initvalue != HPCIOMANCF_INITVALUE_DEFAULT) { 150 1.1 takemura if (cf->cf_initvalue == 0) 151 1.1 takemura hma.hma_initvalue = hma.hma_off; 152 1.1 takemura else 153 1.1 takemura hma.hma_initvalue = hma.hma_on; 154 1.1 takemura } 155 1.6 takemura hma.hma_connect = cf->cf_connect; 156 1.1 takemura 157 1.21 thorpej config_attach(parent, cf, &hma, hpcioman_print, CFARGS_NONE); 158 1.1 takemura 159 1.1 takemura return (0); 160 1.1 takemura } 161 1.1 takemura 162 1.1 takemura int 163 1.1 takemura hpcioman_print(void *aux, const char *pnp) 164 1.1 takemura { 165 1.1 takemura struct hpcioman_attach_args *hma = aux; 166 1.1 takemura int type = hma->hma_type; 167 1.1 takemura 168 1.1 takemura if (!pnp) { 169 1.10 thorpej aprint_normal(" iochip %s, port %d, type %d, id %d", 170 1.3 uch hma->hma_hc ? hma->hma_hc->hc_name : "not found", 171 1.3 uch hma->hma_port, type, hma->hma_id); 172 1.1 takemura if (type == CONFIG_HOOK_BUTTONEVENT || 173 1.12 perry type == CONFIG_HOOK_PMEVENT || 174 1.6 takemura type == CONFIG_HOOK_EVENT || 175 1.6 takemura type == CONFIG_HOOK_PCIINTR) { 176 1.1 takemura if (hma->hma_intr_mode & HPCIO_INTR_EDGE) 177 1.10 thorpej aprint_normal (", interrupt edge [%s%s]", 178 1.3 uch (hma->hma_intr_mode&HPCIO_INTR_POSEDGE) 179 1.3 uch ? "p" : "", 180 1.3 uch (hma->hma_intr_mode&HPCIO_INTR_NEGEDGE) 181 1.3 uch ? "n" : ""); 182 1.1 takemura else 183 1.10 thorpej aprint_normal (", interrupt level %s", 184 1.3 uch (hma->hma_intr_mode&HPCIO_INTR_HIGH) ? 185 1.3 uch "high" : "low"); 186 1.1 takemura } 187 1.1 takemura if (hma->hma_initvalue != -1) 188 1.10 thorpej aprint_normal(", initial value %d", hma->hma_initvalue); 189 1.1 takemura if (hma->hma_on == 0) 190 1.10 thorpej aprint_normal(", active low"); 191 1.1 takemura } 192 1.12 perry 193 1.3 uch return (QUIET); 194 1.1 takemura } 195