Loading drivers/gpu/drm/nouveau/core/subdev/i2c/anx9805.c +19 −5 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ * Authors: Ben Skeggs <bskeggs@redhat.com> */ #include "priv.h" #include "port.h" struct anx9805_i2c_port { struct nouveau_i2c_port base; Loading @@ -37,6 +37,8 @@ anx9805_train(struct nouveau_i2c_port *port, int link_nr, int link_bw, bool enh) struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent; u8 tmp, i; DBG("ANX9805 train %d 0x%02x %d\n", link_nr, link_bw, enh); nv_wri2cr(mast, chan->addr, 0xa0, link_bw); nv_wri2cr(mast, chan->addr, 0xa1, link_nr | (enh ? 0x80 : 0x00)); nv_wri2cr(mast, chan->addr, 0xa2, 0x01); Loading Loading @@ -66,16 +68,23 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry, struct anx9805_i2c_port *chan = (void *)port; struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent; int i, ret = -ETIMEDOUT; u8 buf[16] = {}; u8 tmp; DBG("%02x %05x %d\n", type, addr, size); tmp = nv_rdi2cr(mast, chan->ctrl, 0x07) & ~0x04; nv_wri2cr(mast, chan->ctrl, 0x07, tmp | 0x04); nv_wri2cr(mast, chan->ctrl, 0x07, tmp); nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01); nv_wri2cr(mast, chan->addr, 0xe4, 0x80); for (i = 0; !(type & 1) && i < size; i++) nv_wri2cr(mast, chan->addr, 0xf0 + i, data[i]); if (!(type & 1)) { memcpy(buf, data, size); DBG("%16ph", buf); for (i = 0; i < size; i++) nv_wri2cr(mast, chan->addr, 0xf0 + i, buf[i]); } nv_wri2cr(mast, chan->addr, 0xe5, ((size - 1) << 4) | type); nv_wri2cr(mast, chan->addr, 0xe6, (addr & 0x000ff) >> 0); nv_wri2cr(mast, chan->addr, 0xe7, (addr & 0x0ff00) >> 8); Loading @@ -94,8 +103,13 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry, goto done; } for (i = 0; (type & 1) && i < size; i++) data[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i); if (type & 1) { for (i = 0; i < size; i++) buf[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i); DBG("%16ph", buf); memcpy(data, buf, size); } ret = 0; done: nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01); Loading drivers/gpu/drm/nouveau/core/subdev/i2c/port.h 0 → 100644 +15 −0 Original line number Diff line number Diff line #ifndef __NVKM_I2C_PORT_H__ #define __NVKM_I2C_PORT_H__ #include "priv.h" #ifndef MSG #define MSG(l,f,a...) do { \ struct nouveau_i2c_port *_port = (void *)port; \ nv_##l(nv_object(_port)->engine, "PORT:%02x: "f, _port->index, ##a); \ } while(0) #define DBG(f,a...) MSG(debug, f, ##a) #define ERR(f,a...) MSG(error, f, ##a) #endif #endif Loading
drivers/gpu/drm/nouveau/core/subdev/i2c/anx9805.c +19 −5 Original line number Diff line number Diff line Loading @@ -22,7 +22,7 @@ * Authors: Ben Skeggs <bskeggs@redhat.com> */ #include "priv.h" #include "port.h" struct anx9805_i2c_port { struct nouveau_i2c_port base; Loading @@ -37,6 +37,8 @@ anx9805_train(struct nouveau_i2c_port *port, int link_nr, int link_bw, bool enh) struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent; u8 tmp, i; DBG("ANX9805 train %d 0x%02x %d\n", link_nr, link_bw, enh); nv_wri2cr(mast, chan->addr, 0xa0, link_bw); nv_wri2cr(mast, chan->addr, 0xa1, link_nr | (enh ? 0x80 : 0x00)); nv_wri2cr(mast, chan->addr, 0xa2, 0x01); Loading Loading @@ -66,16 +68,23 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry, struct anx9805_i2c_port *chan = (void *)port; struct nouveau_i2c_port *mast = (void *)nv_object(chan)->parent; int i, ret = -ETIMEDOUT; u8 buf[16] = {}; u8 tmp; DBG("%02x %05x %d\n", type, addr, size); tmp = nv_rdi2cr(mast, chan->ctrl, 0x07) & ~0x04; nv_wri2cr(mast, chan->ctrl, 0x07, tmp | 0x04); nv_wri2cr(mast, chan->ctrl, 0x07, tmp); nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01); nv_wri2cr(mast, chan->addr, 0xe4, 0x80); for (i = 0; !(type & 1) && i < size; i++) nv_wri2cr(mast, chan->addr, 0xf0 + i, data[i]); if (!(type & 1)) { memcpy(buf, data, size); DBG("%16ph", buf); for (i = 0; i < size; i++) nv_wri2cr(mast, chan->addr, 0xf0 + i, buf[i]); } nv_wri2cr(mast, chan->addr, 0xe5, ((size - 1) << 4) | type); nv_wri2cr(mast, chan->addr, 0xe6, (addr & 0x000ff) >> 0); nv_wri2cr(mast, chan->addr, 0xe7, (addr & 0x0ff00) >> 8); Loading @@ -94,8 +103,13 @@ anx9805_aux(struct nouveau_i2c_port *port, bool retry, goto done; } for (i = 0; (type & 1) && i < size; i++) data[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i); if (type & 1) { for (i = 0; i < size; i++) buf[i] = nv_rdi2cr(mast, chan->addr, 0xf0 + i); DBG("%16ph", buf); memcpy(data, buf, size); } ret = 0; done: nv_wri2cr(mast, chan->ctrl, 0xf7, 0x01); Loading
drivers/gpu/drm/nouveau/core/subdev/i2c/port.h 0 → 100644 +15 −0 Original line number Diff line number Diff line #ifndef __NVKM_I2C_PORT_H__ #define __NVKM_I2C_PORT_H__ #include "priv.h" #ifndef MSG #define MSG(l,f,a...) do { \ struct nouveau_i2c_port *_port = (void *)port; \ nv_##l(nv_object(_port)->engine, "PORT:%02x: "f, _port->index, ##a); \ } while(0) #define DBG(f,a...) MSG(debug, f, ##a) #define ERR(f,a...) MSG(error, f, ##a) #endif #endif