[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