Commit cf4c12f9 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie

drm/radeon/kms: fix tv module parameter

The tv parameter was added to disable the tv-out connector,
however, it caused a crash if it was set to 0 due to
drm_connector_init not getting called.  If tv=0, don't
attempt to add the connector.

Might fix:
https://bugzilla.kernel.org/show_bug.cgi?id=17241Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 0d9958b1
...@@ -1051,10 +1051,16 @@ radeon_add_atom_connector(struct drm_device *dev, ...@@ -1051,10 +1051,16 @@ radeon_add_atom_connector(struct drm_device *dev,
uint32_t subpixel_order = SubPixelNone; uint32_t subpixel_order = SubPixelNone;
bool shared_ddc = false; bool shared_ddc = false;
/* fixme - tv/cv/din */
if (connector_type == DRM_MODE_CONNECTOR_Unknown) if (connector_type == DRM_MODE_CONNECTOR_Unknown)
return; return;
/* if the user selected tv=0 don't try and add the connector */
if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
(connector_type == DRM_MODE_CONNECTOR_Composite) ||
(connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
(radeon_tv == 0))
return;
/* see if we already added it */ /* see if we already added it */
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
radeon_connector = to_radeon_connector(connector); radeon_connector = to_radeon_connector(connector);
...@@ -1209,19 +1215,17 @@ radeon_add_atom_connector(struct drm_device *dev, ...@@ -1209,19 +1215,17 @@ radeon_add_atom_connector(struct drm_device *dev,
case DRM_MODE_CONNECTOR_SVIDEO: case DRM_MODE_CONNECTOR_SVIDEO:
case DRM_MODE_CONNECTOR_Composite: case DRM_MODE_CONNECTOR_Composite:
case DRM_MODE_CONNECTOR_9PinDIN: case DRM_MODE_CONNECTOR_9PinDIN:
if (radeon_tv == 1) { drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); radeon_connector->dac_load_detect = true;
radeon_connector->dac_load_detect = true; drm_connector_attach_property(&radeon_connector->base,
drm_connector_attach_property(&radeon_connector->base, rdev->mode_info.load_detect_property,
rdev->mode_info.load_detect_property, 1);
1); drm_connector_attach_property(&radeon_connector->base,
drm_connector_attach_property(&radeon_connector->base, rdev->mode_info.tv_std_property,
rdev->mode_info.tv_std_property, radeon_atombios_get_tv_info(rdev));
radeon_atombios_get_tv_info(rdev)); /* no HPD on analog connectors */
/* no HPD on analog connectors */ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
radeon_connector->hpd.hpd = RADEON_HPD_NONE;
}
break; break;
case DRM_MODE_CONNECTOR_LVDS: case DRM_MODE_CONNECTOR_LVDS:
radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
...@@ -1272,10 +1276,16 @@ radeon_add_legacy_connector(struct drm_device *dev, ...@@ -1272,10 +1276,16 @@ radeon_add_legacy_connector(struct drm_device *dev,
struct radeon_connector *radeon_connector; struct radeon_connector *radeon_connector;
uint32_t subpixel_order = SubPixelNone; uint32_t subpixel_order = SubPixelNone;
/* fixme - tv/cv/din */
if (connector_type == DRM_MODE_CONNECTOR_Unknown) if (connector_type == DRM_MODE_CONNECTOR_Unknown)
return; return;
/* if the user selected tv=0 don't try and add the connector */
if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
(connector_type == DRM_MODE_CONNECTOR_Composite) ||
(connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
(radeon_tv == 0))
return;
/* see if we already added it */ /* see if we already added it */
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
radeon_connector = to_radeon_connector(connector); radeon_connector = to_radeon_connector(connector);
...@@ -1347,26 +1357,24 @@ radeon_add_legacy_connector(struct drm_device *dev, ...@@ -1347,26 +1357,24 @@ radeon_add_legacy_connector(struct drm_device *dev,
case DRM_MODE_CONNECTOR_SVIDEO: case DRM_MODE_CONNECTOR_SVIDEO:
case DRM_MODE_CONNECTOR_Composite: case DRM_MODE_CONNECTOR_Composite:
case DRM_MODE_CONNECTOR_9PinDIN: case DRM_MODE_CONNECTOR_9PinDIN:
if (radeon_tv == 1) { drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); radeon_connector->dac_load_detect = true;
radeon_connector->dac_load_detect = true; /* RS400,RC410,RS480 chipset seems to report a lot
/* RS400,RC410,RS480 chipset seems to report a lot * of false positive on load detect, we haven't yet
* of false positive on load detect, we haven't yet * found a way to make load detect reliable on those
* found a way to make load detect reliable on those * chipset, thus just disable it for TV.
* chipset, thus just disable it for TV. */
*/ if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) radeon_connector->dac_load_detect = false;
radeon_connector->dac_load_detect = false; drm_connector_attach_property(&radeon_connector->base,
drm_connector_attach_property(&radeon_connector->base, rdev->mode_info.load_detect_property,
rdev->mode_info.load_detect_property, radeon_connector->dac_load_detect);
radeon_connector->dac_load_detect); drm_connector_attach_property(&radeon_connector->base,
drm_connector_attach_property(&radeon_connector->base, rdev->mode_info.tv_std_property,
rdev->mode_info.tv_std_property, radeon_combios_get_tv_info(rdev));
radeon_combios_get_tv_info(rdev)); /* no HPD on analog connectors */
/* no HPD on analog connectors */ radeon_connector->hpd.hpd = RADEON_HPD_NONE;
radeon_connector->hpd.hpd = RADEON_HPD_NONE;
}
break; break;
case DRM_MODE_CONNECTOR_LVDS: case DRM_MODE_CONNECTOR_LVDS:
drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment