diff options
author | Michael Hennerich <michael.hennerich@analog.com> | 2009-05-18 08:14:41 -0400 |
---|---|---|
committer | Ben Dooks <ben-linux@fluff.org> | 2009-06-13 05:39:25 -0400 |
commit | 9528d1c7a541b481a0e80301dc8d545848104023 (patch) | |
tree | d42eedf34ee8d79d4fe4acf3a48c260748443b34 /drivers | |
parent | f3ad116588151b3371ae4e092290e4f48e62b8bb (diff) |
i2c: Blackfin TWI: make sure we don't end up with a CLKDIV=0
Make sure we don't end up with an invalid CLKDIV=0 in case someone
specifies 20kHz SCL or less (5 * 1024 / 20 = 0x100).
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
[ben-linux@fluff.org: shortened subject line]
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/busses/Kconfig | 2 | ||||
-rw-r--r-- | drivers/i2c/busses/i2c-bfin-twi.c | 11 |
2 files changed, 9 insertions, 4 deletions
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index f1c6ca7e285..c8460fa9cfa 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
@@ -298,7 +298,7 @@ config I2C_BLACKFIN_TWI | |||
298 | config I2C_BLACKFIN_TWI_CLK_KHZ | 298 | config I2C_BLACKFIN_TWI_CLK_KHZ |
299 | int "Blackfin TWI I2C clock (kHz)" | 299 | int "Blackfin TWI I2C clock (kHz)" |
300 | depends on I2C_BLACKFIN_TWI | 300 | depends on I2C_BLACKFIN_TWI |
301 | range 10 400 | 301 | range 21 400 |
302 | default 50 | 302 | default 50 |
303 | help | 303 | help |
304 | The unit of the TWI clock is kHz. | 304 | The unit of the TWI clock is kHz. |
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c index fc548b3d002..77cafb6ba92 100644 --- a/drivers/i2c/busses/i2c-bfin-twi.c +++ b/drivers/i2c/busses/i2c-bfin-twi.c | |||
@@ -614,6 +614,7 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
614 | struct i2c_adapter *p_adap; | 614 | struct i2c_adapter *p_adap; |
615 | struct resource *res; | 615 | struct resource *res; |
616 | int rc; | 616 | int rc; |
617 | unsigned int clkhilow; | ||
617 | 618 | ||
618 | iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL); | 619 | iface = kzalloc(sizeof(struct bfin_twi_iface), GFP_KERNEL); |
619 | if (!iface) { | 620 | if (!iface) { |
@@ -675,10 +676,14 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
675 | /* Set TWI internal clock as 10MHz */ | 676 | /* Set TWI internal clock as 10MHz */ |
676 | write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F); | 677 | write_CONTROL(iface, ((get_sclk() / 1024 / 1024 + 5) / 10) & 0x7F); |
677 | 678 | ||
679 | /* | ||
680 | * We will not end up with a CLKDIV=0 because no one will specify | ||
681 | * 20kHz SCL or less in Kconfig now. (5 * 1024 / 20 = 0x100) | ||
682 | */ | ||
683 | clkhilow = 5 * 1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ; | ||
684 | |||
678 | /* Set Twi interface clock as specified */ | 685 | /* Set Twi interface clock as specified */ |
679 | write_CLKDIV(iface, ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) | 686 | write_CLKDIV(iface, (clkhilow << 8) | clkhilow); |
680 | << 8) | ((5*1024 / CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ) | ||
681 | & 0xFF)); | ||
682 | 687 | ||
683 | /* Enable TWI */ | 688 | /* Enable TWI */ |
684 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); | 689 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); |