Commit d82b9a89 authored by Ville Syrjälä's avatar Ville Syrjälä
Browse files

drm/i915/dvo: Flatten intel_dvo_init()



The loop over intel_dvo_devices[] makes intel_dvo_init()
an ugly mess. Pull the i2c device probe out to a separate
function so that we can get rid of the loop and flatten
the code.

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221118105525.27254-7-ville.syrjala@linux.intel.com


Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
parent c584f86c
Loading
Loading
Loading
Loading
+117 −100
Original line number Diff line number Diff line
@@ -415,44 +415,15 @@ static int intel_dvo_connector_type(const struct intel_dvo_device *dvo)
	}
}

void intel_dvo_init(struct drm_i915_private *dev_priv)
static bool intel_dvo_init_dev(struct drm_i915_private *dev_priv,
			       struct intel_dvo *intel_dvo,
			       const struct intel_dvo_device *dvo)
{
	struct intel_encoder *intel_encoder;
	struct intel_dvo *intel_dvo;
	struct intel_connector *intel_connector;
	int i;

	intel_dvo = kzalloc(sizeof(*intel_dvo), GFP_KERNEL);
	if (!intel_dvo)
		return;

	intel_connector = intel_connector_alloc();
	if (!intel_connector) {
		kfree(intel_dvo);
		return;
	}

	intel_dvo->attached_connector = intel_connector;

	intel_encoder = &intel_dvo->base;

	intel_encoder->disable = intel_disable_dvo;
	intel_encoder->enable = intel_enable_dvo;
	intel_encoder->get_hw_state = intel_dvo_get_hw_state;
	intel_encoder->get_config = intel_dvo_get_config;
	intel_encoder->compute_config = intel_dvo_compute_config;
	intel_encoder->pre_enable = intel_dvo_pre_enable;
	intel_connector->get_hw_state = intel_dvo_connector_get_hw_state;

	/* Now, try to find a controller */
	for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
		struct drm_connector *connector = &intel_connector->base;
		const struct intel_dvo_device *dvo = &intel_dvo_devices[i];
	struct i2c_adapter *i2c;
		int gpio;
		bool dvoinit;
		enum pipe pipe;
	u32 dpll[I915_MAX_PIPES];
	enum pipe pipe;
	int gpio;
	bool ret;

	/*
	 * Allow the I2C driver info to specify the GPIO to be used in
@@ -484,8 +455,8 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
	/*
	 * ns2501 requires the DVO 2x clock before it will
	 * respond to i2c accesses, so make sure we have
		 * have the clock enabled before we attempt to
		 * initialize the device.
	 * the clock enabled before we attempt to initialize
	 * the device.
	 */
	for_each_pipe(dev_priv, pipe) {
		dpll[pipe] = intel_de_read(dev_priv, DPLL(pipe));
@@ -493,7 +464,7 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)
			       dpll[pipe] | DPLL_DVO_2X_MODE);
	}

		dvoinit = dvo->dev_ops->init(&intel_dvo->dev, i2c);
	ret = dvo->dev_ops->init(&intel_dvo->dev, i2c);

	/* restore the DVO 2x clock state to original */
	for_each_pipe(dev_priv, pipe) {
@@ -502,37 +473,89 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)

	intel_gmbus_force_bit(i2c, false);

		if (!dvoinit)
			continue;
	return ret;
}

static bool intel_dvo_probe(struct drm_i915_private *dev_priv,
			    struct intel_dvo *intel_dvo)
{
	int i;

	/* Now, try to find a controller */
	for (i = 0; i < ARRAY_SIZE(intel_dvo_devices); i++) {
		if (intel_dvo_init_dev(dev_priv, intel_dvo,
				       &intel_dvo_devices[i]))
			return true;
	}

	return false;
}

void intel_dvo_init(struct drm_i915_private *dev_priv)
{
	struct intel_encoder *intel_encoder;
	struct intel_dvo *intel_dvo;
	struct intel_connector *intel_connector;
	struct drm_connector *connector;

	intel_dvo = kzalloc(sizeof(*intel_dvo), GFP_KERNEL);
	if (!intel_dvo)
		return;

	intel_connector = intel_connector_alloc();
	if (!intel_connector) {
		kfree(intel_dvo);
		return;
	}

	connector = &intel_connector->base;

	intel_dvo->attached_connector = intel_connector;

	intel_encoder = &intel_dvo->base;

	intel_encoder->disable = intel_disable_dvo;
	intel_encoder->enable = intel_enable_dvo;
	intel_encoder->get_hw_state = intel_dvo_get_hw_state;
	intel_encoder->get_config = intel_dvo_get_config;
	intel_encoder->compute_config = intel_dvo_compute_config;
	intel_encoder->pre_enable = intel_dvo_pre_enable;
	intel_connector->get_hw_state = intel_dvo_connector_get_hw_state;

	if (!intel_dvo_probe(dev_priv, intel_dvo)) {
		kfree(intel_dvo);
		intel_connector_free(intel_connector);
		return;
	}

	intel_encoder->type = INTEL_OUTPUT_DVO;
	intel_encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
		intel_encoder->port = intel_dvo_port(dvo->dvo_reg);
	intel_encoder->port = intel_dvo_port(intel_dvo->dev.dvo_reg);
	intel_encoder->pipe_mask = ~0;

		if (dvo->type != INTEL_DVO_CHIP_LVDS)
	if (intel_dvo->dev.type != INTEL_DVO_CHIP_LVDS)
		intel_encoder->cloneable = BIT(INTEL_OUTPUT_ANALOG) |
			BIT(INTEL_OUTPUT_DVO);

	drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
			 &intel_dvo_enc_funcs,
				 intel_dvo_encoder_type(dvo),
			 intel_dvo_encoder_type(&intel_dvo->dev),
			 "DVO %c", port_name(intel_encoder->port));

		if (dvo->type == INTEL_DVO_CHIP_TMDS)
	if (intel_dvo->dev.type == INTEL_DVO_CHIP_TMDS)
		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT |
			DRM_CONNECTOR_POLL_DISCONNECT;

	drm_connector_init(&dev_priv->drm, connector,
			   &intel_dvo_connector_funcs,
				   intel_dvo_connector_type(dvo));
			   intel_dvo_connector_type(&intel_dvo->dev));

	drm_connector_helper_add(connector,
				 &intel_dvo_connector_helper_funcs);
	connector->display_info.subpixel_order = SubPixelHorizontalRGB;

	intel_connector_attach_encoder(intel_connector, intel_encoder);
		if (dvo->type == INTEL_DVO_CHIP_LVDS) {
	if (intel_dvo->dev.type == INTEL_DVO_CHIP_LVDS) {
		/*
		 * For our LVDS chipsets, we should hopefully be able
		 * to dig the fixed panel mode out of the BIOS data.
@@ -546,10 +569,4 @@ void intel_dvo_init(struct drm_i915_private *dev_priv)

		intel_panel_init(intel_connector);
	}

		return;
	}

	kfree(intel_dvo);
	intel_connector_free(intel_connector);
}