static int adau1701_write(struct snd_soc_codec *codec, unsigned int reg, unsigned int value) { unsigned int i; unsigned int size; uint8_t buf[4]; int ret; size = adau1701_register_size(codec, reg); if (size == 0) return -EINVAL; snd_soc_cache_write(codec, reg, value); buf[0] = 0x08; buf[1] = reg; for (i = size + 1; i >= 2; --i) { buf[i] = value; value >>= 8; } ret = i2c_master_send(to_i2c_client(codec->dev), buf, size + 2); if (ret == size + 2) return 0; else if (ret < 0) return ret; else return -EIO; }
static int adau1701_reg_write(void *context, unsigned int reg, unsigned int value) { struct i2c_client *client = context; unsigned int i; unsigned int size; uint8_t buf[5]; int ret; size = adau1701_register_size(&client->dev, reg); if (size == 0) return -EINVAL; buf[0] = reg >> 8; buf[1] = reg & 0xff; for (i = size + 1; i >= 2; --i) { buf[i] = value; value >>= 8; } ret = i2c_master_send(client, buf, size + 2); if (ret == size + 2) return 0; else if (ret < 0) return ret; else return -EIO; }
static int adau1701_reg_read(void *context, unsigned int reg, unsigned int *value) { int ret; unsigned int i; unsigned int size; uint8_t send_buf[2], recv_buf[3]; struct i2c_client *client = context; struct i2c_msg msgs[2]; size = adau1701_register_size(&client->dev, reg); if (size == 0) return -EINVAL; send_buf[0] = reg >> 8; send_buf[1] = reg & 0xff; msgs[0].addr = client->addr; msgs[0].len = sizeof(send_buf); msgs[0].buf = send_buf; msgs[0].flags = 0; msgs[1].addr = client->addr; msgs[1].len = size; msgs[1].buf = recv_buf; msgs[1].flags = I2C_M_RD; ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); if (ret < 0) return ret; else if (ret != ARRAY_SIZE(msgs)) return -EIO; *value = 0; for (i = 0; i < size; i++) { *value <<= 8; *value |= recv_buf[i]; } return 0; }