0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "priv.h"
0025 #include "pad.h"
0026
0027 void
0028 gk104_aux_stat(struct nvkm_i2c *i2c, u32 *hi, u32 *lo, u32 *rq, u32 *tx)
0029 {
0030 struct nvkm_device *device = i2c->subdev.device;
0031 u32 intr = nvkm_rd32(device, 0x00dc60);
0032 u32 stat = nvkm_rd32(device, 0x00dc68) & intr, i;
0033 for (i = 0, *hi = *lo = *rq = *tx = 0; i < 8; i++) {
0034 if ((stat & (1 << (i * 4)))) *hi |= 1 << i;
0035 if ((stat & (2 << (i * 4)))) *lo |= 1 << i;
0036 if ((stat & (4 << (i * 4)))) *rq |= 1 << i;
0037 if ((stat & (8 << (i * 4)))) *tx |= 1 << i;
0038 }
0039 nvkm_wr32(device, 0x00dc60, intr);
0040 }
0041
0042 void
0043 gk104_aux_mask(struct nvkm_i2c *i2c, u32 type, u32 mask, u32 data)
0044 {
0045 struct nvkm_device *device = i2c->subdev.device;
0046 u32 temp = nvkm_rd32(device, 0x00dc68), i;
0047 for (i = 0; i < 8; i++) {
0048 if (mask & (1 << i)) {
0049 if (!(data & (1 << i))) {
0050 temp &= ~(type << (i * 4));
0051 continue;
0052 }
0053 temp |= type << (i * 4);
0054 }
0055 }
0056 nvkm_wr32(device, 0x00dc68, temp);
0057 }
0058
0059 static const struct nvkm_i2c_func
0060 gk104_i2c = {
0061 .pad_x_new = gf119_i2c_pad_x_new,
0062 .pad_s_new = gf119_i2c_pad_s_new,
0063 .aux = 4,
0064 .aux_stat = gk104_aux_stat,
0065 .aux_mask = gk104_aux_mask,
0066 };
0067
0068 int
0069 gk104_i2c_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst,
0070 struct nvkm_i2c **pi2c)
0071 {
0072 return nvkm_i2c_new_(&gk104_i2c, device, type, inst, pi2c);
0073 }