static int i2c_read(struct i2c_au1550_data *adap, unsigned char *buf, unsigned int len) { int i; if (len == 0) return 0; /* A read is performed by stuffing the transmit fifo with * zero bytes for timing, waiting for bytes to appear in the * receive fifo, then reading the bytes. */ i = 0; while (i < (len - 1)) { WR(adap, PSC_SMBTXRX, 0); if (wait_for_rx_byte(adap, &buf[i])) return -EIO; i++; } /* The last byte has to indicate transfer done. */ WR(adap, PSC_SMBTXRX, PSC_SMBTXRX_STP); if (wait_master_done(adap)) return -EIO; buf[i] = (unsigned char)(RD(adap, PSC_SMBTXRX) & 0xff); return 0; }
static int i2c_read(struct i2c_au1550_data *adap, unsigned char *buf, unsigned int len) { int i; u32 data; volatile psc_smb_t *sp; if (len == 0) return 0; /* A read is performed by stuffing the transmit fifo with * zero bytes for timing, waiting for bytes to appear in the * receive fifo, then reading the bytes. */ sp = (volatile psc_smb_t *)(adap->psc_base); i = 0; while (i < (len-1)) { sp->psc_smbtxrx = 0; au_sync(); if (wait_for_rx_byte(adap, &data)) return -EIO; buf[i] = data; i++; } /* The last byte has to indicate transfer done. */ sp->psc_smbtxrx = PSC_SMBTXRX_STP; au_sync(); if (wait_master_done(adap)) return -EIO; data = sp->psc_smbtxrx; au_sync(); buf[i] = data; return 0; }
static int i2c_read(struct i2c_au1550_data *adap, unsigned char *buf, unsigned int len) { int i; u32 data; volatile psc_smb_t *sp; if (len == 0) return 0; sp = (volatile psc_smb_t *)(adap->psc_base); i = 0; while (i < (len-1)) { sp->psc_smbtxrx = 0; au_sync(); if (wait_for_rx_byte(adap, &data)) return -EIO; buf[i] = data; i++; } sp->psc_smbtxrx = PSC_SMBTXRX_STP; au_sync(); if (wait_master_done(adap)) return -EIO; data = sp->psc_smbtxrx; au_sync(); buf[i] = data; return 0; }