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

Commit fe9e8238 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/dp: fix AUX initialization sequence"

parents 6862a708 344498e0
Loading
Loading
Loading
Loading
+27 −3
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ struct dp_aux_private {
	bool cmd_busy;
	bool native;
	bool read;
	bool no_send_addr;
	bool no_send_stop;

	struct drm_dp_aux drm_aux;
};
@@ -103,8 +105,15 @@ static u32 dp_aux_write(struct dp_aux_private *aux,
	}

	reg = 0; /* Transaction number == 1 */
	if (!aux->native) /* i2c */
		reg |= (BIT(8) | BIT(10) | BIT(11));
	if (!aux->native) { /* i2c */
		reg |= BIT(8);

		if (aux->no_send_addr)
			reg |= BIT(10);

		if (aux->no_send_stop)
			reg |= BIT(11);
	}

	reg |= BIT(9);
	aux->catalog->data = reg;
@@ -150,7 +159,7 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux,
{
	u32 data;
	u8 *dp;
	u32 i;
	u32 i, actual_i;
	u32 len = msg->size;

	data = 0;
@@ -168,6 +177,11 @@ static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux,
	for (i = 0; i < len; i++) {
		data = aux->catalog->read_data(aux->catalog);
		*dp++ = (u8)((data >> 8) & 0xff);

		actual_i = (data >> 16) & 0xFF;
		if (i != actual_i)
			pr_warn("Index mismatch: expected %d, found %d\n",
				i, actual_i);
	}
}

@@ -288,6 +302,14 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux,
		goto unlock_exit;
	}

	if (aux->read) {
		aux->no_send_addr = true;
		aux->no_send_stop = false;
	} else {
		aux->no_send_addr = true;
		aux->no_send_stop = true;
	}

	ret = dp_aux_cmd_fifo_tx(aux, msg);
	if ((ret < 0) && aux->native) {
		aux->retry_cnt++;
@@ -300,6 +322,8 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *drm_aux,
		goto unlock_exit;
	}

	aux->catalog->clear_trans(aux->catalog);

	if (aux->aux_error_num == DP_AUX_ERR_NONE) {
		if (aux->read)
			dp_aux_cmd_fifo_rx(aux, msg);
+26 −3
Original line number Diff line number Diff line
@@ -131,6 +131,29 @@ static int dp_catalog_aux_write_trans(struct dp_catalog_aux *aux)
	return rc;
}

static int dp_catalog_aux_clear_trans(struct dp_catalog_aux *aux)
{
	int rc = 0;
	u32 data;
	struct dp_catalog_private *catalog;
	void __iomem *base;

	if (!aux) {
		pr_err("invalid input\n");
		rc = -EINVAL;
		goto end;
	}

	dp_catalog_get_priv(aux);
	base = catalog->io->ctrl_io.base;

	data = dp_read(base + DP_AUX_TRANS_CTRL);
	data &= ~BIT(9);
	dp_write(base + DP_AUX_TRANS_CTRL, data);
end:
	return rc;
}

static void dp_catalog_aux_reset(struct dp_catalog_aux *aux)
{
	u32 aux_ctrl;
@@ -219,13 +242,12 @@ static void dp_catalog_aux_setup(struct dp_catalog_aux *aux,

	dp_catalog_get_priv(aux);

	dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x02);
	dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x65);
	wmb(); /* make sure PD programming happened */
	dp_write(catalog->io->phy_io.base + DP_PHY_PD_CTL, 0x7d);

	/* Turn on BIAS current for PHY/PLL */
	dp_write(catalog->io->dp_pll_io.base +
		QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x3f);
		QSERDES_COM_BIAS_EN_CLKBUFLR_EN, 0x1b);

	/* DP AUX CFG register programming */
	for (i = 0; i < PHY_AUX_CFG_MAX; i++) {
@@ -1213,6 +1235,7 @@ struct dp_catalog *dp_catalog_get(struct device *dev, struct dp_io *io)
		.read_data     = dp_catalog_aux_read_data,
		.write_data    = dp_catalog_aux_write_data,
		.write_trans   = dp_catalog_aux_write_trans,
		.clear_trans   = dp_catalog_aux_clear_trans,
		.reset         = dp_catalog_aux_reset,
		.update_aux_cfg = dp_catalog_aux_update_cfg,
		.enable        = dp_catalog_aux_enable,
+1 −0
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ struct dp_catalog_aux {
	u32 (*read_data)(struct dp_catalog_aux *aux);
	int (*write_data)(struct dp_catalog_aux *aux);
	int (*write_trans)(struct dp_catalog_aux *aux);
	int (*clear_trans)(struct dp_catalog_aux *aux);
	void (*reset)(struct dp_catalog_aux *aux);
	void (*enable)(struct dp_catalog_aux *aux, bool enable);
	void (*update_aux_cfg)(struct dp_catalog_aux *aux,
+4 −2
Original line number Diff line number Diff line
@@ -472,6 +472,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)
	u32 max_pclk_from_edid = 0;
	struct edid *edid;

	dp->aux->init(dp->aux, dp->parser->aux_cfg);

	rc = dp->panel->read_sink_caps(dp->panel, dp->dp_display.connector);
	if (rc)
		return rc;
@@ -515,7 +517,6 @@ static void dp_display_host_init(struct dp_display_private *dp)

	dp->power->init(dp->power, flip);
	dp->ctrl->init(dp->ctrl, flip);
	dp->aux->init(dp->aux, dp->parser->aux_cfg);
	enable_irq(dp->irq);
	dp->core_initialized = true;
}
@@ -527,7 +528,6 @@ static void dp_display_host_deinit(struct dp_display_private *dp)
		return;
	}

	dp->aux->deinit(dp->aux);
	dp->ctrl->deinit(dp->ctrl);
	dp->power->deinit(dp->power);
	disable_irq(dp->irq);
@@ -548,6 +548,8 @@ static void dp_display_process_hpd_low(struct dp_display_private *dp)
		dp->audio->off(dp->audio);

	dp_display_send_hpd_notification(dp, false);

	dp->aux->deinit(dp->aux);
}

static int dp_display_usbpd_configure_cb(struct device *dev)