summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorChaitanya Bandi <bandik@nvidia.com>2013-12-17 16:46:19 +0530
committerTom Cherry <tcherry@nvidia.com>2014-01-21 15:14:16 -0800
commit1c2253514c89c9d59e45bf9e299007925c4d9184 (patch)
treeb11c87c4ff93ccd7a7e9a6441b546cf8514c402a /drivers/i2c
parent6ee56678195ff71ef507db0af2300e168de0601f (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.c21
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)