int fd_eeprom_write(struct fd_dev *fd, int i2c_addr, uint32_t offset, void *buf, size_t size) { int i, busy; uint8_t *buf8 = buf; for(i = 0; i < size; i++) { mi2c_start(fd); if(mi2c_put_byte(fd, i2c_addr << 1) < 0) { mi2c_stop(fd); return -1; } mi2c_put_byte(fd, (offset >> 8) & 0xff); mi2c_put_byte(fd, offset & 0xff); mi2c_put_byte(fd, *buf8++); offset++; mi2c_stop(fd); do { /* wait until the chip becomes ready */ mi2c_start(fd); busy = mi2c_put_byte(fd, i2c_addr << 1); mi2c_stop(fd); } while(busy); } return size; }
/* FIXME: this is very inefficient: read several bytes in a row instead */ int fd_eeprom_read(struct fd_dev *fd, int i2c_addr, uint32_t offset, void *buf, size_t size) { int i; uint8_t *buf8 = buf; unsigned char c; for(i = 0; i < size; i++) { mi2c_start(fd); if(mi2c_put_byte(fd, i2c_addr << 1) < 0) { mi2c_stop(fd); return -EIO; } mi2c_put_byte(fd, (offset >> 8) & 0xff); mi2c_put_byte(fd, offset & 0xff); offset++; mi2c_stop(fd); mi2c_start(fd); mi2c_put_byte(fd, (i2c_addr << 1) | 1); mi2c_get_byte(fd, &c, 0); *buf8++ = c; mi2c_stop(fd); } return size; }
int spec_eeprom_write(struct fmc_device *fmc, int i2c_addr, uint32_t offset, const void *buf, size_t size) { int i, busy; const uint8_t *buf8 = buf; for(i = 0; i < size; i++) { mi2c_start((fmc)); if(mi2c_put_byte(fmc, i2c_addr << 1) < 0) { mi2c_stop(fmc); return -1; } mi2c_put_byte(fmc, (offset >> 8) & 0xff); mi2c_put_byte(fmc, offset & 0xff); mi2c_put_byte(fmc, *buf8++); offset++; mi2c_stop(fmc); do { /* wait until the chip becomes ready */ mi2c_start(fmc); busy = mi2c_put_byte(fmc, i2c_addr << 1); mi2c_stop(fmc); } while(busy); } return size; }
int mi2c_scan(struct fmc_device *fmc) { int i, found = 0; for(i = 0; i < 256; i += 2) { mi2c_start(fmc); if(!mi2c_put_byte(fmc, i)) found++; mi2c_stop(fmc); } return found; }
void mi2c_scan(struct fd_dev *fd) { int i; for(i = 0; i < 256; i += 2) { mi2c_start(fd); if(!mi2c_put_byte(fd, i)) dev_info(&fd->fmc->dev, "%s: Found i2c device at 0x%x\n", KBUILD_MODNAME, i >> 1); mi2c_stop(fd); } }