Lines Matching +full:aux +full:- +full:bus
26 #include "bus.h"
39 list_for_each_entry(pad, &i2c->pad, head) { in nvkm_i2c_pad_find()
40 if (pad->id == id) in nvkm_i2c_pad_find()
50 struct nvkm_bios *bios = i2c->subdev.device->bios; in nvkm_i2c_bus_find()
51 struct nvkm_i2c_bus *bus; in nvkm_i2c_bus_find() local
67 list_for_each_entry(bus, &i2c->bus, head) { in nvkm_i2c_bus_find()
68 if (bus->id == id) in nvkm_i2c_bus_find()
69 return bus; in nvkm_i2c_bus_find()
78 struct nvkm_i2c_aux *aux; in nvkm_i2c_aux_find() local
80 list_for_each_entry(aux, &i2c->aux, head) { in nvkm_i2c_aux_find()
81 if (aux->id == id) in nvkm_i2c_aux_find()
82 return aux; in nvkm_i2c_aux_find()
92 struct nvkm_i2c_aux *aux = nvkm_i2c_aux_find(i2c, id); in nvkm_i2c_intr_fini() local
93 if (aux) in nvkm_i2c_intr_fini()
94 i2c->func->aux_mask(i2c, type, aux->intr, 0); in nvkm_i2c_intr_fini()
101 struct nvkm_i2c_aux *aux = nvkm_i2c_aux_find(i2c, id); in nvkm_i2c_intr_init() local
102 if (aux) in nvkm_i2c_intr_init()
103 i2c->func->aux_mask(i2c, type, aux->intr, aux->intr); in nvkm_i2c_intr_init()
116 struct nvkm_i2c_aux *aux; in nvkm_i2c_intr() local
119 if (!i2c->func->aux_stat) in nvkm_i2c_intr()
122 i2c->func->aux_stat(i2c, &hi, &lo, &rq, &tx); in nvkm_i2c_intr()
126 list_for_each_entry(aux, &i2c->aux, head) { in nvkm_i2c_intr()
128 if (hi & aux->intr) mask |= NVKM_I2C_PLUG; in nvkm_i2c_intr()
129 if (lo & aux->intr) mask |= NVKM_I2C_UNPLUG; in nvkm_i2c_intr()
130 if (rq & aux->intr) mask |= NVKM_I2C_IRQ; in nvkm_i2c_intr()
131 if (tx & aux->intr) mask |= NVKM_I2C_DONE; in nvkm_i2c_intr()
133 nvkm_event_ntfy(&i2c->event, aux->id, mask); in nvkm_i2c_intr()
142 struct nvkm_i2c_bus *bus; in nvkm_i2c_fini() local
143 struct nvkm_i2c_aux *aux; in nvkm_i2c_fini() local
146 list_for_each_entry(aux, &i2c->aux, head) { in nvkm_i2c_fini()
147 nvkm_i2c_aux_fini(aux); in nvkm_i2c_fini()
150 list_for_each_entry(bus, &i2c->bus, head) { in nvkm_i2c_fini()
151 nvkm_i2c_bus_fini(bus); in nvkm_i2c_fini()
154 if ((mask = (1 << i2c->func->aux) - 1), i2c->func->aux_stat) { in nvkm_i2c_fini()
155 i2c->func->aux_mask(i2c, NVKM_I2C_ANY, mask, 0); in nvkm_i2c_fini()
156 i2c->func->aux_stat(i2c, &mask, &mask, &mask, &mask); in nvkm_i2c_fini()
159 list_for_each_entry(pad, &i2c->pad, head) { in nvkm_i2c_fini()
170 struct nvkm_i2c_bus *bus; in nvkm_i2c_preinit() local
177 list_for_each_entry(pad, &i2c->pad, head) in nvkm_i2c_preinit()
179 list_for_each_entry(bus, &i2c->bus, head) in nvkm_i2c_preinit()
180 nvkm_i2c_bus_init(bus); in nvkm_i2c_preinit()
189 struct nvkm_i2c_bus *bus; in nvkm_i2c_init() local
191 struct nvkm_i2c_aux *aux; in nvkm_i2c_init() local
193 list_for_each_entry(pad, &i2c->pad, head) { in nvkm_i2c_init()
197 list_for_each_entry(bus, &i2c->bus, head) { in nvkm_i2c_init()
198 nvkm_i2c_bus_init(bus); in nvkm_i2c_init()
201 list_for_each_entry(aux, &i2c->aux, head) { in nvkm_i2c_init()
202 nvkm_i2c_aux_init(aux); in nvkm_i2c_init()
213 nvkm_event_fini(&i2c->event); in nvkm_i2c_dtor()
215 while (!list_empty(&i2c->aux)) { in nvkm_i2c_dtor()
216 struct nvkm_i2c_aux *aux = in nvkm_i2c_dtor() local
217 list_first_entry(&i2c->aux, typeof(*aux), head); in nvkm_i2c_dtor()
218 nvkm_i2c_aux_del(&aux); in nvkm_i2c_dtor()
221 while (!list_empty(&i2c->bus)) { in nvkm_i2c_dtor()
222 struct nvkm_i2c_bus *bus = in nvkm_i2c_dtor() local
223 list_first_entry(&i2c->bus, typeof(*bus), head); in nvkm_i2c_dtor()
224 nvkm_i2c_bus_del(&bus); in nvkm_i2c_dtor()
227 while (!list_empty(&i2c->pad)) { in nvkm_i2c_dtor()
229 list_first_entry(&i2c->pad, typeof(*pad), head); in nvkm_i2c_dtor()
261 struct nvkm_bios *bios = device->bios; in nvkm_i2c_new_()
263 struct nvkm_i2c_aux *aux; in nvkm_i2c_new_() local
270 return -ENOMEM; in nvkm_i2c_new_()
272 nvkm_subdev_ctor(&nvkm_i2c, device, type, inst, &i2c->subdev); in nvkm_i2c_new_()
273 i2c->func = func; in nvkm_i2c_new_()
274 INIT_LIST_HEAD(&i2c->pad); in nvkm_i2c_new_()
275 INIT_LIST_HEAD(&i2c->bus); in nvkm_i2c_new_()
276 INIT_LIST_HEAD(&i2c->aux); in nvkm_i2c_new_()
278 i = -1; in nvkm_i2c_new_()
281 struct nvkm_i2c_bus *bus = NULL; in nvkm_i2c_new_() local
282 struct nvkm_i2c_aux *aux = NULL; in nvkm_i2c_new_() local
284 nvkm_debug(&i2c->subdev, "ccb %02x: type %02x drive %02x " in nvkm_i2c_new_()
291 ret = func->pad_s_new(i2c, id, &pad); in nvkm_i2c_new_()
295 ret = func->pad_x_new(i2c, NVKM_I2C_PAD_CCB(i), &pad); in nvkm_i2c_new_()
299 nvkm_error(&i2c->subdev, "ccb %02x pad, %d\n", i, ret); in nvkm_i2c_new_()
304 if (pad->func->bus_new_0 && ccbE.type == DCB_I2C_NV04_BIT) { in nvkm_i2c_new_()
305 ret = pad->func->bus_new_0(pad, NVKM_I2C_BUS_CCB(i), in nvkm_i2c_new_()
307 ccbE.sense, &bus); in nvkm_i2c_new_()
309 if (pad->func->bus_new_4 && in nvkm_i2c_new_()
314 ret = pad->func->bus_new_4(pad, NVKM_I2C_BUS_CCB(i), in nvkm_i2c_new_()
315 ccbE.drive, &bus); in nvkm_i2c_new_()
319 nvkm_error(&i2c->subdev, "ccb %02x bus, %d\n", i, ret); in nvkm_i2c_new_()
320 nvkm_i2c_bus_del(&bus); in nvkm_i2c_new_()
323 if (pad->func->aux_new_6 && in nvkm_i2c_new_()
327 ret = pad->func->aux_new_6(pad, NVKM_I2C_BUS_CCB(i), in nvkm_i2c_new_()
328 ccbE.auxch, &aux); in nvkm_i2c_new_()
334 nvkm_error(&i2c->subdev, "ccb %02x aux, %d\n", i, ret); in nvkm_i2c_new_()
335 nvkm_i2c_aux_del(&aux); in nvkm_i2c_new_()
338 if (ccbE.type != DCB_I2C_UNUSED && !bus && !aux) { in nvkm_i2c_new_()
339 nvkm_warn(&i2c->subdev, "ccb %02x was ignored\n", i); in nvkm_i2c_new_()
344 i = -1; in nvkm_i2c_new_()
347 struct nvkm_i2c_bus *bus; in nvkm_i2c_new_() local
354 /* we need an i2c bus to talk to the external encoder */ in nvkm_i2c_new_()
355 bus = nvkm_i2c_bus_find(i2c, dcbE.i2c_index); in nvkm_i2c_new_()
356 if (!bus) { in nvkm_i2c_new_()
357 nvkm_debug(&i2c->subdev, "dcb %02x no bus\n", i); in nvkm_i2c_new_()
362 while (drv->pad_new) { in nvkm_i2c_new_()
363 if (drv->bios == dcbE.extdev) in nvkm_i2c_new_()
368 if (!drv->pad_new) { in nvkm_i2c_new_()
369 nvkm_debug(&i2c->subdev, "dcb %02x drv %02x unknown\n", in nvkm_i2c_new_()
378 ret = drv->pad_new(bus, id, drv->addr, &pad); in nvkm_i2c_new_()
380 nvkm_error(&i2c->subdev, "dcb %02x pad, %d\n", in nvkm_i2c_new_()
387 /* create any i2c bus / aux channel required by the output */ in nvkm_i2c_new_()
388 if (pad->func->aux_new_6 && dcbE.type == DCB_OUTPUT_DP) { in nvkm_i2c_new_()
390 struct nvkm_i2c_aux *aux = NULL; in nvkm_i2c_new_() local
391 ret = pad->func->aux_new_6(pad, id, 0, &aux); in nvkm_i2c_new_()
393 nvkm_error(&i2c->subdev, "dcb %02x aux, %d\n", in nvkm_i2c_new_()
395 nvkm_i2c_aux_del(&aux); in nvkm_i2c_new_()
398 if (pad->func->bus_new_4) { in nvkm_i2c_new_()
400 struct nvkm_i2c_bus *bus = NULL; in nvkm_i2c_new_() local
401 ret = pad->func->bus_new_4(pad, id, 0, &bus); in nvkm_i2c_new_()
403 nvkm_error(&i2c->subdev, "dcb %02x bus, %d\n", in nvkm_i2c_new_()
405 nvkm_i2c_bus_del(&bus); in nvkm_i2c_new_()
411 list_for_each_entry(aux, &i2c->aux, head) in nvkm_i2c_new_()
412 ids = max(ids, aux->id + 1); in nvkm_i2c_new_()
416 return nvkm_event_init(&nvkm_i2c_intr_func, &i2c->subdev, 4, ids, &i2c->event); in nvkm_i2c_new_()