From 5ad2f9de06597b1c2ce204cff653b53fb596c5f4 Mon Sep 17 00:00:00 2001 From: Mukesh Kumar Savaliya Date: Mon, 30 Aug 2021 23:11:03 +0530 Subject: [PATCH] i2c: i2c-msm-geni: Do i2c transfer if GENI IOS in proper state This change ensures the IOS lines are in protocol default state before starting the data transfer. This ensures the slave is properly powered up and also protocol lines are in IDLE High state. We can prevent any further try to send data which can be failed due to lines not in proper state. Change-Id: Ibd9a6109133dd776f86a841f8bde305d08d2c187 Signed-off-by: Mukesh Kumar Savaliya --- drivers/i2c/busses/i2c-msm-geni.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/i2c/busses/i2c-msm-geni.c b/drivers/i2c/busses/i2c-msm-geni.c index c850bdce9f70..d1c7af60c50f 100644 --- a/drivers/i2c/busses/i2c-msm-geni.c +++ b/drivers/i2c/busses/i2c-msm-geni.c @@ -243,6 +243,8 @@ err_ret: static int geni_i2c_prepare(struct geni_i2c_dev *gi2c) { + u32 geni_ios = 0; + if (gi2c->se_mode == UNINITIALIZED) { int proto = get_se_proto(gi2c->base); u32 se_mode; @@ -254,6 +256,16 @@ static int geni_i2c_prepare(struct geni_i2c_dev *gi2c) return -ENXIO; } + geni_ios = geni_read_reg_nolog(gi2c->base, SE_GENI_IOS); + if ((geni_ios & 0x3) != 0x3) { //SCL:b'1, SDA:b'0 + GENI_SE_DBG(gi2c->ipcl, true, gi2c->dev, + "IO lines not in good state, Check power to slave\n"); + + if (!gi2c->is_le_vm) + se_geni_resources_off(&gi2c->i2c_rsc); + return -ENXIO; + } + se_mode = readl_relaxed(gi2c->base + GENI_IF_FIFO_DISABLE_RO); if (se_mode) {