summaryrefslogtreecommitdiff
path: root/nvkm
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2014-09-24 10:41:50 +1000
committerBen Skeggs <bskeggs@redhat.com>2014-12-02 15:37:19 +1000
commitf27955bc68e075e7e85d4c08603fb7eb8a7f670c (patch)
tree8a32d6068f6c862143f45ba108871a395ecf4ecd /nvkm
parent7b8ee5b8117107fa645299b1a9e406936990c420 (diff)
downloadnouveau-f27955bc68e075e7e85d4c08603fb7eb8a7f670c.tar.gz
i2c: segregate aux channel adapter indices from bit-banged i2c
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'nvkm')
-rw-r--r--nvkm/engine/disp/outp.c5
-rw-r--r--nvkm/include/subdev/i2c.h2
-rw-r--r--nvkm/subdev/bios/init.c2
-rw-r--r--nvkm/subdev/i2c/base.c8
4 files changed, 14 insertions, 3 deletions
diff --git a/nvkm/engine/disp/outp.c b/nvkm/engine/disp/outp.c
index a5ff00a9c..bbd9b6fdc 100644
--- a/nvkm/engine/disp/outp.c
+++ b/nvkm/engine/disp/outp.c
@@ -85,7 +85,10 @@ nvkm_output_create_(struct nouveau_object *parent,
dcbE->sorconf.link : 0, dcbE->connector, dcbE->i2c_index,
dcbE->bus, dcbE->heads);
- outp->port = i2c->find(i2c, outp->info.i2c_index);
+ if (outp->info.type != DCB_OUTPUT_DP)
+ outp->port = i2c->find(i2c, NV_I2C_PORT(outp->info.i2c_index));
+ else
+ outp->port = i2c->find(i2c, NV_I2C_AUX(outp->info.i2c_index));
outp->edid = outp->port;
data = nvbios_connEp(bios, outp->info.connector, &ver, &hdr, &connE);
diff --git a/nvkm/include/subdev/i2c.h b/nvkm/include/subdev/i2c.h
index 1b937c2c2..50453dd0f 100644
--- a/nvkm/include/subdev/i2c.h
+++ b/nvkm/include/subdev/i2c.h
@@ -8,6 +8,8 @@
#include <subdev/bios/i2c.h>
#define NV_I2C_PORT(n) (0x00 + (n))
+#define NV_I2C_AUX(n) (0x10 + (n))
+#define NV_I2C_EXT(n) (0x20 + (n))
#define NV_I2C_DEFAULT(n) (0x80 + (n))
#define NV_I2C_TYPE_DCBI2C(n) (0x0000 | (n))
diff --git a/nvkm/subdev/bios/init.c b/nvkm/subdev/bios/init.c
index 2c9f2c36f..0c0889e85 100644
--- a/nvkm/subdev/bios/init.c
+++ b/nvkm/subdev/bios/init.c
@@ -255,6 +255,8 @@ init_i2c(struct nvbios_init *init, int index)
}
index = init->outp->i2c_index;
+ if (init->outp->type == DCB_OUTPUT_DP)
+ index += NV_I2C_AUX(0);
}
return i2c->find(i2c, index);
diff --git a/nvkm/subdev/i2c/base.c b/nvkm/subdev/i2c/base.c
index 90d1660b8..3376356ab 100644
--- a/nvkm/subdev/i2c/base.c
+++ b/nvkm/subdev/i2c/base.c
@@ -549,8 +549,12 @@ nouveau_i2c_create_(struct nouveau_object *parent,
case DCB_I2C_NV04_BIT:
case DCB_I2C_NV4E_BIT:
case DCB_I2C_NVIO_BIT:
+ nouveau_i2c_create_port(i2c, NV_I2C_PORT(index),
+ info.type, &info);
+ break;
case DCB_I2C_NVIO_AUX:
- nouveau_i2c_create_port(i2c, index, info.type, &info);
+ nouveau_i2c_create_port(i2c, NV_I2C_AUX(index),
+ info.type, &info);
break;
case DCB_I2C_UNUSED:
default:
@@ -562,7 +566,7 @@ nouveau_i2c_create_(struct nouveau_object *parent,
* may be ddc/aux channels hiding behind external tmds/dp/etc
* transmitters.
*/
- index = ((index + 0x0f) / 0x10) * 0x10;
+ index = NV_I2C_EXT(0);
i = -1;
while ((data = dcb_outp_parse(bios, ++i, &ver, &hdr, &outp))) {
if (!outp.location || !outp.extdev)