diff options
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 74 |
1 files changed, 1 insertions, 73 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 6f6b26479d82..801a0d0e0810 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -589,85 +589,13 @@ int drm_do_probe_ddc_edid(struct i2c_adapter *adapter, | |||
589 | } | 589 | } |
590 | EXPORT_SYMBOL(drm_do_probe_ddc_edid); | 590 | EXPORT_SYMBOL(drm_do_probe_ddc_edid); |
591 | 591 | ||
592 | /** | ||
593 | * Get EDID information. | ||
594 | * | ||
595 | * \param adapter : i2c device adaptor. | ||
596 | * \param buf : EDID data buffer to be filled | ||
597 | * \param len : EDID data buffer length | ||
598 | * \return 0 on success or -1 on failure. | ||
599 | * | ||
600 | * Initialize DDC, then fetch EDID information | ||
601 | * by calling drm_do_probe_ddc_edid function. | ||
602 | */ | ||
603 | static int drm_ddc_read(struct i2c_adapter *adapter, | ||
604 | unsigned char *buf, int len) | ||
605 | { | ||
606 | struct i2c_algo_bit_data *algo_data = adapter->algo_data; | ||
607 | int i, j; | ||
608 | int ret = -1; | ||
609 | |||
610 | algo_data->setscl(algo_data->data, 1); | ||
611 | |||
612 | for (i = 0; i < 1; i++) { | ||
613 | /* For some old monitors we need the | ||
614 | * following process to initialize/stop DDC | ||
615 | */ | ||
616 | algo_data->setsda(algo_data->data, 1); | ||
617 | msleep(13); | ||
618 | |||
619 | algo_data->setscl(algo_data->data, 1); | ||
620 | for (j = 0; j < 5; j++) { | ||
621 | msleep(10); | ||
622 | if (algo_data->getscl(algo_data->data)) | ||
623 | break; | ||
624 | } | ||
625 | if (j == 5) | ||
626 | continue; | ||
627 | |||
628 | algo_data->setsda(algo_data->data, 0); | ||
629 | msleep(15); | ||
630 | algo_data->setscl(algo_data->data, 0); | ||
631 | msleep(15); | ||
632 | algo_data->setsda(algo_data->data, 1); | ||
633 | msleep(15); | ||
634 | |||
635 | /* Do the real work */ | ||
636 | ret = drm_do_probe_ddc_edid(adapter, buf, len); | ||
637 | algo_data->setsda(algo_data->data, 0); | ||
638 | algo_data->setscl(algo_data->data, 0); | ||
639 | msleep(15); | ||
640 | |||
641 | algo_data->setscl(algo_data->data, 1); | ||
642 | for (j = 0; j < 10; j++) { | ||
643 | msleep(10); | ||
644 | if (algo_data->getscl(algo_data->data)) | ||
645 | break; | ||
646 | } | ||
647 | |||
648 | algo_data->setsda(algo_data->data, 1); | ||
649 | msleep(15); | ||
650 | algo_data->setscl(algo_data->data, 0); | ||
651 | algo_data->setsda(algo_data->data, 0); | ||
652 | if (ret == 0) | ||
653 | break; | ||
654 | } | ||
655 | /* Release the DDC lines when done or the Apple Cinema HD display | ||
656 | * will switch off | ||
657 | */ | ||
658 | algo_data->setsda(algo_data->data, 1); | ||
659 | algo_data->setscl(algo_data->data, 1); | ||
660 | |||
661 | return ret; | ||
662 | } | ||
663 | |||
664 | static int drm_ddc_read_edid(struct drm_connector *connector, | 592 | static int drm_ddc_read_edid(struct drm_connector *connector, |
665 | struct i2c_adapter *adapter, | 593 | struct i2c_adapter *adapter, |
666 | char *buf, int len) | 594 | char *buf, int len) |
667 | { | 595 | { |
668 | int ret; | 596 | int ret; |
669 | 597 | ||
670 | ret = drm_ddc_read(adapter, buf, len); | 598 | ret = drm_do_probe_ddc_edid(adapter, buf, len); |
671 | if (ret != 0) { | 599 | if (ret != 0) { |
672 | dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n", | 600 | dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n", |
673 | drm_get_connector_name(connector)); | 601 | drm_get_connector_name(connector)); |