|
Lines 203-208
struct a10hdmi_softc {
Link Here
|
| 203 |
|
203 |
|
| 204 |
uint8_t edid[EDID_LENGTH]; |
204 |
uint8_t edid[EDID_LENGTH]; |
| 205 |
|
205 |
|
|
|
206 |
int has_hdmi; |
| 206 |
int has_audio; |
207 |
int has_audio; |
| 207 |
}; |
208 |
}; |
| 208 |
|
209 |
|
|
Lines 371-397
a10hdmi_ddc_read(struct a10hdmi_softc *sc, int block, uint8_t *edid)
Link Here
|
| 371 |
return (0); |
372 |
return (0); |
| 372 |
} |
373 |
} |
| 373 |
|
374 |
|
| 374 |
static int |
375 |
static void |
| 375 |
a10hdmi_detect_audio(struct a10hdmi_softc *sc) |
376 |
a10hdmi_detect_hdmi(struct a10hdmi_softc *sc, int *phdmi, int *paudio) |
| 376 |
{ |
377 |
{ |
| 377 |
struct edid_info ei; |
378 |
struct edid_info ei; |
| 378 |
uint8_t edid[EDID_LENGTH]; |
379 |
uint8_t edid[EDID_LENGTH]; |
| 379 |
int block; |
380 |
int block; |
| 380 |
|
381 |
|
|
|
382 |
*phdmi = *paudio = 0; |
| 383 |
|
| 381 |
if (edid_parse(sc->edid, &ei) != 0) |
384 |
if (edid_parse(sc->edid, &ei) != 0) |
| 382 |
return (0); |
385 |
return; |
| 383 |
|
386 |
|
| 384 |
/* Scan through extension blocks, looking for a CEA-861 block. */ |
387 |
/* Scan through extension blocks, looking for a CEA-861 block. */ |
| 385 |
for (block = 1; block <= ei.edid_ext_block_count; block++) { |
388 |
for (block = 1; block <= ei.edid_ext_block_count; block++) { |
| 386 |
if (a10hdmi_ddc_read(sc, block, edid) != 0) |
389 |
if (a10hdmi_ddc_read(sc, block, edid) != 0) |
| 387 |
break; |
390 |
return; |
| 388 |
|
391 |
|
| 389 |
if (edid[EXT_TAG] == CEA_TAG_ID) |
392 |
if (edid[EXT_TAG] == CEA_TAG_ID) { |
| 390 |
return ((edid[CEA_DTD] & DTD_BASIC_AUDIO) != 0); |
393 |
*phdmi = 1; |
|
|
394 |
*paudio = ((edid[CEA_DTD] & DTD_BASIC_AUDIO) != 0); |
| 395 |
return; |
| 396 |
} |
| 391 |
} |
397 |
} |
| 392 |
|
|
|
| 393 |
/* No CEA-861 block found */ |
| 394 |
return (0); |
| 395 |
} |
398 |
} |
| 396 |
|
399 |
|
| 397 |
static int |
400 |
static int |
|
Lines 426-434
a10hdmi_get_edid(device_t dev, uint8_t **edid, uint32_t *edid_len)
Link Here
|
| 426 |
} |
429 |
} |
| 427 |
|
430 |
|
| 428 |
if (error == 0) |
431 |
if (error == 0) |
| 429 |
sc->has_audio = a10hdmi_detect_audio(sc); |
432 |
a10hdmi_detect_hdmi(sc, &sc->has_hdmi, &sc->has_audio); |
| 430 |
else |
433 |
else |
| 431 |
sc->has_audio = 0; |
434 |
sc->has_hdmi = sc->has_audio = 0; |
| 432 |
|
435 |
|
| 433 |
return (error); |
436 |
return (error); |
| 434 |
} |
437 |
} |
|
Lines 515-521
a10hdmi_set_videomode(device_t dev, const struct videomode *mode)
Link Here
|
| 515 |
PLLCTRL0_VCO_S); |
518 |
PLLCTRL0_VCO_S); |
| 516 |
|
519 |
|
| 517 |
/* Setup display settings */ |
520 |
/* Setup display settings */ |
| 518 |
val = VID_CTRL_HDMI_MODE; |
521 |
val = 0; |
|
|
522 |
if (sc->has_hdmi) |
| 523 |
val |= VID_CTRL_HDMI_MODE; |
| 519 |
if (mode->flags & VID_INTERLACE) |
524 |
if (mode->flags & VID_INTERLACE) |
| 520 |
val |= VID_CTRL_INTERLACE; |
525 |
val |= VID_CTRL_INTERLACE; |
| 521 |
if (mode->flags & VID_DBLSCAN) |
526 |
if (mode->flags & VID_DBLSCAN) |