[i2c] [PATCH] AT91 I2C configurable clock-rate
Andrew Victor
andrew at sanpeople.com
Thu Feb 22 09:07:18 CET 2007
Allow the AT91 I2C clock-rate to be user-configurable.
Based on Atmel's AVR32 version of the driver, developed by Espen
Krangnes.
Signed-off-by: Andrew Victor <andrew at sanpeople.com>
diff -urN -x CVS linux-2.6.21-rc1/drivers/i2c/busses/Kconfig linux-2.6/drivers/i2c/busses/Kconfig
--- linux-2.6.21-rc1/drivers/i2c/busses/Kconfig Thu Feb 22 09:00:36 2007
+++ linux-2.6/drivers/i2c/busses/Kconfig Wed Feb 21 10:21:17 2007
@@ -81,6 +81,14 @@
This supports the use of the I2C interface on Atmel AT91
processors.
+config I2C_AT91_CLOCKRATE
+ prompt "Atmel AT91 I2C/TWI clock-rate"
+ depends on I2C_AT91
+ int
+ default 100000
+ help
+ Set the AT91 I2C/TWI clock-rate.
+
config I2C_AU1550
tristate "Au1550/Au1200 SMBus interface"
depends on I2C && (SOC_AU1550 || SOC_AU1200)
diff -urN -x CVS linux-2.6.21-rc1/drivers/i2c/busses/i2c-at91.c linux-2.6/drivers/i2c/busses/i2c-at91.c
--- linux-2.6.21-rc1/drivers/i2c/busses/i2c-at91.c Thu Feb 22 08:58:49 2007
+++ linux-2.6/drivers/i2c/busses/i2c-at91.c Thu Feb 22 09:57:48 2007
@@ -31,8 +31,11 @@
#include <asm/arch/board.h>
#include <asm/arch/cpu.h>
-#define TWI_CLOCK 100000 /* Hz. max 400 Kbits/sec */
+/* Clockrate is configurable - max 400 Kbits/sec */
+static unsigned int clockrate = CONFIG_I2C_AT91_CLOCKRATE;
+module_param(clockrate, uint, 0);
+MODULE_PARM_DESC(clockrate, "The TWI clockrate");
static struct clk *twi_clk;
static void __iomem *twi_base;
@@ -53,7 +56,7 @@
at91_twi_write(AT91_TWI_CR, AT91_TWI_MSEN); /* Set Master mode */
/* Calcuate clock dividers */
- cdiv = (clk_get_rate(twi_clk) / (2 * TWI_CLOCK)) - 3;
+ cdiv = (clk_get_rate(twi_clk) / (2 * clockrate)) - 3;
cdiv = cdiv + 1; /* round up */
ckdiv = 0;
while (cdiv > 255) {
@@ -61,11 +64,12 @@
cdiv = cdiv >> 1;
}
- if (cpu_is_at91rm9200()) { /* AT91RM9200 Errata #22 */
- if (ckdiv > 5) {
- printk(KERN_ERR "AT91 I2C: Invalid TWI_CLOCK value!\n");
- ckdiv = 5;
- }
+ if (cpu_is_at91rm9200() && (ckdiv > 5)) { /* AT91RM9200 Errata #22 */
+ printk(KERN_ERR "AT91 I2C: Invalid TWI clockrate!\n");
+ ckdiv = 5;
+ } else if (ckdiv > 7) {
+ printk(KERN_ERR "AT91 I2C: Invalid TWI clockrate!\n");
+ ckdiv = 7;
}
at91_twi_write(AT91_TWI_CWGR, (ckdiv << 16) | (cdiv << 8) | cdiv);
More information about the i2c
mailing list