[PATCH 2/2] staging: Use generic IGD opregion code for gma500

From: Matthew Garrett
Date: Tue Feb 22 2011 - 15:03:48 EST


The gma500 driver currently includes its own IGD opregion implementation.
Rework it to use the generic one instead. Note that this is missing a
certain level of functionality - the driver does nothing to enable
opregion interrupts right now, and so will simply poll for updates rather
than doing anything sensible.

Signed-off-by: Matthew Garrett <mjg@xxxxxxxxxx>
---
drivers/staging/gma500/Kconfig | 1 +
drivers/staging/gma500/Makefile | 1 -
drivers/staging/gma500/psb_drv.c | 28 ++++++++--
drivers/staging/gma500/psb_drv.h | 21 +-------
drivers/staging/gma500/psb_gfx.mod.c | 4 +-
drivers/staging/gma500/psb_intel_drv.h | 3 +-
drivers/staging/gma500/psb_intel_lvds.c | 4 +-
drivers/staging/gma500/psb_intel_opregion.c | 78 ---------------------------
8 files changed, 31 insertions(+), 109 deletions(-)
delete mode 100644 drivers/staging/gma500/psb_intel_opregion.c

diff --git a/drivers/staging/gma500/Kconfig b/drivers/staging/gma500/Kconfig
index 5501eb9..f3ab6cb 100644
--- a/drivers/staging/gma500/Kconfig
+++ b/drivers/staging/gma500/Kconfig
@@ -1,6 +1,7 @@
config DRM_PSB
tristate "Intel GMA500 KMS Framebuffer"
depends on DRM && PCI
+ depends on ACPI_IGD_OPREGION
select FB_CFB_COPYAREA
select FB_CFB_FILLRECT
select FB_CFB_IMAGEBLIT
diff --git a/drivers/staging/gma500/Makefile b/drivers/staging/gma500/Makefile
index 21381eb..dba41e3 100644
--- a/drivers/staging/gma500/Makefile
+++ b/drivers/staging/gma500/Makefile
@@ -8,7 +8,6 @@ psb_gfx-y += psb_bl.o \
psb_fb.o \
psb_gtt.o \
psb_intel_bios.o \
- psb_intel_opregion.o \
psb_intel_display.o \
psb_intel_i2c.o \
psb_intel_lvds.o \
diff --git a/drivers/staging/gma500/psb_drv.c b/drivers/staging/gma500/psb_drv.c
index 2fe09c8..f1775e1 100644
--- a/drivers/staging/gma500/psb_drv.c
+++ b/drivers/staging/gma500/psb_drv.c
@@ -29,6 +29,7 @@
#include "psb_intel_bios.h"
#include <drm/drm_pciids.h>
#include "psb_powermgmt.h"
+#include <acpi/video.h>
#include <linux/cpu.h>
#include <linux/notifier.h>
#include <linux/spinlock.h>
@@ -294,6 +295,18 @@ static struct drm_ioctl_desc psb_ioctls[] = {
DRM_AUTH),
};

+static void psb_lid_init(struct drm_device *dev)
+{
+ struct drm_psb_private *dev_priv = dev->dev_private;
+ struct igd_opregion *opregion = &dev_priv->opregion_dev.opregion;
+
+ if (!opregion->acpi)
+ return;
+
+ dev_priv->lid_state = &opregion->acpi->clid;
+ dev_priv->lid_last_state = *dev_priv->lid_state;
+}
+
static void psb_set_uopt(struct drm_psb_uopt *uopt)
{
return;
@@ -515,6 +528,8 @@ static int psb_driver_unload(struct drm_device *dev)

/* Kill vblank etc here */

+ acpi_video_unregister();
+
psb_backlight_exit(); /*writes minimum value to backlight HW reg */

if (drm_psb_no_fb == 0)
@@ -662,7 +677,10 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
goto out_err;

psb_get_core_freq(dev);
- psb_intel_opregion_init(dev);
+ dev_priv->opregion_dev.drm_dev = dev;
+ dev_priv->opregion_dev.max_backlight = psb_intel_lvds_get_max_backlight(dev);
+ dev_priv->opregion_dev.set_backlight = psb_intel_lvds_set_brightness;
+ igd_opregion_setup(&dev_priv->opregion_dev);
psb_intel_init_bios(dev);

PSB_DEBUG_INIT("Init TTM fence and BO driver\n");
@@ -765,11 +783,9 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
if (ret)
return ret;

- /**
- * Init lid switch timer.
- * NOTE: must do this after psb_intel_opregion_init
- * and psb_backlight_init
- */
+ igd_opregion_init(&dev_priv->opregion_dev);
+ acpi_video_register();
+ psb_lid_init(dev);
if (dev_priv->lid_state)
psb_lid_timer_init(dev_priv);

diff --git a/drivers/staging/gma500/psb_drv.h b/drivers/staging/gma500/psb_drv.h
index b75b9d8..30d161e 100644
--- a/drivers/staging/gma500/psb_drv.h
+++ b/drivers/staging/gma500/psb_drv.h
@@ -23,6 +23,7 @@
#include <linux/version.h>

#include <drm/drmP.h>
+#include <acpi/acpi_igd_opregion.h>
#include "drm_global.h"
#include "psb_drm.h"
#include "psb_reg.h"
@@ -253,19 +254,6 @@ enum {
#define MDFLD_PLANE_MAX_WIDTH 2048
#define MDFLD_PLANE_MAX_HEIGHT 2048

-struct opregion_header;
-struct opregion_acpi;
-struct opregion_swsci;
-struct opregion_asle;
-
-struct psb_intel_opregion {
- struct opregion_header *header;
- struct opregion_acpi *acpi;
- struct opregion_swsci *swsci;
- struct opregion_asle *asle;
- int enabled;
-};
-
/*
*User options.
*/
@@ -692,7 +680,7 @@ struct drm_psb_private {
*/
spinlock_t lid_lock;
struct timer_list lid_timer;
- struct psb_intel_opregion opregion;
+ struct opregion_dev opregion_dev;
u32 *lid_state;
u32 lid_last_state;

@@ -902,11 +890,6 @@ extern int lnc_video_getparam(struct drm_device *dev, void *data,
struct drm_file *file_priv);

/*
- * psb_opregion.c
- */
-extern int psb_intel_opregion_init(struct drm_device *dev);
-
-/*
*psb_fb.c
*/
extern int psbfb_probed(struct drm_device *dev);
diff --git a/drivers/staging/gma500/psb_gfx.mod.c b/drivers/staging/gma500/psb_gfx.mod.c
index 1a663ab..14772c4 100644
--- a/drivers/staging/gma500/psb_gfx.mod.c
+++ b/drivers/staging/gma500/psb_gfx.mod.c
@@ -19,9 +19,9 @@ MODULE_INFO(staging, "Y");
static const char __module_depends[]
__used
__attribute__((section(".modinfo"))) =
-"depends=ttm,drm,drm_kms_helper,i2c-core,cfbfillrect,cfbimgblt,cfbcopyarea,i2c-algo-bit";
+"depends=video";

MODULE_ALIAS("pci:v00008086d00008108sv*sd*bc*sc*i*");
MODULE_ALIAS("pci:v00008086d00008109sv*sd*bc*sc*i*");

-MODULE_INFO(srcversion, "933CCC78041722973001B78");
+MODULE_INFO(srcversion, "B869B52B58BF27553563032");
diff --git a/drivers/staging/gma500/psb_intel_drv.h b/drivers/staging/gma500/psb_intel_drv.h
index cb0a91b..67a3789 100644
--- a/drivers/staging/gma500/psb_intel_drv.h
+++ b/drivers/staging/gma500/psb_intel_drv.h
@@ -197,7 +197,8 @@ extern void psb_intel_dvo_init(struct drm_device *dev);
extern void psb_intel_tv_init(struct drm_device *dev);
extern void psb_intel_lvds_init(struct drm_device *dev,
struct psb_intel_mode_device *mode_dev);
-extern void psb_intel_lvds_set_brightness(struct drm_device *dev, int level);
+extern u32 psb_intel_lvds_get_max_backlight(struct drm_device *dev);
+extern void psb_intel_lvds_set_brightness(struct drm_device *dev, u32 level);
extern void mrst_lvds_init(struct drm_device *dev,
struct psb_intel_mode_device *mode_dev);
extern void mrst_wait_for_INTR_PKT_SENT(struct drm_device *dev);
diff --git a/drivers/staging/gma500/psb_intel_lvds.c b/drivers/staging/gma500/psb_intel_lvds.c
index d3d210a..dec391d 100644
--- a/drivers/staging/gma500/psb_intel_lvds.c
+++ b/drivers/staging/gma500/psb_intel_lvds.c
@@ -78,7 +78,7 @@ struct psb_intel_lvds_priv {
/**
* Returns the maximum level of the backlight duty cycle field.
*/
-static u32 psb_intel_lvds_get_max_backlight(struct drm_device *dev)
+u32 psb_intel_lvds_get_max_backlight(struct drm_device *dev)
{
struct drm_psb_private *dev_priv = dev->dev_private;
u32 retVal;
@@ -171,7 +171,7 @@ static int psb_lvds_pwm_set_brightness(struct drm_device *dev, int level)
/**
* Set LVDS backlight level either by I2C or PWM
*/
-void psb_intel_lvds_set_brightness(struct drm_device *dev, int level)
+void psb_intel_lvds_set_brightness(struct drm_device *dev, u32 level)
{
/*u32 blc_pwm_ctl;*/
struct drm_psb_private *dev_priv =
diff --git a/drivers/staging/gma500/psb_intel_opregion.c b/drivers/staging/gma500/psb_intel_opregion.c
deleted file mode 100644
index 65e3e9b..0000000
--- a/drivers/staging/gma500/psb_intel_opregion.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright 2010 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include "psb_drv.h"
-
-struct opregion_header {
- u8 signature[16];
- u32 size;
- u32 opregion_ver;
- u8 bios_ver[32];
- u8 vbios_ver[16];
- u8 driver_ver[16];
- u32 mboxes;
- u8 reserved[164];
-} __attribute__((packed));
-
-struct opregion_apci {
- /*FIXME: add it later*/
-} __attribute__((packed));
-
-struct opregion_swsci {
- /*FIXME: add it later*/
-} __attribute__((packed));
-
-struct opregion_acpi {
- /*FIXME: add it later*/
-} __attribute__((packed));
-
-int psb_intel_opregion_init(struct drm_device *dev)
-{
- struct drm_psb_private *dev_priv = dev->dev_private;
- /*struct psb_intel_opregion * opregion = &dev_priv->opregion;*/
- u32 opregion_phy;
- void *base;
- u32 *lid_state;
-
- dev_priv->lid_state = NULL;
-
- pci_read_config_dword(dev->pdev, 0xfc, &opregion_phy);
- if (opregion_phy == 0) {
- DRM_DEBUG("Opregion not supported, won't support lid-switch\n");
- return -ENOTSUPP;
- }
- DRM_DEBUG("OpRegion detected at 0x%8x\n", opregion_phy);
-
- base = ioremap(opregion_phy, 8*1024);
- if (!base)
- return -ENOMEM;
-
- lid_state = base + 0x01ac;
-
- DRM_DEBUG("Lid switch state 0x%08x\n", *lid_state);
-
- dev_priv->lid_state = lid_state;
- dev_priv->lid_last_state = *lid_state;
- return 0;
-}
--
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/