void wdc_amiga_attach(device_t parent, device_t self, void *aux) { struct wdc_amiga_softc *sc = device_private(self); struct wdc_regs *wdr; int i; aprint_normal("\n"); sc->sc_wdcdev.sc_atac.atac_dev = self; sc->sc_wdcdev.regs = wdr = &sc->sc_wdc_regs; gayle_init(); if (is_a4000()) { sc->cmd_iot.base = (bus_addr_t) ztwomap(GAYLE_IDE_BASE_A4000 + 2); } else { sc->cmd_iot.base = (bus_addr_t) ztwomap(GAYLE_IDE_BASE + 2); } sc->cmd_iot.absm = sc->ctl_iot.absm = &amiga_bus_stride_4swap; wdr->cmd_iot = &sc->cmd_iot; wdr->ctl_iot = &sc->ctl_iot; if (bus_space_map(wdr->cmd_iot, 0, 0x40, 0, &wdr->cmd_baseioh)) { aprint_error_dev(self, "couldn't map registers\n"); return; } for (i = 0; i < WDC_NREG; i++) { if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh, i, i == 0 ? 4 : 1, &wdr->cmd_iohs[i]) != 0) { bus_space_unmap(wdr->cmd_iot, wdr->cmd_baseioh, 0x40); aprint_error_dev(self, "couldn't map registers\n"); return; } } if (bus_space_subregion(wdr->cmd_iot, wdr->cmd_baseioh, 0x406, 1, &wdr->ctl_ioh)) return; sc->sc_wdcdev.sc_atac.atac_cap = ATAC_CAP_DATA16; sc->sc_wdcdev.sc_atac.atac_pio_cap = 0; sc->sc_chanlist[0] = &sc->sc_channel; sc->sc_wdcdev.sc_atac.atac_channels = sc->sc_chanlist; sc->sc_wdcdev.sc_atac.atac_nchannels = 1; sc->sc_wdcdev.wdc_maxdrives = 2; sc->sc_channel.ch_channel = 0; sc->sc_channel.ch_atac = &sc->sc_wdcdev.sc_atac; sc->sc_channel.ch_queue = &sc->sc_chqueue; wdc_init_shadow_regs(&sc->sc_channel); sc->sc_isr.isr_intr = wdc_amiga_intr; sc->sc_isr.isr_arg = sc; sc->sc_isr.isr_ipl = 2; add_isr (&sc->sc_isr); if (!is_a4000()) gayle_intr_enable_set(GAYLE_INT_IDE); wdcattach(&sc->sc_channel); }
static void pccard_attach(struct device *parent, struct device *myself, void *aux) { struct pccard_softc *self = (struct pccard_softc *) myself; struct pcmciabus_attach_args paa; vaddr_t pcmcia_base; vaddr_t i; printf("\n"); gayle_init(); pcmcia_base = uvm_km_alloc(kernel_map, GAYLE_PCMCIA_END - GAYLE_PCMCIA_START, 0, UVM_KMF_VAONLY | UVM_KMF_NOWAIT); if (pcmcia_base == 0) { printf("attach failed (no virtual memory)\n"); return; } for (i = GAYLE_PCMCIA_START; i < GAYLE_PCMCIA_END; i += PAGE_SIZE) pmap_enter(vm_map_pmap(kernel_map), i - GAYLE_PCMCIA_START + pcmcia_base, i, VM_PROT_READ | VM_PROT_WRITE, true); pmap_update(vm_map_pmap(kernel_map)); /* override the one-byte access methods for I/O space */ pcmio_bs_methods = amiga_bus_stride_1; pcmio_bs_methods.bsr1 = pcmio_bsr1; pcmio_bs_methods.bsw1 = pcmio_bsw1; pcmio_bs_methods.bsrm1 = pcmio_bsrm1; pcmio_bs_methods.bswm1 = pcmio_bswm1; pcmio_bs_methods.bsrr1 = pcmio_bsrr1; pcmio_bs_methods.bswr1 = pcmio_bswr1; pcmio_bs_methods.bssr1 = pcmio_bssr1; pcmio_bs_methods.bscr1 = pcmio_bscr1; reset_card_reg = (u_int8_t *) pcmcia_base + (GAYLE_PCMCIA_RESET - GAYLE_PCMCIA_START); self->io_space.base = (bus_addr_t) pcmcia_base + (GAYLE_PCMCIA_IO_START - GAYLE_PCMCIA_START); self->io_space.absm = &pcmio_bs_methods; self->attr_space.base = (bus_addr_t) pcmcia_base + (GAYLE_PCMCIA_ATTR_START - GAYLE_PCMCIA_START); self->attr_space.absm = &amiga_bus_stride_1; /* XXX we should check if the 4M of common memory are actually * RAM or PCMCIA usable. * For now, we just do as if the 4M were RAM and make common memory * point to attribute memory, which is OK for some I/O cards. */ self->mem_space.base = (bus_addr_t) pcmcia_base; self->mem_space.absm = &amiga_bus_stride_1; self->devs[0].sc = self; self->devs[0].intr_func = NULL; self->devs[0].intr_arg = NULL; self->devs[0].flags = 0; gayle.pcc_status = 0; gayle.intreq = 0; gayle.pcc_config = 0; gayle.intena &= GAYLE_INT_IDE; paa.paa_busname = "pcmcia"; paa.pct = &chip_functions; paa.pch = &self->devs[0]; paa.iobase = 0; paa.iosize = 0; self->devs[0].card = config_found(myself, &paa, simple_devprint); if (self->devs[0].card == NULL) { printf("attach failed, config_found() returned NULL\n"); pmap_remove(kernel_map->pmap, pcmcia_base, pcmcia_base + (GAYLE_PCMCIA_END - GAYLE_PCMCIA_START)); pmap_update(kernel_map->pmap); uvm_deallocate(kernel_map, pcmcia_base, GAYLE_PCMCIA_END - GAYLE_PCMCIA_START); return; } self->intr6.isr_intr = pccard_intr6; self->intr6.isr_arg = self; self->intr6.isr_ipl = 6; add_isr(&self->intr6); self->intr2.isr_intr = pccard_intr2; self->intr2.isr_arg = self; self->intr2.isr_ipl = 2; add_isr(&self->intr2); if (kthread_create(PRI_NONE, 0, NULL, pccard_kthread, self, NULL, "pccard")) { printf("%s: can't create kernel thread\n", self->sc_dev.dv_xname); panic("pccard kthread_create() failed"); } gayle.intena |= GAYLE_INT_DETECT | GAYLE_INT_IREQ; /* reset the card if it's already there */ if (gayle.pcc_status & GAYLE_CCMEM_DETECT) { volatile u_int8_t x; *reset_card_reg = 0x0; delay(1000); x = *reset_card_reg; gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR; } pccard_attach_slot(&self->devs[0]); }
/* * probe_for_hwifs() finds/initializes "known" IDE interfaces */ static void __init probe_for_hwifs (void) { #ifdef CONFIG_IDEPCI_PCIBUS_ORDER ide_scan_pcibus(ide_scan_direction); #endif #ifdef CONFIG_ETRAX_IDE { extern void init_e100_ide(void); init_e100_ide(); } #endif /* CONFIG_ETRAX_IDE */ #ifdef CONFIG_BLK_DEV_CMD640 { extern void ide_probe_for_cmd640x(void); ide_probe_for_cmd640x(); } #endif /* CONFIG_BLK_DEV_CMD640 */ #ifdef CONFIG_BLK_DEV_IDE_PMAC { extern int pmac_ide_probe(void); (void)pmac_ide_probe(); } #endif /* CONFIG_BLK_DEV_IDE_PMAC */ #ifdef CONFIG_BLK_DEV_GAYLE { extern void gayle_init(void); gayle_init(); } #endif /* CONFIG_BLK_DEV_GAYLE */ #ifdef CONFIG_BLK_DEV_FALCON_IDE { extern void falconide_init(void); falconide_init(); } #endif /* CONFIG_BLK_DEV_FALCON_IDE */ #ifdef CONFIG_BLK_DEV_MAC_IDE { extern void macide_init(void); macide_init(); } #endif /* CONFIG_BLK_DEV_MAC_IDE */ #ifdef CONFIG_BLK_DEV_Q40IDE { extern void q40ide_init(void); q40ide_init(); } #endif /* CONFIG_BLK_DEV_Q40IDE */ #ifdef CONFIG_BLK_DEV_BUDDHA { extern void buddha_init(void); buddha_init(); } #endif /* CONFIG_BLK_DEV_BUDDHA */ #ifdef CONFIG_BLK_DEV_IDEPNP pnpide_init(); #endif #ifdef CONFIG_H8300 h8300_ide_init(); #endif #ifdef CONFIG_BLK_DEV_BMIDE_TANGOX { extern int __init tangox_bmide_init(void); tangox_bmide_init(); } #endif #ifdef CONFIG_BLK_DEV_PBIDE_TANGOX { extern int __init tangox_pbide_init(void); tangox_pbide_init(); } #endif }