diff options
| author | rkujawa <rkujawa@NetBSD.org> | 2014-01-03 00:33:06 +0000 |
|---|---|---|
| committer | rkujawa <rkujawa@NetBSD.org> | 2014-01-03 00:33:06 +0000 |
| commit | dec458678e514b08d976255eda5ec7868c5f76d5 (patch) | |
| tree | 54bf0cf120b081dcdc2998b80fe70a7b6c01716a /sys/arch/amiga/dev | |
| parent | 08fbedeaff08b5bb777514ed6d008013761d8593 (diff) | |
Rework handling of Commodore Gayle chip. Avoid ugly struct casts, introduce
proper bus_space accesses and some abstraction layer. All drivers that utilised
Gayle also had to be refactored.
I tried not to break anything more, but this clearly needs more testing...
Diffstat (limited to 'sys/arch/amiga/dev')
| -rw-r--r-- | sys/arch/amiga/dev/acafhreg.h | 6 | ||||
| -rw-r--r-- | sys/arch/amiga/dev/efa.c | 12 | ||||
| -rw-r--r-- | sys/arch/amiga/dev/efareg.h | 3 | ||||
| -rw-r--r-- | sys/arch/amiga/dev/gayle_pcmcia.c | 44 | ||||
| -rw-r--r-- | sys/arch/amiga/dev/wdc_acafh.c | 20 | ||||
| -rw-r--r-- | sys/arch/amiga/dev/wdc_amiga.c | 37 |
6 files changed, 62 insertions, 60 deletions
diff --git a/sys/arch/amiga/dev/acafhreg.h b/sys/arch/amiga/dev/acafhreg.h index 9e24053ad4f..af21b8e707a 100644 --- a/sys/arch/amiga/dev/acafhreg.h +++ b/sys/arch/amiga/dev/acafhreg.h @@ -1,4 +1,4 @@ -/* $NetBSD: acafhreg.h,v 1.3 2013/12/26 20:38:11 rkujawa Exp $ */ +/* $NetBSD: acafhreg.h,v 1.4 2014/01/03 00:33:06 rkujawa Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -29,9 +29,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include <amiga/amiga/gayle.h> + #ifndef _AMIGA_ACAFHREG_H_ -#define GAYLE_IDE_BASE 0xDA0000 /* ACA500 has Gayle-compatible IDE */ +#define ACAFH_IDE_BASE GAYLE_IDE_BASE /* ACA500 has Gayle-compatible IDE */ #define ACAFH_CLOCKPORT_BASE 0xD80001 #define ACAFH_MSB_SHIFT 0xF diff --git a/sys/arch/amiga/dev/efa.c b/sys/arch/amiga/dev/efa.c index 44a29b0f1da..547829e18ed 100644 --- a/sys/arch/amiga/dev/efa.c +++ b/sys/arch/amiga/dev/efa.c @@ -1,4 +1,4 @@ -/* $NetBSD: efa.c,v 1.11 2012/07/31 15:50:31 bouyer Exp $ */ +/* $NetBSD: efa.c,v 1.12 2014/01/03 00:33:06 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -172,8 +172,6 @@ efa_attach(device_t parent, device_t self, void *aux) wdc_allocate_regs(&sc->sc_wdcdev); - sc->sc_intreg = &gayle.intreq; - for (i = 0; i < FATA1_CHANNELS; i++) efa_attach_channel(sc, i); @@ -194,7 +192,7 @@ efa_attach(device_t parent, device_t self, void *aux) sc->sc_isr.isr_arg = sc; sc->sc_isr.isr_ipl = 2; add_isr (&sc->sc_isr); - gayle.intena |= GAYLE_INT_IDE; + gayle_intr_enable_set(GAYLE_INT_IDE); } } @@ -283,13 +281,13 @@ efa_intr(void *arg) { struct efa_softc *sc = (struct efa_softc *)arg; int r1, r2, ret; - u_char intreq; + uint8_t intreq; - intreq = *sc->sc_intreg; + intreq = gayle_intr_status(); ret = 0; if (intreq & GAYLE_INT_IDE) { - gayle.intreq = 0x7c | (intreq & 0x03); + gayle_intr_ack(0x7C | (intreq & 0x03)); /* How to check which channel caused interrupt? * Interrupt status register is not very useful here. */ r1 = wdcintr(&sc->sc_ports[0].chan); diff --git a/sys/arch/amiga/dev/efareg.h b/sys/arch/amiga/dev/efareg.h index d8d5ca04524..1b5eb5970a5 100644 --- a/sys/arch/amiga/dev/efareg.h +++ b/sys/arch/amiga/dev/efareg.h @@ -1,4 +1,4 @@ -/* $NetBSD: efareg.h,v 1.2 2011/10/29 11:16:19 rkujawa Exp $ */ +/* $NetBSD: efareg.h,v 1.3 2014/01/03 00:33:06 rkujawa Exp $ */ /*- * Copyright (c) 2011 The NetBSD Foundation, Inc. @@ -31,7 +31,6 @@ #ifndef _AMIGA_EFAREG_H_ -#define GAYLE_IDE_BASE 0xDA0000 #define FATA1_BASE 0xDA2000 /* Offsets. Stride of 4 is used, so multiply any offset by 4. */ diff --git a/sys/arch/amiga/dev/gayle_pcmcia.c b/sys/arch/amiga/dev/gayle_pcmcia.c index ab0092dcd2b..2dd10b779fd 100644 --- a/sys/arch/amiga/dev/gayle_pcmcia.c +++ b/sys/arch/amiga/dev/gayle_pcmcia.c @@ -1,9 +1,9 @@ -/* $NetBSD: gayle_pcmcia.c,v 1.27 2013/09/23 08:39:28 jandberg Exp $ */ +/* $NetBSD: gayle_pcmcia.c,v 1.28 2014/01/03 00:33:06 rkujawa Exp $ */ /* public domain */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gayle_pcmcia.c,v 1.27 2013/09/23 08:39:28 jandberg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gayle_pcmcia.c,v 1.28 2014/01/03 00:33:06 rkujawa Exp $"); /* PCMCIA front-end driver for A1200's and A600's. */ @@ -165,10 +165,10 @@ pccard_attach(device_t parent, device_t self, void *aux) sc->devs[0].intr_arg = NULL; sc->devs[0].flags = 0; - gayle.pcc_status = 0; - gayle.intreq = 0; - gayle.pcc_config = 0; - gayle.intena &= GAYLE_INT_IDE; + gayle_pcmcia_status_write(0); + gayle_intr_ack(0); + gayle_pcmcia_config_write(0); + gayle_intr_enable_set(GAYLE_INT_IDE); paa.paa_busname = "pcmcia"; paa.pct = &chip_functions; @@ -201,15 +201,15 @@ pccard_attach(device_t parent, device_t self, void *aux) panic("pccard kthread_create() failed"); } - gayle.intena |= GAYLE_INT_DETECT | GAYLE_INT_IREQ; + gayle_intr_enable_set(GAYLE_INT_DETECT | GAYLE_INT_IREQ); /* reset the card if it's already there */ - if (gayle.pcc_status & GAYLE_CCMEM_DETECT) { + if (gayle_pcmcia_status_read() & 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; + gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); } pccard_attach_slot(&sc->devs[0]); @@ -220,9 +220,9 @@ pccard_intr6(void *arg) { struct pccard_softc *sc = arg; - if (gayle.intreq & GAYLE_INT_DETECT) { - gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_STSCHG | - GAYLE_INT_SPKR | GAYLE_INT_WP | GAYLE_INT_IREQ; + if (gayle_intr_status() & GAYLE_INT_DETECT) { + gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_STSCHG | + GAYLE_INT_SPKR | GAYLE_INT_WP | GAYLE_INT_IREQ); sc->devs[0].flags |= SLOT_NEW_CARD_EVENT; return 1; } @@ -239,15 +239,15 @@ pccard_intr2(void *arg) slot->flags &= ~SLOT_NEW_CARD_EVENT; /* reset the registers */ - gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_DETECT; - gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR; - gayle.pcc_config = 0; + gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT); + gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); + gayle_pcmcia_config_write(0); pccard_attach_slot(&sc->devs[0]); } else { - int intreq = gayle.intreq & + int intreq = gayle_intr_status() & (GAYLE_INT_STSCHG | GAYLE_INT_WP | GAYLE_INT_IREQ); if (intreq) { - gayle.intreq = (intreq ^ 0x2c) | 0xc0; + gayle_intr_ack((intreq ^ 0x2c) | 0xc0); return slot->flags & SLOT_OCCUPIED && slot->intr_func != NULL && @@ -268,12 +268,12 @@ pccard_kthread(void *arg) if (slot->flags & SLOT_NEW_CARD_EVENT) { slot->flags &= ~SLOT_NEW_CARD_EVENT; - gayle.intreq = 0xc0; + gayle_intr_ack(0xc0); /* reset the registers */ - gayle.intreq = GAYLE_INT_IDE | GAYLE_INT_DETECT; - gayle.pcc_status = GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR; - gayle.pcc_config = 0; + gayle_intr_ack(GAYLE_INT_IDE | GAYLE_INT_DETECT); + gayle_pcmcia_status_write(GAYLE_CCMEM_WP | GAYLE_CCIO_SPKR); + gayle_pcmcia_config_write(0); pccard_attach_slot(&sc->devs[0]); } splx(s); @@ -287,7 +287,7 @@ pccard_attach_slot(struct pccard_slot *slot) { if (!(slot->flags & SLOT_OCCUPIED) && - gayle.pcc_status & GAYLE_CCMEM_DETECT) { + gayle_pcmcia_status_read() & GAYLE_CCMEM_DETECT) { if (pcmcia_card_attach(slot->card) == 0) slot->flags |= SLOT_OCCUPIED; } diff --git a/sys/arch/amiga/dev/wdc_acafh.c b/sys/arch/amiga/dev/wdc_acafh.c index 93201091962..0f92414604a 100644 --- a/sys/arch/amiga/dev/wdc_acafh.c +++ b/sys/arch/amiga/dev/wdc_acafh.c @@ -1,4 +1,4 @@ -/* $NetBSD: wdc_acafh.c,v 1.2 2013/12/22 23:02:38 rkujawa Exp $ */ +/* $NetBSD: wdc_acafh.c,v 1.3 2014/01/03 00:33:06 rkujawa Exp $ */ /*- * Copyright (c) 2000, 2003, 2013 The NetBSD Foundation, Inc. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wdc_acafh.c,v 1.2 2013/12/22 23:02:38 rkujawa Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wdc_acafh.c,v 1.3 2014/01/03 00:33:06 rkujawa Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -81,7 +81,6 @@ struct wdc_acafh_softc { struct wdc_acafh_slot sc_slots[WDC_ACAFH_SLOTS]; struct isr sc_isr; - volatile u_char *sc_intreg; struct bus_space_tag cmd_iot; @@ -119,7 +118,6 @@ wdc_acafh_attach(device_t parent, device_t self, void *aux) sc->aca_sc = device_private(parent); gayle_init(); - sc->sc_intreg = &gayle.intreq; /* XXX: take addr from attach args? */ sc->cmd_iot.base = (u_long) ztwomap(GAYLE_IDE_BASE + 2); @@ -143,7 +141,7 @@ wdc_acafh_attach(device_t parent, device_t self, void *aux) sc->sc_isr.isr_ipl = 2; add_isr (&sc->sc_isr); - gayle.intena |= GAYLE_INT_IDE; + gayle_intr_enable_set(GAYLE_INT_IDE); } @@ -205,9 +203,13 @@ wdc_acafh_map_channel(struct wdc_acafh_softc *sc, int chnum) int wdc_acafh_intr(void *arg) { - struct wdc_acafh_softc *sc = (struct wdc_acafh_softc *)arg; - int ret = 0; - u_char intreq = *sc->sc_intreg; + struct wdc_acafh_softc *sc; + uint8_t intreq; + int ret; + + sc = (struct wdc_acafh_softc *) arg; + intreq = gayle_intr_status(); + ret = 0; if (intreq & GAYLE_INT_IDE) { if (acafh_cf_intr_status(sc->aca_sc, 1) == 1) { @@ -216,7 +218,7 @@ wdc_acafh_intr(void *arg) if (acafh_cf_intr_status(sc->aca_sc, 0) == 1) { ret = wdcintr(&sc->sc_slots[0].channel); } - gayle.intreq = 0x7c | (intreq & 0x03); + gayle_intr_ack(0x7C | (intreq & GAYLE_INT_IDEACK)); } return ret; diff --git a/sys/arch/amiga/dev/wdc_amiga.c b/sys/arch/amiga/dev/wdc_amiga.c index b0f8b5dca5b..beacdfe590a 100644 --- a/sys/arch/amiga/dev/wdc_amiga.c +++ b/sys/arch/amiga/dev/wdc_amiga.c @@ -1,4 +1,4 @@ -/* $NetBSD: wdc_amiga.c,v 1.36 2012/07/31 15:50:31 bouyer Exp $ */ +/* $NetBSD: wdc_amiga.c,v 1.37 2014/01/03 00:33:06 rkujawa Exp $ */ /*- * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wdc_amiga.c,v 1.36 2012/07/31 15:50:31 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wdc_amiga.c,v 1.37 2014/01/03 00:33:06 rkujawa Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -59,10 +59,8 @@ struct wdc_amiga_softc { struct ata_queue sc_chqueue; struct wdc_regs sc_wdc_regs; struct isr sc_isr; - volatile u_char *sc_intreg; struct bus_space_tag cmd_iot; struct bus_space_tag ctl_iot; - char sc_a1200; }; int wdc_amiga_probe(device_t, cfdata_t, void *); @@ -93,16 +91,14 @@ wdc_amiga_attach(device_t parent, device_t self, void *aux) 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 = (u_long)ztwomap(0xdd2020 + 2); - sc->sc_intreg = (volatile u_char *)ztwomap(0xdd2020 + 0x1000); - sc->sc_a1200 = 0; + sc->cmd_iot.base = (bus_addr_t) ztwomap(GAYLE_IDE_BASE_A4000 + 2); } else { - sc->cmd_iot.base = (u_long) ztwomap(0xda0000 + 2); - gayle_init(); - sc->sc_intreg = &gayle.intreq; - sc->sc_a1200 = 1; + 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; @@ -146,8 +142,8 @@ wdc_amiga_attach(device_t parent, device_t self, void *aux) sc->sc_isr.isr_ipl = 2; add_isr (&sc->sc_isr); - if (sc->sc_a1200) - gayle.intena |= GAYLE_INT_IDE; + if (!is_a4000()) + gayle_intr_enable_set(GAYLE_INT_IDE); wdcattach(&sc->sc_channel); } @@ -155,15 +151,20 @@ wdc_amiga_attach(device_t parent, device_t self, void *aux) int wdc_amiga_intr(void *arg) { - struct wdc_amiga_softc *sc = (struct wdc_amiga_softc *)arg; - u_char intreq = *sc->sc_intreg; - int ret = 0; + struct wdc_amiga_softc *sc; + uint8_t intreq; + int ret; + + sc = (struct wdc_amiga_softc *)arg; + ret = 0; + intreq = gayle_intr_status(); if (intreq & GAYLE_INT_IDE) { - if (sc->sc_a1200) - gayle.intreq = 0x7c | (intreq & 0x03); + if (!is_a4000()) + gayle_intr_ack(0x7C | (intreq & GAYLE_INT_IDEACK)); ret = wdcintr(&sc->sc_channel); } return ret; } + |
