drm/nouveau: support fetching LVDS EDID from ACPI
Based on a patch from Matthew Garrett. Signed-off-by: Ben Skeggs <bskeggs@redhat.com> Acked-by: Matthew Garrett <mjg@redhat.com>
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <acpi/acpi_drivers.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/video.h>
|
||||
|
||||
#include "drmP.h"
|
||||
#include "drm.h"
|
||||
@@ -11,6 +12,7 @@
|
||||
#include "nouveau_drv.h"
|
||||
#include "nouveau_drm.h"
|
||||
#include "nv50_display.h"
|
||||
#include "nouveau_connector.h"
|
||||
|
||||
#include <linux/vga_switcheroo.h>
|
||||
|
||||
@@ -259,3 +261,37 @@ int nouveau_acpi_get_bios_chunk(uint8_t *bios, int offset, int len)
|
||||
{
|
||||
return nouveau_rom_call(nouveau_dsm_priv.rom_handle, bios, offset, len);
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_acpi_edid(struct drm_device *dev, struct drm_connector *connector)
|
||||
{
|
||||
struct nouveau_connector *nv_connector = nouveau_connector(connector);
|
||||
struct acpi_device *acpidev;
|
||||
acpi_handle handle;
|
||||
int type, ret;
|
||||
void *edid;
|
||||
|
||||
switch (connector->connector_type) {
|
||||
case DRM_MODE_CONNECTOR_LVDS:
|
||||
case DRM_MODE_CONNECTOR_eDP:
|
||||
type = ACPI_VIDEO_DISPLAY_LCD;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
handle = DEVICE_ACPI_HANDLE(&dev->pdev->dev);
|
||||
if (!handle)
|
||||
return -ENODEV;
|
||||
|
||||
ret = acpi_bus_get_device(handle, &acpidev);
|
||||
if (ret)
|
||||
return -ENODEV;
|
||||
|
||||
ret = acpi_video_get_edid(acpidev, type, -1, &edid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
nv_connector->edid = edid;
|
||||
return 0;
|
||||
}
|
||||
|
مرجع در شماره جدید
Block a user