/* * $Id: obio.c,v 1.1 2007/10/16 08:41:04 init Exp $ */ #include #include #include #include #include /* * 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 *self) { 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; printf("memory-mapped i/o\n"); return(0); } uint8_t obio_read_1(struct device *devp, uint32_t addr) { /* * struct device is not used in obio. * There is only one on-board i/o bus in testarm. */ return( (*(uint8_t *)addr) ); } uint16_t obio_read_2(struct device *devp, uint32_t addr) { return( (*(uint16_t *)addr) ); } uint32_t obio_read_4(struct device *devp, uint32_t addr) { return( (*(uint32_t *)addr) ); } int obio_write_1(struct device *devp, uint32_t addr, uint8_t data) { *((uint8_t *)addr) = data; /* XXX what about write errors? */ return(0); } int obio_write_2(struct device *devp, uint32_t addr, uint16_t data) { *((uint16_t *)addr) = data; return(0); } int obio_write_4(struct device *devp, uint32_t addr, uint32_t data) { *((uint32_t *)addr) = data; return(0); }