diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index 2399f25ec037..79159b5da05b 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -396,6 +396,21 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct | |||
396 | } | 396 | } |
397 | } | 397 | } |
398 | 398 | ||
399 | if (property == rdev->mode_info.audio_property) { | ||
400 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
401 | /* need to find digital encoder on connector */ | ||
402 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); | ||
403 | if (!encoder) | ||
404 | return 0; | ||
405 | |||
406 | radeon_encoder = to_radeon_encoder(encoder); | ||
407 | |||
408 | if (radeon_connector->audio != val) { | ||
409 | radeon_connector->audio = val; | ||
410 | radeon_property_change_mode(&radeon_encoder->base); | ||
411 | } | ||
412 | } | ||
413 | |||
399 | if (property == rdev->mode_info.underscan_property) { | 414 | if (property == rdev->mode_info.underscan_property) { |
400 | /* need to find digital encoder on connector */ | 415 | /* need to find digital encoder on connector */ |
401 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); | 416 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); |
@@ -1420,7 +1435,7 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | |||
1420 | if (radeon_dp_getdpcd(radeon_connector)) | 1435 | if (radeon_dp_getdpcd(radeon_connector)) |
1421 | ret = connector_status_connected; | 1436 | ret = connector_status_connected; |
1422 | } else { | 1437 | } else { |
1423 | /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ | 1438 | /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */ |
1424 | if (radeon_ddc_probe(radeon_connector, false)) | 1439 | if (radeon_ddc_probe(radeon_connector, false)) |
1425 | ret = connector_status_connected; | 1440 | ret = connector_status_connected; |
1426 | } | 1441 | } |
@@ -1489,6 +1504,24 @@ static const struct drm_connector_funcs radeon_dp_connector_funcs = { | |||
1489 | .force = radeon_dvi_force, | 1504 | .force = radeon_dvi_force, |
1490 | }; | 1505 | }; |
1491 | 1506 | ||
1507 | static const struct drm_connector_funcs radeon_edp_connector_funcs = { | ||
1508 | .dpms = drm_helper_connector_dpms, | ||
1509 | .detect = radeon_dp_detect, | ||
1510 | .fill_modes = drm_helper_probe_single_connector_modes, | ||
1511 | .set_property = radeon_lvds_set_property, | ||
1512 | .destroy = radeon_dp_connector_destroy, | ||
1513 | .force = radeon_dvi_force, | ||
1514 | }; | ||
1515 | |||
1516 | static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = { | ||
1517 | .dpms = drm_helper_connector_dpms, | ||
1518 | .detect = radeon_dp_detect, | ||
1519 | .fill_modes = drm_helper_probe_single_connector_modes, | ||
1520 | .set_property = radeon_lvds_set_property, | ||
1521 | .destroy = radeon_dp_connector_destroy, | ||
1522 | .force = radeon_dvi_force, | ||
1523 | }; | ||
1524 | |||
1492 | void | 1525 | void |
1493 | radeon_add_atom_connector(struct drm_device *dev, | 1526 | radeon_add_atom_connector(struct drm_device *dev, |
1494 | uint32_t connector_id, | 1527 | uint32_t connector_id, |
@@ -1580,8 +1613,6 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1580 | goto failed; | 1613 | goto failed; |
1581 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1614 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1582 | radeon_connector->con_priv = radeon_dig_connector; | 1615 | radeon_connector->con_priv = radeon_dig_connector; |
1583 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); | ||
1584 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); | ||
1585 | if (i2c_bus->valid) { | 1616 | if (i2c_bus->valid) { |
1586 | /* add DP i2c bus */ | 1617 | /* add DP i2c bus */ |
1587 | if (connector_type == DRM_MODE_CONNECTOR_eDP) | 1618 | if (connector_type == DRM_MODE_CONNECTOR_eDP) |
@@ -1598,6 +1629,10 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1598 | case DRM_MODE_CONNECTOR_VGA: | 1629 | case DRM_MODE_CONNECTOR_VGA: |
1599 | case DRM_MODE_CONNECTOR_DVIA: | 1630 | case DRM_MODE_CONNECTOR_DVIA: |
1600 | default: | 1631 | default: |
1632 | drm_connector_init(dev, &radeon_connector->base, | ||
1633 | &radeon_dp_connector_funcs, connector_type); | ||
1634 | drm_connector_helper_add(&radeon_connector->base, | ||
1635 | &radeon_dp_connector_helper_funcs); | ||
1601 | connector->interlace_allowed = true; | 1636 | connector->interlace_allowed = true; |
1602 | connector->doublescan_allowed = true; | 1637 | connector->doublescan_allowed = true; |
1603 | radeon_connector->dac_load_detect = true; | 1638 | radeon_connector->dac_load_detect = true; |
@@ -1610,6 +1645,10 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1610 | case DRM_MODE_CONNECTOR_HDMIA: | 1645 | case DRM_MODE_CONNECTOR_HDMIA: |
1611 | case DRM_MODE_CONNECTOR_HDMIB: | 1646 | case DRM_MODE_CONNECTOR_HDMIB: |
1612 | case DRM_MODE_CONNECTOR_DisplayPort: | 1647 | case DRM_MODE_CONNECTOR_DisplayPort: |
1648 | drm_connector_init(dev, &radeon_connector->base, | ||
1649 | &radeon_dp_connector_funcs, connector_type); | ||
1650 | drm_connector_helper_add(&radeon_connector->base, | ||
1651 | &radeon_dp_connector_helper_funcs); | ||
1613 | drm_object_attach_property(&radeon_connector->base.base, | 1652 | drm_object_attach_property(&radeon_connector->base.base, |
1614 | rdev->mode_info.underscan_property, | 1653 | rdev->mode_info.underscan_property, |
1615 | UNDERSCAN_OFF); | 1654 | UNDERSCAN_OFF); |
@@ -1619,6 +1658,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1619 | drm_object_attach_property(&radeon_connector->base.base, | 1658 | drm_object_attach_property(&radeon_connector->base.base, |
1620 | rdev->mode_info.underscan_vborder_property, | 1659 | rdev->mode_info.underscan_vborder_property, |
1621 | 0); | 1660 | 0); |
1661 | drm_object_attach_property(&radeon_connector->base.base, | ||
1662 | rdev->mode_info.audio_property, | ||
1663 | RADEON_AUDIO_DISABLE); | ||
1622 | subpixel_order = SubPixelHorizontalRGB; | 1664 | subpixel_order = SubPixelHorizontalRGB; |
1623 | connector->interlace_allowed = true; | 1665 | connector->interlace_allowed = true; |
1624 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | 1666 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
@@ -1634,6 +1676,10 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1634 | break; | 1676 | break; |
1635 | case DRM_MODE_CONNECTOR_LVDS: | 1677 | case DRM_MODE_CONNECTOR_LVDS: |
1636 | case DRM_MODE_CONNECTOR_eDP: | 1678 | case DRM_MODE_CONNECTOR_eDP: |
1679 | drm_connector_init(dev, &radeon_connector->base, | ||
1680 | &radeon_lvds_bridge_connector_funcs, connector_type); | ||
1681 | drm_connector_helper_add(&radeon_connector->base, | ||
1682 | &radeon_dp_connector_helper_funcs); | ||
1637 | drm_object_attach_property(&radeon_connector->base.base, | 1683 | drm_object_attach_property(&radeon_connector->base.base, |
1638 | dev->mode_config.scaling_mode_property, | 1684 | dev->mode_config.scaling_mode_property, |
1639 | DRM_MODE_SCALE_FULLSCREEN); | 1685 | DRM_MODE_SCALE_FULLSCREEN); |
@@ -1708,6 +1754,11 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1708 | rdev->mode_info.underscan_vborder_property, | 1754 | rdev->mode_info.underscan_vborder_property, |
1709 | 0); | 1755 | 0); |
1710 | } | 1756 | } |
1757 | if (ASIC_IS_DCE2(rdev)) { | ||
1758 | drm_object_attach_property(&radeon_connector->base.base, | ||
1759 | rdev->mode_info.audio_property, | ||
1760 | RADEON_AUDIO_DISABLE); | ||
1761 | } | ||
1711 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | 1762 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1712 | radeon_connector->dac_load_detect = true; | 1763 | radeon_connector->dac_load_detect = true; |
1713 | drm_object_attach_property(&radeon_connector->base.base, | 1764 | drm_object_attach_property(&radeon_connector->base.base, |
@@ -1748,6 +1799,11 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1748 | rdev->mode_info.underscan_vborder_property, | 1799 | rdev->mode_info.underscan_vborder_property, |
1749 | 0); | 1800 | 0); |
1750 | } | 1801 | } |
1802 | if (ASIC_IS_DCE2(rdev)) { | ||
1803 | drm_object_attach_property(&radeon_connector->base.base, | ||
1804 | rdev->mode_info.audio_property, | ||
1805 | RADEON_AUDIO_DISABLE); | ||
1806 | } | ||
1751 | subpixel_order = SubPixelHorizontalRGB; | 1807 | subpixel_order = SubPixelHorizontalRGB; |
1752 | connector->interlace_allowed = true; | 1808 | connector->interlace_allowed = true; |
1753 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) | 1809 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
@@ -1787,6 +1843,11 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1787 | rdev->mode_info.underscan_vborder_property, | 1843 | rdev->mode_info.underscan_vborder_property, |
1788 | 0); | 1844 | 0); |
1789 | } | 1845 | } |
1846 | if (ASIC_IS_DCE2(rdev)) { | ||
1847 | drm_object_attach_property(&radeon_connector->base.base, | ||
1848 | rdev->mode_info.audio_property, | ||
1849 | RADEON_AUDIO_DISABLE); | ||
1850 | } | ||
1790 | connector->interlace_allowed = true; | 1851 | connector->interlace_allowed = true; |
1791 | /* in theory with a DP to VGA converter... */ | 1852 | /* in theory with a DP to VGA converter... */ |
1792 | connector->doublescan_allowed = false; | 1853 | connector->doublescan_allowed = false; |
@@ -1797,7 +1858,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1797 | goto failed; | 1858 | goto failed; |
1798 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 1859 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1799 | radeon_connector->con_priv = radeon_dig_connector; | 1860 | radeon_connector->con_priv = radeon_dig_connector; |
1800 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); | 1861 | drm_connector_init(dev, &radeon_connector->base, &radeon_edp_connector_funcs, connector_type); |
1801 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); | 1862 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
1802 | if (i2c_bus->valid) { | 1863 | if (i2c_bus->valid) { |
1803 | /* add DP i2c bus */ | 1864 | /* add DP i2c bus */ |