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

Commit 1b22edfd authored by Alan Cox's avatar Alan Cox Committed by Dave Airlie
Browse files

gma500: Oaktrail BIOS handling



Now that we pull the right BIOS data out of the hat we need to use it when
doing our panel setup.

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent aa0c45fd
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -457,9 +457,13 @@ static int oaktrail_power_up(struct drm_device *dev)
}


static void oaktrail_chip_setup(struct drm_device *dev)
static int oaktrail_chip_setup(struct drm_device *dev)
{
	int ret = mid_chip_setup(dev);
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct oaktrail_vbt *vbt = &dev_priv->vbt_data;
	int ret;
	
	ret = mid_chip_setup(dev);
	if (ret < 0)
		return ret;
	if (vbt->size == 0) {
@@ -472,6 +476,9 @@ static void oaktrail_chip_setup(struct drm_device *dev)

static void oaktrail_teardown(struct drm_device *dev)
{
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct oaktrail_vbt *vbt = &dev_priv->vbt_data;

	oaktrail_hdmi_teardown(dev);
	if (vbt->size == 0)
		psb_intel_destroy_bios(dev);
+27 −10
Original line number Diff line number Diff line
@@ -228,17 +228,20 @@ static struct drm_display_mode lvds_configuration_modes[] = {

/* Returns the panel fixed mode from configuration. */

static struct drm_display_mode *
oaktrail_lvds_get_configuration_mode(struct drm_device *dev)
static void oaktrail_lvds_get_configuration_mode(struct drm_device *dev,
					struct psb_intel_mode_device *mode_dev)
{
	struct drm_display_mode *mode = NULL;
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD;

	mode_dev->panel_fixed_mode = NULL;

	/* Use the firmware provided data on Moorestown */
	if (dev_priv->vbt_data.size != 0x00) { /*if non-zero, then use vbt*/
		mode = kzalloc(sizeof(*mode), GFP_KERNEL);
		if (!mode)
			return NULL;
			return;

		mode->hdisplay = (ti->hactive_hi << 8) | ti->hactive_lo;
		mode->vdisplay = (ti->vactive_hi << 8) | ti->vactive_lo;
@@ -270,13 +273,27 @@ oaktrail_lvds_get_configuration_mode(struct drm_device *dev)
		printk(KERN_INFO "vtotal is %d\n", mode->vtotal);
		printk(KERN_INFO "clock is %d\n", mode->clock);
#endif
	} else
		mode = drm_mode_duplicate(dev, &lvds_configuration_modes[2]);
		mode_dev->panel_fixed_mode = mode;
	}

	drm_mode_set_name(mode);
	drm_mode_set_crtcinfo(mode, 0);
	/* Use the BIOS VBT mode if available */
	if (mode_dev->panel_fixed_mode == NULL && mode_dev->vbt_mode)
		mode_dev->panel_fixed_mode = drm_mode_duplicate(dev,
						mode_dev->vbt_mode);

	return mode;
	/* Then try the LVDS VBT mode */
	if (mode_dev->panel_fixed_mode == NULL)
		if (dev_priv->lfp_lvds_vbt_mode)
			mode_dev->panel_fixed_mode =
				drm_mode_duplicate(dev,
					dev_priv->lfp_lvds_vbt_mode);
	/* Then guess */
	if (mode_dev->panel_fixed_mode == NULL)
		mode_dev->panel_fixed_mode
			= drm_mode_duplicate(dev, &lvds_configuration_modes[2]);

	drm_mode_set_name(mode_dev->panel_fixed_mode);
	drm_mode_set_crtcinfo(mode_dev->panel_fixed_mode, 0);
}

/**
@@ -375,7 +392,7 @@ void oaktrail_lvds_init(struct drm_device *dev,
	 * If we didn't get EDID, try geting panel timing
	 * from configuration data
	 */
	mode_dev->panel_fixed_mode = oaktrail_lvds_get_configuration_mode(dev);
	oaktrail_lvds_get_configuration_mode(dev, mode_dev);

	if (mode_dev->panel_fixed_mode) {
		mode_dev->panel_fixed_mode->type |= DRM_MODE_TYPE_PREFERRED;