diff options
Diffstat (limited to 'drivers/staging/gma500/psb_intel_lvds.c')
-rw-r--r-- | drivers/staging/gma500/psb_intel_lvds.c | 148 |
1 files changed, 56 insertions, 92 deletions
diff --git a/drivers/staging/gma500/psb_intel_lvds.c b/drivers/staging/gma500/psb_intel_lvds.c index b0a225b9f562..c6436da60732 100644 --- a/drivers/staging/gma500/psb_intel_lvds.c +++ b/drivers/staging/gma500/psb_intel_lvds.c @@ -21,21 +21,16 @@ */ #include <linux/i2c.h> -/* #include <drm/drm_crtc.h> */ -/* #include <drm/drm_edid.h> */ #include <drm/drmP.h> -#include "psb_intel_bios.h" +#include "intel_bios.h" #include "psb_drv.h" #include "psb_intel_drv.h" #include "psb_intel_reg.h" -#include "psb_powermgmt.h" +#include "power.h" #include <linux/pm_runtime.h> -u32 CoreClock; -u32 PWMControlRegFreq; - -/** +/* * LVDS I2C backlight control macros */ #define BRIGHTNESS_MAX_LEVEL 100 @@ -53,7 +48,7 @@ u32 PWMControlRegFreq; #define PSB_BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xFFFE) struct psb_intel_lvds_priv { - /** + /* * Saved LVDO output states */ uint32_t savePP_ON; @@ -66,9 +61,8 @@ struct psb_intel_lvds_priv { uint32_t saveBLC_PWM_CTL; }; -/* MRST defines end */ -/** +/* * Returns the maximum level of the backlight duty cycle field. */ static u32 psb_intel_lvds_get_max_backlight(struct drm_device *dev) @@ -126,13 +120,13 @@ static int psb_lvds_i2c_set_brightness(struct drm_device *dev, out_buf[1] = (u8)blc_i2c_brightness; if (i2c_transfer(&lvds_i2c_bus->adapter, msgs, 1) == 1) { - DRM_DEBUG("I2C set brightness.(command, value) (%d, %d)\n", + dev_dbg(dev->dev, "I2C set brightness.(command, value) (%d, %d)\n", dev_priv->lvds_bl->brightnesscmd, blc_i2c_brightness); return 0; } - DRM_ERROR("I2C transfer error\n"); + dev_err(dev->dev, "I2C transfer error\n"); return -1; } @@ -163,7 +157,7 @@ static int psb_lvds_pwm_set_brightness(struct drm_device *dev, int level) return 0; } -/** +/* * Set LVDS backlight level either by I2C or PWM */ void psb_intel_lvds_set_brightness(struct drm_device *dev, int level) @@ -172,10 +166,10 @@ void psb_intel_lvds_set_brightness(struct drm_device *dev, int level) struct drm_psb_private *dev_priv = (struct drm_psb_private *)dev->dev_private; - DRM_DEBUG("backlight level is %d\n", level); + dev_dbg(dev->dev, "backlight level is %d\n", level); if (!dev_priv->lvds_bl) { - DRM_ERROR("NO LVDS Backlight Info\n"); + dev_err(dev->dev, "NO LVDS Backlight Info\n"); return; } @@ -185,10 +179,10 @@ void psb_intel_lvds_set_brightness(struct drm_device *dev, int level) psb_lvds_pwm_set_brightness(dev, level); } -/** +/* * Sets the backlight level. * - * \param level backlight level, from 0 to psb_intel_lvds_get_max_backlight(). + * level: backlight level, from 0 to psb_intel_lvds_get_max_backlight(). */ static void psb_intel_lvds_set_backlight(struct drm_device *dev, int level) { @@ -210,7 +204,7 @@ static void psb_intel_lvds_set_backlight(struct drm_device *dev, int level) } } -/** +/* * Sets the power state for the panel. */ static void psb_intel_lvds_set_power(struct drm_device *dev, @@ -289,7 +283,7 @@ static void psb_intel_lvds_save(struct drm_connector *connector) dev_priv->backlight_duty_cycle = psb_intel_lvds_get_max_backlight(dev); - DRM_DEBUG("(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", + dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", lvds_priv->savePP_ON, lvds_priv->savePP_OFF, lvds_priv->saveLVDS, @@ -310,7 +304,7 @@ static void psb_intel_lvds_restore(struct drm_connector *connector) struct psb_intel_lvds_priv *lvds_priv = (struct psb_intel_lvds_priv *)psb_intel_output->dev_priv; - DRM_DEBUG("(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", + dev_dbg(dev->dev, "(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", lvds_priv->savePP_ON, lvds_priv->savePP_OFF, lvds_priv->saveLVDS, @@ -351,8 +345,6 @@ int psb_intel_lvds_mode_valid(struct drm_connector *connector, struct drm_display_mode *fixed_mode = psb_intel_output->mode_dev->panel_fixed_mode; - PSB_DEBUG_ENTRY("\n"); - if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) fixed_mode = psb_intel_output->mode_dev->panel_fixed_mode2; @@ -387,12 +379,10 @@ bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, struct psb_intel_output *psb_intel_output = enc_to_psb_intel_output(encoder); - PSB_DEBUG_ENTRY("type = 0x%x, pipe = %d.\n", - psb_intel_output->type, psb_intel_crtc->pipe); - if (psb_intel_output->type == INTEL_OUTPUT_MIPI2) panel_fixed_mode = mode_dev->panel_fixed_mode2; + /* FIXME: review for Medfield */ /* PSB requires the LVDS is on pipe B, MRST has only one pipe anyway */ if (!IS_MRST(dev) && psb_intel_crtc->pipe == 0) { printk(KERN_ERR "Can't support LVDS on pipe A\n"); @@ -442,14 +432,12 @@ bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder, return true; } -void psb_intel_lvds_prepare(struct drm_encoder *encoder) +static void psb_intel_lvds_prepare(struct drm_encoder *encoder) { struct drm_device *dev = encoder->dev; struct psb_intel_output *output = enc_to_psb_intel_output(encoder); struct psb_intel_mode_device *mode_dev = output->mode_dev; - PSB_DEBUG_ENTRY("\n"); - if (!gma_power_begin(dev, true)) return; @@ -462,14 +450,12 @@ void psb_intel_lvds_prepare(struct drm_encoder *encoder) gma_power_end(dev); } -void psb_intel_lvds_commit(struct drm_encoder *encoder) +static void psb_intel_lvds_commit(struct drm_encoder *encoder) { struct drm_device *dev = encoder->dev; struct psb_intel_output *output = enc_to_psb_intel_output(encoder); struct psb_intel_mode_device *mode_dev = output->mode_dev; - PSB_DEBUG_ENTRY("\n"); - if (mode_dev->backlight_duty_cycle == 0) mode_dev->backlight_duty_cycle = psb_intel_lvds_get_max_backlight(dev); @@ -481,9 +467,8 @@ static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode) { - struct psb_intel_mode_device *mode_dev = - enc_to_psb_intel_output(encoder)->mode_dev; struct drm_device *dev = encoder->dev; + struct drm_psb_private *dev_priv = dev->dev_private; u32 pfit_control; /* @@ -505,13 +490,13 @@ static void psb_intel_lvds_mode_set(struct drm_encoder *encoder, else pfit_control = 0; - if (mode_dev->panel_wants_dither) + if (dev_priv->lvds_dither) pfit_control |= PANEL_8TO6_DITHER_ENABLE; REG_WRITE(PFIT_CONTROL, pfit_control); } -/** +/* * Detect the LVDS connection. * * This always returns CONNECTOR_STATUS_CONNECTED. @@ -524,7 +509,7 @@ static enum drm_connector_status psb_intel_lvds_detect(struct drm_connector return connector_status_connected; } -/** +/* * Return the list of DDC modes if available, or the BIOS fixed mode otherwise. */ static int psb_intel_lvds_get_modes(struct drm_connector *connector) @@ -536,7 +521,8 @@ static int psb_intel_lvds_get_modes(struct drm_connector *connector) psb_intel_output->mode_dev; int ret = 0; - ret = psb_intel_ddc_get_modes(psb_intel_output); + if (!IS_MRST(dev)) + ret = psb_intel_ddc_get_modes(psb_intel_output); if (ret) return ret; @@ -583,18 +569,17 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, struct drm_property *property, uint64_t value) { - struct drm_encoder *pEncoder = connector->encoder; + struct drm_encoder *encoder = connector->encoder; - PSB_DEBUG_ENTRY("\n"); + if (!encoder) + return -1; - if (!strcmp(property->name, "scaling mode") && pEncoder) { - struct psb_intel_crtc *pPsbCrtc = - to_psb_intel_crtc(pEncoder->crtc); - uint64_t curValue; + if (!strcmp(property->name, "scaling mode")) { + struct psb_intel_crtc *crtc = + to_psb_intel_crtc(encoder->crtc); + uint64_t curval; - PSB_DEBUG_ENTRY("scaling mode\n"); - - if (!pPsbCrtc) + if (!crtc) goto set_prop_error; switch (value) { @@ -610,10 +595,10 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, if (drm_connector_property_get_value(connector, property, - &curValue)) + &curval)) goto set_prop_error; - if (curValue == value) + if (curval == value) goto set_prop_done; if (drm_connector_property_set_value(connector, @@ -621,34 +606,34 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, value)) goto set_prop_error; - if (pPsbCrtc->saved_mode.hdisplay != 0 && - pPsbCrtc->saved_mode.vdisplay != 0) { - if (!drm_crtc_helper_set_mode(pEncoder->crtc, - &pPsbCrtc->saved_mode, - pEncoder->crtc->x, - pEncoder->crtc->y, - pEncoder->crtc->fb)) + if (crtc->saved_mode.hdisplay != 0 && + crtc->saved_mode.vdisplay != 0) { + if (!drm_crtc_helper_set_mode(encoder->crtc, + &crtc->saved_mode, + encoder->crtc->x, + encoder->crtc->y, + encoder->crtc->fb)) goto set_prop_error; } - } else if (!strcmp(property->name, "backlight") && pEncoder) { - PSB_DEBUG_ENTRY("backlight\n"); - + } else if (!strcmp(property->name, "backlight")) { if (drm_connector_property_set_value(connector, property, value)) goto set_prop_error; else { #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE - struct backlight_device bd; - bd.props.brightness = value; - psb_set_brightness(&bd); + struct drm_psb_private *devp = encoder->dev->dev_private; + struct backlight_device *bd = devp->backlight_device; + if (bd) { + bd->props.brightness = value; + backlight_update_status(bd); + } #endif } - } else if (!strcmp(property->name, "DPMS") && pEncoder) { - struct drm_encoder_helper_funcs *pEncHFuncs - = pEncoder->helper_private; - PSB_DEBUG_ENTRY("DPMS\n"); - pEncHFuncs->dpms(pEncoder, value); + } else if (!strcmp(property->name, "DPMS")) { + struct drm_encoder_helper_funcs *hfuncs + = encoder->helper_private; + hfuncs->dpms(encoder, value); } set_prop_done: @@ -722,7 +707,7 @@ void psb_intel_lvds_init(struct drm_device *dev, lvds_priv = kzalloc(sizeof(struct psb_intel_lvds_priv), GFP_KERNEL); if (!lvds_priv) { kfree(psb_intel_output); - DRM_DEBUG("LVDS private allocation error\n"); + dev_err(dev->dev, "LVDS private allocation error\n"); return; } @@ -758,7 +743,7 @@ void psb_intel_lvds_init(struct drm_device *dev, dev_priv->backlight_property, BRIGHTNESS_MAX_LEVEL); - /** + /* * Set up I2C bus * FIXME: distroy i2c_bus when exit */ @@ -806,7 +791,7 @@ void psb_intel_lvds_init(struct drm_device *dev, } } - /* Failed to get EDID, what about VBT? do we need this?*/ + /* Failed to get EDID, what about VBT? do we need this? */ if (mode_dev->vbt_mode) mode_dev->panel_fixed_mode = drm_mode_duplicate(dev, mode_dev->vbt_mode); @@ -838,8 +823,7 @@ void psb_intel_lvds_init(struct drm_device *dev, /* If we still don't have a mode after all that, give up. */ if (!mode_dev->panel_fixed_mode) { - DRM_DEBUG - ("Found no modes on the lvds, ignoring the LVDS\n"); + dev_err(dev->dev, "Found no modes on the lvds, ignoring the LVDS\n"); goto failed_find; } @@ -849,26 +833,6 @@ void psb_intel_lvds_init(struct drm_device *dev, */ out: drm_sysfs_connector_add(connector); - - PSB_DEBUG_ENTRY("hdisplay = %d\n", - mode_dev->panel_fixed_mode->hdisplay); - PSB_DEBUG_ENTRY(" vdisplay = %d\n", - mode_dev->panel_fixed_mode->vdisplay); - PSB_DEBUG_ENTRY(" hsync_start = %d\n", - mode_dev->panel_fixed_mode->hsync_start); - PSB_DEBUG_ENTRY(" hsync_end = %d\n", - mode_dev->panel_fixed_mode->hsync_end); - PSB_DEBUG_ENTRY(" htotal = %d\n", - mode_dev->panel_fixed_mode->htotal); - PSB_DEBUG_ENTRY(" vsync_start = %d\n", - mode_dev->panel_fixed_mode->vsync_start); - PSB_DEBUG_ENTRY(" vsync_end = %d\n", - mode_dev->panel_fixed_mode->vsync_end); - PSB_DEBUG_ENTRY(" vtotal = %d\n", - mode_dev->panel_fixed_mode->vtotal); - PSB_DEBUG_ENTRY(" clock = %d\n", - mode_dev->panel_fixed_mode->clock); - return; failed_find: |