Lines Matching full:outp

24 #include "outp.h"
35 struct nvkm_outp *outp; in nvkm_outp_route() local
39 if ((outp = ior->arm.outp) && ior->arm.outp != ior->asy.outp) { in nvkm_outp_route()
40 OUTP_DBG(outp, "release %s", ior->name); in nvkm_outp_route()
42 ior->func->route.set(outp, NULL); in nvkm_outp_route()
43 ior->arm.outp = NULL; in nvkm_outp_route()
48 if ((outp = ior->asy.outp)) { in nvkm_outp_route()
49 OUTP_DBG(outp, "acquire %s", ior->name); in nvkm_outp_route()
50 if (ior->asy.outp != ior->arm.outp) { in nvkm_outp_route()
52 ior->func->route.set(outp, ior); in nvkm_outp_route()
53 ior->arm.outp = ior->asy.outp; in nvkm_outp_route()
60 nvkm_outp_xlat(struct nvkm_outp *outp, enum nvkm_ior_type *type) in nvkm_outp_xlat() argument
62 switch (outp->info.location) { in nvkm_outp_xlat()
64 switch (outp->info.type) { in nvkm_outp_xlat()
75 switch (outp->info.type) { in nvkm_outp_xlat()
90 nvkm_outp_release(struct nvkm_outp *outp, u8 user) in nvkm_outp_release() argument
92 struct nvkm_ior *ior = outp->ior; in nvkm_outp_release()
93 OUTP_TRACE(outp, "release %02x &= %02x %p", outp->acquired, ~user, ior); in nvkm_outp_release()
95 outp->acquired &= ~user; in nvkm_outp_release()
96 if (!outp->acquired) { in nvkm_outp_release()
97 if (outp->func->release && outp->ior) in nvkm_outp_release()
98 outp->func->release(outp); in nvkm_outp_release()
99 outp->ior->asy.outp = NULL; in nvkm_outp_release()
100 outp->ior = NULL; in nvkm_outp_release()
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(struct nvkm_outp *outp, u8 user, bool hda) in nvkm_outp_acquire() argument
145 struct nvkm_ior *ior = outp->ior; in nvkm_outp_acquire()
149 OUTP_TRACE(outp, "acquire %02x |= %02x %p", outp->acquired, user, ior); in nvkm_outp_acquire()
151 outp->acquired |= user; in nvkm_outp_acquire()
156 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_acquire()
161 if (outp->identity) { in nvkm_outp_acquire()
162 ior = nvkm_ior_find(outp->disp, SOR, ffs(outp->info.or) - 1); in nvkm_outp_acquire()
165 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire()
171 list_for_each_entry(ior, &outp->disp->iors, head) { in nvkm_outp_acquire()
172 if (!ior->identity && !ior->asy.outp && ior->arm.outp == outp) { in nvkm_outp_acquire()
185 return nvkm_outp_acquire_ior(outp, user, ior); in nvkm_outp_acquire()
193 if (!nvkm_outp_acquire_hda(outp, type, user, false)) in nvkm_outp_acquire()
197 return nvkm_outp_acquire_hda(outp, type, user, true); in nvkm_outp_acquire()
201 if (!nvkm_outp_acquire_hda(outp, type, user, true)) in nvkm_outp_acquire()
207 return nvkm_outp_acquire_hda(outp, type, user, false); in nvkm_outp_acquire()
211 nvkm_outp_fini(struct nvkm_outp *outp) in nvkm_outp_fini() argument
213 if (outp->func->fini) in nvkm_outp_fini()
214 outp->func->fini(outp); in nvkm_outp_fini()
218 nvkm_outp_init_route(struct nvkm_outp *outp) in nvkm_outp_init_route() argument
220 struct nvkm_disp *disp = outp->disp; in nvkm_outp_init_route()
227 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_init_route()
239 id = ior->func->route.get(outp, &link); in nvkm_outp_init_route()
241 OUTP_DBG(outp, "no route"); in nvkm_outp_init_route()
246 id = ffs(outp->info.or) - 1; in nvkm_outp_init_route()
247 link = (ior->type == SOR) ? outp->info.sorconf.link : 0; in nvkm_outp_init_route()
259 OUTP_DBG(outp, "no heads (%x %d %d)", ior->arm.head, in nvkm_outp_init_route()
266 if (ior->func->route.get && !ior->arm.head && outp->info.type == DCB_OUTPUT_DP) in nvkm_outp_init_route()
267 nvkm_dp_disable(outp, ior); in nvkm_outp_init_route()
272 OUTP_DBG(outp, "on %s link %x", ior->name, ior->arm.link); in nvkm_outp_init_route()
273 ior->arm.outp = outp; in nvkm_outp_init_route()
277 nvkm_outp_init(struct nvkm_outp *outp) in nvkm_outp_init() argument
279 nvkm_outp_init_route(outp); in nvkm_outp_init()
280 if (outp->func->init) in nvkm_outp_init()
281 outp->func->init(outp); in nvkm_outp_init()
287 struct nvkm_outp *outp = *poutp; in nvkm_outp_del() local
288 if (outp && !WARN_ON(!outp->func)) { in nvkm_outp_del()
289 if (outp->func->dtor) in nvkm_outp_del()
290 *poutp = outp->func->dtor(outp); in nvkm_outp_del()
301 struct nvkm_outp *outp; in nvkm_outp_new_() local
305 if (!(outp = *poutp = kzalloc(sizeof(*outp), GFP_KERNEL))) in nvkm_outp_new_()
308 outp->func = func; in nvkm_outp_new_()
309 outp->disp = disp; in nvkm_outp_new_()
310 outp->index = index; in nvkm_outp_new_()
311 outp->info = *dcbE; in nvkm_outp_new_()
312 outp->i2c = nvkm_i2c_bus_find(i2c, dcbE->i2c_index); in nvkm_outp_new_()
314 OUTP_DBG(outp, "type %02x loc %d or %d link %d con %x " in nvkm_outp_new_()
316 outp->info.type, outp->info.location, outp->info.or, in nvkm_outp_new_()
317 outp->info.type >= 2 ? outp->info.sorconf.link : 0, in nvkm_outp_new_()
318 outp->info.connector, outp->info.i2c_index, in nvkm_outp_new_()
319 outp->info.bus, outp->info.heads); in nvkm_outp_new_()
322 proto = nvkm_outp_xlat(outp, &type); in nvkm_outp_new_()