summaryrefslogtreecommitdiffstats
path: root/sound/soc/codecs/sigmadsp-i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/codecs/sigmadsp-i2c.c')
-rw-r--r--sound/soc/codecs/sigmadsp-i2c.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/sound/soc/codecs/sigmadsp-i2c.c b/sound/soc/codecs/sigmadsp-i2c.c
index bf6a2be72692..21ca3a5e9f66 100644
--- a/sound/soc/codecs/sigmadsp-i2c.c
+++ b/sound/soc/codecs/sigmadsp-i2c.c
@@ -34,6 +34,34 @@ static int sigmadsp_write_i2c(void *control_data,
return ret;
}
+static int sigmadsp_read_i2c(void *control_data,
+ unsigned int addr, uint8_t data[], size_t len)
+{
+ struct i2c_client *client = control_data;
+ struct i2c_msg msgs[2];
+ uint8_t buf[2];
+ int ret;
+
+ put_unaligned_be16(addr, buf);
+
+ msgs[0].addr = client->addr;
+ msgs[0].len = sizeof(buf);
+ msgs[0].buf = buf;
+ msgs[0].flags = 0;
+
+ msgs[1].addr = client->addr;
+ msgs[1].len = len;
+ msgs[1].buf = data;
+ 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;
+ return 0;
+}
+
/**
* devm_sigmadsp_init_i2c() - Initialize SigmaDSP instance
* @client: The parent I2C device
@@ -55,6 +83,7 @@ struct sigmadsp *devm_sigmadsp_init_i2c(struct i2c_client *client,
sigmadsp->control_data = client;
sigmadsp->write = sigmadsp_write_i2c;
+ sigmadsp->read = sigmadsp_read_i2c;
return sigmadsp;
}