Lines Matching full:outp

24 #include "outp.h"
37 struct nvkm_outp *outp; in nvkm_outp_route() local
41 if ((outp = ior->arm.outp) && ior->arm.outp != ior->asy.outp) { in nvkm_outp_route()
42 OUTP_DBG(outp, "release %s", ior->name); in nvkm_outp_route()
44 ior->func->route.set(outp, NULL); in nvkm_outp_route()
45 ior->arm.outp = NULL; in nvkm_outp_route()
50 if ((outp = ior->asy.outp)) { in nvkm_outp_route()
51 if (ior->asy.outp != ior->arm.outp) { in nvkm_outp_route()
52 OUTP_DBG(outp, "acquire %s", ior->name); in nvkm_outp_route()
54 ior->func->route.set(outp, ior); in nvkm_outp_route()
55 ior->arm.outp = ior->asy.outp; in nvkm_outp_route()
62 nvkm_outp_xlat(struct nvkm_outp *outp, enum nvkm_ior_type *type) in nvkm_outp_xlat() argument
64 switch (outp->info.location) { in nvkm_outp_xlat()
66 switch (outp->info.type) { in nvkm_outp_xlat()
77 switch (outp->info.type) { in nvkm_outp_xlat()
92 nvkm_outp_release_or(struct nvkm_outp *outp, u8 user) in nvkm_outp_release_or() argument
94 struct nvkm_ior *ior = outp->ior; in nvkm_outp_release_or()
95 OUTP_TRACE(outp, "release %02x &= %02x %p", outp->acquired, ~user, ior); in nvkm_outp_release_or()
97 outp->acquired &= ~user; in nvkm_outp_release_or()
98 if (!outp->acquired) { in nvkm_outp_release_or()
99 outp->ior->asy.outp = NULL; in nvkm_outp_release_or()
100 outp->ior = NULL; in nvkm_outp_release_or()
106 nvkm_outp_acquire_ior(struct nvkm_outp *outp, u8 user, struct nvkm_ior *ior) in nvkm_outp_acquire_ior() argument
108 outp->ior = ior; in nvkm_outp_acquire_ior()
109 outp->ior->asy.outp = outp; in nvkm_outp_acquire_ior()
110 outp->ior->asy.link = outp->info.sorconf.link; in nvkm_outp_acquire_ior()
111 outp->acquired |= user; in nvkm_outp_acquire_ior()
116 nvkm_outp_acquire_hda(struct nvkm_outp *outp, enum nvkm_ior_type type, in nvkm_outp_acquire_hda() argument
122 list_for_each_entry(ior, &outp->disp->iors, head) { in nvkm_outp_acquire_hda()
124 !ior->asy.outp && ior->type == type && !ior->arm.outp && in nvkm_outp_acquire_hda()
125 (ior->func->route.set || ior->id == __ffs(outp->info.or))) in nvkm_outp_acquire_hda()
126 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire_hda()
132 list_for_each_entry(ior, &outp->disp->iors, head) { in nvkm_outp_acquire_hda()
134 !ior->asy.outp && ior->type == type && in nvkm_outp_acquire_hda()
135 (ior->func->route.set || ior->id == __ffs(outp->info.or))) in nvkm_outp_acquire_hda()
136 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire_hda()
143 nvkm_outp_acquire_or(struct nvkm_outp *outp, u8 user, bool hda) in nvkm_outp_acquire_or() argument
145 struct nvkm_ior *ior = outp->ior; in nvkm_outp_acquire_or()
149 OUTP_TRACE(outp, "acquire %02x |= %02x %p", outp->acquired, user, ior); in nvkm_outp_acquire_or()
151 outp->acquired |= user; in nvkm_outp_acquire_or()
156 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_acquire_or()
161 if (outp->identity) { in nvkm_outp_acquire_or()
162 ior = nvkm_ior_find(outp->disp, SOR, ffs(outp->info.or) - 1); in nvkm_outp_acquire_or()
165 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire_or()
171 list_for_each_entry(ior, &outp->disp->iors, head) { in nvkm_outp_acquire_or()
172 if (!ior->identity && !ior->asy.outp && ior->arm.outp == outp) { in nvkm_outp_acquire_or()
185 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire_or()
193 if (!nvkm_outp_acquire_hda(outp, type, user, false)) in nvkm_outp_acquire_or()
197 return nvkm_outp_acquire_hda(outp, type, user, true); in nvkm_outp_acquire_or()
201 if (!nvkm_outp_acquire_hda(outp, type, user, true)) in nvkm_outp_acquire_or()
207 return nvkm_outp_acquire_hda(outp, type, user, false); in nvkm_outp_acquire_or()
211 nvkm_outp_bl_set(struct nvkm_outp *outp, int level) in nvkm_outp_bl_set() argument
215 ret = nvkm_outp_acquire_or(outp, NVKM_OUTP_PRIV, false); in nvkm_outp_bl_set()
219 if (outp->ior->func->bl) in nvkm_outp_bl_set()
220 ret = outp->ior->func->bl->set(outp->ior, level); in nvkm_outp_bl_set()
224 nvkm_outp_release_or(outp, NVKM_OUTP_PRIV); in nvkm_outp_bl_set()
229 nvkm_outp_bl_get(struct nvkm_outp *outp) in nvkm_outp_bl_get() argument
233 ret = nvkm_outp_acquire_or(outp, NVKM_OUTP_PRIV, false); in nvkm_outp_bl_get()
237 if (outp->ior->func->bl) in nvkm_outp_bl_get()
238 ret = outp->ior->func->bl->get(outp->ior); in nvkm_outp_bl_get()
242 nvkm_outp_release_or(outp, NVKM_OUTP_PRIV); in nvkm_outp_bl_get()
247 nvkm_outp_detect(struct nvkm_outp *outp) in nvkm_outp_detect() argument
249 struct nvkm_gpio *gpio = outp->disp->engine.subdev.device->gpio; in nvkm_outp_detect()
252 if (outp->conn->info.hpd != DCB_GPIO_UNUSED) { in nvkm_outp_detect()
253 ret = nvkm_gpio_get(gpio, 0, DCB_GPIO_UNUSED, outp->conn->info.hpd); in nvkm_outp_detect()
264 if (outp->info.type == DCB_OUTPUT_DP) in nvkm_outp_detect()
272 nvkm_outp_release(struct nvkm_outp *outp) in nvkm_outp_release() argument
274 nvkm_outp_release_or(outp, NVKM_OUTP_USER); in nvkm_outp_release()
275 nvkm_outp_route(outp->disp); in nvkm_outp_release()
279 nvkm_outp_acquire(struct nvkm_outp *outp, bool hda) in nvkm_outp_acquire() argument
281 int ret = nvkm_outp_acquire_or(outp, NVKM_OUTP_USER, hda); in nvkm_outp_acquire()
286 nvkm_outp_route(outp->disp); in nvkm_outp_acquire()
291 nvkm_outp_inherit(struct nvkm_outp *outp) in nvkm_outp_inherit() argument
293 struct nvkm_disp *disp = outp->disp; in nvkm_outp_inherit()
300 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_inherit()
310 id = ior->func->route.get(outp, &link); in nvkm_outp_inherit()
312 OUTP_DBG(outp, "no route"); in nvkm_outp_inherit()
317 id = ffs(outp->info.or) - 1; in nvkm_outp_inherit()
318 link = (ior->type == SOR) ? outp->info.sorconf.link : 0; in nvkm_outp_inherit()
329 nvkm_outp_init(struct nvkm_outp *outp) in nvkm_outp_init() argument
336 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_init()
337 ior = outp->func->inherit(outp); in nvkm_outp_init()
344 OUTP_DBG(outp, "no heads (%x %d %d)", ior->arm.head, in nvkm_outp_init()
351 if (ior->func->route.get && !ior->arm.head && outp->info.type == DCB_OUTPUT_DP) in nvkm_outp_init()
352 nvkm_dp_disable(outp, ior); in nvkm_outp_init()
357 OUTP_DBG(outp, "on %s link %x", ior->name, ior->arm.link); in nvkm_outp_init()
358 ior->arm.outp = outp; in nvkm_outp_init()
364 struct nvkm_outp *outp = *poutp; in nvkm_outp_del() local
365 if (outp && !WARN_ON(!outp->func)) { in nvkm_outp_del()
366 if (outp->func->dtor) in nvkm_outp_del()
367 *poutp = outp->func->dtor(outp); in nvkm_outp_del()
378 struct nvkm_outp *outp; in nvkm_outp_new_() local
382 if (!(outp = *poutp = kzalloc(sizeof(*outp), GFP_KERNEL))) in nvkm_outp_new_()
385 outp->func = func; in nvkm_outp_new_()
386 outp->disp = disp; in nvkm_outp_new_()
387 outp->index = index; in nvkm_outp_new_()
388 outp->info = *dcbE; in nvkm_outp_new_()
390 outp->i2c = nvkm_i2c_bus_find(i2c, dcbE->i2c_index); in nvkm_outp_new_()
392 OUTP_DBG(outp, "type %02x loc %d or %d link %d con %x " in nvkm_outp_new_()
394 outp->info.type, outp->info.location, outp->info.or, in nvkm_outp_new_()
395 outp->info.type >= 2 ? outp->info.sorconf.link : 0, in nvkm_outp_new_()
396 outp->info.connector, outp->info.i2c_index, in nvkm_outp_new_()
397 outp->info.bus, outp->info.heads); in nvkm_outp_new_()
400 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_new_()