diff options
author | Chaitanya Bandi <bandik@nvidia.com> | 2013-12-17 16:46:19 +0530 |
---|---|---|
committer | Tom Cherry <tcherry@nvidia.com> | 2014-01-21 15:14:16 -0800 |
commit | 1c2253514c89c9d59e45bf9e299007925c4d9184 (patch) | |
tree | b11c87c4ff93ccd7a7e9a6441b546cf8514c402a /drivers/i2c | |
parent | 6ee56678195ff71ef507db0af2300e168de0601f (diff) |
i2c: tegra: Replace writesl/readsl calls
Replaced writesl/readsl calls by adding writes/reads
multiple times.
Bug 1423775
Change-Id: I26649f947b57b77bc5940b5b78833ee8900f95e4
Signed-off-by: Chaitanya Bandi <bandik@nvidia.com>
Reviewed-on: http://git-master/r/346455
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Suresh Mangipudi <smangipudi@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-tegra.c | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index df8f20303dc3..b80e2a7e465b 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c @@ -190,6 +190,7 @@ struct tegra_i2c_dev { struct clk *dvfs_ref_clk; struct clk *dvfs_soc_clk; spinlock_t fifo_lock; + spinlock_t mem_lock; void __iomem *base; int cont_id; int irq; @@ -286,13 +287,27 @@ static u32 i2c_readl(struct tegra_i2c_dev *i2c_dev, unsigned long reg) static void i2c_writesl(struct tegra_i2c_dev *i2c_dev, void *data, unsigned long reg, int len) { - writesl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len); + u32 *buf = data; + unsigned long flags; + + spin_lock_irqsave(&i2c_dev->mem_lock, flags); + while (len--) + writel(*buf++, i2c_dev->base + + tegra_i2c_reg_addr(i2c_dev, reg)); + spin_unlock_irqrestore(&i2c_dev->mem_lock, flags); } static void i2c_readsl(struct tegra_i2c_dev *i2c_dev, void *data, unsigned long reg, int len) { - readsl(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg), data, len); + u32 *buf = data; + unsigned long flags; + + spin_lock_irqsave(&i2c_dev->mem_lock, flags); + while (len--) + *buf++ = readl(i2c_dev->base + + tegra_i2c_reg_addr(i2c_dev, reg)); + spin_unlock_irqrestore(&i2c_dev->mem_lock, flags); } static inline void tegra_i2c_gpio_setscl(void *data, int state) @@ -1513,6 +1528,8 @@ static int tegra_i2c_probe(struct platform_device *pdev) if (!i2c_dev->chipdata->has_xfer_complete_interrupt) spin_lock_init(&i2c_dev->fifo_lock); + spin_lock_init(&i2c_dev->mem_lock); + platform_set_drvdata(pdev, i2c_dev); if (i2c_dev->is_clkon_always) |