ch7322
static int ch7322_send_message(struct ch7322 *ch7322, const struct cec_msg *msg)
WARN_ON(!mutex_is_locked(&ch7322->mutex));
ret = regmap_read(ch7322->regmap, CH7322_WRITE, &val);
ch7322->tx_flags = CH7322_TX_FLAG_NACK | CH7322_TX_FLAG_RETRY;
ch7322->tx_flags = CH7322_TX_FLAG_NACK;
ch7322->tx_flags = CH7322_TX_FLAG_RETRY;
ret = regmap_write(ch7322->regmap, CH7322_WRITE, len - 1);
ret = regmap_write(ch7322->regmap,
static int ch7322_receive_message(struct ch7322 *ch7322, struct cec_msg *msg)
WARN_ON(!mutex_is_locked(&ch7322->mutex));
ret = regmap_read(ch7322->regmap, CH7322_READ, &val);
ret = regmap_read(ch7322->regmap, CH7322_RDBUF + i, &val);
static void ch7322_tx_done(struct ch7322 *ch7322)
mutex_lock(&ch7322->mutex);
ret = regmap_read(ch7322->regmap, CH7322_WRITE, &val);
flags = ch7322->tx_flags;
mutex_unlock(&ch7322->mutex);
cec_transmit_attempt_done(ch7322->cec, status);
static void ch7322_rx_done(struct ch7322 *ch7322)
mutex_lock(&ch7322->mutex);
ret = ch7322_receive_message(ch7322, &msg);
mutex_unlock(&ch7322->mutex);
dev_err(&ch7322->i2c->dev, "cec receive error: %d\n", ret);
cec_received_msg(ch7322->cec, &msg);
static void ch7322_phys_addr(struct ch7322 *ch7322)
mutex_lock(&ch7322->mutex);
ret |= regmap_read(ch7322->regmap, CH7322_PARH, &pah);
ret |= regmap_read(ch7322->regmap, CH7322_PARL, &pal);
mutex_unlock(&ch7322->mutex);
dev_err(&ch7322->i2c->dev, "phys addr error\n");
cec_s_phys_addr(ch7322->cec, pal | (pah << 8), false);
struct ch7322 *ch7322 = dev;
mutex_lock(&ch7322->mutex);
regmap_read(ch7322->regmap, CH7322_INTDATA, &data);
regmap_write(ch7322->regmap, CH7322_INTDATA, data);
mutex_unlock(&ch7322->mutex);
cec_phys_addr_invalidate(ch7322->cec);
ch7322_tx_done(ch7322);
ch7322_rx_done(ch7322);
ch7322_phys_addr(ch7322);
dev_dbg(&ch7322->i2c->dev, "unknown error\n");
struct ch7322 *ch7322 = cec_get_drvdata(adap);
mutex_lock(&ch7322->mutex);
ret = regmap_update_bits(ch7322->regmap, CH7322_ADDLW,
mutex_unlock(&ch7322->mutex);
struct ch7322 *ch7322 = cec_get_drvdata(adap);
mutex_lock(&ch7322->mutex);
ret = ch7322_send_message(ch7322, msg);
mutex_unlock(&ch7322->mutex);
struct ch7322 *ch7322;
ch7322 = devm_kzalloc(&client->dev, sizeof(*ch7322), GFP_KERNEL);
if (!ch7322)
ch7322->regmap = devm_regmap_init_i2c(client, &ch7322_regmap);
if (IS_ERR(ch7322->regmap))
return PTR_ERR(ch7322->regmap);
ret = regmap_read(ch7322->regmap, CH7322_DID, &val);
mutex_init(&ch7322->mutex);
ch7322->i2c = client;
ch7322->tx_flags = 0;
i2c_set_clientdata(client, ch7322);
ret = regmap_write(ch7322->regmap, CH7322_MODE, CH7322_MODE_SW);
ret = regmap_update_bits(ch7322->regmap, CH7322_CTL,
ch7322->cec = cec_allocate_adapter(&ch7322_cec_adap_ops, ch7322,
if (IS_ERR(ch7322->cec)) {
ret = PTR_ERR(ch7322->cec);
ch7322->cec->adap_controls_phys_addr = true;
ch7322->cec);
ret = regmap_write(ch7322->regmap, CH7322_CFG1, 0);
ret = regmap_write(ch7322->regmap, CH7322_INTCTL, CH7322_INTCTL_INTPB);
ret = regmap_write(ch7322->regmap, CH7322_INTDATA, 0xff);
ret = regmap_read(ch7322->regmap, CH7322_ADDLR, &val);
ch7322_phys_addr(ch7322);
client->name, ch7322);
mutex_lock(&ch7322->mutex);
ret = regmap_write(ch7322->regmap, CH7322_INTCTL, 0xff);
mutex_unlock(&ch7322->mutex);
ret = cec_register_adapter(ch7322->cec, &client->dev);
cec_notifier_cec_adap_unregister(notifier, ch7322->cec);
cec_delete_adapter(ch7322->cec);
mutex_destroy(&ch7322->mutex);
struct ch7322 *ch7322 = i2c_get_clientdata(client);
mutex_lock(&ch7322->mutex);
regmap_write(ch7322->regmap, CH7322_INTCTL, CH7322_INTCTL_INTPB);
mutex_unlock(&ch7322->mutex);
cec_unregister_adapter(ch7322->cec);
mutex_destroy(&ch7322->mutex);