summaryrefslogtreecommitdiff
path: root/drivers/i2c
diff options
context:
space:
mode:
authorChaitanya Bandi <bandik@nvidia.com>2013-07-05 16:15:28 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:43:32 -0700
commit797377472bff473415b69186d3d78d76997224bd (patch)
treef4bde73c5b5ae4dab6861a91133a84f184ab6e60 /drivers/i2c
parentd985fc4dc48acccd99e17e7a2fefe7a5876aef9b (diff)
i2c: tegra: Add appropriate clk divisor for FM Plus mode
Added appropriate clock divisor for FM Plus mode. Bug 1318578 Change-Id: I5f5d0fdbcb3df54f6ca74b752c81b00ab8841f05 Signed-off-by: Chaitanya Bandi <bandik@nvidia.com> (cherry picked from commit 01faecda1d6ab479ada1f12ada3da4fbbe1fb7e1) Reviewed-on: http://git-master/r/266039 GVS: Gerrit_Virtual_Submit Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-tegra.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c
index 356d5a0a0563..59ed0f37b9f6 100644
--- a/drivers/i2c/busses/i2c-tegra.c
+++ b/drivers/i2c/busses/i2c-tegra.c
@@ -155,6 +155,7 @@ struct tegra_i2c_chipdata {
bool has_clk_divisor_std_fast_mode;
bool has_continue_xfer_support;
u16 clk_divisor_std_fast_mode;
+ u16 clk_divisor_fast_plus_mode;
u16 clk_divisor_hs_mode;
int clk_multiplier_hs_mode;
bool has_config_load_reg;
@@ -217,6 +218,7 @@ struct tegra_i2c_dev {
bool is_clkon_always;
bool is_high_speed_enable;
u16 hs_master_code;
+ u16 clk_divisor_non_hs_mode;
bool use_single_xfer_complete;
const struct tegra_i2c_chipdata *chipdata;
int scl_gpio;
@@ -623,7 +625,7 @@ static void tegra_i2c_set_clk_rate(struct tegra_i2c_dev *i2c_dev)
* (i2c_dev->chipdata->clk_divisor_hs_mode + 1);
else
clk_multiplier = I2C_CLK_MULTIPLIER_STD_FAST_MODE
- * (i2c_dev->chipdata->clk_divisor_std_fast_mode + 1);
+ * (i2c_dev->clk_divisor_non_hs_mode + 1);
clk_set_rate(i2c_dev->div_clk, i2c_dev->bus_clk_rate
* clk_multiplier);
@@ -658,7 +660,7 @@ static int tegra_i2c_init(struct tegra_i2c_dev *i2c_dev)
clk_divisor |= i2c_dev->chipdata->clk_divisor_hs_mode;
if (i2c_dev->chipdata->has_clk_divisor_std_fast_mode)
- clk_divisor |= i2c_dev->chipdata->clk_divisor_std_fast_mode
+ clk_divisor |= i2c_dev->clk_divisor_non_hs_mode
<< I2C_CLK_DIVISOR_STD_FAST_MODE_SHIFT;
i2c_writel(i2c_dev, clk_divisor, I2C_CLK_DIVISOR);
@@ -1282,6 +1284,7 @@ static struct tegra_i2c_chipdata tegra114_i2c_chipdata = {
.has_fast_clock = false,
.has_clk_divisor_std_fast_mode = true,
.clk_divisor_std_fast_mode = 0x19,
+ .clk_divisor_fast_plus_mode = 0x10,
.clk_divisor_hs_mode = 1,
.clk_multiplier_hs_mode = 3,
.has_config_load_reg = false,
@@ -1295,6 +1298,7 @@ static struct tegra_i2c_chipdata tegra148_i2c_chipdata = {
.has_fast_clock = false,
.has_clk_divisor_std_fast_mode = true,
.clk_divisor_std_fast_mode = 0x19,
+ .clk_divisor_fast_plus_mode = 0x19,
.clk_divisor_hs_mode = 1,
.clk_multiplier_hs_mode = 3,
.has_config_load_reg = true,
@@ -1444,6 +1448,11 @@ static int tegra_i2c_probe(struct platform_device *pdev)
i2c_dev->is_clkon_always = pdata->is_clkon_always;
i2c_dev->bus_clk_rate = pdata->bus_clk_rate ? pdata->bus_clk_rate: 100000;
i2c_dev->is_high_speed_enable = pdata->is_high_speed_enable;
+ i2c_dev->clk_divisor_non_hs_mode =
+ i2c_dev->chipdata->clk_divisor_std_fast_mode;
+ if (i2c_dev->bus_clk_rate == 1000000)
+ i2c_dev->clk_divisor_non_hs_mode =
+ i2c_dev->chipdata->clk_divisor_fast_plus_mode;
i2c_dev->msgs = NULL;
i2c_dev->msgs_num = 0;
i2c_dev->is_dvc = pdata->is_dvc;