summaryrefslogtreecommitdiff
path: root/sound/pci
diff options
context:
space:
mode:
authorLucas Tanure <tanureal@opensource.cirrus.com>2021-08-11 21:56:41 +0300
committerTakashi Iwai <tiwai@suse.de>2021-08-12 14:41:48 +0300
commitd395fd7864c553908a83e10112184febbb9cf81c (patch)
treeb3f1df6110b3422de23e8c0eea14d23c7b484ead /sound/pci
parent647d50a0c30402d2156ca201a74d77d58c7ef5ff (diff)
downloadlinux-d395fd7864c553908a83e10112184febbb9cf81c.tar.xz
ALSA: hda/cs8409: Avoid setting the same I2C address for every access
Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com> Signed-off-by: Vitaly Rodionov <vitalyr@opensource.cirrus.com> Link: https://lore.kernel.org/r/20210811185654.6837-15-vitalyr@opensource.cirrus.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/hda/patch_cs8409.c19
-rw-r--r--sound/pci/hda/patch_cs8409.h1
2 files changed, 18 insertions, 2 deletions
diff --git a/sound/pci/hda/patch_cs8409.c b/sound/pci/hda/patch_cs8409.c
index 420f3a612fc4..e683349ebd50 100644
--- a/sound/pci/hda/patch_cs8409.c
+++ b/sound/pci/hda/patch_cs8409.c
@@ -156,6 +156,21 @@ static int cs8409_i2c_wait_complete(struct hda_codec *codec)
}
/**
+ * cs8409_set_i2c_dev_addr - Set i2c address for transaction
+ * @codec: the codec instance
+ * @addr: I2C Address
+ */
+static void cs8409_set_i2c_dev_addr(struct hda_codec *codec, unsigned int addr)
+{
+ struct cs8409_spec *spec = codec->spec;
+
+ if (spec->dev_addr != addr) {
+ cs8409_vendor_coef_set(codec, CS8409_I2C_ADDR, addr);
+ spec->dev_addr = addr;
+ }
+}
+
+/**
* cs8409_i2c_read - CS8409 I2C Read.
* @codec: the codec instance
* @i2c_address: I2C Address
@@ -176,7 +191,7 @@ static int cs8409_i2c_read(struct hda_codec *codec, unsigned int i2c_address, un
return -EPERM;
cs8409_enable_i2c_clock(codec);
- cs8409_vendor_coef_set(codec, CS8409_I2C_ADDR, i2c_address);
+ cs8409_set_i2c_dev_addr(codec, i2c_address);
if (paged) {
cs8409_vendor_coef_set(codec, CS8409_I2C_QWRITE, i2c_reg >> 8);
@@ -222,7 +237,7 @@ static int cs8409_i2c_write(struct hda_codec *codec, unsigned int i2c_address, u
return -EPERM;
cs8409_enable_i2c_clock(codec);
- cs8409_vendor_coef_set(codec, CS8409_I2C_ADDR, i2c_address);
+ cs8409_set_i2c_dev_addr(codec, i2c_address);
if (paged) {
cs8409_vendor_coef_set(codec, CS8409_I2C_QWRITE, i2c_reg >> 8);
diff --git a/sound/pci/hda/patch_cs8409.h b/sound/pci/hda/patch_cs8409.h
index 542582c213d2..c2c208218e34 100644
--- a/sound/pci/hda/patch_cs8409.h
+++ b/sound/pci/hda/patch_cs8409.h
@@ -281,6 +281,7 @@ struct cs8409_spec {
struct mutex cs8409_i2c_mux;
unsigned int i2c_clck_enabled;
+ unsigned int dev_addr;
struct delayed_work i2c_clk_work;
/* verb exec op override */