aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/scc
diff options
context:
space:
mode:
authorMarius Strobl <marius@FreeBSD.org>2013-08-02 23:28:49 +0000
committerMarius Strobl <marius@FreeBSD.org>2013-08-02 23:28:49 +0000
commitc4b1deaf0d05e7ba715124b4c752edef80222115 (patch)
tree67524f606efe46bfafc6a116eefbc47842a7fadb /sys/dev/scc
parentf86392791f0ccbb5573cbcfe8963cd76dd26e7cd (diff)
Notes
Diffstat (limited to 'sys/dev/scc')
-rw-r--r--sys/dev/scc/scc_dev_quicc.c24
-rw-r--r--sys/dev/scc/scc_dev_sab82532.c31
-rw-r--r--sys/dev/scc/scc_dev_z8530.c10
3 files changed, 41 insertions, 24 deletions
diff --git a/sys/dev/scc/scc_dev_quicc.c b/sys/dev/scc/scc_dev_quicc.c
index 6f337b8c453e..e2fdb628b633 100644
--- a/sys/dev/scc/scc_dev_quicc.c
+++ b/sys/dev/scc/scc_dev_quicc.c
@@ -27,13 +27,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#define __RMAN_RESOURCE_VISIBLE
-
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
#include <sys/conf.h>
-#include <sys/endian.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <sys/serial.h>
@@ -63,7 +60,7 @@ static kobj_method_t quicc_methods[] = {
KOBJMETHOD(scc_iclear, quicc_bfe_iclear),
KOBJMETHOD(scc_ipend, quicc_bfe_ipend),
KOBJMETHOD(scc_probe, quicc_bfe_probe),
- { 0, 0 }
+ KOBJMETHOD_END
};
struct scc_class scc_quicc_class = {
@@ -77,11 +74,9 @@ struct scc_class scc_quicc_class = {
};
static int
-quicc_bfe_attach(struct scc_softc *sc, int reset)
+quicc_bfe_attach(struct scc_softc *sc __unused, int reset __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}
@@ -104,7 +99,18 @@ quicc_bfe_enabled(struct scc_softc *sc, struct scc_chan *ch)
static int
quicc_bfe_iclear(struct scc_softc *sc, struct scc_chan *ch)
{
+ struct scc_bas *bas;
+ uint16_t rb, st;
+ bas = &sc->sc_bas;
+ mtx_lock_spin(&sc->sc_hwmtx);
+ if (ch->ch_ipend & SER_INT_RXREADY) {
+ rb = quicc_read2(bas, QUICC_PRAM_SCC_RBASE(ch->ch_nr - 1));
+ st = quicc_read2(bas, rb);
+ (void)quicc_read4(bas, rb + 4);
+ quicc_write2(bas, rb, st | 0x9000);
+ }
+ mtx_unlock_spin(&sc->sc_hwmtx);
return (0);
}
@@ -142,10 +148,8 @@ quicc_bfe_ipend(struct scc_softc *sc)
}
static int
-quicc_bfe_probe(struct scc_softc *sc)
+quicc_bfe_probe(struct scc_softc *sc __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}
diff --git a/sys/dev/scc/scc_dev_sab82532.c b/sys/dev/scc/scc_dev_sab82532.c
index f8845c517cf3..bbc8bd4b9812 100644
--- a/sys/dev/scc/scc_dev_sab82532.c
+++ b/sys/dev/scc/scc_dev_sab82532.c
@@ -52,7 +52,7 @@ static kobj_method_t sab82532_methods[] = {
KOBJMETHOD(scc_iclear, sab82532_bfe_iclear),
KOBJMETHOD(scc_ipend, sab82532_bfe_ipend),
KOBJMETHOD(scc_probe, sab82532_bfe_probe),
- { 0, 0 }
+ KOBJMETHOD_END
};
struct scc_class scc_sab82532_class = {
@@ -66,18 +66,37 @@ struct scc_class scc_sab82532_class = {
};
static int
-sab82532_bfe_attach(struct scc_softc *sc, int reset)
+sab82532_bfe_attach(struct scc_softc *sc __unused, int reset __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}
static int
sab82532_bfe_iclear(struct scc_softc *sc, struct scc_chan *ch)
{
+ struct scc_bas *bas;
+ int i, ofs, rbcl;
+ bas = &sc->sc_bas;
+ ofs = (ch->ch_nr - 1) * SAB_CHANLEN;
+ mtx_lock_spin(&sc->sc_hwmtx);
+ if (ch->ch_ipend & SER_INT_RXREADY) {
+ if (scc_getreg(bas, ofs + SAB_STAR) & SAB_STAR_RFNE) {
+ rbcl = scc_getreg(bas, ofs + SAB_RBCL) & 31;
+ if (rbcl == 0)
+ rbcl = 32;
+ for (i = 0; i < rbcl; i += 2) {
+ (void)scc_getreg(bas, ofs + SAB_RFIFO);
+ (void)scc_getreg(bas, ofs + SAB_RFIFO + 1);
+ }
+ }
+ while (scc_getreg(bas, ofs + SAB_STAR) & SAB_STAR_CEC)
+ ;
+ scc_setreg(bas, ofs + SAB_CMDR, SAB_CMDR_RMC);
+ scc_barrier(bas);
+ }
+ mtx_unlock_spin(&sc->sc_hwmtx);
return (0);
}
@@ -124,10 +143,8 @@ sab82532_bfe_ipend(struct scc_softc *sc)
}
static int
-sab82532_bfe_probe(struct scc_softc *sc)
+sab82532_bfe_probe(struct scc_softc *sc __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}
diff --git a/sys/dev/scc/scc_dev_z8530.c b/sys/dev/scc/scc_dev_z8530.c
index 3d63c227b248..0920d45bec45 100644
--- a/sys/dev/scc/scc_dev_z8530.c
+++ b/sys/dev/scc/scc_dev_z8530.c
@@ -52,7 +52,7 @@ static kobj_method_t z8530_methods[] = {
KOBJMETHOD(scc_iclear, z8530_bfe_iclear),
KOBJMETHOD(scc_ipend, z8530_bfe_ipend),
KOBJMETHOD(scc_probe, z8530_bfe_probe),
- { 0, 0 }
+ KOBJMETHOD_END
};
struct scc_class scc_z8530_class = {
@@ -85,11 +85,9 @@ scc_getmreg(struct scc_bas *bas, int ch, int reg)
}
static int
-z8530_bfe_attach(struct scc_softc *sc, int reset)
+z8530_bfe_attach(struct scc_softc *sc __unused, int reset __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}
@@ -189,10 +187,8 @@ z8530_bfe_ipend(struct scc_softc *sc)
}
static int
-z8530_bfe_probe(struct scc_softc *sc)
+z8530_bfe_probe(struct scc_softc *sc __unused)
{
- struct scc_bas *bas;
- bas = &sc->sc_bas;
return (0);
}