summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/dev
diff options
context:
space:
mode:
authorrkujawa <rkujawa@NetBSD.org>2014-01-03 00:33:06 +0000
committerrkujawa <rkujawa@NetBSD.org>2014-01-03 00:33:06 +0000
commitdec458678e514b08d976255eda5ec7868c5f76d5 (patch)
tree54bf0cf120b081dcdc2998b80fe70a7b6c01716a /sys/arch/amiga/dev
parent08fbedeaff08b5bb777514ed6d008013761d8593 (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.h6
-rw-r--r--sys/arch/amiga/dev/efa.c12
-rw-r--r--sys/arch/amiga/dev/efareg.h3
-rw-r--r--sys/arch/amiga/dev/gayle_pcmcia.c44
-rw-r--r--sys/arch/amiga/dev/wdc_acafh.c20
-rw-r--r--sys/arch/amiga/dev/wdc_amiga.c37
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;
}
+