aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_edid.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r--drivers/gpu/drm/drm_edid.c74
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}
590EXPORT_SYMBOL(drm_do_probe_ddc_edid); 590EXPORT_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 */
603static 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
664static int drm_ddc_read_edid(struct drm_connector *connector, 592static 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));