case I2C_SLAVE_WRITE_RECEIVED: if (test_bit(TU_FLAG_IN_PROCESS | TU_FLAG_NACK, &tu->flags)) {
ret = -EBUSY; break;
}
if (tu->reg_idx < TU_NUM_REGS)
tu->regs[tu->reg_idx] = *val; else
ret = -EMSGSIZE;
if (tu->reg_idx <= TU_NUM_REGS)
tu->reg_idx++;
/* TU_REG_CMD always written at this point */ if (tu->regs[TU_REG_CMD] >= TU_NUM_CMDS)
ret = -EINVAL;
break;
case I2C_SLAVE_STOP: if (tu->reg_idx == TU_NUM_REGS) {
set_bit(TU_FLAG_IN_PROCESS, &tu->flags);
queue_delayed_work(system_long_wq, &tu->worker,
msecs_to_jiffies(10 * tu->regs[TU_REG_DELAY]));
}
/* * Reset reg_idx to avoid that work gets queued again in case of * STOP after a following read message. But do not clear TU regs * here because we still need them in the workqueue!
*/
tu->reg_idx = 0;
clear_bit(TU_FLAG_NACK, &tu->flags); break;
case I2C_SLAVE_READ_PROCESSED: /* Advance until we reach the NUL character */ if (is_get_version && tu_version_info[tu->read_idx] != 0)
tu->read_idx++; elseif (is_proc_call && tu->regs[TU_REG_DATAH])
tu->regs[TU_REG_DATAH]--;
case TU_CMD_SMBUS_ALERT_REQUEST: if (!tu->gpio) {
ret = -ENOENT; break;
}
i2c_slave_unregister(tu->client);
orig_addr = tu->client->addr;
tu->client->addr = 0x0c;
ret = i2c_slave_register(tu->client, i2c_slave_testunit_smbalert_cb); if (ret) goto out_smbalert;
reinit_completion(&tu->alert_done);
gpiod_set_value(tu->gpio, 1);
time_left = wait_for_completion_timeout(&tu->alert_done, HZ); if (!time_left)
ret = -ETIMEDOUT;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.