[i2c] [patch 2.6.21-rc3-git +i2c] switch at91 to new-style i2c drivers

David Brownell david-b at pacbell.net
Fri Mar 9 06:36:12 CET 2007


Update AT91 platform support to support "new style" I2C drivers.

 - Board-specific init functions take i2c_board_info describing ach
   I2C device on that board, and register that after configuring the
   adapter and its platform_device.

 - Make i2c-at91 register as i2c adapter zero (none of these chips
   seem to have more than one TWI controllers) to make it kick in
   any board-specific device declarations..

 - Update all the board specific init code to use that new signature,
   adding chip declarations (often from schematics) for:

     * csb337 (ds1307 rtc)
     * eb9200 (at24c512 eeprom)
     * rm9200-dk (at24c1024 eeprom, ics1523 clock chip, x9429 pot)
     * rm9200-ek (ics1523 clock chip, dac3550a audio controller)

   The ds1307 rtc driver is updated to "new style" in the next patch;
   there's a new-style at24c eeprom driver I'll post sometime too.
   So far as I know, the other chips have no Linux-I2C drivers, so
   those declarations couldn't break old-style drivers.

Signed-off-by: David Brownell <dbrownell at users.sourceforge.net>
---
NOTE that this doesn't affect the ability to use legacy drivers at
all ... except for the specific updates listed above.  So the ds1307
updates will matter, but no other in-tree drivers will care.

 arch/arm/mach-at91/at91rm9200_devices.c  |    3 ++-
 arch/arm/mach-at91/at91sam9260_devices.c |    3 ++-
 arch/arm/mach-at91/at91sam9261_devices.c |    3 ++-
 arch/arm/mach-at91/board-carmeva.c       |    2 +-
 arch/arm/mach-at91/board-csb337.c        |    7 ++++++-
 arch/arm/mach-at91/board-csb637.c        |    2 +-
 arch/arm/mach-at91/board-dk.c            |   10 +++++++++-
 arch/arm/mach-at91/board-eb9200.c        |    6 +++++-
 arch/arm/mach-at91/board-ek.c            |    8 +++++++-
 arch/arm/mach-at91/board-kafa.c          |    2 +-
 arch/arm/mach-at91/board-kb9202.c        |    3 ++-
 arch/arm/mach-at91/board-sam9261ek.c     |    2 +-
 drivers/i2c/busses/i2c-at91.c            |    6 +++++-
 include/asm-arm/arch-at91/board.h        |    3 ++-
 14 files changed, 46 insertions(+), 14 deletions(-)


Index: at91/drivers/i2c/busses/i2c-at91.c
===================================================================
--- at91.orig/drivers/i2c/busses/i2c-at91.c	2007-03-06 12:19:29.000000000 -0800
+++ at91/drivers/i2c/busses/i2c-at91.c	2007-03-08 09:18:09.000000000 -0800
@@ -230,13 +230,14 @@ static int __devinit at91_i2c_probe(stru
 	adapter->algo = &at91_algorithm;
 	adapter->class = I2C_CLASS_HWMON;
 	adapter->dev.parent = &pdev->dev;
+	/* adapter->id == 0 ... only one TWI controller for now */
 
 	platform_set_drvdata(pdev, adapter);
 
 	clk_enable(twi_clk);		/* enable peripheral clock */
 	at91_twi_hwinit();		/* initialize TWI controller */
 
-	rc = i2c_add_adapter(adapter);
+	rc = i2c_add_numbered_adapter(adapter);
 	if (rc) {
 		dev_err(&pdev->dev, "Adapter %s registration failed\n",
 				adapter->name);
@@ -299,6 +300,9 @@ static int at91_i2c_resume(struct platfo
 #define at91_i2c_resume		NULL
 #endif
 
+/* work with "modprobe at91_i2c" from hotplugging or coldplugging */
+MODULE_ALIAS("at91_i2c");
+
 static struct platform_driver at91_i2c_driver = {
 	.probe		= at91_i2c_probe,
 	.remove		= __devexit_p(at91_i2c_remove),
Index: at91/include/asm-arm/arch-at91/board.h
===================================================================
--- at91.orig/include/asm-arm/arch-at91/board.h	2007-03-04 15:40:41.000000000 -0800
+++ at91/include/asm-arm/arch-at91/board.h	2007-03-08 09:18:09.000000000 -0800
@@ -33,6 +33,7 @@
 
 #include <linux/mtd/partitions.h>
 #include <linux/device.h>
+#include <linux/i2c.h>
 #include <linux/spi/spi.h>
 
  /* USB Device */
@@ -93,7 +94,7 @@ struct at91_nand_data {
 extern void __init at91_add_device_nand(struct at91_nand_data *data);
 
  /* I2C*/
-extern void __init at91_add_device_i2c(void);
+extern void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices);
 
  /* SPI */
 extern void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices);
Index: at91/arch/arm/mach-at91/at91rm9200_devices.c
===================================================================
--- at91.orig/arch/arm/mach-at91/at91rm9200_devices.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/at91rm9200_devices.c	2007-03-08 09:18:09.000000000 -0800
@@ -460,7 +460,7 @@ static struct platform_device at91rm9200
 	.num_resources	= ARRAY_SIZE(twi_resources),
 };
 
-void __init at91_add_device_i2c(void)
+void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
 {
 	/* pins used for TWI interface */
 	at91_set_A_periph(AT91_PIN_PA25, 0);		/* TWD */
@@ -469,6 +469,7 @@ void __init at91_add_device_i2c(void)
 	at91_set_A_periph(AT91_PIN_PA26, 0);		/* TWCK */
 	at91_set_multi_drive(AT91_PIN_PA26, 1);
 
+	i2c_register_board_info(0, devices, nr_devices);
 	platform_device_register(&at91rm9200_twi_device);
 }
 #else
Index: at91/arch/arm/mach-at91/at91sam9260_devices.c
===================================================================
--- at91.orig/arch/arm/mach-at91/at91sam9260_devices.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/at91sam9260_devices.c	2007-03-08 09:18:09.000000000 -0800
@@ -377,7 +377,7 @@ static struct platform_device at91sam926
 	.num_resources	= ARRAY_SIZE(twi_resources),
 };
 
-void __init at91_add_device_i2c(void)
+void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
 {
 	/* pins used for TWI interface */
 	at91_set_A_periph(AT91_PIN_PA23, 0);		/* TWD */
@@ -386,6 +386,7 @@ void __init at91_add_device_i2c(void)
 	at91_set_A_periph(AT91_PIN_PA24, 0);		/* TWCK */
 	at91_set_multi_drive(AT91_PIN_PA24, 1);
 
+	i2c_register_board_info(0, devices, nr_devices);
 	platform_device_register(&at91sam9260_twi_device);
 }
 #else
Index: at91/arch/arm/mach-at91/at91sam9261_devices.c
===================================================================
--- at91.orig/arch/arm/mach-at91/at91sam9261_devices.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/at91sam9261_devices.c	2007-03-08 09:18:09.000000000 -0800
@@ -298,7 +298,7 @@ static struct platform_device at91sam926
 	.num_resources	= ARRAY_SIZE(twi_resources),
 };
 
-void __init at91_add_device_i2c(void)
+void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
 {
 	/* pins used for TWI interface */
 	at91_set_A_periph(AT91_PIN_PA7, 0);		/* TWD */
@@ -307,6 +307,7 @@ void __init at91_add_device_i2c(void)
 	at91_set_A_periph(AT91_PIN_PA8, 0);		/* TWCK */
 	at91_set_multi_drive(AT91_PIN_PA8, 1);
 
+	i2c_register_board_info(0, devices, nr_devices);
 	platform_device_register(&at91sam9261_twi_device);
 }
 #else
Index: at91/arch/arm/mach-at91/board-csb337.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-csb337.c	2007-03-06 12:19:00.000000000 -0800
+++ at91/arch/arm/mach-at91/board-csb337.c	2007-03-08 09:21:26.000000000 -0800
@@ -85,6 +85,11 @@ static struct at91_udc_data __initdata c
 	.pullup_pin	= AT91_PIN_PA24,
 };
 
+static struct i2c_board_info __initdata csb337_i2c_devices[] = { {
+	I2C_BOARD_INFO("rtc-ds1307", 0x68, "ds1307"),
+} };
+
+
 static struct at91_cf_data __initdata csb337_cf_data = {
 	/*
 	 * connector P4 on the CSB 337 mates to
@@ -198,7 +203,7 @@ static void __init csb337_board_init(voi
 	/* USB Device */
 	at91_add_device_udc(&csb337_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(csb337_i2c_devices, ARRAY_SIZE(csb337_i2c_devices));
 	/* Compact Flash */
 	at91_set_gpio_input(AT91_PIN_PB22, 1);		/* IOIS16 */
 	at91_add_device_cf(&csb337_cf_data);
Index: at91/arch/arm/mach-at91/board-eb9200.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-eb9200.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-eb9200.c	2007-03-08 09:22:10.000000000 -0800
@@ -79,6 +79,10 @@ static struct at91_udc_data __initdata e
 	.pullup_pin	= AT91_PIN_PD5,
 };
 
+static struct i2c_board_info __initdata eb9200_i2c_devices[] = { {
+	I2C_BOARD_INFO("at24c", 0x50, "24c512"),
+} };
+
 static struct at91_cf_data __initdata eb9200_cf_data = {
 	.det_pin	= AT91_PIN_PB0,
 	.rst_pin	= AT91_PIN_PC5,
@@ -102,7 +106,7 @@ static void __init eb9200_board_init(voi
 	/* USB Device */
 	at91_add_device_udc(&eb9200_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(eb9200_i2c_devices, ARRAY_SIZE(eb9200_i2c_devices));
 	/* Compact Flash */
 	at91_add_device_cf(&eb9200_cf_data);
 	/* SPI */
Index: at91/arch/arm/mach-at91/board-dk.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-dk.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-dk.c	2007-03-08 09:21:56.000000000 -0800
@@ -99,6 +99,14 @@ static struct at91_mmc_data __initdata d
 	.wire4		= 1,
 };
 
+static struct i2c_board_info __initdata dk_i2c_devices[] = { {
+	I2C_BOARD_INFO("ics1523", 0x26, ""),
+}, {
+	I2C_BOARD_INFO("x9429", 0x28, ""),
+}, {
+	I2C_BOARD_INFO("at24c", 0x50, "24c1024"),
+} };
+
 static struct spi_board_info dk_spi_devices[] = {
 	{	/* DataFlash chip */
 		.modalias	= "mtd_dataflash",
@@ -185,7 +193,7 @@ static void __init dk_board_init(void)
 	/* Compact Flash */
 	at91_add_device_cf(&dk_cf_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(dk_i2c_devices, ARRAY_SIZE(dk_i2c_devices));
 	/* SPI */
 	at91_add_device_spi(dk_spi_devices, ARRAY_SIZE(dk_spi_devices));
 #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
Index: at91/arch/arm/mach-at91/board-ek.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-ek.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-ek.c	2007-03-08 09:22:32.000000000 -0800
@@ -94,6 +94,12 @@ static struct at91_mmc_data __initdata e
 	.wp_pin		= AT91_PIN_PA17,
 };
 
+static struct i2c_board_info __initdata ek_i2c_devices[] = { {
+	I2C_BOARD_INFO("ics1523", 0x26, ""),
+}, {
+	I2C_BOARD_INFO("dac3550", 0x4d, ""),
+} };
+
 static struct spi_board_info ek_spi_devices[] = {
 	{	/* DataFlash chip */
 		.modalias	= "mtd_dataflash",
@@ -145,7 +151,7 @@ static void __init ek_board_init(void)
 	at91_add_device_udc(&ek_udc_data);
 	at91_set_multi_drive(ek_udc_data.pullup_pin, 1);	/* pullup_pin is connected to reset */
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
 	/* SPI */
 	at91_add_device_spi(ek_spi_devices, ARRAY_SIZE(ek_spi_devices));
 #ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
Index: at91/arch/arm/mach-at91/board-kb9202.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-kb9202.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-kb9202.c	2007-03-08 09:18:09.000000000 -0800
@@ -124,7 +124,8 @@ static void __init kb9202_board_init(voi
 	/* MMC */
 	at91_add_device_mmc(0, &kb9202_mmc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	/* (nyet declared:  i2c boot eeprom, temp sensor) */
+	at91_add_device_i2c(NULL, 0);
 	/* SPI */
 	at91_add_device_spi(NULL, 0);
 	/* NAND */
Index: at91/arch/arm/mach-at91/board-sam9261ek.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-sam9261ek.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-sam9261ek.c	2007-03-08 09:18:09.000000000 -0800
@@ -231,7 +231,7 @@ static void __init ek_board_init(void)
 	/* USB Device */
 	at91_add_device_udc(&ek_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(NULL, 0);
 	/* NAND */
 	at91_add_device_nand(&ek_nand_data);
 	/* DM9000 ethernet */
Index: at91/arch/arm/mach-at91/board-csb637.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-csb637.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-csb637.c	2007-03-08 09:18:09.000000000 -0800
@@ -129,7 +129,7 @@ static void __init csb637_board_init(voi
 	/* USB Device */
 	at91_add_device_udc(&csb637_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(NULL, 0);
 	/* SPI */
 	at91_add_device_spi(NULL, 0);
 	/* NOR flash */
Index: at91/arch/arm/mach-at91/board-kafa.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-kafa.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-kafa.c	2007-03-08 09:18:09.000000000 -0800
@@ -92,7 +92,7 @@ static void __init kafa_board_init(void)
 	/* USB Device */
 	at91_add_device_udc(&kafa_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(NULL, 0);
 	/* SPI */
 	at91_add_device_spi(NULL, 0);
 }
Index: at91/arch/arm/mach-at91/board-carmeva.c
===================================================================
--- at91.orig/arch/arm/mach-at91/board-carmeva.c	2007-03-04 15:40:41.000000000 -0800
+++ at91/arch/arm/mach-at91/board-carmeva.c	2007-03-08 09:18:09.000000000 -0800
@@ -128,7 +128,7 @@ static void __init carmeva_board_init(vo
 	/* USB Device */
 	at91_add_device_udc(&carmeva_udc_data);
 	/* I2C */
-	at91_add_device_i2c();
+	at91_add_device_i2c(NULL, 0);
 	/* SPI */
 	at91_add_device_spi(carmeva_spi_devices, ARRAY_SIZE(carmeva_spi_devices));
 	/* Compact Flash */



More information about the i2c mailing list