Commit bf5169db authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/i915/dsi: convert intel_dsi_vbt.[ch] to struct intel_display



Going forward, struct intel_display is the main display device data
pointer. Convert as much as possible of intel_dsi_vbt.[ch] to struct
intel_display.

Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://lore.kernel.org/r/d2a327c7121263cd67986a2d9199e18d7bf03acd.1742554320.git.jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 70c71634
Loading
Loading
Loading
Loading
+63 −68
Original line number Diff line number Diff line
@@ -102,13 +102,13 @@ static enum port intel_dsi_seq_port_to_port(struct intel_dsi *intel_dsi,
static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
				       const u8 *data)
{
	struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct mipi_dsi_device *dsi_device;
	u8 type, flags, seq_port;
	u16 len;
	enum port port;

	drm_dbg_kms(&dev_priv->drm, "\n");
	drm_dbg_kms(display->drm, "\n");

	flags = *data++;
	type = *data++;
@@ -120,12 +120,12 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,

	port = intel_dsi_seq_port_to_port(intel_dsi, seq_port);

	if (drm_WARN_ON(&dev_priv->drm, !intel_dsi->dsi_hosts[port]))
	if (drm_WARN_ON(display->drm, !intel_dsi->dsi_hosts[port]))
		goto out;

	dsi_device = intel_dsi->dsi_hosts[port]->device;
	if (!dsi_device) {
		drm_dbg_kms(&dev_priv->drm, "no dsi device for port %c\n",
		drm_dbg_kms(display->drm, "no dsi device for port %c\n",
			    port_name(port));
		goto out;
	}
@@ -150,8 +150,7 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
	case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM:
	case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM:
	case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM:
		drm_dbg(&dev_priv->drm,
			"Generic Read not yet implemented or used\n");
		drm_dbg_kms(display->drm, "Generic Read not yet implemented or used\n");
		break;
	case MIPI_DSI_GENERIC_LONG_WRITE:
		mipi_dsi_generic_write(dsi_device, data, len);
@@ -163,15 +162,14 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
		mipi_dsi_dcs_write_buffer(dsi_device, data, 2);
		break;
	case MIPI_DSI_DCS_READ:
		drm_dbg(&dev_priv->drm,
			"DCS Read not yet implemented or used\n");
		drm_dbg_kms(display->drm, "DCS Read not yet implemented or used\n");
		break;
	case MIPI_DSI_DCS_LONG_WRITE:
		mipi_dsi_dcs_write_buffer(dsi_device, data, len);
		break;
	}

	if (DISPLAY_VER(dev_priv) < 11)
	if (DISPLAY_VER(display) < 11)
		vlv_dsi_wait_for_fifo_empty(intel_dsi, port);

out:
@@ -182,10 +180,10 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,

static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data)
{
	struct drm_i915_private *i915 = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	u32 delay = *((const u32 *) data);

	drm_dbg_kms(&i915->drm, "%d usecs\n", delay);
	drm_dbg_kms(display->drm, "%d usecs\n", delay);

	usleep_range(delay, delay + 10);
	data += 4;
@@ -196,7 +194,7 @@ static const u8 *mipi_exec_delay(struct intel_dsi *intel_dsi, const u8 *data)
static void soc_gpio_set_value(struct intel_connector *connector, u8 gpio_index,
			       const char *con_id, u8 idx, bool value)
{
	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
	struct intel_display *display = to_intel_display(connector);
	/* XXX: this table is a quick ugly hack. */
	static struct gpio_desc *soc_gpio_table[U8_MAX + 1];
	struct gpio_desc *gpio_desc = soc_gpio_table[gpio_index];
@@ -204,10 +202,10 @@ static void soc_gpio_set_value(struct intel_connector *connector, u8 gpio_index,
	if (gpio_desc) {
		gpiod_set_value(gpio_desc, value);
	} else {
		gpio_desc = devm_gpiod_get_index(dev_priv->drm.dev, con_id, idx,
		gpio_desc = devm_gpiod_get_index(display->drm->dev, con_id, idx,
						 value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW);
		if (IS_ERR(gpio_desc)) {
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"GPIO index %u request failed (%pe)\n",
				gpio_index, gpio_desc);
			return;
@@ -242,16 +240,16 @@ static void soc_opaque_gpio_set_value(struct intel_connector *connector,
static void vlv_gpio_set_value(struct intel_connector *connector,
			       u8 gpio_source, u8 gpio_index, bool value)
{
	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
	struct intel_display *display = to_intel_display(connector);

	/* XXX: this assumes vlv_gpio_table only has NC GPIOs. */
	if (connector->panel.vbt.dsi.seq_version < 3) {
		if (gpio_source == 1) {
			drm_dbg_kms(&dev_priv->drm, "SC gpio not supported\n");
			drm_dbg_kms(display->drm, "SC gpio not supported\n");
			return;
		}
		if (gpio_source > 1) {
			drm_dbg_kms(&dev_priv->drm,
			drm_dbg_kms(display->drm,
				    "unknown gpio source %u\n", gpio_source);
			return;
		}
@@ -264,7 +262,7 @@ static void vlv_gpio_set_value(struct intel_connector *connector,
static void chv_gpio_set_value(struct intel_connector *connector,
			       u8 gpio_source, u8 gpio_index, bool value)
{
	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
	struct intel_display *display = to_intel_display(connector);

	if (connector->panel.vbt.dsi.seq_version >= 3) {
		if (gpio_index >= CHV_GPIO_IDX_START_SE) {
@@ -284,13 +282,13 @@ static void chv_gpio_set_value(struct intel_connector *connector,
	} else {
		/* XXX: The spec is unclear about CHV GPIO on seq v2 */
		if (gpio_source != 0) {
			drm_dbg_kms(&dev_priv->drm,
			drm_dbg_kms(display->drm,
				    "unknown gpio source %u\n", gpio_source);
			return;
		}

		if (gpio_index >= CHV_GPIO_IDX_START_E) {
			drm_dbg_kms(&dev_priv->drm,
			drm_dbg_kms(display->drm,
				    "invalid gpio index %u for GPIO N\n",
				    gpio_index);
			return;
@@ -320,13 +318,13 @@ enum {
	MIPI_VIO_EN_2,
};

static void icl_native_gpio_set_value(struct drm_i915_private *dev_priv,
static void icl_native_gpio_set_value(struct intel_display *display,
				      int gpio, bool value)
{
	struct intel_display *display = &dev_priv->display;
	struct drm_i915_private *dev_priv = to_i915(display->drm);
	int index;

	if (drm_WARN_ON(&dev_priv->drm, DISPLAY_VER(dev_priv) == 11 && gpio >= MIPI_RESET_2))
	if (drm_WARN_ON(display->drm, DISPLAY_VER(display) == 11 && gpio >= MIPI_RESET_2))
		return;

	switch (gpio) {
@@ -344,7 +342,7 @@ static void icl_native_gpio_set_value(struct drm_i915_private *dev_priv,
		 * modifications in irq setup and handling.
		 */
		spin_lock_irq(&dev_priv->irq_lock);
		intel_de_rmw(dev_priv, SHOTPLUG_CTL_DDI,
		intel_de_rmw(display, SHOTPLUG_CTL_DDI,
			     SHOTPLUG_CTL_DDI_HPD_ENABLE(index) |
			     SHOTPLUG_CTL_DDI_HPD_OUTPUT_DATA(index),
			     value ? SHOTPLUG_CTL_DDI_HPD_OUTPUT_DATA(index) : 0);
@@ -354,14 +352,14 @@ static void icl_native_gpio_set_value(struct drm_i915_private *dev_priv,
	case MIPI_AVDD_EN_2:
		index = gpio == MIPI_AVDD_EN_1 ? 0 : 1;

		intel_de_rmw(dev_priv, PP_CONTROL(dev_priv, index), PANEL_POWER_ON,
		intel_de_rmw(display, PP_CONTROL(display, index), PANEL_POWER_ON,
			     value ? PANEL_POWER_ON : 0);
		break;
	case MIPI_BKLT_EN_1:
	case MIPI_BKLT_EN_2:
		index = gpio == MIPI_BKLT_EN_1 ? 0 : 1;

		intel_de_rmw(dev_priv, PP_CONTROL(dev_priv, index), EDP_BLC_ENABLE,
		intel_de_rmw(display, PP_CONTROL(display, index), EDP_BLC_ENABLE,
			     value ? EDP_BLC_ENABLE : 0);
		break;
	case MIPI_AVEE_EN_1:
@@ -389,13 +387,12 @@ static void icl_native_gpio_set_value(struct drm_i915_private *dev_priv,

static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
{
	struct drm_device *dev = intel_dsi->base.base.dev;
	struct drm_i915_private *i915 = to_i915(dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct intel_connector *connector = intel_dsi->attached_connector;
	u8 gpio_source = 0, gpio_index = 0, gpio_number;
	bool value;
	int size;
	bool native = DISPLAY_VER(i915) >= 11;
	bool native = DISPLAY_VER(display) >= 11;

	if (connector->panel.vbt.dsi.seq_version >= 3) {
		size = 3;
@@ -416,16 +413,16 @@ static const u8 *mipi_exec_gpio(struct intel_dsi *intel_dsi, const u8 *data)
			gpio_source = (data[1] >> 1) & 3;
	}

	drm_dbg_kms(&i915->drm, "GPIO index %u, number %u, source %u, native %s, set to %s\n",
	drm_dbg_kms(display->drm, "GPIO index %u, number %u, source %u, native %s, set to %s\n",
		    gpio_index, gpio_number, gpio_source, str_yes_no(native), str_on_off(value));

	if (native)
		icl_native_gpio_set_value(i915, gpio_number, value);
	else if (DISPLAY_VER(i915) >= 9)
		icl_native_gpio_set_value(display, gpio_number, value);
	else if (DISPLAY_VER(display) >= 9)
		bxt_gpio_set_value(connector, gpio_index, value);
	else if (IS_VALLEYVIEW(i915))
	else if (display->platform.valleyview)
		vlv_gpio_set_value(connector, gpio_source, gpio_number, value);
	else if (IS_CHERRYVIEW(i915))
	else if (display->platform.cherryview)
		chv_gpio_set_value(connector, gpio_source, gpio_number, value);

	return data + size;
@@ -463,8 +460,8 @@ static int i2c_adapter_lookup(struct acpi_resource *ares, void *data)
static void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,
				  const u16 target_addr)
{
	struct drm_device *drm_dev = intel_dsi->base.base.dev;
	struct acpi_device *adev = ACPI_COMPANION(drm_dev->dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct acpi_device *adev = ACPI_COMPANION(display->drm->dev);
	struct i2c_adapter_lookup lookup = {
		.target_addr = target_addr,
		.intel_dsi = intel_dsi,
@@ -484,7 +481,7 @@ static inline void i2c_acpi_find_adapter(struct intel_dsi *intel_dsi,

static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
{
	struct drm_i915_private *i915 = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct i2c_adapter *adapter;
	struct i2c_msg msg;
	int ret;
@@ -494,7 +491,7 @@ static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)
	u8 payload_size = *(data + 6);
	u8 *payload_data;

	drm_dbg_kms(&i915->drm, "bus %d target-addr 0x%02x reg 0x%02x data %*ph\n",
	drm_dbg_kms(display->drm, "bus %d target-addr 0x%02x reg 0x%02x data %*ph\n",
		    vbt_i2c_bus_num, target_addr, reg_offset, payload_size, data + 7);

	if (intel_dsi->i2c_bus_num < 0) {
@@ -504,7 +501,7 @@ static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)

	adapter = i2c_get_adapter(intel_dsi->i2c_bus_num);
	if (!adapter) {
		drm_err(&i915->drm, "Cannot find a valid i2c bus for xfer\n");
		drm_err(display->drm, "Cannot find a valid i2c bus for xfer\n");
		goto err_bus;
	}

@@ -522,7 +519,7 @@ static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)

	ret = i2c_transfer(adapter, &msg, 1);
	if (ret < 0)
		drm_err(&i915->drm,
		drm_err(display->drm,
			"Failed to xfer payload of size (%u) to reg (%u)\n",
			payload_size, reg_offset);

@@ -535,16 +532,16 @@ static const u8 *mipi_exec_i2c(struct intel_dsi *intel_dsi, const u8 *data)

static const u8 *mipi_exec_spi(struct intel_dsi *intel_dsi, const u8 *data)
{
	struct drm_i915_private *i915 = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);

	drm_dbg_kms(&i915->drm, "Skipping SPI element execution\n");
	drm_dbg_kms(display->drm, "Skipping SPI element execution\n");

	return data + *(data + 5) + 6;
}

static const u8 *mipi_exec_pmic(struct intel_dsi *intel_dsi, const u8 *data)
{
	struct drm_i915_private *i915 = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
#ifdef CONFIG_PMIC_OPREGION
	u32 value, mask, reg_address;
	u16 i2c_address;
@@ -560,9 +557,9 @@ static const u8 *mipi_exec_pmic(struct intel_dsi *intel_dsi, const u8 *data)
							reg_address,
							value, mask);
	if (ret)
		drm_err(&i915->drm, "%s failed, error: %d\n", __func__, ret);
		drm_err(display->drm, "%s failed, error: %d\n", __func__, ret);
#else
	drm_err(&i915->drm,
	drm_err(display->drm,
		"Your hardware requires CONFIG_PMIC_OPREGION and it is not set\n");
#endif

@@ -612,12 +609,12 @@ static const char *sequence_name(enum mipi_seq seq_id)
static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi,
			       enum mipi_seq seq_id)
{
	struct drm_i915_private *dev_priv = to_i915(intel_dsi->base.base.dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct intel_connector *connector = intel_dsi->attached_connector;
	const u8 *data;
	fn_mipi_elem_exec mipi_elem_exec;

	if (drm_WARN_ON(&dev_priv->drm,
	if (drm_WARN_ON(display->drm,
			seq_id >= ARRAY_SIZE(connector->panel.vbt.dsi.sequence)))
		return;

@@ -625,9 +622,9 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi,
	if (!data)
		return;

	drm_WARN_ON(&dev_priv->drm, *data != seq_id);
	drm_WARN_ON(display->drm, *data != seq_id);

	drm_dbg_kms(&dev_priv->drm, "Starting MIPI sequence %d - %s\n",
	drm_dbg_kms(display->drm, "Starting MIPI sequence %d - %s\n",
		    seq_id, sequence_name(seq_id));

	/* Skip Sequence Byte. */
@@ -657,19 +654,19 @@ static void intel_dsi_vbt_exec(struct intel_dsi *intel_dsi,

			/* Consistency check if we have size. */
			if (operation_size && data != next) {
				drm_err(&dev_priv->drm,
				drm_err(display->drm,
					"Inconsistent operation size\n");
				return;
			}
		} else if (operation_size) {
			/* We have size, skip. */
			drm_dbg_kms(&dev_priv->drm,
			drm_dbg_kms(display->drm,
				    "Unsupported MIPI operation byte %u\n",
				    operation_byte);
			data += operation_size;
		} else {
			/* No size, can't skip without parsing. */
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"Unsupported MIPI operation byte %u\n",
				operation_byte);
			return;
@@ -754,8 +751,7 @@ static enum mipi_dsi_pixel_format vbt_to_dsi_pixel_format(unsigned int format)

bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
{
	struct drm_device *dev = intel_dsi->base.base.dev;
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct intel_connector *connector = intel_dsi->attached_connector;
	struct mipi_config *mipi_config = connector->panel.vbt.dsi.config;
	struct mipi_pps_data *pps = connector->panel.vbt.dsi.pps;
@@ -763,7 +759,7 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
	u16 burst_mode_ratio;
	enum port port;

	drm_dbg_kms(&dev_priv->drm, "\n");
	drm_dbg_kms(display->drm, "\n");

	intel_dsi->eotp_pkt = mipi_config->eot_pkt_disabled ? 0 : 1;
	intel_dsi->clock_stop = mipi_config->enable_clk_stop ? 1 : 0;
@@ -809,7 +805,7 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
		u32 bitrate;

		if (mipi_config->target_burst_mode_freq == 0) {
			drm_err(&dev_priv->drm, "Burst mode target is not set\n");
			drm_err(display->drm, "Burst mode target is not set\n");
			return false;
		}

@@ -826,7 +822,7 @@ bool intel_dsi_vbt_init(struct intel_dsi *intel_dsi, u16 panel_id)
			mipi_config->target_burst_mode_freq = bitrate;

		if (mipi_config->target_burst_mode_freq < bitrate) {
			drm_err(&dev_priv->drm, "Burst mode freq is less than computed\n");
			drm_err(display->drm, "Burst mode freq is less than computed\n");
			return false;
		}

@@ -890,8 +886,7 @@ static const struct pinctrl_map soc_pwm_pinctrl_map[] = {

void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
{
	struct drm_device *dev = intel_dsi->base.base.dev;
	struct drm_i915_private *dev_priv = to_i915(dev);
	struct intel_display *display = to_intel_display(&intel_dsi->base);
	struct intel_connector *connector = intel_dsi->attached_connector;
	struct mipi_config *mipi_config = connector->panel.vbt.dsi.config;
	enum gpiod_flags flags = panel_is_on ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW;
@@ -901,13 +896,13 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
	struct pinctrl *pinctrl;
	int ret;

	if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
	if ((display->platform.valleyview || display->platform.cherryview) &&
	    mipi_config->pwm_blc == PPS_BLC_PMIC) {
		gpiod_lookup_table = &pmic_panel_gpio_table;
		want_panel_gpio = true;
	}

	if (IS_VALLEYVIEW(dev_priv) && mipi_config->pwm_blc == PPS_BLC_SOC) {
	if (display->platform.valleyview && mipi_config->pwm_blc == PPS_BLC_SOC) {
		gpiod_lookup_table = &soc_panel_gpio_table;
		want_panel_gpio = true;
		want_backlight_gpio = true;
@@ -916,12 +911,12 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
		ret = pinctrl_register_mappings(soc_pwm_pinctrl_map,
					     ARRAY_SIZE(soc_pwm_pinctrl_map));
		if (ret)
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"Failed to register pwm0 pinmux mapping\n");

		pinctrl = devm_pinctrl_get_select(dev->dev, "soc_pwm0");
		pinctrl = devm_pinctrl_get_select(display->drm->dev, "soc_pwm0");
		if (IS_ERR(pinctrl))
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"Failed to set pinmux to PWM\n");
	}

@@ -929,9 +924,9 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)
		gpiod_add_lookup_table(gpiod_lookup_table);

	if (want_panel_gpio) {
		intel_dsi->gpio_panel = devm_gpiod_get(dev->dev, "panel", flags);
		intel_dsi->gpio_panel = devm_gpiod_get(display->drm->dev, "panel", flags);
		if (IS_ERR(intel_dsi->gpio_panel)) {
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"Failed to own gpio for panel control\n");
			intel_dsi->gpio_panel = NULL;
		}
@@ -939,9 +934,9 @@ void intel_dsi_vbt_gpio_init(struct intel_dsi *intel_dsi, bool panel_is_on)

	if (want_backlight_gpio) {
		intel_dsi->gpio_backlight =
			devm_gpiod_get(dev->dev, "backlight", flags);
			devm_gpiod_get(display->drm->dev, "backlight", flags);
		if (IS_ERR(intel_dsi->gpio_backlight)) {
			drm_err(&dev_priv->drm,
			drm_err(display->drm,
				"Failed to own gpio for backlight control\n");
			intel_dsi->gpio_backlight = NULL;
		}