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

Commit 0cf0db5e authored by Alan Cox's avatar Alan Cox Committed by Greg Kroah-Hartman
Browse files

gma500: tidy up the CDV files



We are close to having PSB and CDV ready for moving from staging so it's
time to get the polish out.

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 2b9428e2
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -129,7 +129,6 @@ static int cdv_backlight_setup(struct drm_device *dev)

static int cdv_set_brightness(struct backlight_device *bd)
{
	struct drm_device *dev = bl_get_data(cdv_backlight_device);
	int level = bd->props.brightness;

	/* Percentage 1-100% being valid */
@@ -218,8 +217,10 @@ static void cdv_init_pm(struct drm_device *dev)
	u32 pwr_cnt;
	int i;

	dev_priv->apm_base = CDV_MSG_READ32(PSB_PUNIT_PORT, PSB_APMBA) & 0xFFFF;
	dev_priv->ospm_base = CDV_MSG_READ32(PSB_PUNIT_PORT, PSB_OSPMBA) & 0xFFFF;
	dev_priv->apm_base = CDV_MSG_READ32(PSB_PUNIT_PORT,
							PSB_APMBA) & 0xFFFF;
	dev_priv->ospm_base = CDV_MSG_READ32(PSB_PUNIT_PORT,
							PSB_OSPMBA) & 0xFFFF;

	/* Force power on for now */
	pwr_cnt = inl(dev_priv->apm_base + PSB_APM_CMD);
+13 −10
Original line number Diff line number Diff line
@@ -128,11 +128,10 @@ static void cdv_intel_crt_mode_set(struct drm_encoder *encoder,
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
		adpa |= ADPA_VSYNC_ACTIVE_HIGH;

	if (psb_intel_crtc->pipe == 0) {
	if (psb_intel_crtc->pipe == 0)
		adpa |= ADPA_PIPE_A_SELECT;
	} else {
	else
		adpa |= ADPA_PIPE_B_SELECT;
	}

	REG_WRITE(adpa_reg, adpa);
}
@@ -144,7 +143,8 @@ static void cdv_intel_crt_mode_set(struct drm_encoder *encoder,
 * \return true if CRT is connected.
 * \return false if CRT is disconnected.
 */
static bool cdv_intel_crt_detect_hotplug(struct drm_connector *connector, bool force)
static bool cdv_intel_crt_detect_hotplug(struct drm_connector *connector,
								bool force)
{
	struct drm_device *dev = connector->dev;
	u32 hotplug_en;
@@ -193,7 +193,8 @@ static bool cdv_intel_crt_detect_hotplug(struct drm_connector *connector, bool f
	return ret;
}

static enum drm_connector_status cdv_intel_crt_detect(struct drm_connector *connector, bool force)
static enum drm_connector_status cdv_intel_crt_detect(
				struct drm_connector *connector, bool force)
{
	if (cdv_intel_crt_detect_hotplug(connector, force))
		return connector_status_connected;
@@ -245,7 +246,8 @@ static const struct drm_connector_funcs cdv_intel_crt_connector_funcs = {
	.set_property = cdv_intel_crt_set_property,
};

static const struct drm_connector_helper_funcs cdv_intel_crt_connector_helper_funcs = {
static const struct drm_connector_helper_funcs
				cdv_intel_crt_connector_helper_funcs = {
	.mode_valid = cdv_intel_crt_mode_valid,
	.get_modes = cdv_intel_crt_get_modes,
	.best_encoder = psb_intel_best_encoder,
@@ -310,7 +312,8 @@ void cdv_intel_crt_init(struct drm_device *dev,
	connector->doublescan_allowed = 0;

	drm_encoder_helper_add(encoder, &cdv_intel_crt_helper_funcs);
	drm_connector_helper_add(connector, &cdv_intel_crt_connector_helper_funcs);
	drm_connector_helper_add(connector,
					&cdv_intel_crt_connector_helper_funcs);

	drm_sysfs_connector_add(connector);

+55 −60
Original line number Diff line number Diff line
@@ -40,8 +40,7 @@ struct cdv_intel_p2_t {
	int p2_slow, p2_fast;
};

struct cdv_intel_clock_t
{
struct cdv_intel_clock_t {
	/* given values */
	int n;
	int m1, m2;
@@ -124,7 +123,8 @@ static const struct cdv_intel_limit_t cdv_intel_limits[] = {
			ret__ = -ETIMEDOUT;				\
			break;						\
		}							\
                if (W && !in_dbg_master()) msleep(W);                   \
		if (W && !in_dbg_master())				\
			msleep(W);					\
	}								\
	ret__;								\
})
@@ -331,7 +331,6 @@ cdv_dpll_set_clock_cdv(struct drm_device *dev, struct drm_crtc *crtc,
		lane_value |= LANE_PLL_ENABLE;
		cdv_sb_write(dev, lane_reg, lane_value);

	
		lane_reg = PSB_LANE3;
		cdv_sb_read(dev, lane_reg, &lane_value);
		lane_value &= ~(LANE_PLL_MASK);
@@ -362,7 +361,8 @@ bool cdv_intel_pipe_has_type(struct drm_crtc *crtc, int type)
	return false;
}

static const struct cdv_intel_limit_t *cdv_intel_limit(struct drm_crtc *crtc, int refclk)
static const struct cdv_intel_limit_t *cdv_intel_limit(struct drm_crtc *crtc,
							int refclk)
{
	const struct cdv_intel_limit_t *limit;
	if (cdv_intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) {
@@ -448,17 +448,20 @@ static bool cdv_intel_find_best_PLL(struct drm_crtc *crtc, int target,

	memset(best_clock, 0, sizeof(*best_clock));
	clock.m1 = 0;
	/* m1 is reserved as 0 in CDV, n is a ring counter. So skip the m1 loop */
	/* m1 is reserved as 0 in CDV, n is a ring counter.
	   So skip the m1 loop */
	for (clock.n = limit->n.min; clock.n <= limit->n.max; clock.n++) {
		for (clock.m2 = limit->m2.min; clock.m2 <= limit->m2.max;
					     clock.m2++) {
			for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
			for (clock.p1 = limit->p1.min;
					clock.p1 <= limit->p1.max;
					clock.p1++) {
				int this_err;

				cdv_intel_clock(dev, refclk, &clock);

				if (!cdv_intel_PLL_is_valid(crtc, limit, &clock))
				if (!cdv_intel_PLL_is_valid(crtc,
								limit, &clock))
						continue;

				this_err = abs(clock.dot - target);
@@ -808,7 +811,7 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
		dpll |= DPLLB_MODE_LVDS;
	else
		dpll |= DPLLB_MODE_DAC_SERIAL;
	//dpll |= (2 << 11);
	/* dpll |= (2 << 11); */

	/* setup pipeconf */
	pipeconf = REG_READ(pipeconf_reg);
@@ -824,9 +827,7 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
	dspcntr |= DISPLAY_PLANE_ENABLE;
	pipeconf |= PIPEACONF_ENABLE;

	REG_WRITE(dpll_reg,
                   dpll | DPLL_VGA_MODE_DIS |
                   DPLL_SYNCLOCK_ENABLE);
	REG_WRITE(dpll_reg, dpll | DPLL_VGA_MODE_DIS | DPLL_SYNCLOCK_ENABLE);
	REG_READ(dpll_reg);

	cdv_dpll_set_clock_cdv(dev, crtc, &clock);
@@ -864,7 +865,6 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,

	dpll |= DPLL_VCO_ENABLE;

		
	/* Disable the panel fitter if it was on our pipe */
	if (cdv_intel_panel_fitter_pipe(dev) == pipe)
		REG_WRITE(PFIT_CONTROL, 0);
@@ -873,8 +873,7 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
	drm_mode_debug_printmodeline(mode);

	REG_WRITE(dpll_reg,
                   (REG_READ(dpll_reg) & ~DPLL_LOCK) |
                   DPLL_VCO_ENABLE);
		(REG_READ(dpll_reg) & ~DPLL_LOCK) | DPLL_VCO_ENABLE);
	REG_READ(dpll_reg);
	/* Wait for the clocks to stabilize. */
	udelay(150); /* 42 usec w/o calibration, 110 with.  rounded up. */
@@ -885,12 +884,8 @@ static int cdv_intel_crtc_mode_set(struct drm_crtc *crtc,
	}

	{
        	int sdvo_pixel_multiply =
		    adjusted_mode->clock / mode->clock;
		REG_WRITE(dpll_md_reg,
			  (0 << DPLL_MD_UDI_DIVIDER_SHIFT) |
			  ((sdvo_pixel_multiply -
			    1) << DPLL_MD_UDI_MULTIPLIER_SHIFT));
		int sdvo_pixel_multiply = adjusted_mode->clock / mode->clock;
		REG_WRITE(dpll_md_reg, (0 << DPLL_MD_UDI_DIVIDER_SHIFT) | ((sdvo_pixel_multiply - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT));
	}

	REG_WRITE(htot_reg, (adjusted_mode->crtc_hdisplay - 1) |
+42 −38
Original line number Diff line number Diff line
@@ -92,7 +92,6 @@ static bool cdv_hdmi_mode_fixup(struct drm_encoder *encoder,
				  struct drm_display_mode *mode,
				  struct drm_display_mode *adjusted_mode)
{

	return true;
}

@@ -105,11 +104,10 @@ static void cdv_hdmi_dpms(struct drm_encoder *encoder, int mode)

	hdmib = REG_READ(hdmi_priv->hdmi_reg);

	if (mode != DRM_MODE_DPMS_ON) {
	if (mode != DRM_MODE_DPMS_ON)
		REG_WRITE(hdmi_priv->hdmi_reg, hdmib & ~HDMIB_PORT_EN);
	} else {
	else
		REG_WRITE(hdmi_priv->hdmi_reg, hdmib | HDMIB_PORT_EN);
	}
	REG_READ(hdmi_priv->hdmi_reg);
}

@@ -132,11 +130,12 @@ static void cdv_hdmi_restore(struct drm_connector *connector)
	REG_READ(hdmi_priv->hdmi_reg);
}

static enum drm_connector_status cdv_hdmi_detect(struct drm_connector *connector, bool force)
static enum drm_connector_status cdv_hdmi_detect(
				struct drm_connector *connector, bool force)
{
	struct drm_device *dev = connector->dev;
	struct drm_psb_private *dev_priv = dev->dev_private;
	struct psb_intel_output *psb_intel_output = to_psb_intel_output(connector);
	struct psb_intel_output *psb_intel_output =
						to_psb_intel_output(connector);
	struct mid_intel_hdmi_priv *hdmi_priv = psb_intel_output->dev_priv;
	struct edid *edid = NULL;
	enum drm_connector_status status = connector_status_disconnected;
@@ -149,8 +148,10 @@ static enum drm_connector_status cdv_hdmi_detect(struct drm_connector *connector
	if (edid) {
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
			status = connector_status_connected;
			hdmi_priv->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
			hdmi_priv->has_hdmi_audio = drm_detect_monitor_audio(edid);
			hdmi_priv->has_hdmi_sink =
						drm_detect_hdmi_monitor(edid);
			hdmi_priv->has_hdmi_audio =
						drm_detect_monitor_audio(edid);
		}

		psb_intel_output->base.display_info.raw_edid = NULL;
@@ -184,13 +185,15 @@ static int cdv_hdmi_set_property(struct drm_connector *connector,
			return -1;
		}

		if (drm_connector_property_get_value(connector, property, &curValue))
		if (drm_connector_property_get_value(connector,
							property, &curValue))
			return -1;

		if (curValue == value)
			return 0;

		if (drm_connector_property_set_value(connector, property, value))
		if (drm_connector_property_set_value(connector,
							property, value))
			return -1;

		centre = (curValue == DRM_MODE_SCALE_NO_SCALE) ||
@@ -203,7 +206,8 @@ static int cdv_hdmi_set_property(struct drm_connector *connector,
					    encoder->crtc->x, encoder->crtc->y, encoder->crtc->fb))
					return -1;
			} else {
				struct drm_encoder_helper_funcs *helpers  = encoder->helper_private;
				struct drm_encoder_helper_funcs *helpers
						    = encoder->helper_private;
				helpers->mode_set(encoder, &crtc->saved_mode,
					     &crtc->saved_adjusted_mode);
			}
@@ -217,7 +221,8 @@ static int cdv_hdmi_set_property(struct drm_connector *connector,
 */
static int cdv_hdmi_get_modes(struct drm_connector *connector)
{
	struct psb_intel_output *psb_intel_output = to_psb_intel_output(connector);
	struct psb_intel_output *psb_intel_output =
					to_psb_intel_output(connector);
	struct edid *edid = NULL;
	int ret = 0;

@@ -250,8 +255,8 @@ static int cdv_hdmi_mode_valid(struct drm_connector *connector,
		return MODE_NO_INTERLACE;

	/*
	 * FIXME: fornow we limit the size to 1680x1050 on CDV, otherwise it will
	 * go beyond the stolen memory size allocated to the Framebuffer
	 * FIXME: for now we limit the size to 1680x1050 on CDV, otherwise it
	 * will go beyond the stolen memory size allocated to the framebuffer
	 */
	if (mode->hdisplay > 1680)
		return MODE_PANEL;
@@ -280,7 +285,8 @@ static const struct drm_encoder_helper_funcs cdv_hdmi_helper_funcs = {
	.commit = psb_intel_encoder_commit,
};

static const struct drm_connector_helper_funcs cdv_hdmi_connector_helper_funcs = {
static const struct drm_connector_helper_funcs
					cdv_hdmi_connector_helper_funcs = {
	.get_modes = cdv_hdmi_get_modes,
	.mode_valid = cdv_hdmi_mode_valid,
	.best_encoder = psb_intel_best_encoder,
@@ -296,7 +302,8 @@ static const struct drm_connector_funcs cdv_hdmi_connector_funcs = {
	.destroy = cdv_hdmi_destroy,
};

void cdv_hdmi_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev, int reg)
void cdv_hdmi_init(struct drm_device *dev,
			struct psb_intel_mode_device *mode_dev, int reg)
{
	struct psb_intel_output *psb_intel_output;
	struct drm_connector *connector;
@@ -334,7 +341,8 @@ void cdv_hdmi_init(struct drm_device *dev, struct psb_intel_mode_device *mode_de
	connector->interlace_allowed = false;
	connector->doublescan_allowed = false;

	drm_connector_attach_property(connector, dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_FULLSCREEN);
	drm_connector_attach_property(connector,
	    dev->mode_config.scaling_mode_property, DRM_MODE_SCALE_FULLSCREEN);

	switch (reg) {
	case SDVOB:
@@ -352,16 +360,12 @@ void cdv_hdmi_init(struct drm_device *dev, struct psb_intel_mode_device *mode_de
	psb_intel_output->ddc_bus = psb_intel_i2c_create(dev,
				ddc_bus, (reg == SDVOB) ? "HDMIB" : "HDMIC");

	if (psb_intel_output->ddc_bus) {
     		/* HACKS_JLIU7 */
		DRM_INFO("Enter cdv_hdmi_init, i2c_adapter is availabe.\n");

	} else {
		printk(KERN_ALERT "No ddc adapter available!\n");
	if (!psb_intel_output->ddc_bus) {
		dev_err(dev->dev, "No ddc adapter available!\n");
		goto failed_ddc;
	}
	psb_intel_output->hdmi_i2c_adapter = &(psb_intel_output->ddc_bus->adapter);

	psb_intel_output->hdmi_i2c_adapter =
				&(psb_intel_output->ddc_bus->adapter);
	hdmi_priv->dev = dev;
	drm_sysfs_connector_add(connector);
	return;
+12 −8
Original line number Diff line number Diff line
@@ -390,7 +390,8 @@ static void cdv_intel_lvds_mode_set(struct drm_encoder *encoder,
 * This connector should only have
 * been set up if the LVDS was actually connected anyway.
 */
static enum drm_connector_status cdv_intel_lvds_detect(struct drm_connector *connector, bool force)
static enum drm_connector_status cdv_intel_lvds_detect(
				struct drm_connector *connector, bool force)
{
	return connector_status_connected;
}
@@ -505,19 +506,22 @@ int cdv_intel_lvds_set_property(struct drm_connector *connector,
#ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
			struct drm_psb_private *dev_priv =
						encoder->dev->dev_private;
			struct backlight_device *bd = dev_priv->backlight_device;
			struct backlight_device *bd =
						dev_priv->backlight_device;
			bd->props.brightness = value;
			backlight_update_status(bd);
#endif
		}
	} else if (!strcmp(property->name, "DPMS") && encoder) {
		struct drm_encoder_helper_funcs *helpers = encoder->helper_private;
		struct drm_encoder_helper_funcs *helpers =
					encoder->helper_private;
		helpers->dpms(encoder, value);
	}
	return 0;
}

static const struct drm_encoder_helper_funcs cdv_intel_lvds_helper_funcs = {
static const struct drm_encoder_helper_funcs
					cdv_intel_lvds_helper_funcs = {
	.dpms = cdv_intel_lvds_encoder_dpms,
	.mode_fixup = cdv_intel_lvds_mode_fixup,
	.prepare = cdv_intel_lvds_prepare,