Changeset View
Changeset View
Standalone View
Standalone View
sys/mips/ingenic/jz4780_smb.c
Show First 20 Lines • Show All 242 Lines • ▼ Show 20 Lines | jzsmb_transfer_read(device_t dev, struct iic_msg *msg) | ||||
SMB_WRITE(sc, SMBCON, con); | SMB_WRITE(sc, SMBCON, con); | ||||
getnanouptime(&start); | getnanouptime(&start); | ||||
for (resid = msg->len; resid > 0; resid--) { | for (resid = msg->len; resid > 0; resid--) { | ||||
for (int i = 0; i < min(resid, 8); i++) | for (int i = 0; i < min(resid, 8); i++) | ||||
SMB_WRITE(sc, SMBDC, SMBDC_CMD); | SMB_WRITE(sc, SMBDC, SMBDC_CMD); | ||||
for (;;) { | for (;;) { | ||||
getnanouptime(&diff); | getnanouptime(&diff); | ||||
timespecsub(&diff, &start); | timespecsub(&diff, &start, &diff); | ||||
if ((SMB_READ(sc, SMBST) & SMBST_RFNE) != 0) { | if ((SMB_READ(sc, SMBST) & SMBST_RFNE) != 0) { | ||||
msg->buf[msg->len - resid] = | msg->buf[msg->len - resid] = | ||||
SMB_READ(sc, SMBDC) & SMBDC_DAT; | SMB_READ(sc, SMBDC) & SMBDC_DAT; | ||||
break; | break; | ||||
} else | } else | ||||
DELAY(1000); | DELAY(1000); | ||||
if (tstohz(&diff) >= timeo) { | if (tstohz(&diff) >= timeo) { | ||||
Show All 28 Lines | jzsmb_transfer_write(device_t dev, struct iic_msg *msg, int stop_hold) | ||||
con = SMB_READ(sc, SMBCON); | con = SMB_READ(sc, SMBCON); | ||||
con |= SMBCON_STPHLD; | con |= SMBCON_STPHLD; | ||||
SMB_WRITE(sc, SMBCON, con); | SMB_WRITE(sc, SMBCON, con); | ||||
getnanouptime(&start); | getnanouptime(&start); | ||||
for (resid = msg->len; resid > 0; resid--) { | for (resid = msg->len; resid > 0; resid--) { | ||||
for (;;) { | for (;;) { | ||||
getnanouptime(&diff); | getnanouptime(&diff); | ||||
timespecsub(&diff, &start); | timespecsub(&diff, &start, &diff); | ||||
if ((SMB_READ(sc, SMBST) & SMBST_TFNF) != 0) { | if ((SMB_READ(sc, SMBST) & SMBST_TFNF) != 0) { | ||||
SMB_WRITE(sc, SMBDC, | SMB_WRITE(sc, SMBDC, | ||||
msg->buf[msg->len - resid]); | msg->buf[msg->len - resid]); | ||||
break; | break; | ||||
} else | } else | ||||
DELAY((1000 * hz) / JZSMB_TIMEOUT); | DELAY((1000 * hz) / JZSMB_TIMEOUT); | ||||
if (tstohz(&diff) >= timeo) { | if (tstohz(&diff) >= timeo) { | ||||
▲ Show 20 Lines • Show All 176 Lines • Show Last 20 Lines |