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

Commit fdef8f99 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "i2c: i2c-qcom-geni: Reinitialize the variables after every transfer"

parents fdb03eae 07d4b903
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
/* Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
/* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -287,6 +287,7 @@ static const char *const gpi_cb_event_str[MSM_GPI_QUP_MAX_EVENT] = {
	[MSM_GPI_QUP_NOTIFY] = "NOTIFY",
	[MSM_GPI_QUP_ERROR] = "GLOBAL ERROR",
	[MSM_GPI_QUP_CH_ERROR] = "CHAN ERROR",
	[MSM_GPI_QUP_FW_ERROR] = "UNHANDLED ERROR",
	[MSM_GPI_QUP_PENDING_EVENT] = "PENDING EVENT",
	[MSM_GPI_QUP_EOT_DESC_MISMATCH] = "EOT/DESC MISMATCH",
	[MSM_GPI_QUP_SW_ERROR] = "SW ERROR",
@@ -2191,6 +2192,10 @@ int gpi_terminate_all(struct dma_chan *chan)
		if (ret) {
			GPII_ERR(gpii, gpii_chan->chid,
				 "Error resetting channel ret:%d\n", ret);
			if (!gpii->reg_table_dump) {
				gpi_dump_debug_reg(gpii);
				gpii->reg_table_dump = true;
			}
			goto terminate_exit;
		}

+15 −12
Original line number Diff line number Diff line
@@ -395,6 +395,7 @@ static void gi2c_ev_cb(struct dma_chan *ch, struct msm_gpi_cb const *cb_str,
	case MSM_GPI_QUP_MAX_EVENT:
		/* fall through to stall impacted channel */
	case MSM_GPI_QUP_CH_ERROR:
	case MSM_GPI_QUP_FW_ERROR:
	case MSM_GPI_QUP_PENDING_EVENT:
	case MSM_GPI_QUP_EOT_DESC_MISMATCH:
		break;
@@ -413,8 +414,8 @@ static void gi2c_ev_cb(struct dma_chan *ch, struct msm_gpi_cb const *cb_str,
	if (cb_str->cb_event != MSM_GPI_QUP_NOTIFY)
		GENI_SE_ERR(gi2c->ipcl, true, gi2c->dev,
			"GSI QN err:0x%x, status:0x%x, err:%d\n",
				cb_str->error_log.error_code,
				m_stat, cb_str->cb_event);
			cb_str->error_log.error_code, m_stat,
			cb_str->cb_event);
}

static void gi2c_gsi_cb_err(struct msm_gpi_dma_async_tx_cb_param *cb,
@@ -538,6 +539,7 @@ static int geni_i2c_gsi_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
		struct msm_gpi_tre *go_t = &gi2c->go_t;
		struct device *rx_dev = gi2c->wrapper_dev;
		struct device *tx_dev = gi2c->wrapper_dev;
		reinit_completion(&gi2c->xfer);

		gi2c->cur = &msgs[i];
		qcom_geni_i2c_calc_timeout(gi2c);
@@ -708,7 +710,14 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,
	int i, ret = 0, timeout = 0;

	gi2c->err = 0;
	reinit_completion(&gi2c->xfer);

	/* Client to respect system suspend */
	if (!pm_runtime_enabled(gi2c->dev)) {
		GENI_SE_ERR(gi2c->ipcl, false, gi2c->dev,
			"%s: System suspended\n", __func__);
		return -EACCES;
	}

	mutex_lock(&gi2c->i2c_ssr.ssr_lock);
	if (gi2c->i2c_ssr.is_ssr_down) {
		GENI_SE_DBG(gi2c->ipcl, false, gi2c->dev,
@@ -716,12 +725,6 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,
		mutex_unlock(&gi2c->i2c_ssr.ssr_lock);
		return -EINVAL;
	}
	/* Client to respect system suspend */
	if (!pm_runtime_enabled(gi2c->dev)) {
		GENI_SE_ERR(gi2c->ipcl, false, gi2c->dev,
			"%s: System suspended\n", __func__);
		return -EACCES;
	}

	ret = pm_runtime_get_sync(gi2c->dev);
	if (ret < 0) {
@@ -856,6 +859,8 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,
				geni_abort_m_cmd(gi2c->base);
			}
		}
		gi2c->cur_wr = 0;
		gi2c->cur_rd = 0;

		gi2c->cur_wr = 0;
		gi2c->cur_rd = 0;
@@ -889,8 +894,6 @@ static int geni_i2c_xfer(struct i2c_adapter *adap,

	pm_runtime_mark_last_busy(gi2c->dev);
	pm_runtime_put_autosuspend(gi2c->dev);
	gi2c->cur_wr = 0;
	gi2c->cur_rd = 0;
	gi2c->cur = NULL;
	gi2c->err = 0;
	GENI_SE_DBG(gi2c->ipcl, false, gi2c->dev,