summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorAlok Chauhan <alokc@nvidia.com>2011-05-26 11:31:25 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:47:06 -0800
commit078e429720d8021248c832cc60558ed8aa9bfc89 (patch)
tree57661a4081770edc9446728057c08b2a384f13ad /drivers/i2c
parent7359d83b54df8dc87e33833d5fedf76415ac8871 (diff)
i2c: tegra: Remove the synchronization between isr and caller
Remove the handling of synchronisation between isr and caller. This change has become obsolete because now clock driver will make sure that any write operations will be completed before disabling the driver clock. Original-Change-Id: I95957351fd1f291a59182fddbb619ffd02a0db63 Reviewed-on: http://git-master/r/33099 Reviewed-by: Bo Yan <byan@nvidia.com> Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com> Tested-by: Alok Chauhan <alokc@nvidia.com> Rebase-Id: Rec9671e9283870630fda6ceb977b99b92c3a99a9
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-tegra.c46
1 files changed, 8 insertions, 38 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 58cf7030860f..b9f155c14665 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -146,12 +146,10 @@ struct tegra_i2c_dev {
struct clk *clk;
struct resource *iomem;
struct rt_mutex dev_lock;
- spinlock_t clk_lock;
void __iomem *base;
int cont_id;
int irq;
bool irq_disabled;
- bool controller_enabled;
int is_dvc;
bool is_slave;
struct completion msg_complete;
@@ -446,14 +444,6 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
u32 status;
const u32 status_err = I2C_INT_NO_ACK | I2C_INT_ARBITRATION_LOST | I2C_INT_TX_FIFO_OVERFLOW;
struct tegra_i2c_dev *i2c_dev = dev_id;
- unsigned long flags;
-
- spin_lock_irqsave(&i2c_dev->clk_lock, flags);
- if (!i2c_dev->controller_enabled) {
- dev_warn(i2c_dev->dev, "Controller not enabled\n");
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
- return IRQ_NONE;
- }
status = i2c_readl(i2c_dev, I2C_INT_STATUS);
@@ -467,6 +457,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
i2c_dev->irq_disabled = 1;
}
+ complete(&i2c_dev->msg_complete);
goto err;
}
@@ -495,6 +486,8 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
dev_warn(i2c_dev->dev, "Packet status 0x%08x\n",
i2c_readl(i2c_dev, I2C_PACKET_TRANSFER_STATUS));
}
+ complete(&i2c_dev->msg_complete);
+
goto err;
}
@@ -510,6 +503,7 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
i2c_dev->irq_disabled = 1;
}
+ complete(&i2c_dev->msg_complete);
goto err;
}
@@ -527,17 +521,15 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id)
tegra_i2c_mask_irq(i2c_dev, I2C_INT_TX_FIFO_DATA_REQ);
}
- i2c_writel(i2c_dev, status, I2C_INT_STATUS);
-
- if (i2c_dev->is_dvc)
- dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
-
if (status & I2C_INT_PACKET_XFER_COMPLETE) {
BUG_ON(i2c_dev->msg_buf_remaining);
complete(&i2c_dev->msg_complete);
}
+ i2c_writel(i2c_dev, status, I2C_INT_STATUS);
+
+ if (i2c_dev->is_dvc)
+ dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
return IRQ_HANDLED;
err:
@@ -571,8 +563,6 @@ err:
if (i2c_dev->is_dvc)
dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS);
- complete(&i2c_dev->msg_complete);
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
return IRQ_HANDLED;
}
@@ -582,7 +572,6 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_bus *i2c_bus,
struct tegra_i2c_dev *i2c_dev = i2c_bus->dev;
u32 int_mask;
int ret;
- unsigned long flags;
tegra_i2c_flush_fifos(i2c_dev);
@@ -639,10 +628,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_bus *i2c_bus,
"i2c transfer timed out, addr 0x%04x, data 0x%02x\n",
msg->addr, msg->buf[0]);
- spin_lock_irqsave(&i2c_dev->clk_lock, flags);
- i2c_dev->controller_enabled = false;
tegra_i2c_init(i2c_dev);
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
return -ETIMEDOUT;
}
@@ -652,11 +638,7 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_bus *i2c_bus,
if (likely(i2c_dev->msg_err == I2C_ERR_NONE))
return 0;
- spin_lock_irqsave(&i2c_dev->clk_lock, flags);
- i2c_dev->controller_enabled = false;
tegra_i2c_init(i2c_dev);
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
-
if (i2c_dev->msg_err == I2C_ERR_NO_ACK) {
if (msg->flags & I2C_M_IGNORE_NAK)
return 0;
@@ -676,7 +658,6 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
struct tegra_i2c_dev *i2c_dev = i2c_bus->dev;
int i;
int ret = 0;
- unsigned long flags;
if (i2c_dev->is_suspended)
return -EBUSY;
@@ -702,11 +683,6 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
if (!i2c_dev->is_clkon_always)
clk_enable(i2c_dev->clk);
-
- spin_lock_irqsave(&i2c_dev->clk_lock, flags);
- i2c_dev->controller_enabled = true;
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
-
for (i = 0; i < num; i++) {
int stop = (i == (num - 1)) ? 1 : 0;
ret = tegra_i2c_xfer_msg(i2c_bus, &msgs[i], stop);
@@ -714,10 +690,6 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
break;
}
- spin_lock_irqsave(&i2c_dev->clk_lock, flags);
- i2c_dev->controller_enabled = false;
- spin_unlock_irqrestore(&i2c_dev->clk_lock, flags);
-
if (!i2c_dev->is_clkon_always)
clk_disable(i2c_dev->clk);
@@ -827,9 +799,7 @@ static int tegra_i2c_probe(struct platform_device *pdev)
i2c_dev->msgs = NULL;
i2c_dev->msgs_num = 0;
- i2c_dev->controller_enabled = false;
rt_mutex_init(&i2c_dev->dev_lock);
- spin_lock_init(&i2c_dev->clk_lock);
i2c_dev->slave_addr = plat->slave_addr;
i2c_dev->is_dvc = plat->is_dvc;