drm/nouveau: Fix backlight control on PPC machines with an internal TMDS panel.
This commit fixes fdo bug 29685. Reported-by: Vlado Plaga <rechner@vlado-do.de> Signed-off-by: Francisco Jerez <currojerez@riseup.net> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
Родитель
f5cb8ab154
Коммит
d31e078d84
|
@ -3869,27 +3869,10 @@ static int call_lvds_manufacturer_script(struct drm_device *dev, struct dcb_entr
|
||||||
}
|
}
|
||||||
#ifdef __powerpc__
|
#ifdef __powerpc__
|
||||||
/* Powerbook specific quirks */
|
/* Powerbook specific quirks */
|
||||||
if ((dev->pci_device & 0xffff) == 0x0179 ||
|
if (script == LVDS_RESET &&
|
||||||
(dev->pci_device & 0xffff) == 0x0189 ||
|
(dev->pci_device == 0x0179 || dev->pci_device == 0x0189 ||
|
||||||
(dev->pci_device & 0xffff) == 0x0329) {
|
dev->pci_device == 0x0329))
|
||||||
if (script == LVDS_RESET) {
|
nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72);
|
||||||
nv_write_tmds(dev, dcbent->or, 0, 0x02, 0x72);
|
|
||||||
|
|
||||||
} else if (script == LVDS_PANEL_ON) {
|
|
||||||
bios_wr32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL,
|
|
||||||
bios_rd32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL)
|
|
||||||
| (1 << 31));
|
|
||||||
bios_wr32(bios, NV_PCRTC_GPIO_EXT,
|
|
||||||
bios_rd32(bios, NV_PCRTC_GPIO_EXT) | 1);
|
|
||||||
|
|
||||||
} else if (script == LVDS_PANEL_OFF) {
|
|
||||||
bios_wr32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL,
|
|
||||||
bios_rd32(bios, NV_PBUS_DEBUG_DUALHEAD_CTL)
|
|
||||||
& ~(1 << 31));
|
|
||||||
bios_wr32(bios, NV_PCRTC_GPIO_EXT,
|
|
||||||
bios_rd32(bios, NV_PCRTC_GPIO_EXT) & ~3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -475,6 +475,27 @@ static void nv04_dfp_commit(struct drm_encoder *encoder)
|
||||||
nv_crtc->index, '@' + ffs(nv_encoder->dcb->or));
|
nv_crtc->index, '@' + ffs(nv_encoder->dcb->or));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode)
|
||||||
|
{
|
||||||
|
#ifdef __powerpc__
|
||||||
|
struct drm_device *dev = encoder->dev;
|
||||||
|
|
||||||
|
/* BIOS scripts usually take care of the backlight, thanks
|
||||||
|
* Apple for your consistency.
|
||||||
|
*/
|
||||||
|
if (dev->pci_device == 0x0179 || dev->pci_device == 0x0189 ||
|
||||||
|
dev->pci_device == 0x0329) {
|
||||||
|
if (mode == DRM_MODE_DPMS_ON) {
|
||||||
|
nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 0, 1 << 31);
|
||||||
|
nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 1);
|
||||||
|
} else {
|
||||||
|
nv_mask(dev, NV_PBUS_DEBUG_DUALHEAD_CTL, 1 << 31, 0);
|
||||||
|
nv_mask(dev, NV_PCRTC_GPIO_EXT, 3, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool is_powersaving_dpms(int mode)
|
static inline bool is_powersaving_dpms(int mode)
|
||||||
{
|
{
|
||||||
return (mode != DRM_MODE_DPMS_ON);
|
return (mode != DRM_MODE_DPMS_ON);
|
||||||
|
@ -522,6 +543,7 @@ static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode)
|
||||||
LVDS_PANEL_OFF, 0);
|
LVDS_PANEL_OFF, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nv04_dfp_update_backlight(encoder, mode);
|
||||||
nv04_dfp_update_fp_control(encoder, mode);
|
nv04_dfp_update_fp_control(encoder, mode);
|
||||||
|
|
||||||
if (mode == DRM_MODE_DPMS_ON)
|
if (mode == DRM_MODE_DPMS_ON)
|
||||||
|
@ -545,6 +567,7 @@ static void nv04_tmds_dpms(struct drm_encoder *encoder, int mode)
|
||||||
NV_INFO(dev, "Setting dpms mode %d on tmds encoder (output %d)\n",
|
NV_INFO(dev, "Setting dpms mode %d on tmds encoder (output %d)\n",
|
||||||
mode, nv_encoder->dcb->index);
|
mode, nv_encoder->dcb->index);
|
||||||
|
|
||||||
|
nv04_dfp_update_backlight(encoder, mode);
|
||||||
nv04_dfp_update_fp_control(encoder, mode);
|
nv04_dfp_update_fp_control(encoder, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче