shithub: n900

Download patch

ref: 442bdf2e2cdde057cd3199f67296ef58d5bacb79
parent: 1a2e9ac076148c21d82d3ad6f730af3d7f88692a
author: mia soweli <[email protected]>
date: Thu Aug 31 12:37:33 EDT 2023

9: remove n900 naming from files that do not require it

this is preparation for eventually bringing this
into the upstream 9front omap kernel.

--- a/sys/src/9/n900/devkbd.c
+++ /dev/null
@@ -1,243 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "../port/error.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/i2c.h"
-
-enum {
-	Rctrl		= 0xd2,
-		Csoftreset	= 1<<0,
-		Csoftmode	= 1<<1,
-		Cenable		= 1<<6,
-	Rcode	= 0xdb,
-	Risr		= 0xe3,
-	Rimr		= 0xe4,
-		Ikp			= 1<<0,
-		Ilk			= 1<<1,
-		Ito			= 1<<2,
-	Rsir		= 0xe7,
-	Redr		= 0xe8,
-		Ekpfalling		= 1<<0,
-		Ekprising		= 1<<1,
-		Elkfalling		= 1<<2,
-		Elkrising		= 1<<3,
-		Etofalling		= 1<<4,
-		Etorising		= 1<<5,
-		Emisfalling	= 1<<6,
-		Emisrising	= 1<<7,
-	Rsih		= 0xe9,
-		Scor			= 1<<2,
-};
-
-enum {
-	Qdir,
-	Qscan,
-};
-
-typedef struct Ctlr Ctlr;
-struct Ctlr {
-	Ref;
-	Lock;
-
-	I2Cdev *dev;
-	Queue *q;
-
-	uchar cur[8];
-	uchar prev[8];
-};
-
-static Ctlr ctlr;
-static Dirtab kbdtab[] = {
-	".",			{Qdir, 0, QTDIR},		0, 0555,
-	"scancode",	{Qscan, 0, QTFILE},	0, 0440,
-};
-
-static u8int
-csr8r(Ctlr *ctlr, u8int r)
-{
-	uchar buf;
-
-	i2crecv(ctlr->dev, &buf, sizeof(buf), r);
-	return buf;
-}
-
-static u8int
-csr8w(Ctlr *ctlr, u8int r, u8int w)
-{
-	i2csend(ctlr->dev, &w, sizeof(w), r);
-	return w;
-}
-
-static void
-kbdinterrupt(Ureg *, void*)
-{
-	int i, j, c, k;
-
-	ilock(&ctlr);
-	if(!(csr8r(&ctlr, Risr) & Ikp)) {
-		iunlock(&ctlr);
-		return;
-	}
-
-	/* scan key columns */
-	for(i = 0; i < 8; i++) {
-		ctlr.prev[i] = ctlr.cur[i];
-		ctlr.cur[i] = csr8r(&ctlr, Rcode + i);
-
-		/* changed? */
-		c = ctlr.cur[i] ^ ctlr.prev[i];
-		if(!c)
-			continue;
-
-		/* scan key rows */
-		for(j = 0; j < 8; j++) {
-			if(!(c & (1 << j)))
-				continue;
-
-			/* pressed or released? */
-			k = i << 3 | j;
-			if(ctlr.prev[i] & (1 << j))
-				k |= 0x80;
-
-			qproduce(ctlr.q, &k, 1);
-		}
-	}
-
-	iunlock(&ctlr);
-}
-
-static void
-kbdreset(void)
-{
-	ilock(&ctlr);
-	ctlr.q = qopen(1024, Qcoalesce, 0, 0);
-	if(!ctlr.q) {
-		iunlock(&ctlr);
-		return;
-	}
-
-	ctlr.dev = i2cdev(i2cbus("i2c1"), 0x4a);
-	if(!ctlr.dev) {
-		iunlock(&ctlr);
-		return;
-	}
-
-	ctlr.dev->subaddr = 1;
-	ctlr.dev->size = 0x100;
-
-	csr8w(&ctlr, Rctrl, Csoftreset | Csoftmode | Cenable);
-	csr8w(&ctlr, Rsih, Scor);
-	csr8w(&ctlr, Rimr, ~Ikp);
-
-	intrenable(IRQTWL, kbdinterrupt, nil, BUSUNKNOWN, "kbd");
-	iunlock(&ctlr);
-}
-
-static void
-kbdshutdown(void)
-{
-}
-
-static Chan *
-kbdattach(char *spec)
-{
-	if(!ctlr.dev)
-		error(Enonexist);
-
-	return devattach(L'b', spec);
-}
-
-static Walkqid *
-kbdwalk(Chan *c, Chan *nc, char **name, int nname)
-{
-	return devwalk(c, nc, name, nname, kbdtab, nelem(kbdtab), devgen);
-}
-
-static int
-kbdstat(Chan *c, uchar *dp, int n)
-{
-	return devstat(c, dp, n, kbdtab, nelem(kbdtab), devgen);
-}
-
-static Chan *
-kbdopen(Chan *c, int mode)
-{
-	if(!iseve)
-		error(Eperm);
-
-	if(c->qid.path == Qscan) {
-		if(waserror()) {
-			decref(&ctlr);
-			nexterror();
-		}
-
-		if(incref(&ctlr) != 1)
-			error(Einuse);
-
-		c = devopen(c, mode, kbdtab, nelem(kbdtab), devgen);
-		poperror();
-		return c;
-	}
-
-	return devopen(c, mode, kbdtab, nelem(kbdtab), devgen);
-}
-
-static void
-kbdclose(Chan *c)
-{
-	if((c->flag & COPEN) && c->qid.path == Qscan)
-		decref(&ctlr);
-}
-
-static Block*
-kbdbread(Chan *c, long n, ulong off)
-{
-	if(c->qid.path == Qscan)
-		return qbread(ctlr.q, n);
-
-	return devbread(c, n, off);
-}
-
-static long
-kbdread(Chan *c, void *a, long n, vlong)
-{
-	if(c->qid.path == Qscan)
-		return qread(ctlr.q, a, n);
-
-	if(c->qid.path == Qdir)
-		return devdirread(c, a, n, kbdtab, nelem(kbdtab), devgen);
-
-	error(Egreg);
-	return 0;
-}
-
-static long
-kbdwrite(Chan *, void *, long, vlong)
-{
-	error(Egreg);
-	return 0;
-}
-
-Dev kbddevtab = {
-	L'b',
-	"kbd",
-
-	kbdreset,
-	devinit,
-	kbdshutdown,
-	kbdattach,
-	kbdwalk,
-	kbdstat,
-	kbdopen,
-	devcreate,
-	kbdclose,
-	kbdread,
-	kbdbread,
-	kbdwrite,
-	devbwrite,
-	devremove,
-	devwstat,
-};
--- /dev/null
+++ b/sys/src/9/n900/devkbdtwl.c
@@ -1,0 +1,243 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "../port/error.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/i2c.h"
+
+enum {
+	Rctrl		= 0xd2,
+		Csoftreset	= 1<<0,
+		Csoftmode	= 1<<1,
+		Cenable		= 1<<6,
+	Rcode	= 0xdb,
+	Risr		= 0xe3,
+	Rimr		= 0xe4,
+		Ikp			= 1<<0,
+		Ilk			= 1<<1,
+		Ito			= 1<<2,
+	Rsir		= 0xe7,
+	Redr		= 0xe8,
+		Ekpfalling		= 1<<0,
+		Ekprising		= 1<<1,
+		Elkfalling		= 1<<2,
+		Elkrising		= 1<<3,
+		Etofalling		= 1<<4,
+		Etorising		= 1<<5,
+		Emisfalling	= 1<<6,
+		Emisrising	= 1<<7,
+	Rsih		= 0xe9,
+		Scor			= 1<<2,
+};
+
+enum {
+	Qdir,
+	Qscan,
+};
+
+typedef struct Ctlr Ctlr;
+struct Ctlr {
+	Ref;
+	Lock;
+
+	I2Cdev *dev;
+	Queue *q;
+
+	uchar cur[8];
+	uchar prev[8];
+};
+
+static Ctlr ctlr;
+static Dirtab kbdtab[] = {
+	".",			{Qdir, 0, QTDIR},		0, 0555,
+	"scancode",	{Qscan, 0, QTFILE},	0, 0440,
+};
+
+static u8int
+csr8r(Ctlr *ctlr, u8int r)
+{
+	uchar buf;
+
+	i2crecv(ctlr->dev, &buf, sizeof(buf), r);
+	return buf;
+}
+
+static u8int
+csr8w(Ctlr *ctlr, u8int r, u8int w)
+{
+	i2csend(ctlr->dev, &w, sizeof(w), r);
+	return w;
+}
+
+static void
+kbdinterrupt(Ureg *, void*)
+{
+	int i, j, c, k;
+
+	ilock(&ctlr);
+	if(!(csr8r(&ctlr, Risr) & Ikp)) {
+		iunlock(&ctlr);
+		return;
+	}
+
+	/* scan key columns */
+	for(i = 0; i < 8; i++) {
+		ctlr.prev[i] = ctlr.cur[i];
+		ctlr.cur[i] = csr8r(&ctlr, Rcode + i);
+
+		/* changed? */
+		c = ctlr.cur[i] ^ ctlr.prev[i];
+		if(!c)
+			continue;
+
+		/* scan key rows */
+		for(j = 0; j < 8; j++) {
+			if(!(c & (1 << j)))
+				continue;
+
+			/* pressed or released? */
+			k = i << 3 | j;
+			if(ctlr.prev[i] & (1 << j))
+				k |= 0x80;
+
+			qproduce(ctlr.q, &k, 1);
+		}
+	}
+
+	iunlock(&ctlr);
+}
+
+static void
+kbdreset(void)
+{
+	ilock(&ctlr);
+	ctlr.q = qopen(1024, Qcoalesce, 0, 0);
+	if(!ctlr.q) {
+		iunlock(&ctlr);
+		return;
+	}
+
+	ctlr.dev = i2cdev(i2cbus("i2c1"), 0x4a);
+	if(!ctlr.dev) {
+		iunlock(&ctlr);
+		return;
+	}
+
+	ctlr.dev->subaddr = 1;
+	ctlr.dev->size = 0x100;
+
+	csr8w(&ctlr, Rctrl, Csoftreset | Csoftmode | Cenable);
+	csr8w(&ctlr, Rsih, Scor);
+	csr8w(&ctlr, Rimr, ~Ikp);
+
+	intrenable(IRQTWL, kbdinterrupt, nil, BUSUNKNOWN, "kbd");
+	iunlock(&ctlr);
+}
+
+static void
+kbdshutdown(void)
+{
+}
+
+static Chan *
+kbdattach(char *spec)
+{
+	if(!ctlr.dev)
+		error(Enonexist);
+
+	return devattach(L'b', spec);
+}
+
+static Walkqid *
+kbdwalk(Chan *c, Chan *nc, char **name, int nname)
+{
+	return devwalk(c, nc, name, nname, kbdtab, nelem(kbdtab), devgen);
+}
+
+static int
+kbdstat(Chan *c, uchar *dp, int n)
+{
+	return devstat(c, dp, n, kbdtab, nelem(kbdtab), devgen);
+}
+
+static Chan *
+kbdopen(Chan *c, int mode)
+{
+	if(!iseve)
+		error(Eperm);
+
+	if(c->qid.path == Qscan) {
+		if(waserror()) {
+			decref(&ctlr);
+			nexterror();
+		}
+
+		if(incref(&ctlr) != 1)
+			error(Einuse);
+
+		c = devopen(c, mode, kbdtab, nelem(kbdtab), devgen);
+		poperror();
+		return c;
+	}
+
+	return devopen(c, mode, kbdtab, nelem(kbdtab), devgen);
+}
+
+static void
+kbdclose(Chan *c)
+{
+	if((c->flag & COPEN) && c->qid.path == Qscan)
+		decref(&ctlr);
+}
+
+static Block*
+kbdbread(Chan *c, long n, ulong off)
+{
+	if(c->qid.path == Qscan)
+		return qbread(ctlr.q, n);
+
+	return devbread(c, n, off);
+}
+
+static long
+kbdread(Chan *c, void *a, long n, vlong)
+{
+	if(c->qid.path == Qscan)
+		return qread(ctlr.q, a, n);
+
+	if(c->qid.path == Qdir)
+		return devdirread(c, a, n, kbdtab, nelem(kbdtab), devgen);
+
+	error(Egreg);
+	return 0;
+}
+
+static long
+kbdwrite(Chan *, void *, long, vlong)
+{
+	error(Egreg);
+	return 0;
+}
+
+Dev kbddevtab = {
+	L'b',
+	"kbd",
+
+	kbdreset,
+	devinit,
+	kbdshutdown,
+	kbdattach,
+	kbdwalk,
+	kbdstat,
+	kbdopen,
+	devcreate,
+	kbdclose,
+	kbdread,
+	kbdbread,
+	kbdwrite,
+	devbwrite,
+	devremove,
+	devwstat,
+};
--- a/sys/src/9/n900/devrtc.c
+++ /dev/null
@@ -1,202 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "../port/error.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/i2c.h"
-
-enum {
-	Rsec		= 0x1c,
-	Rmin	= 0x1d,
-	Rhour	= 0x1e,
-	Rday	= 0x1f,
-	Rmonth	= 0x20,
-	Ryear	= 0x21,
-	Rweeks	= 0x22,
-	Rctrl		= 0x29,
-		Cget		= 1<<6,
-
-	Qdir = 0,
-	Qrtc,
-
-	SecMin	= 60,
-	SecHour	= 60*SecMin,
-	SecDay	= 24*SecHour,
-};
-
-typedef struct Ctlr Ctlr;
-struct Ctlr {
-	I2Cdev *dev;
-
-	int sec;
-	int min;
-	int hour;
-	int day;
-	int month;
-	int year;
-};
-
-static Ctlr ctlr;
-static int dmsize[] = { 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-static int ldmsize[] = { 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
-static Dirtab rtctab[] = {
-	".",		{Qdir, 0, QTDIR},	0, 0555,
-	"rtc",	{Qrtc, 0, QTFILE},	0, 0440,
-};
-
-#define bcddec(x) (((x) & 0xf) + ((x) >> 4) * 10)
-#define bcdenc(x) (((x / 10) << 4) + (x) % 10)
-#define leap(x) (((x) % 4) == 0 && ((x % 100) != 0 || (x % 400) == 0))
-
-static u8int
-csr8r(Ctlr *ctlr, u8int r)
-{
-	uchar buf;
-
-	i2crecv(ctlr->dev, &buf, sizeof(buf), r);
-	return buf;
-}
-
-static u8int
-csr8w(Ctlr *ctlr, u8int r, u8int w)
-{
-	i2csend(ctlr->dev, &w, sizeof(w), r);
-	return w;
-}
-
-static vlong
-rtcsnarf(void)
-{
-	vlong s;
-	int i;
-
-	/* latch and snarf */
-	csr8w(&ctlr, Rctrl, csr8r(&ctlr, Rctrl) | Cget);
-	ctlr.sec = bcddec(csr8r(&ctlr, Rsec)) % 60;
-	ctlr.min = bcddec(csr8r(&ctlr, Rmin)) % 60;
-	ctlr.hour = bcddec(csr8r(&ctlr, Rhour)) % 24;
-	ctlr.day = bcddec(csr8r(&ctlr, Rday));
-	ctlr.month = bcddec(csr8r(&ctlr, Rmonth));
-	ctlr.year = bcddec(csr8r(&ctlr, Ryear)) % 100;
-	ctlr.year += 2000;
-
-	/* seconds per year */
-	s = 0;
-	for(i = 1970; i < ctlr.year; i++) {
-		if(leap(i))
-			s += ldmsize[0] * SecDay;
-		else
-			s += dmsize[0] * SecDay;
-	}
-
-	/* seconds per month */
-	for(i = 1; i < ctlr.month; i++) {
-		if(leap(ctlr.year))
-			s += ldmsize[i] * SecDay;
-		else
-			s += dmsize[i] * SecDay;
-	}
-
-	/* days, hours, minutes, seconds */
-	s += (ctlr.day - 1) * SecDay;
-	s += ctlr.hour * SecHour;
-	s += ctlr.min * SecMin;
-	s += ctlr.sec;
-	return s;
-}
-
-static void
-rtcreset(void)
-{
-	ctlr.dev = i2cdev(i2cbus("i2c1"), 0x4b);
-	if(!ctlr.dev)
-		return;
-
-	ctlr.dev->subaddr = 1;
-	ctlr.dev->size = 0x100;
-}
-
-static void
-rtcshutdown(void)
-{
-}
-
-static Chan *
-rtcattach(char *spec)
-{
-	if(!ctlr.dev)
-		error(Enonexist);
-
-	return devattach('r', spec);
-}
-
-static Walkqid *
-rtcwalk(Chan *c, Chan *nc, char **name, int nname)
-{
-	return devwalk(c, nc, name, nname, rtctab, nelem(rtctab), devgen);
-}
-
-static int
-rtcstat(Chan *c, uchar *dp, int n)
-{
-	return devstat(c, dp, n, rtctab, nelem(rtctab), devgen);
-}
-
-static Chan *
-rtcopen(Chan *c, int mode)
-{
-	mode = openmode(mode);
-	if(c->qid.path == Qrtc) {
-		if(!iseve() && mode != OREAD)
-			error(Eperm);
-	}
-
-	return devopen(c, mode, rtctab, nelem(rtctab), devgen);
-}
-
-static void
-rtcclose(Chan *)
-{
-}
-
-static long
-rtcread(Chan *c, void *a, long n, vlong off)
-{
-	if(c->qid.path == Qdir)
-		return devdirread(c, a, n, rtctab, nelem(rtctab), devgen);
-	if(c->qid.path == Qrtc)
-		return readnum(off, a, n, rtcsnarf(), 12);
-
-	error(Egreg);
-	return 0;
-}
-
-static long
-rtcwrite(Chan *, void *, long, vlong)
-{
-	error(Egreg);
-	return 0;
-}
-
-Dev rtcdevtab = {
-	'r',
-	"rtc",
-
-	rtcreset,
-	devinit,
-	rtcshutdown,
-	rtcattach,
-	rtcwalk,
-	rtcstat,
-	rtcopen,
-	devcreate,
-	rtcclose,
-	rtcread,
-	devbread,
-	rtcwrite,
-	devbwrite,
-	devremove,
-	devwstat,
-};
--- /dev/null
+++ b/sys/src/9/n900/devrtctwl.c
@@ -1,0 +1,202 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "../port/error.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/i2c.h"
+
+enum {
+	Rsec		= 0x1c,
+	Rmin	= 0x1d,
+	Rhour	= 0x1e,
+	Rday	= 0x1f,
+	Rmonth	= 0x20,
+	Ryear	= 0x21,
+	Rweeks	= 0x22,
+	Rctrl		= 0x29,
+		Cget		= 1<<6,
+
+	Qdir = 0,
+	Qrtc,
+
+	SecMin	= 60,
+	SecHour	= 60*SecMin,
+	SecDay	= 24*SecHour,
+};
+
+typedef struct Ctlr Ctlr;
+struct Ctlr {
+	I2Cdev *dev;
+
+	int sec;
+	int min;
+	int hour;
+	int day;
+	int month;
+	int year;
+};
+
+static Ctlr ctlr;
+static int dmsize[] = { 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static int ldmsize[] = { 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static Dirtab rtctab[] = {
+	".",		{Qdir, 0, QTDIR},	0, 0555,
+	"rtc",	{Qrtc, 0, QTFILE},	0, 0440,
+};
+
+#define bcddec(x) (((x) & 0xf) + ((x) >> 4) * 10)
+#define bcdenc(x) (((x / 10) << 4) + (x) % 10)
+#define leap(x) (((x) % 4) == 0 && ((x % 100) != 0 || (x % 400) == 0))
+
+static u8int
+csr8r(Ctlr *ctlr, u8int r)
+{
+	uchar buf;
+
+	i2crecv(ctlr->dev, &buf, sizeof(buf), r);
+	return buf;
+}
+
+static u8int
+csr8w(Ctlr *ctlr, u8int r, u8int w)
+{
+	i2csend(ctlr->dev, &w, sizeof(w), r);
+	return w;
+}
+
+static vlong
+rtcsnarf(void)
+{
+	vlong s;
+	int i;
+
+	/* latch and snarf */
+	csr8w(&ctlr, Rctrl, csr8r(&ctlr, Rctrl) | Cget);
+	ctlr.sec = bcddec(csr8r(&ctlr, Rsec)) % 60;
+	ctlr.min = bcddec(csr8r(&ctlr, Rmin)) % 60;
+	ctlr.hour = bcddec(csr8r(&ctlr, Rhour)) % 24;
+	ctlr.day = bcddec(csr8r(&ctlr, Rday));
+	ctlr.month = bcddec(csr8r(&ctlr, Rmonth));
+	ctlr.year = bcddec(csr8r(&ctlr, Ryear)) % 100;
+	ctlr.year += 2000;
+
+	/* seconds per year */
+	s = 0;
+	for(i = 1970; i < ctlr.year; i++) {
+		if(leap(i))
+			s += ldmsize[0] * SecDay;
+		else
+			s += dmsize[0] * SecDay;
+	}
+
+	/* seconds per month */
+	for(i = 1; i < ctlr.month; i++) {
+		if(leap(ctlr.year))
+			s += ldmsize[i] * SecDay;
+		else
+			s += dmsize[i] * SecDay;
+	}
+
+	/* days, hours, minutes, seconds */
+	s += (ctlr.day - 1) * SecDay;
+	s += ctlr.hour * SecHour;
+	s += ctlr.min * SecMin;
+	s += ctlr.sec;
+	return s;
+}
+
+static void
+rtcreset(void)
+{
+	ctlr.dev = i2cdev(i2cbus("i2c1"), 0x4b);
+	if(!ctlr.dev)
+		return;
+
+	ctlr.dev->subaddr = 1;
+	ctlr.dev->size = 0x100;
+}
+
+static void
+rtcshutdown(void)
+{
+}
+
+static Chan *
+rtcattach(char *spec)
+{
+	if(!ctlr.dev)
+		error(Enonexist);
+
+	return devattach('r', spec);
+}
+
+static Walkqid *
+rtcwalk(Chan *c, Chan *nc, char **name, int nname)
+{
+	return devwalk(c, nc, name, nname, rtctab, nelem(rtctab), devgen);
+}
+
+static int
+rtcstat(Chan *c, uchar *dp, int n)
+{
+	return devstat(c, dp, n, rtctab, nelem(rtctab), devgen);
+}
+
+static Chan *
+rtcopen(Chan *c, int mode)
+{
+	mode = openmode(mode);
+	if(c->qid.path == Qrtc) {
+		if(!iseve() && mode != OREAD)
+			error(Eperm);
+	}
+
+	return devopen(c, mode, rtctab, nelem(rtctab), devgen);
+}
+
+static void
+rtcclose(Chan *)
+{
+}
+
+static long
+rtcread(Chan *c, void *a, long n, vlong off)
+{
+	if(c->qid.path == Qdir)
+		return devdirread(c, a, n, rtctab, nelem(rtctab), devgen);
+	if(c->qid.path == Qrtc)
+		return readnum(off, a, n, rtcsnarf(), 12);
+
+	error(Egreg);
+	return 0;
+}
+
+static long
+rtcwrite(Chan *, void *, long, vlong)
+{
+	error(Egreg);
+	return 0;
+}
+
+Dev rtcdevtab = {
+	'r',
+	"rtc",
+
+	rtcreset,
+	devinit,
+	rtcshutdown,
+	rtcattach,
+	rtcwalk,
+	rtcstat,
+	rtcopen,
+	devcreate,
+	rtcclose,
+	rtcread,
+	devbread,
+	rtcwrite,
+	devbwrite,
+	devremove,
+	devwstat,
+};
--- a/sys/src/9/n900/i2cn900.c
+++ /dev/null
@@ -1,224 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-#include "../port/i2c.h"
-
-enum {
-	Rrev	= 0x00,
-	Rie		= 0x04,
-	Ris		= 0x08,
-		Ial		= 1 << 0, /* arbitration lost */
-		Inack	= 1 << 1, /* no acknowledgement */
-		Iardy	= 1 << 2, /* address ready */
-		Irrdy		= 1 << 3, /* receive ready */
-		Ixrdy	= 1 << 4, /* transmit ready */
-		Ibb		= 1 << 12, /* bus busy */
-		Iall		= 0xffff,
-
-	Rwe		= 0x0c,
-	Rsyss	= 0x10,
-		SSreset	= 1 << 0, /* reset status */
-
-	Rbuf	= 0x14,
-	Rcnt	= 0x18,
-	Rdata	= 0x1c,
-	Rsysc	= 0x20,
-		SCreset	= 1 << 1, /* software reset */
-
-	Rcon	= 0x24,
-		Cstt		= 1 << 0, /* start condition */
-		Cstp		= 1 << 1, /* stop condiction */
-		Cxoa3	= 1 << 4, /* expand address */
-		Cxoa2	= 1 << 5,
-		Cxoa1	= 1 << 6,
-		Cxoa0	= 1 << 7,
-		Cxa		= 1 << 8,
-		Ctrx		= 1 << 9, /* transmit mode */
-		Cmst	= 1 << 10, /* master mode */
-		Cstb		= 1 << 11, /* start byte */
-		Cen		= 1 << 15, /* enable */
-
-	Raddr	= 0x2c,
-};
-
-#define csr32r(c, r) ((c)->io[(r)/4])
-#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
-
-typedef struct Ctlr Ctlr;
-struct Ctlr {
-	u32int *io;
-	ulong irq;
-
-	Rendez;
-};
-
-static Ctlr ctlr[] = {
-	{ .io = (u32int*) PHYSI2C1, .irq = IRQI2C1 },
-	{ .io = (u32int*) PHYSI2C2, .irq = IRQI2C2 },
-	{ .io = (u32int*) PHYSI2C3, .irq = IRQI2C3 },
-};
-
-static void
-n900i2cwaitbus(Ctlr *ctlr)
-{
-	/* FIXME: timeout here? */
-	while(csr32r(ctlr, Ris) & Ibb)
-		;
-}
-
-static int
-n900i2cwaitirq(void *arg)
-{
-	Ctlr *ctlr = arg; return csr32r(ctlr, Ris);
-}
-
-static uint
-n900i2cwait(Ctlr *ctlr)
-{
-	uint s;
-
-	/* FIXME: timeout here? */
-	while(!(s = csr32r(ctlr, Ris))) {
-		if(!up || !islo())
-			continue;
-
-		tsleep(ctlr, n900i2cwaitirq, ctlr, 5);
-	}
-
-	return s;
-}
-
-static void
-n900i2cflush(Ctlr *ctlr)
-{
-	while(csr32r(ctlr, Ris) & Irrdy) {
-		USED(csr32r(ctlr, Rdata));
-		csr32w(ctlr, Ris, Irrdy);
-	}
-}
-
-static void
-n900i2cintr(Ureg *, void *arg)
-{
-	Ctlr *ctlr;
-
-	ctlr = arg;
-	wakeup(ctlr);
-}
-
-static int
-n900i2cinit(I2Cbus *bus)
-{
-	Ctlr *ctlr;
-
-	/* reset the ctlr */
-	ctlr = bus->ctlr;
-	csr32w(ctlr, Rsysc, SCreset);
-	csr32w(ctlr, Rcon, Cen);
-
-	/* FIXME: timeout here? */
-	while(!(csr32r(ctlr, Rsyss) & SSreset))
-		;
-
-	intrenable(ctlr->irq, n900i2cintr, ctlr, 0, bus->name);
-	return 0;
-}
-
-static int
-n900i2cio(I2Cbus *bus, uchar *pkt, int olen, int ilen)
-{
-	Ctlr *ctlr;
-	uint con, addr, stat;
-	uint o;
-
-	ctlr = bus->ctlr;
-	if(olen <= 0 || pkt == nil)
-		return -1;
-
-	o = 0;
-	con = Cen | Cmst | Ctrx | Cstp | Cstt;
-	if((pkt[o] & 0xf8) == 0xf0) {
-		/* 10-bit address: qemu has bugs, nothing on the n900 needs them.
-		 * con |= Cxa;
-		 * addr = ((pkt[o++] & 6) << 7) | pkt[o++];
-		 */
-		return -1;
-	} else {
-		/* 7-bit address */
-		addr = pkt[o++] >> 1;
-	}
-
-	/* wait for bus */
-	n900i2cwaitbus(ctlr);
-
-	/* first attempt to probe, will get nack here if no dev */
-	csr32w(ctlr, Rcnt, olen);
-	csr32w(ctlr, Raddr, addr);
-	csr32w(ctlr, Rcon, con);
-	stat = n900i2cwait(ctlr);
-	if(stat & Inack || stat & Ial) {
-		o = -1; goto err;
-	}
-
-	/* transmit */
-	while(o < olen) {
-		stat = n900i2cwait(ctlr);
-		if(stat == 0 || stat & Inack || stat & Ial) {
-			o = -1; goto err;
-		}
-
-		if(stat & Iardy) {
-			csr32w(ctlr, Ris, Iardy);
-			break;
-		}
-
-		if(stat & Ixrdy) {
-			csr32w(ctlr, Rdata, pkt[o++]);
-			csr32w(ctlr, Ris, Ixrdy);
-		}
-	}
-
-	/* receive */
-	csr32w(ctlr, Rcnt, ilen);
-	csr32w(ctlr, Raddr, addr);
-	csr32w(ctlr, Rcon, Cen | Cmst | Cstp | Cstt);
-	while(o < olen + ilen) {
-		stat = n900i2cwait(ctlr);
-		if(stat == 0 || stat & Inack || stat & Ial) {
-			o = -1; goto err;
-		}
-
-		if(stat & Iardy) {
-			csr32w(ctlr, Ris, Iardy);
-			break;
-		}
-
-		if(stat & Irrdy) {
-			pkt[o++] = csr32r(ctlr, Rdata);
-			csr32w(ctlr, Ris, Irrdy);
-		}
-	}
-
-err:
-	n900i2cflush(ctlr);
-	csr32w(ctlr, Ris, Iall);
-	return o;
-}
-
-void
-i2cn900link(void)
-{
-	int i;
-	static I2Cbus bus[] = {
-		{ "i2c1", 4000000, &ctlr[0], n900i2cinit, n900i2cio },
-		{ "i2c2", 4000000, &ctlr[1], n900i2cinit, n900i2cio },
-		{ "i2c3", 4000000, &ctlr[2], n900i2cinit, n900i2cio },
-	};
-
-	for(i = 0; i < nelem(bus); i++)
-		addi2cbus(&bus[i]);
-}
--- /dev/null
+++ b/sys/src/9/n900/i2comap.c
@@ -1,0 +1,217 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/error.h"
+#include "../port/i2c.h"
+
+enum {
+	Rrev	= 0x00,
+	Rie		= 0x04,
+	Ris		= 0x08,
+		Ial		= 1 << 0,
+		Inack	= 1 << 1,
+		Iardy	= 1 << 2,
+		Irrdy	= 1 << 3,
+		Ixrdy	= 1 << 4,
+		Ibb		= 1 << 12,
+		Iall	= 0xffff,
+
+	Rwe		= 0x0c,
+	Rsyss	= 0x10,
+		SSreset	= 1 << 0,
+
+	Rbuf	= 0x14,
+	Rcnt	= 0x18,
+	Rdata	= 0x1c,
+	Rsysc	= 0x20,
+		SCreset	= 1 << 1,
+
+	Rcon	= 0x24,
+		Cstt	= 1 << 0,
+		Cstp	= 1 << 1,
+		Cxoa3	= 1 << 4,
+		Cxoa2	= 1 << 5,
+		Cxoa1	= 1 << 6,
+		Cxoa0	= 1 << 7,
+		Cxa		= 1 << 8,
+		Ctrx	= 1 << 9,
+		Cmst	= 1 << 10,
+		Cstb	= 1 << 11,
+		Cen		= 1 << 15,
+
+	Raddr	= 0x2c,
+};
+
+#define csr32r(c, r) ((c)->io[(r)/4])
+#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
+
+typedef struct Ctlr Ctlr;
+struct Ctlr {
+	u32int *io;
+	ulong irq;
+
+	Rendez;
+};
+
+static Ctlr ctlr[] = {
+	{ .io = (u32int*) PHYSI2C1, .irq = IRQI2C1 },
+	{ .io = (u32int*) PHYSI2C2, .irq = IRQI2C2 },
+	{ .io = (u32int*) PHYSI2C3, .irq = IRQI2C3 },
+};
+
+static void
+omapi2cwaitbus(Ctlr *ctlr)
+{
+	/* FIXME: timeout here? */
+	while(csr32r(ctlr, Ris) & Ibb)
+		;
+}
+
+static int
+omapi2cwaitirq(void *arg)
+{
+	Ctlr *ctlr = arg; return csr32r(ctlr, Ris);
+}
+
+static uint
+omapi2cwait(Ctlr *ctlr)
+{
+	uint s;
+
+	/* FIXME: timeout here? */
+	while(!(s = csr32r(ctlr, Ris))) {
+		if(!up || !islo())
+			continue;
+
+		tsleep(ctlr, omapi2cwaitirq, ctlr, 5);
+	}
+
+	return s;
+}
+
+static void
+omapi2cflush(Ctlr *ctlr)
+{
+	while(csr32r(ctlr, Ris) & Irrdy) {
+		USED(csr32r(ctlr, Rdata));
+		csr32w(ctlr, Ris, Irrdy);
+	}
+}
+
+static void
+omapi2cintr(Ureg *, void *arg)
+{
+	Ctlr *ctlr;
+
+	ctlr = arg;
+	wakeup(ctlr);
+}
+
+static int
+omapi2cinit(I2Cbus *bus)
+{
+	Ctlr *ctlr;
+
+	/* reset the ctlr */
+	ctlr = bus->ctlr;
+	csr32w(ctlr, Rsysc, SCreset);
+	csr32w(ctlr, Rcon, Cen);
+
+	/* FIXME: timeout here? */
+	while(!(csr32r(ctlr, Rsyss) & SSreset))
+		;
+
+	intrenable(ctlr->irq, omapi2cintr, ctlr, 0, bus->name);
+	return 0;
+}
+
+static int
+omapi2cio(I2Cbus *bus, uchar *pkt, int olen, int ilen)
+{
+	Ctlr *ctlr;
+	uint con, addr, stat;
+	uint o;
+
+	ctlr = bus->ctlr;
+	if(olen <= 0 || pkt == nil)
+		return -1;
+
+	o = 0;
+	con = Cen | Cmst | Ctrx | Cstp | Cstt;
+	if((pkt[o] & 0xf8) == 0xf0)
+		return -1;
+	addr = pkt[o++] >> 1;
+
+	/* wait for bus */
+	omapi2cwaitbus(ctlr);
+
+	/* first attempt to probe, will get nack here if no dev */
+	csr32w(ctlr, Rcnt, olen);
+	csr32w(ctlr, Raddr, addr);
+	csr32w(ctlr, Rcon, con);
+	stat = omapi2cwait(ctlr);
+	if(stat & Inack || stat & Ial) {
+		o = -1; goto err;
+	}
+
+	/* transmit */
+	while(o < olen) {
+		stat = omapi2cwait(ctlr);
+		if(stat == 0 || stat & Inack || stat & Ial) {
+			o = -1; goto err;
+		}
+
+		if(stat & Iardy) {
+			csr32w(ctlr, Ris, Iardy);
+			break;
+		}
+
+		if(stat & Ixrdy) {
+			csr32w(ctlr, Rdata, pkt[o++]);
+			csr32w(ctlr, Ris, Ixrdy);
+		}
+	}
+
+	/* receive */
+	csr32w(ctlr, Rcnt, ilen);
+	csr32w(ctlr, Raddr, addr);
+	csr32w(ctlr, Rcon, Cen | Cmst | Cstp | Cstt);
+	while(o < olen + ilen) {
+		stat = omapi2cwait(ctlr);
+		if(stat == 0 || stat & Inack || stat & Ial) {
+			o = -1; goto err;
+		}
+
+		if(stat & Iardy) {
+			csr32w(ctlr, Ris, Iardy);
+			break;
+		}
+
+		if(stat & Irrdy) {
+			pkt[o++] = csr32r(ctlr, Rdata);
+			csr32w(ctlr, Ris, Irrdy);
+		}
+	}
+
+err:
+	omapi2cflush(ctlr);
+	csr32w(ctlr, Ris, Iall);
+	return o;
+}
+
+void
+i2comaplink(void)
+{
+	int i;
+	static I2Cbus bus[] = {
+		{ "i2c1", 4000000, &ctlr[0], omapi2cinit, omapi2cio },
+		{ "i2c2", 4000000, &ctlr[1], omapi2cinit, omapi2cio },
+		{ "i2c3", 4000000, &ctlr[2], omapi2cinit, omapi2cio },
+	};
+
+	for(i = 0; i < nelem(bus); i++)
+		addi2cbus(&bus[i]);
+}
--- a/sys/src/9/n900/mmcn900.c
+++ /dev/null
@@ -1,308 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "../port/error.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/pci.h"
-#include "../port/sd.h"
-
-enum {
-	Rsysc		= 0x10,
-		SCreset		= 1 << 1,
-	Rsyss		= 0x14,
-		SSreset		= 1 << 0,
-	Rcsre		= 0x24,
-	Rcon		= 0x28,
-	Rpwcnt		= 0x2c,
-	Rblk		= 0x104,
-	Rarg		= 0x108,
-	Rcmd		= 0x10c,
-		CRnone		= 0 << 16,
-		CR136		= 1 << 16,
-		CR48		= 2 << 16,
-		CR48busy	= 3 << 16,
-		CRmask		= 3 << 16,
-
-		CFcheckidx	= 1 << 19,
-		CFcheckcrc	= 1 << 20,
-		CFdata		= 1 << 21,
-		CFdataread	= 1 << 4,
-		CFdatamulti	= 1 << 5,
-
-		CTnone		= 0 << 22,
-		CTbus		= 1 << 22,
-		CTfunc		= 2 << 22,
-		CTio		= 3 << 22,
-	Rrsp10		= 0x110,
-	Rrsp32		= 0x114,
-	Rrsp54		= 0x118,
-	Rrsp76		= 0x11c,
-	Rdata		= 0x120,
-	Rpstate		= 0x124,
-	Rhctl		= 0x128,
-	Rsysctl		= 0x12c,
-	Rstatus		= 0x130,
-		STcmd		= 1 << 0,
-		STtransfer	= 1 << 1,
-		STbufwrite	= 1 << 4,
-		STbufread	= 1 << 5,
-
-		STmaskok	= 0xffff << 0,
-		STmaskerr	= 0xffff << 16,
-	Rie			= 0x134,
-	Rise		= 0x138,
-	Rac12		= 0x13c,
-	Rcapa		= 0x140,
-	Rcapacur	= 0x148,
-	Rrev		= 0x1fc,
-};
-
-#define csr32r(c, r) ((c)->io[(r)/4])
-#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
-
-typedef struct Ctlr Ctlr;
-struct Ctlr {
-	char *name;
-	u32int *io;
-	ulong irq;
-
-	struct {
-		uint bcount;
-		uint bsize;
-	} cmd;
-
-	Lock;
-	Rendez;
-};
-
-static int
-n900mmcinit(SDio *io)
-{
-	Ctlr *ctlr;
-
-	ctlr = io->aux;
-	csr32w(ctlr, Rsysc, SCreset);
-	while(!(csr32r(ctlr, Rsyss) & SSreset))
-		;
-
-	return 0;
-}
-
-static void
-n900mmcenable(SDio *)
-{
-}
-
-static int
-n900mmcinquiry(SDio *, char *inquiry, int len)
-{
-	return snprint(inquiry, len, "MMC Host Controller");
-}
-
-static void
-n900mmcintr(Ureg *, void *aux)
-{
-	Ctlr *ctlr;
-
-	ctlr = aux;
-	ilock(ctlr);
-	if(csr32r(ctlr, Rstatus) & STcmd)
-		wakeup(ctlr);
-
-	iunlock(ctlr);
-}
-
-static int
-n900mmcdone(void *aux)
-{
-	Ctlr *ctlr = aux;
-
-	if(csr32r(ctlr, Rstatus) & STcmd)
-		return 1;
-
-	return 0;
-}
-
-static int
-n900mmccmd(SDio *io, SDiocmd *iocmd, u32int arg, u32int *resp)
-{
-	Ctlr *ctlr;
-	u32int cmd;
-
-	/* prepare flags for this command */
-	ctlr = io->aux;
-	cmd = iocmd->index << 24;
-	switch(iocmd->resp) {
-	case 0: cmd |= CRnone; break;
-	case 2: cmd |= CR136 | CFcheckcrc; break;
-	case 3: cmd |= CR48; break;
-	case 1:
-		if(iocmd->busy) {
-			cmd |= CR48busy | CFcheckidx | CFcheckcrc;
-			break;
-		}
-
-	default:
-		cmd |= CR48 | CFcheckidx | CFcheckcrc;
-		break;
-	}
-
-	/* if there is data, set the data, read, and multi flags */
-	if(iocmd->data) {
-		cmd |= CFdata;
-		if(iocmd->data & 1)
-			cmd |= CFdataread;
-		if(iocmd->data > 2)
-			cmd |= CFdatamulti;
-	}
-
-	/* off it goes, wait for a response */
-	csr32w(ctlr, Rstatus, ~0);
-	csr32w(ctlr, Rarg, arg);
-	csr32w(ctlr, Rcmd, cmd);
-
-	/* wait for command to be done */
-	tsleep(ctlr, n900mmcdone, ctlr, 100);
-	if(csr32r(ctlr, Rstatus) & STmaskerr)
-		error(Eio);
-
-	/* unpack the response */
-	switch(cmd & CRmask) {
-	case CRnone:
-		resp[0] = 0;
-		break;
-
-	case CR136:
-		resp[0] = csr32r(ctlr, Rrsp10);
-		resp[1] = csr32r(ctlr, Rrsp32);
-		resp[2] = csr32r(ctlr, Rrsp54);
-		resp[3] = csr32r(ctlr, Rrsp76);
-		break;
-
-	case CR48:
-	case CR48busy:
-		resp[0] = csr32r(ctlr, Rrsp10);
-		break;
-	}
-
-	return 0;
-}
-
-static void
-n900mmciosetup(SDio *io, int, void *, int bsize, int bcount)
-{
-	Ctlr *ctlr;
-
-	ctlr = io->aux;
-	if(bsize == 0 || (bsize & 3) != 0)
-		error(Egreg);
-
-	ctlr->cmd.bsize = bsize;
-	ctlr->cmd.bcount = bcount;
-	csr32w(ctlr, Rblk, (bsize & 0x3ff) | (bcount << 16));
-}
-
-static void
-n900mmcbufread(Ctlr *ctlr, uchar *buf, int len)
-{
-	for(len >>= 2; len > 0; len--) {
-		*((u32int*)buf) = csr32r(ctlr, Rdata);
-		buf += 4;
-	}
-}
-
-static void
-n900mmcbufwrite(Ctlr *ctlr, uchar *buf, int len)
-{
-	for(len >>= 2; len > 0; len--) {
-		csr32w(ctlr, Rdata, *((u32int*)buf));
-		buf += 4;
-	}
-}
-
-static void
-n900mmcio(SDio *io, int write, uchar *buf, int len)
-{
-	Ctlr *ctlr;
-	u32int stat, n;
-
-	ctlr = io->aux;
-	if(len != ctlr->cmd.bsize * ctlr->cmd.bcount)
-		error(Egreg);
-
-	while(len > 0) {
-		stat = csr32r(ctlr, Rstatus);
-		if(stat & STmaskerr) {
-			csr32w(ctlr, Rstatus, STmaskerr);
-			error(Eio);
-		}
-
-		if(stat & STbufwrite) {
-			csr32w(ctlr, Rstatus, STbufwrite);
-			if(!write)
-				error(Eio);
-
-			n = len;
-			if(n > ctlr->cmd.bsize)
-				n = ctlr->cmd.bsize;
-
-			n900mmcbufwrite(ctlr, buf, n);
-			len -= n;
-			buf += n;
-		}
-
-		if(stat & STbufread) {
-			csr32w(ctlr, Rstatus, STbufread);
-			if(write)
-				error(Eio);
-
-			n = len;
-			if(n > ctlr->cmd.bsize)
-				n = ctlr->cmd.bsize;
-
-			n900mmcbufread(ctlr, buf, n);
-			len -= n;
-			buf += n;
-		}
-
-		if(stat & STtransfer) {
-			csr32w(ctlr, Rstatus, STtransfer);
-			if(len != 0)
-				error(Eio);
-		}
-	}
-}
-
-static void
-n900mmcbus(SDio *, int, int)
-{
-	/* FIXME: change bus width */
-}
-
-void
-mmcn900link(void)
-{
-	int i;
-	static Ctlr ctlr[2] = {
-		{ .name = "mmc1", .io = (u32int*) PHYSMMC1, .irq = IRQMMC1, },
-		{ .name = "mmc2", .io = (u32int*) PHYSMMC2, .irq = IRQMMC2, },
-	};
-
-	static SDio io[nelem(ctlr)];
-	for(i = 0; i < nelem(io); i++) {
-		io[i].name = "mmc",
-		io[i].init = n900mmcinit,
-		io[i].enable = n900mmcenable,
-		io[i].inquiry = n900mmcinquiry,
-		io[i].cmd = n900mmccmd,
-		io[i].iosetup = n900mmciosetup,
-		io[i].io = n900mmcio,
-		io[i].bus = n900mmcbus,
-		io[i].aux = &ctlr[i];
-
-		addmmcio(&io[i]);
-		intrenable(ctlr[i].irq, n900mmcintr, &ctlr[i], BUSUNKNOWN, ctlr[i].name);
-	}
-}
--- /dev/null
+++ b/sys/src/9/n900/mmcomap.c
@@ -1,0 +1,309 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "../port/error.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/pci.h"
+#include "../port/sd.h"
+
+enum {
+	Rsysc		= 0x10,
+		SCreset		= 1 << 1,
+	Rsyss		= 0x14,
+		SSreset		= 1 << 0,
+	Rcsre		= 0x24,
+	Rcon		= 0x28,
+	Rpwcnt		= 0x2c,
+	Rblk		= 0x104,
+	Rarg		= 0x108,
+	Rcmd		= 0x10c,
+		CRnone		= 0 << 16,
+		CR136		= 1 << 16,
+		CR48		= 2 << 16,
+		CR48busy	= 3 << 16,
+		CRmask		= 3 << 16,
+
+		CFcheckidx	= 1 << 19,
+		CFcheckcrc	= 1 << 20,
+		CFdata		= 1 << 21,
+		CFdataread	= 1 << 4,
+		CFdatamulti	= 1 << 5,
+
+		CTnone		= 0 << 22,
+		CTbus		= 1 << 22,
+		CTfunc		= 2 << 22,
+		CTio		= 3 << 22,
+	Rrsp10		= 0x110,
+	Rrsp32		= 0x114,
+	Rrsp54		= 0x118,
+	Rrsp76		= 0x11c,
+	Rdata		= 0x120,
+	Rpstate		= 0x124,
+	Rhctl		= 0x128,
+	Rsysctl		= 0x12c,
+	Rstatus		= 0x130,
+		STcmd		= 1 << 0,
+		STtransfer	= 1 << 1,
+		STbufwrite	= 1 << 4,
+		STbufread	= 1 << 5,
+
+		STmaskok	= 0xffff << 0,
+		STmaskerr	= 0xffff << 16,
+	Rie			= 0x134,
+	Rise		= 0x138,
+	Rac12		= 0x13c,
+	Rcapa		= 0x140,
+	Rcapacur	= 0x148,
+	Rrev		= 0x1fc,
+};
+
+#define csr32r(c, r) ((c)->io[(r)/4])
+#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
+
+typedef struct Ctlr Ctlr;
+struct Ctlr {
+	char *name;
+	u32int *io;
+	ulong irq;
+
+	struct {
+		uint bcount;
+		uint bsize;
+	} cmd;
+
+	Lock;
+	Rendez;
+};
+
+static int
+omapmmcinit(SDio *io)
+{
+	Ctlr *ctlr;
+
+	ctlr = io->aux;
+	csr32w(ctlr, Rsysc, SCreset);
+	while(!(csr32r(ctlr, Rsyss) & SSreset))
+		;
+
+	return 0;
+}
+
+static void
+omapmmcenable(SDio *)
+{
+}
+
+static int
+omapmmcinquiry(SDio *, char *inquiry, int len)
+{
+	return snprint(inquiry, len, "MMC Host Controller");
+}
+
+static void
+omapmmcintr(Ureg *, void *aux)
+{
+	Ctlr *ctlr;
+
+	ctlr = aux;
+	ilock(ctlr);
+	if(csr32r(ctlr, Rstatus) & STcmd)
+		wakeup(ctlr);
+
+	iunlock(ctlr);
+}
+
+static int
+omapmmcdone(void *aux)
+{
+	Ctlr *ctlr = aux;
+
+	if(csr32r(ctlr, Rstatus) & STcmd)
+		return 1;
+
+	return 0;
+}
+
+static int
+omapmmccmd(SDio *io, SDiocmd *iocmd, u32int arg, u32int *resp)
+{
+	Ctlr *ctlr;
+	u32int cmd;
+
+	/* prepare flags for this command */
+	ctlr = io->aux;
+	cmd = iocmd->index << 24;
+	switch(iocmd->resp) {
+	case 0: cmd |= CRnone; break;
+	case 2: cmd |= CR136 | CFcheckcrc; break;
+	case 3: cmd |= CR48; break;
+	case 1:
+		if(iocmd->busy) {
+			cmd |= CR48busy | CFcheckidx | CFcheckcrc;
+			break;
+		}
+
+	default:
+		cmd |= CR48 | CFcheckidx | CFcheckcrc;
+		break;
+	}
+
+	/* if there is data, set the data, read, and multi flags */
+	if(iocmd->data) {
+		cmd |= CFdata;
+		if(iocmd->data & 1)
+			cmd |= CFdataread;
+		if(iocmd->data > 2)
+			cmd |= CFdatamulti;
+	}
+
+	/* off it goes, wait for a response */
+	csr32w(ctlr, Rstatus, ~0);
+	csr32w(ctlr, Rarg, arg);
+	csr32w(ctlr, Rcmd, cmd);
+
+	/* wait for command to be done */
+	tsleep(ctlr, omapmmcdone, ctlr, 100);
+	if(csr32r(ctlr, Rstatus) & STmaskerr)
+		error(Eio);
+
+	/* unpack the response */
+	switch(cmd & CRmask) {
+	case CRnone:
+		resp[0] = 0;
+		break;
+
+	case CR136:
+		resp[0] = csr32r(ctlr, Rrsp10);
+		resp[1] = csr32r(ctlr, Rrsp32);
+		resp[2] = csr32r(ctlr, Rrsp54);
+		resp[3] = csr32r(ctlr, Rrsp76);
+		break;
+
+	case CR48:
+	case CR48busy:
+		resp[0] = csr32r(ctlr, Rrsp10);
+		break;
+	}
+
+	return 0;
+}
+
+static void
+omapmmciosetup(SDio *io, int, void *, int bsize, int bcount)
+{
+	Ctlr *ctlr;
+
+	ctlr = io->aux;
+	if(bsize == 0 || (bsize & 3) != 0)
+		error(Egreg);
+
+	ctlr->cmd.bsize = bsize;
+	ctlr->cmd.bcount = bcount;
+	csr32w(ctlr, Rblk, (bsize & 0x3ff) | (bcount << 16));
+}
+
+static void
+omapmmcbufread(Ctlr *ctlr, uchar *buf, int len)
+{
+	for(len >>= 2; len > 0; len--) {
+		*((u32int*)buf) = csr32r(ctlr, Rdata);
+		buf += 4;
+	}
+}
+
+static void
+omapmmcbufwrite(Ctlr *ctlr, uchar *buf, int len)
+{
+	for(len >>= 2; len > 0; len--) {
+		csr32w(ctlr, Rdata, *((u32int*)buf));
+		buf += 4;
+	}
+}
+
+static void
+omapmmcio(SDio *io, int write, uchar *buf, int len)
+{
+	Ctlr *ctlr;
+	u32int stat, n;
+
+	ctlr = io->aux;
+	if(len != ctlr->cmd.bsize * ctlr->cmd.bcount)
+		error(Egreg);
+
+	while(len > 0) {
+		stat = csr32r(ctlr, Rstatus);
+		if(stat & STmaskerr) {
+			csr32w(ctlr, Rstatus, STmaskerr);
+			error(Eio);
+		}
+
+		if(stat & STbufwrite) {
+			csr32w(ctlr, Rstatus, STbufwrite);
+			if(!write)
+				error(Eio);
+
+			n = len;
+			if(n > ctlr->cmd.bsize)
+				n = ctlr->cmd.bsize;
+
+			omapmmcbufwrite(ctlr, buf, n);
+			len -= n;
+			buf += n;
+		}
+
+		if(stat & STbufread) {
+			csr32w(ctlr, Rstatus, STbufread);
+			if(write)
+				error(Eio);
+
+			n = len;
+			if(n > ctlr->cmd.bsize)
+				n = ctlr->cmd.bsize;
+
+			omapmmcbufread(ctlr, buf, n);
+			len -= n;
+			buf += n;
+		}
+
+		if(stat & STtransfer) {
+			csr32w(ctlr, Rstatus, STtransfer);
+			if(len != 0)
+				error(Eio);
+		}
+	}
+}
+
+static void
+omapmmcbus(SDio *, int, int)
+{
+	/* FIXME: change bus width */
+}
+
+void
+mmcomaplink(void)
+{
+	int i;
+	static Ctlr ctlr[] = {
+		{ .name = "mmc 1", .io = (u32int*) PHYSMMC1, .irq = IRQMMC1, },
+		{ .name = "mmc 2", .io = (u32int*) PHYSMMC2, .irq = IRQMMC2, },
+		{ .name = "mmc 3", .io = (u32int*) PHYSMMC3, .irq = IRQMMC3, },
+	};
+
+	static SDio io[nelem(ctlr)];
+	for(i = 0; i < nelem(io); i++) {
+		io[i].name = "mmc",
+		io[i].init = omapmmcinit,
+		io[i].enable = omapmmcenable,
+		io[i].inquiry = omapmmcinquiry,
+		io[i].cmd = omapmmccmd,
+		io[i].iosetup = omapmmciosetup,
+		io[i].io = omapmmcio,
+		io[i].bus = omapmmcbus,
+		io[i].aux = &ctlr[i];
+
+		addmmcio(&io[i]);
+		intrenable(ctlr[i].irq, omapmmcintr, &ctlr[i], BUSUNKNOWN, ctlr[i].name);
+	}
+}
--- a/sys/src/9/n900/n900
+++ b/sys/src/9/n900/n900
@@ -17,8 +17,8 @@
 
 	draw	screen
 
-	kbd		devi2c
-	rtc		devi2c
+	kbdtwl		devi2c
+	rtctwl		devi2c
 
 	uart
 	usb
@@ -25,9 +25,9 @@
 	i2c
 
 misc
-	uartn900
+	uartomap
 
-	sdmmc	mmcn900
+	sdmmc	mmcomap
 	sdloop
 	sdram
 
@@ -36,8 +36,8 @@
 	dtracydev
 
 link
-	i2cn900		devi2c
-	mmcn900
+	i2comap		devi2c
+	mmcomap
 
 port
 	int cpuserver = 0;
--- a/sys/src/9/n900/uartn900.c
+++ /dev/null
@@ -1,268 +1,0 @@
-#include "u.h"
-#include "../port/lib.h"
-#include "mem.h"
-#include "dat.h"
-#include "fns.h"
-#include "io.h"
-#include "../port/error.h"
-
-enum {
-	Rdll	= 0x00,
-	Rrhr	= 0x00,
-	Rthr	= 0x00,
-	Rdlh	= 0x04,
-	Rier	= 0x04,
-		IErhr	= 1 << 0,
-		IEthr	= 1 << 1,
-		IEls	= 1 << 2,
-		IEms	= 1 << 3,
-	Riir	= 0x08,
-		Ipending = 1 << 0,
-		Imodem	= 0x00,
-		Ithr	= 0x01,
-		Irhr	= 0x02,
-		Ils		= 0x03,
-		Irxt	= 0x06,
-		Ixoff	= 0x08,
-		Icts	= 0x10,
-		Imask 	= 0x1f,
-	Rfcr	= 0x08,
-		FCRen		= 1 << 0,
-	Refr	= 0x08,
-	Rlcr	= 0x0c,
-	Rmcr	= 0x10,
-	Rxon1	= 0x10,
-	Rlsr	= 0x14,
-		LSRrxempty	= 1 << 0,
-		LSRrxover	= 1 << 1,
-		LSRrxparity	= 1 << 2,
-		LSRrxframe	= 1 << 3,
-		LSRrxbreak	= 1 << 4,
-		LSRtxempty	= 1 << 5,
-		LSRtxshift	= 1 << 6,
-		LSRrxstat	= 1 << 7,
-	Rxon2	= 0x14,
-	Rmsr	= 0x18,
-	Rtcr	= 0x18,
-	Rxoff1	= 0x18,
-	Rspr	= 0x1c,
-	Rtlr	= 0x1c,
-	Rxoff2	= 0x1c,
-	Rmdr1	= 0x20,
-	Rmdr2	= 0x24,
-	Rsysc	= 0x54,
-		SCreset		= 1 << 1,
-	Rsyss	= 0x58,
-		SSreset		= 1 << 0,
-};
-
-#define csr32r(c, r) ((c)->io[(r)/4])
-#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
-
-typedef struct Ctlr Ctlr;
-struct Ctlr {
-	Lock;
-
-	u32int *io;
-	ulong irq;
-
-	int ie;
-};
-
-extern PhysUart n900physuart;
-
-static Ctlr ctlr[] = {
-	{ .io = (u32int*) PHYSUART1, .irq = IRQUART1, },
-	{ .io = (u32int*) PHYSUART2, .irq = IRQUART2, },
-	{ .io = (u32int*) PHYSUART3, .irq = IRQUART3, },
-};
-
-static Uart n900uart[] = {
-	{
-		.regs = &ctlr[0],
-		.name = "uart1",
-		.freq = 48000000,
-		.phys = &n900physuart,
-		.next = &n900uart[1],
-	},
-	{
-		.regs = &ctlr[1],
-		.name = "uart2",
-		.freq = 48000000,
-		.phys = &n900physuart,
-		.next = &n900uart[2],
-	},
-	{
-		.regs = &ctlr[2],
-		.name = "uart3",
-		.freq = 48000000,
-		.phys = &n900physuart,
-		.next = nil,
-	},
-};
-
-static Uart *
-n900uartpnp(void)
-{
-	return n900uart;
-}
-
-static long
-n900uartstatus(Uart *, void *, long, long)
-{
-	return 0;
-}
-
-static void
-n900uartintr(Ureg *, void *arg)
-{
-	Uart *uart;
-	Ctlr *ctlr;
-	int lsr;
-	char c;
-
-	uart = arg;
-	ctlr = uart->regs;
-
-	ilock(ctlr);
-	switch((csr32r(ctlr, Riir) >> 1) & Imask) {
-	case Ithr:
-		uartkick(uart);
-		break;
-
-	case Irhr:
-		while((lsr = csr32r(ctlr, Rlsr)) & LSRrxempty) {
-			c = csr32r(ctlr, Rrhr);
-
-			if(lsr & LSRrxover) { uart->oerr++; break; }
-			if(lsr & LSRrxparity) { uart->perr++; break; }
-			if(lsr & LSRrxframe) { uart->ferr++; break; }
-
-			uartrecv(uart, c);
-		}
-
-		break;
-	}
-
-	iunlock(ctlr);
-}
-
-static void
-n900uartenable(Uart *uart, int ie)
-{
-	Ctlr *ctlr;
-
-	ctlr = uart->regs;
-	ilock(ctlr);
-
-	csr32w(ctlr, Rsysc, SCreset);
-	while(!(csr32r(ctlr, Rsyss) & SSreset))
-		;
-
-	csr32w(ctlr, Rfcr, FCRen);
-	if(ie) {
-		if(!ctlr->ie) {
-			intrenable(ctlr->irq, n900uartintr, uart, 0, uart->name);
-			ctlr->ie = 1;
-		}
-
-		csr32w(ctlr, Rier, IErhr);
-	}
-
-	iunlock(ctlr);
-}
-
-static void
-n900uartdisable(Uart *uart)
-{
-	Ctlr *ctlr;
-
-	ctlr = uart->regs;
-
-	ilock(ctlr);
-	csr32w(ctlr, Rier, 0);
-	if(ctlr->ie) {
-		intrdisable(ctlr->irq, n900uartintr, uart, 0, uart->name);
-		ctlr->ie = 0;
-	}
-
-	iunlock(ctlr);
-}
-
-static void
-n900uartkick(Uart *uart)
-{
-	Ctlr *ctlr;
-	int i;
-
-	ctlr = uart->regs;
-	if(uart->blocked)
-		return;
-
-	for(i = 0; i < 128; i++) {
-		if(csr32r(ctlr, Rlsr) & LSRtxempty) {
-			if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
-				break;
-
-			csr32w(ctlr, Rthr, *uart->op++);
-		}
-	}
-}
-
-static int
-n900uartgetc(Uart *uart)
-{
-	Ctlr *ctlr;
-
-	ctlr = uart->regs;
-	while(!(csr32r(ctlr, Rlsr) & LSRrxempty))
-		;
-
-	return csr32r(ctlr, Rrhr);
-}
-
-static void
-n900uartputc(Uart *uart, int c)
-{
-	Ctlr *ctlr;
-
-	ctlr = uart->regs;
-	while(!(csr32r(ctlr, Rlsr) & LSRtxempty))
-		;
-
-	csr32w(ctlr, Rthr, c);
-}
-
-static void n900uartnop(Uart *, int) {}
-static int n900uartnope(Uart *, int) { return -1; }
-
-PhysUart n900physuart = {
-	.name = "n900",
-
-	.pnp = n900uartpnp,
-	.enable = n900uartenable,
-	.disable = n900uartdisable,
-	.kick = n900uartkick,
-	.status = n900uartstatus,
-	.getc = n900uartgetc,
-	.putc = n900uartputc,
-
-	.dobreak = n900uartnop,
-	.baud = n900uartnope,
-	.bits = n900uartnope,
-	.stop = n900uartnope,
-	.parity = n900uartnope,
-	.modemctl = n900uartnop,
-	.rts = n900uartnop,
-	.dtr = n900uartnop,
-	.fifo = n900uartnop,
-	.power = n900uartnop,
-};
-
-void
-uartinit(void)
-{
-	consuart = &n900uart[2];
-	consuart->console = 1;
-	uartputs(kmesg.buf, kmesg.n);
-}
--- /dev/null
+++ b/sys/src/9/n900/uartomap.c
@@ -1,0 +1,268 @@
+#include "u.h"
+#include "../port/lib.h"
+#include "mem.h"
+#include "dat.h"
+#include "fns.h"
+#include "io.h"
+#include "../port/error.h"
+
+enum {
+	Rdll	= 0x00,
+	Rrhr	= 0x00,
+	Rthr	= 0x00,
+	Rdlh	= 0x04,
+	Rier	= 0x04,
+		IErhr	= 1 << 0,
+		IEthr	= 1 << 1,
+		IEls	= 1 << 2,
+		IEms	= 1 << 3,
+	Riir	= 0x08,
+		Ipending = 1 << 0,
+		Imodem	= 0x00,
+		Ithr	= 0x01,
+		Irhr	= 0x02,
+		Ils		= 0x03,
+		Irxt	= 0x06,
+		Ixoff	= 0x08,
+		Icts	= 0x10,
+		Imask 	= 0x1f,
+	Rfcr	= 0x08,
+		FCRen		= 1 << 0,
+	Refr	= 0x08,
+	Rlcr	= 0x0c,
+	Rmcr	= 0x10,
+	Rxon1	= 0x10,
+	Rlsr	= 0x14,
+		LSRrxempty	= 1 << 0,
+		LSRrxover	= 1 << 1,
+		LSRrxparity	= 1 << 2,
+		LSRrxframe	= 1 << 3,
+		LSRrxbreak	= 1 << 4,
+		LSRtxempty	= 1 << 5,
+		LSRtxshift	= 1 << 6,
+		LSRrxstat	= 1 << 7,
+	Rxon2	= 0x14,
+	Rmsr	= 0x18,
+	Rtcr	= 0x18,
+	Rxoff1	= 0x18,
+	Rspr	= 0x1c,
+	Rtlr	= 0x1c,
+	Rxoff2	= 0x1c,
+	Rmdr1	= 0x20,
+	Rmdr2	= 0x24,
+	Rsysc	= 0x54,
+		SCreset		= 1 << 1,
+	Rsyss	= 0x58,
+		SSreset		= 1 << 0,
+};
+
+#define csr32r(c, r) ((c)->io[(r)/4])
+#define csr32w(c, r, w) ((c)->io[(r)/4] = (w))
+
+typedef struct Ctlr Ctlr;
+struct Ctlr {
+	Lock;
+
+	u32int *io;
+	ulong irq;
+
+	int ie;
+};
+
+extern PhysUart omapphysuart;
+
+static Ctlr ctlr[] = {
+	{ .io = (u32int*) PHYSUART1, .irq = IRQUART1, },
+	{ .io = (u32int*) PHYSUART2, .irq = IRQUART2, },
+	{ .io = (u32int*) PHYSUART3, .irq = IRQUART3, },
+};
+
+static Uart omapuart[] = {
+	{
+		.regs = &ctlr[0],
+		.name = "uart1",
+		.freq = 48000000,
+		.phys = &omapphysuart,
+		.next = &omapuart[1],
+	},
+	{
+		.regs = &ctlr[1],
+		.name = "uart2",
+		.freq = 48000000,
+		.phys = &omapphysuart,
+		.next = &omapuart[2],
+	},
+	{
+		.regs = &ctlr[2],
+		.name = "uart3",
+		.freq = 48000000,
+		.phys = &omapphysuart,
+		.next = nil,
+	},
+};
+
+static Uart *
+omapuartpnp(void)
+{
+	return omapuart;
+}
+
+static long
+omapuartstatus(Uart *, void *, long, long)
+{
+	return 0;
+}
+
+static void
+omapuartintr(Ureg *, void *arg)
+{
+	Uart *uart;
+	Ctlr *ctlr;
+	int lsr;
+	char c;
+
+	uart = arg;
+	ctlr = uart->regs;
+
+	ilock(ctlr);
+	switch((csr32r(ctlr, Riir) >> 1) & Imask) {
+	case Ithr:
+		uartkick(uart);
+		break;
+
+	case Irhr:
+		while((lsr = csr32r(ctlr, Rlsr)) & LSRrxempty) {
+			c = csr32r(ctlr, Rrhr);
+
+			if(lsr & LSRrxover) { uart->oerr++; break; }
+			if(lsr & LSRrxparity) { uart->perr++; break; }
+			if(lsr & LSRrxframe) { uart->ferr++; break; }
+
+			uartrecv(uart, c);
+		}
+
+		break;
+	}
+
+	iunlock(ctlr);
+}
+
+static void
+omapuartenable(Uart *uart, int ie)
+{
+	Ctlr *ctlr;
+
+	ctlr = uart->regs;
+	ilock(ctlr);
+
+	csr32w(ctlr, Rsysc, SCreset);
+	while(!(csr32r(ctlr, Rsyss) & SSreset))
+		;
+
+	csr32w(ctlr, Rfcr, FCRen);
+	if(ie) {
+		if(!ctlr->ie) {
+			intrenable(ctlr->irq, omapuartintr, uart, 0, uart->name);
+			ctlr->ie = 1;
+		}
+
+		csr32w(ctlr, Rier, IErhr);
+	}
+
+	iunlock(ctlr);
+}
+
+static void
+omapuartdisable(Uart *uart)
+{
+	Ctlr *ctlr;
+
+	ctlr = uart->regs;
+
+	ilock(ctlr);
+	csr32w(ctlr, Rier, 0);
+	if(ctlr->ie) {
+		intrdisable(ctlr->irq, omapuartintr, uart, 0, uart->name);
+		ctlr->ie = 0;
+	}
+
+	iunlock(ctlr);
+}
+
+static void
+omapuartkick(Uart *uart)
+{
+	Ctlr *ctlr;
+	int i;
+
+	ctlr = uart->regs;
+	if(uart->blocked)
+		return;
+
+	for(i = 0; i < 128; i++) {
+		if(csr32r(ctlr, Rlsr) & LSRtxempty) {
+			if(uart->op >= uart->oe && uartstageoutput(uart) == 0)
+				break;
+
+			csr32w(ctlr, Rthr, *uart->op++);
+		}
+	}
+}
+
+static int
+omapuartgetc(Uart *uart)
+{
+	Ctlr *ctlr;
+
+	ctlr = uart->regs;
+	while(!(csr32r(ctlr, Rlsr) & LSRrxempty))
+		;
+
+	return csr32r(ctlr, Rrhr);
+}
+
+static void
+omapuartputc(Uart *uart, int c)
+{
+	Ctlr *ctlr;
+
+	ctlr = uart->regs;
+	while(!(csr32r(ctlr, Rlsr) & LSRtxempty))
+		;
+
+	csr32w(ctlr, Rthr, c);
+}
+
+static void omapuartnop(Uart *, int) {}
+static int omapuartnope(Uart *, int) { return -1; }
+
+PhysUart omapphysuart = {
+	.name = "omap",
+
+	.pnp = omapuartpnp,
+	.enable = omapuartenable,
+	.disable = omapuartdisable,
+	.kick = omapuartkick,
+	.status = omapuartstatus,
+	.getc = omapuartgetc,
+	.putc = omapuartputc,
+
+	.dobreak = omapuartnop,
+	.baud = omapuartnope,
+	.bits = omapuartnope,
+	.stop = omapuartnope,
+	.parity = omapuartnope,
+	.modemctl = omapuartnop,
+	.rts = omapuartnop,
+	.dtr = omapuartnop,
+	.fifo = omapuartnop,
+	.power = omapuartnop,
+};
+
+void
+uartinit(void)
+{
+	consuart = &omapuart[2];
+	consuart->console = 1;
+	uartputs(kmesg.buf, kmesg.n);
+}