|
@@ -37,6 +37,7 @@
|
|
|
#include "nouveau_drv.h"
|
|
|
#include "nouveau_drm.h"
|
|
|
#include "nouveau_reg.h"
|
|
|
+#include "nouveau_encoder.h"
|
|
|
|
|
|
static int
|
|
|
nv40_get_intensity(struct backlight_device *bd)
|
|
@@ -96,18 +97,22 @@ nv40_backlight_init(struct drm_connector *connector)
|
|
|
static int
|
|
|
nv50_get_intensity(struct backlight_device *bd)
|
|
|
{
|
|
|
- struct drm_device *dev = bl_get_data(bd);
|
|
|
+ struct nouveau_encoder *nv_encoder = bl_get_data(bd);
|
|
|
+ struct drm_device *dev = nv_encoder->base.base.dev;
|
|
|
+ int or = nv_encoder->or;
|
|
|
|
|
|
- return nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT);
|
|
|
+ return nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT + (or * 0x800));
|
|
|
}
|
|
|
|
|
|
static int
|
|
|
nv50_set_intensity(struct backlight_device *bd)
|
|
|
{
|
|
|
- struct drm_device *dev = bl_get_data(bd);
|
|
|
+ struct nouveau_encoder *nv_encoder = bl_get_data(bd);
|
|
|
+ struct drm_device *dev = nv_encoder->base.base.dev;
|
|
|
int val = bd->props.brightness;
|
|
|
+ int or = nv_encoder->or;
|
|
|
|
|
|
- nv_wr32(dev, NV50_PDISPLAY_SOR_BACKLIGHT,
|
|
|
+ nv_wr32(dev, NV50_PDISPLAY_SOR_BACKLIGHT + (or * 0x800),
|
|
|
val | NV50_PDISPLAY_SOR_BACKLIGHT_ENABLE);
|
|
|
return 0;
|
|
|
}
|
|
@@ -123,17 +128,28 @@ nv50_backlight_init(struct drm_connector *connector)
|
|
|
{
|
|
|
struct drm_device *dev = connector->dev;
|
|
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
+ struct nouveau_encoder *nv_encoder;
|
|
|
struct backlight_properties props;
|
|
|
struct backlight_device *bd;
|
|
|
+ int or;
|
|
|
+
|
|
|
+ nv_encoder = find_encoder(connector, OUTPUT_LVDS);
|
|
|
+ if (!nv_encoder) {
|
|
|
+ nv_encoder = find_encoder(connector, OUTPUT_DP);
|
|
|
+ if (!nv_encoder)
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
+ or = nv_encoder->or;
|
|
|
|
|
|
- if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT))
|
|
|
+ if (!nv_rd32(dev, NV50_PDISPLAY_SOR_BACKLIGHT + (or * 0x800)))
|
|
|
return 0;
|
|
|
|
|
|
memset(&props, 0, sizeof(struct backlight_properties));
|
|
|
props.type = BACKLIGHT_RAW;
|
|
|
props.max_brightness = 1025;
|
|
|
- bd = backlight_device_register("nv_backlight", &connector->kdev, dev,
|
|
|
- &nv50_bl_ops, &props);
|
|
|
+ bd = backlight_device_register("nv_backlight", &connector->kdev,
|
|
|
+ nv_encoder, &nv50_bl_ops, &props);
|
|
|
if (IS_ERR(bd))
|
|
|
return PTR_ERR(bd);
|
|
|
|
|
@@ -144,10 +160,10 @@ nv50_backlight_init(struct drm_connector *connector)
|
|
|
}
|
|
|
|
|
|
int
|
|
|
-nouveau_backlight_init(struct drm_connector *connector)
|
|
|
+nouveau_backlight_init(struct drm_device *dev)
|
|
|
{
|
|
|
- struct drm_device *dev = connector->dev;
|
|
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
+ struct drm_connector *connector;
|
|
|
|
|
|
#ifdef CONFIG_ACPI
|
|
|
if (acpi_video_backlight_support()) {
|
|
@@ -157,22 +173,28 @@ nouveau_backlight_init(struct drm_connector *connector)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
- switch (dev_priv->card_type) {
|
|
|
- case NV_40:
|
|
|
- return nv40_backlight_init(connector);
|
|
|
- case NV_50:
|
|
|
- return nv50_backlight_init(connector);
|
|
|
- default:
|
|
|
- break;
|
|
|
+ list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
|
|
+ if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS &&
|
|
|
+ connector->connector_type != DRM_MODE_CONNECTOR_eDP)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ switch (dev_priv->card_type) {
|
|
|
+ case NV_40:
|
|
|
+ return nv40_backlight_init(connector);
|
|
|
+ case NV_50:
|
|
|
+ return nv50_backlight_init(connector);
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
void
|
|
|
-nouveau_backlight_exit(struct drm_connector *connector)
|
|
|
+nouveau_backlight_exit(struct drm_device *dev)
|
|
|
{
|
|
|
- struct drm_device *dev = connector->dev;
|
|
|
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
|
|
|
|
|
if (dev_priv->backlight) {
|