/* * $Id: obio.c,v 1.9 2007/10/16 21:27:28 init Exp $ */ #include #include #include #include #include #include /* * testarm obio (on-board i/o) support. * This is a simple memory read/writes. */ 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, uint32_t loc, uint8_t flags) { 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); } uint8_t obio_read_1(void *ddp, uint32_t addr) { /* * There is only one on-board i/o bus in testarm. */ return( (*(uint8_t *)addr) ); } uint16_t obio_read_2(void *ddp, uint32_t addr) { return( (*(uint16_t *)addr) ); } uint32_t obio_read_4(void *ddp, uint32_t addr) { return( (*(uint32_t *)addr) ); } int obio_write_1(void *ddp, uint32_t addr, uint8_t data) { *((uint8_t *)addr) = data; /* XXX what about write errors? */ return(0); } int obio_write_2(void *ddp, uint32_t addr, uint16_t data) { *((uint16_t *)addr) = data; return(0); } int obio_write_4(void *ddp, uint32_t addr, uint32_t data) { *((uint32_t *)addr) = data; return(0); }