Lines Matching refs:outp

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