Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d31e078d authored by Francisco Jerez's avatar Francisco Jerez Committed by Ben Skeggs
Browse files

drm/nouveau: Fix backlight control on PPC machines with an internal TMDS panel.



This commit fixes fdo bug 29685.

Reported-by: default avatarVlado Plaga <rechner@vlado-do.de>
Signed-off-by: default avatarFrancisco Jerez <currojerez@riseup.net>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent f5cb8ab1
Loading
Loading
Loading
Loading
+4 −21
Original line number Original line Diff line number Diff line
@@ -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;
+23 −0
Original line number Original line Diff line number Diff line
@@ -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);
}
}