=================================================================== RCS file: /cvs/funnyos/arch/testarm/dev/obio.c,v retrieving revision 1.1 retrieving revision 1.10 diff -u -r1.1 -r1.10 --- funnyos/arch/testarm/dev/obio.c 2007/10/16 09:41:04 1.1 +++ funnyos/arch/testarm/dev/obio.c 2007/10/26 14:34:47 1.10 @@ -1,39 +1,63 @@ /* - * $Id: obio.c,v 1.1 2007/10/16 08:41:04 init Exp $ + * $Id: obio.c,v 1.10 2007/10/26 13:34:47 init Exp $ */ #include #include #include #include + +#include #include +/* #define OBIO_DEBUG */ + +#ifdef OBIO_DEBUG +#define DPRINTF(x...) do { printf(x); } while (0) +#else +#define DPRINTF(x...) { } +#endif + /* * testarm obio (on-board i/o) support. * This is a simple memory read/writes. */ -uint8_t obio_read_1(struct device *, uint32_t); -uint16_t obio_read_2(struct device *, uint32_t); -uint32_t obio_read_4(struct device *, uint32_t); -int obio_write_1(struct device *, uint32_t, uint8_t); -int obio_write_2(struct device *, uint32_t, uint16_t); -int obio_write_4(struct device *, uint32_t, uint32_t); +int obio_attach(struct device *, uint32_t, uint8_t); +uint8_t obio_read_1(void *, uint32_t); +uint16_t obio_read_2(void *, uint32_t); +uint32_t obio_read_4(void *, uint32_t); +int obio_write_1(void *, uint32_t, uint8_t); +int obio_write_2(void *, uint32_t, uint16_t); +int obio_write_4(void *, uint32_t, uint32_t); + +struct driver obio_dr = { + sizeof(struct obio_dd), + obio_attach, + NULL +}; + + int -obio_attach(struct device *self) +obio_attach(struct device *self, uint32_t loc, uint8_t flags) { - struct busops *aux = self->dv_aux; - aux = (struct busops *)kmalloc(sizeof(struct busops)); - /* - * Link bus ops. - */ - aux->bus_read_1 = obio_read_1; - aux->bus_read_2 = obio_read_2; - aux->bus_read_4 = obio_read_4; - aux->bus_write_1 = obio_write_1; - aux->bus_write_2 = obio_write_2; - aux->bus_write_4 = obio_write_4; + struct obio_dd *ddp = self->dv_devdata; + struct bus_handle *bhp = &ddp->od_bh; + ddp->od_locked = 0; + ddp->od_ndevices = 0; + + bhp->bus_read_1 = obio_read_1; + bhp->bus_read_2 = obio_read_2; + bhp->bus_read_4 = obio_read_4; + bhp->bus_write_1 = obio_write_1; + bhp->bus_write_2 = obio_write_2; + bhp->bus_write_4 = obio_write_4; + bhp->bh_ownerdd = self->dv_devdata; /* XXX UGLY bus_{read|write} stuff will access bus device from bus_handle using this */ + + /* expose our bus_handle to the world */ + self->dv_aux = bhp; + printf("memory-mapped i/o\n"); return(0); @@ -41,33 +65,37 @@ uint8_t -obio_read_1(struct device *devp, uint32_t addr) +obio_read_1(void *ddp, uint32_t addr) { /* - * struct device is not used in obio. * There is only one on-board i/o bus in testarm. */ + DPRINTF("obio_read_1: read @0x%x\n", addr); return( (*(uint8_t *)addr) ); } uint16_t -obio_read_2(struct device *devp, uint32_t addr) +obio_read_2(void *ddp, uint32_t addr) { + DPRINTF("obio_read_2: read @0x%x\n", addr); return( (*(uint16_t *)addr) ); } uint32_t -obio_read_4(struct device *devp, uint32_t addr) +obio_read_4(void *ddp, uint32_t addr) { + DPRINTF("obio_read_4: read @0x%x\n", addr); return( (*(uint32_t *)addr) ); } int -obio_write_1(struct device *devp, uint32_t addr, uint8_t data) +obio_write_1(void *ddp, uint32_t addr, uint8_t data) { + DPRINTF("obio_write_1: write @0x%x data %d\n", addr, data); + *((uint8_t *)addr) = data; /* XXX what about write errors? */ @@ -76,8 +104,10 @@ int -obio_write_2(struct device *devp, uint32_t addr, uint16_t data) +obio_write_2(void *ddp, uint32_t addr, uint16_t data) { + DPRINTF("obio_write_2: write @0x%x data %d\n", addr, data); + *((uint16_t *)addr) = data; return(0); @@ -85,8 +115,10 @@ int -obio_write_4(struct device *devp, uint32_t addr, uint32_t data) +obio_write_4(void *ddp, uint32_t addr, uint32_t data) { + DPRINTF("obio_write_4: write @0x%x data %d\n", addr, data); + *((uint32_t *)addr) = data; return(0);